ATTiny85 a WS2812B

NCPlyn
Příspěvky: 6
Registrován: 03 led 2019, 19:33
Reputation: 0

ATTiny85 a WS2812B

Příspěvek od NCPlyn » 31 led 2019, 20:49

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 :D. 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 :)

Uživatelský avatar
SkullKeep
Příspěvky: 167
Registrován: 23 srp 2017, 18:51
Reputation: 0
Bydliště: Brno

Re: ATTiny85 a WS2812B

Příspěvek od SkullKeep » 31 led 2019, 20:59

A na ,který pin a který z těch verzí? Lépe se ladí celý program než jen část.
:twisted: :?: :arrow: :geek:

RomanB
Příspěvky: 31
Registrován: 04 zář 2017, 14:28
Reputation: 0
Bydliště: Havířov

Re: ATTiny85 a WS2812B

Příspěvek od RomanB » 31 led 2019, 21:05

Změň

Kód: Vybrat vše

int leftPin = A0; 
je možné, že číslem 5 definuješ pin jako digi vstup, kdežto A0 bude brán jako analog input

Uživatelský avatar
SkullKeep
Příspěvky: 167
Registrován: 23 srp 2017, 18:51
Reputation: 0
Bydliště: Brno

Re: ATTiny85 a WS2812B

Příspěvek od SkullKeep » 31 led 2019, 21:09

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 
//                --------
Jenom návrh nebylo by lepší u proměnných, které se nemění dát spíš #DEFINE.
:twisted: :?: :arrow: :geek:

NCPlyn
Příspěvky: 6
Registrován: 03 led 2019, 19:33
Reputation: 0

Re: ATTiny85 a WS2812B

Příspěvek od NCPlyn » 31 led 2019, 21:55

Je to verze 20171105 a vyzkoušel jsem A0 míto 5 a stále nic...

Uživatelský avatar
SkullKeep
Příspěvky: 167
Registrován: 23 srp 2017, 18:51
Reputation: 0
Bydliště: Brno

Re: ATTiny85 a WS2812B

Příspěvek od SkullKeep » 31 led 2019, 22:48

Místo

Kód: Vybrat vše

int leftPin = A0; 
dát

Kód: Vybrat vše

#define leftPin   A2 
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
:twisted: :?: :arrow: :geek:

Uživatelský avatar
SkullKeep
Příspěvky: 167
Registrován: 23 srp 2017, 18:51
Reputation: 0
Bydliště: Brno

Re: ATTiny85 a WS2812B

Příspěvek od SkullKeep » 31 led 2019, 23:45

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];
}
:twisted: :?: :arrow: :geek:

NCPlyn
Příspěvky: 6
Registrován: 03 led 2019, 19:33
Reputation: 0

Re: ATTiny85 a WS2812B

Příspěvek od NCPlyn » 01 úno 2019, 10:20

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.

Uživatelský avatar
SkullKeep
Příspěvky: 167
Registrován: 23 srp 2017, 18:51
Reputation: 0
Bydliště: Brno

Re: ATTiny85 a WS2812B

Příspěvek od SkullKeep » 01 úno 2019, 12:16

Doma jsem našel WS2812B desku s 8-smi lediodama a zkusím to otestovat.
:twisted: :?: :arrow: :geek:

Uživatelský avatar
SkullKeep
Příspěvky: 167
Registrován: 23 srp 2017, 18:51
Reputation: 0
Bydliště: Brno

Re: ATTiny85 a WS2812B

Příspěvek od SkullKeep » 02 úno 2019, 16:25

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];
}
:twisted: :?: :arrow: :geek:

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host