ATTiny85 a WS2812B
ATTiny85 a WS2812B
Dobrý večer,
do schránky mi přišel pásek s adresovatelnýma ledkama a mě napadlo že bych je mohl využít jako vumetr. Našel jsem si kód, poupravil jsem ho abych ho zbavil přebytečností a aby se vešel na ATTiny85. Nejdříve jsem vyzkoušel pásek na UNO a pak i můj poupravený kód a vše fungovalo krásně...
Napojil jsem a naprogramoval DigiSpark ATTiny85 a nic . Vyzkoušel jsem i jiné piny a stále nic, vyzkoušel jsem příklad k WS2812B a vše fungovalo.
Takže mám pocit že bude něco špatně v kódu nebo stále nedokážu pochopit piny na ATTiny85...
Orig.: https://www.hackster.io/ericBcreator/st ... ter-b28e78
Upravené: https://hastebin.com/oborafesef.cpp
Pokud by někdo poradil jak tento problém vyřešit, budu jen rád
do schránky mi přišel pásek s adresovatelnýma ledkama a mě napadlo že bych je mohl využít jako vumetr. Našel jsem si kód, poupravil jsem ho abych ho zbavil přebytečností a aby se vešel na ATTiny85. Nejdříve jsem vyzkoušel pásek na UNO a pak i můj poupravený kód a vše fungovalo krásně...
Napojil jsem a naprogramoval DigiSpark ATTiny85 a nic . Vyzkoušel jsem i jiné piny a stále nic, vyzkoušel jsem příklad k WS2812B a vše fungovalo.
Takže mám pocit že bude něco špatně v kódu nebo stále nedokážu pochopit piny na ATTiny85...
Orig.: https://www.hackster.io/ericBcreator/st ... ter-b28e78
Upravené: https://hastebin.com/oborafesef.cpp
Pokud by někdo poradil jak tento problém vyřešit, budu jen rád
- SkullKeep
- Příspěvky: 290
- Registrován: 23 srp 2017, 18:51
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: ATTiny85 a WS2812B
A na ,který pin a který z těch verzí? Lépe se ladí celý program než jen část.
P. Q. M.
Re: ATTiny85 a WS2812B
Změň je možné, že číslem 5 definuješ pin jako digi vstup, kdežto A0 bude brán jako analog input
Kód: Vybrat vše
int leftPin = A0;
- SkullKeep
- Příspěvky: 290
- Registrován: 23 srp 2017, 18:51
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: ATTiny85 a WS2812B
Kód: Vybrat vše
// ATTINY85
// --------
// reset PB5-|1* 8|-VCC
// pin 3 PB3-|2 7|-PB2 pin 2
// pin 4 PB4-|3 6|-PB1 pin 1
// GND-|4 5|-PB0 pin 0
// --------
P. Q. M.
Re: ATTiny85 a WS2812B
Je to verze 20171105 a vyzkoušel jsem A0 míto 5 a stále nic...
- SkullKeep
- Příspěvky: 290
- Registrován: 23 srp 2017, 18:51
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: ATTiny85 a WS2812B
Místo
dát
zaprvé ušetříš paměť a za druhé piny 2,3,4 jsou na konverzi analog na digital.
Jinak tu je Referenční příručka na ATTINY85 s popisen co a jak použít
Kód: Vybrat vše
int leftPin = A0;
Kód: Vybrat vše
#define leftPin A2
Jinak tu je Referenční příručka na ATTINY85 s popisen co a jak použít
P. Q. M.
- SkullKeep
- Příspěvky: 290
- Registrován: 23 srp 2017, 18:51
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: ATTiny85 a WS2812B
opravená verze programu snad pojede. Menší místo zabírá i méně paměti.
Kód: Vybrat vše
#include <Adafruit_NeoPixel.h>
#define led_strip_30
#define leftPin A2 // left audio in on fourth pin fro
#define stripPin 0 // DIN of leds on second pin from top
#define stripNumOfLeds 60 // the total number of leds
#define ledBrightness 100 // 0 - 255, initial value (value read from the potentiometer if useSensorValues = true)
#define dropDelay 10 // hold time before dropping the leds
#define sensitivityValue 128 // 0 - 255, initial value (value read from the potentiometer if useSensorValues = true)
#define minValue 10 // min analog input value
#define maxValue 350 // max analog input value (0-1023 equals 0-5V)
#define overflowDelay 20 // overflow hold time
#define middleOffset 0 // offset for the middle led when using one strip
#define orangeLimitAmount 0 // limit the amount of green of the middle LEDs to make them more orange
#define maxSensitivity 510 // let the 'volume' go up to 200%!
/*************/
unsigned int stripColor[30]; // half of the number of leds + 1
boolean displayMiddleLed = false; // display the middle led (blue). set to true for one strip, false for two strips or rings
boolean splitStrip = true; // set to true when using 2 strips or rings, false for one strip
float dropFactor = .9; // value for dropping the leds
//******
int numOfSegments = stripNumOfLeds / 2;
int halfNumOfSegments = numOfSegments / 2;
int stripMiddle = stripNumOfLeds / 2;
int maxDisplaySegments = stripMiddle - 1;
float sensitivityFactor;
float ledFactor, ledFactor_div_numOfSegments;
int leftValue = 0, maxReadValue = 0;
int leftAnalogValue = 0;
int prevLeftValue = 0;
int prevLeftAnalogValue = 0;
int dropLeft;
int leftDropTime;
unsigned int stripMiddleColor, stripOverflowColor, stripHoldColor;
//**************8
Adafruit_NeoPixel strip = Adafruit_NeoPixel(stripNumOfLeds, stripPin, NEO_RGB + NEO_KHZ800);
//*************
void setup() {
strip.begin();
setStripColors();
sensitivityFactor = ((float) sensitivityValue / 255 * (float) maxSensitivity / 255);
}
//*****************8
void loop() {
readValues();
drawValues();
}
//*********************
void readValues() {
leftAnalogValue = analogRead(leftPin);
if (leftAnalogValue < prevLeftAnalogValue) {
leftDropTime++;
if (leftDropTime > dropDelay) {
leftAnalogValue = prevLeftAnalogValue * dropFactor;
leftDropTime = 0;
}
else
leftAnalogValue = prevLeftAnalogValue;
}
leftValue = map(leftAnalogValue * sensitivityFactor, minValue, maxValue, 0, maxDisplaySegments);
if (leftValue > maxDisplaySegments) {
leftValue = maxDisplaySegments;
drawOverflow();
}
prevLeftAnalogValue = leftAnalogValue;
prevLeftValue = leftValue;
}
//************************
void drawValues() {
if (splitStrip) {
for (int i = middleOffset; i < leftValue; i++)
strip.setPixelColor(i, stripColor[i]);
for (int i = prevLeftValue; i > leftValue; i--)
strip.setPixelColor(i, 0);
}
else {
for (int i = middleOffset; i < leftValue; i++)
strip.setPixelColor(stripMiddle + i, stripColor[i]);
for (int i = prevLeftValue; i > leftValue; i--)
strip.setPixelColor(stripMiddle + i, 0);
}
if (displayMiddleLed) strip.setPixelColor(stripMiddle, stripMiddleColor);
strip.show();
}
//***************
void drawOverflow() {
for (int i = 0; i <= numOfSegments; i++) {
strip.setPixelColor(stripMiddle + i, stripOverflowColor);
strip.setPixelColor(stripMiddle - i, stripOverflowColor);
}
strip.show();
delay(overflowDelay);
for (int i = 0; i <= numOfSegments; i++) {
strip.setPixelColor(stripMiddle + i, 0);
strip.setPixelColor(stripMiddle - i, 0);
}
strip.show();
}
//****************
void setStripColors() {
int orangeLimit;
ledFactor = (float)ledBrightness / 255;
float orangeFactor = orangeLimitAmount / halfNumOfSegments;
ledFactor_div_numOfSegments = ledFactor / numOfSegments;
stripOverflowColor = strip.Color(min(255, 255 * ledFactor * 1.5), 0, 0);
stripMiddleColor = strip.Color(0, 0, 255 * ledFactor);
stripColor[0] = strip.Color(0, 255 * ledFactor, 0);
for (int i = 1; i <= numOfSegments; i++) {
if (i <= halfNumOfSegments)
orangeLimit = (i * orangeFactor);
else
orangeLimit = ((numOfSegments - i) * orangeFactor);
stripColor[i] = strip.Color((255 * i * ledFactor_div_numOfSegments), ((255 - orangeLimit) * (numOfSegments - i) * ledFactor_div_numOfSegments), 0);
}
stripHoldColor = stripColor[numOfSegments];
}
P. Q. M.
Re: ATTiny85 a WS2812B
Teď jsem našel doma attiny85 samo o sobě (jenom chip bez žádné desky), vyzkoušel jsem kód co jsi napsal s 8 a 16mhz zavaděčem a momentálně svítí asi polovina ledek zeleně bez reakce na vstup.
- SkullKeep
- Příspěvky: 290
- Registrován: 23 srp 2017, 18:51
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: ATTiny85 a WS2812B
Doma jsem našel WS2812B desku s 8-smi lediodama a zkusím to otestovat.
P. Q. M.
- SkullKeep
- Příspěvky: 290
- Registrován: 23 srp 2017, 18:51
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: ATTiny85 a WS2812B
Mám finální a funkční verzi tvé úpravy pro ATTINY85 8MHz.O testováno na led WS2812B 8 diod na pásku funguje. Pro zapojení je diagram pinů níže.
Kód: Vybrat vše
// ATTINY85
// --------
// reset PB5-|1* 8|-VCC
// A3 pin 3 PB3-|2 7|-PB2 pin 2 A1
// A4 pin 4 PB4-|3 6|-PB1 pin 1
// GND-|4 5|-PB0 pin 0
// --------
Kód: Vybrat vše
#include <Adafruit_NeoPixel.h>
#define leftPin A2 // left audio in on fourth pin fro
#define stripPin PB0 // DIN of leds on second pin from top
#define stripNumOfLeds 30 // the total number of leds
#define ledBrightness 70 // 0 - 255, initial value (value read from the potentiometer if useSensorValues = true)
#define dropDelay 10 // hold time before dropping the leds
#define minValue 10 // min analog input value
#define maxValue 550 // max analog input value (0-1023 equals 0-5V)
#define overflowDelay 20 // overflow hold time
#define middleOffset 0 // offset for the middle led when using one strip
#define orangeLimitAmount 0 // limit the amount of green of the middle LEDs to make them more orange
#define sensitivityFactor 10
/*************/
unsigned int stripColor[stripNumOfLeds/2-1]; // half of the number of leds + 1
boolean displayMiddleLed = false; // display the middle led (blue). set to true for one strip, false for two strips or rings
boolean splitStrip = true; // set to true when using 2 strips or rings, false for one strip
float dropFactor = .9; // value for dropping the leds
//******
int numOfSegments = stripNumOfLeds / 2;
int halfNumOfSegments = numOfSegments / 2;
int stripMiddle = stripNumOfLeds / 2;
int maxDisplaySegments = stripMiddle - 1;
float ledFactor, ledFactor_div_numOfSegments;
int leftValue = 0;
int leftAnalogValue = 0;
int prevLeftValue = 0;
int prevLeftAnalogValue = 0;
int leftDropTime = 0;
int i;
unsigned int stripMiddleColor, stripOverflowColor, stripHoldColor;
//**************8
Adafruit_NeoPixel strip = Adafruit_NeoPixel(stripNumOfLeds, stripPin, NEO_RGB + NEO_KHZ800);
//*************
void setup() {
strip.begin();
setStripColors();
}
//*****************8
void loop() {
readValues();
drawValues();
prevLeftAnalogValue = leftAnalogValue;
prevLeftValue = leftValue;
}
//*********************
void readValues() {
leftAnalogValue = analogRead(leftPin);
if (leftAnalogValue < prevLeftAnalogValue) {
leftDropTime++;
if (leftDropTime > dropDelay) {
leftAnalogValue = prevLeftAnalogValue * dropFactor;
leftDropTime = 0;
}
else
leftAnalogValue = prevLeftAnalogValue;
}
leftValue = map(leftAnalogValue * sensitivityFactor, minValue, maxValue, 0, maxDisplaySegments);
if (leftValue > maxDisplaySegments) {
leftValue = maxDisplaySegments;
drawOverflow();
}
}
//************************
void drawValues() {
if (splitStrip) {
for (i = middleOffset; i < leftValue; i++)
{
strip.setPixelColor(i, stripColor[i]);
}
for (i = prevLeftValue; i > leftValue; i--)
{
strip.setPixelColor(i, 0);
}
}
else {
for (i = middleOffset; i < leftValue; i++)
{
strip.setPixelColor(stripMiddle + i, stripColor[i]);
}
for (i = prevLeftValue; i > leftValue; i--)
{
strip.setPixelColor(stripMiddle + i, 0);
}
}
if (displayMiddleLed) {
strip.setPixelColor(stripMiddle, stripMiddleColor);
}
strip.show();
}
//***************
void drawOverflow() {
for (i = 0; i <= numOfSegments; i++) {
strip.setPixelColor(stripMiddle + i, stripOverflowColor);
strip.setPixelColor(stripMiddle - i, stripOverflowColor);
}
strip.show();
delay(overflowDelay);
for (i = 0; i <= numOfSegments; i++) {
strip.setPixelColor(stripMiddle + i, 0);
strip.setPixelColor(stripMiddle - i, 0);
}
strip.show();
}
//****************
void setStripColors() {
int orangeLimit;
ledFactor = (float)ledBrightness / 255;
float orangeFactor = orangeLimitAmount / halfNumOfSegments;
ledFactor_div_numOfSegments = ledFactor / numOfSegments;
stripOverflowColor = strip.Color(min(255, 255 * ledFactor * 1.5), 0, 0);
stripMiddleColor = strip.Color(0, 0, 255 * ledFactor);
stripColor[0] = strip.Color(0, 255 * ledFactor, 0);
for (i = 1; i <= numOfSegments; i++) {
if (i <= halfNumOfSegments)
orangeLimit = (i * orangeFactor);
else
orangeLimit = ((numOfSegments - i) * orangeFactor);
stripColor[i] = strip.Color((255 * i * ledFactor_div_numOfSegments), ((255 - orangeLimit) * (numOfSegments - i) * ledFactor_div_numOfSegments), 0);
}
stripHoldColor = stripColor[numOfSegments];
}
P. Q. M.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 10 hostů