Odczyt z YF-S201 połączony z progress barem 2812B - Szałot - 03-10-2021
Witajcie!
Od razu nadmienię, iż kwestii programowania jestem bardzo początkującą osobą i będę bardzo wdzięczny za rady i wypunktowanie moich błędów.
Projekt, nad którym pracuje to przepływomierz (YF-S201), który w zależności od obrotów będzie regulował wizualny efekt progress baru na taśmie WS2812B. Płytka to arduino Nano.
Kod, który znalazłem w internecie służący do odczytu z przepływomierza (z dodaną biblioteką adafruita i resztą) :
Kod: #include <Adafruit_NeoPixel.h>
#define PIN 6 // WS2812 chip - Data In
#define Pixel_Number 8
Adafruit_NeoPixel strip = Adafruit_NeoPixel(Pixel_Number, PIN, NEO_GRB + NEO_KHZ800);
const int watermeterPin = 2;
volatile int pulse_frequency;
unsigned int literperhour;
unsigned long currentTime, loopTime;
byte sensorInterrupt = 0;
void setup()
{
pinMode(watermeterPin, INPUT);
Serial.begin(9600);
strip.begin();
attachInterrupt(sensorInterrupt, getFlow, FALLING);
currentTime = millis();
loopTime = currentTime;
}
void loop ()
{
currentTime = millis();
if(currentTime >= (loopTime + 100))
{
loopTime = currentTime;
literperhour = (pulse_frequency * 60 / 7.5);
pulse_frequency = 0;
Serial.print(literperhour, DEC);
Serial.println(" Liter/hour");
jazda();
}
}
void getFlow ()
{
pulse_frequency++;
}
Kod odpowiedzialny za dostosowanie efektu diod do natężenia przepływu:
Kod: void jazda ()
{
if(literperhour < 20 )
{
strip.setPixelColor(0, strip.Color(0, 127, 0));
for(int i=1;i<Pixel_Number;i++)
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.show();
}
else if(literperhour > 20 && literperhour < 40 )
{
strip.setPixelColor(0, strip.Color(0, 127, 0));
strip.setPixelColor(1, strip.Color(0, 127, 0));
for(int i=2;i<Pixel_Number;i++)
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.show();
}
else if(literperhour > 40 && literperhour < 60 )
{
for(int i=0;i<2;i++)
strip.setPixelColor(i, strip.Color(0, 127, 0));
for(int i=3;i<Pixel_Number;i++)
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.show();
}
else if(literperhour > 60 && literperhour < 80 )
{
for(int i=0;i<3;i++)
strip.setPixelColor(i, strip.Color(0, 127, 0));
for(int i=4;i<Pixel_Number;i++)
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.show();
}
else if(literperhour > 80 && literperhour < 100 )
{
for(int i=0;i<4;i++)
strip.setPixelColor(i, strip.Color(0, 127, 0));
for(int i=5;i<Pixel_Number;i++)
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.show();
}
else if(literperhour > 100 && literperhour < 120 )
{
for(int i=0;i<5;i++)
strip.setPixelColor(i, strip.Color(0, 127, 0));
for(int i=6;i<Pixel_Number;i++)
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.setPixelColor(4, strip.Color(255, 255, 0));
strip.show();
}
else if(literperhour > 120 && literperhour < 140 )
{
for(int i=0;i<6;i++)
strip.setPixelColor(i, strip.Color(0, 127, 0));
for(int i=7;i<Pixel_Number;i++)
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.setPixelColor(4, strip.Color(255, 255, 0));
strip.setPixelColor(5, strip.Color(255, 255, 0));
strip.show();
}
else if(literperhour > 140 && literperhour < 160 )
{
for(int i=0;i<7;i++)
strip.setPixelColor(i, strip.Color(0, 127, 0));
for(int i=8;i<Pixel_Number;i++)
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.setPixelColor(4, strip.Color(255, 255, 0));
strip.setPixelColor(5, strip.Color(255, 255, 0));
strip.setPixelColor(6, strip.Color(255, 0, 0));
strip.show();
}
else if(literperhour > 160 )
{
for(int i=0;i<8;i++)
strip.setPixelColor(i, strip.Color(0, 127, 0));
for(int i=8;i<Pixel_Number;i++)
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.setPixelColor(4, strip.Color(255, 255, 0));
strip.setPixelColor(5, strip.Color(255, 255, 0));
strip.setPixelColor(6, strip.Color(255, 0, 0));
strip.setPixelColor(7, strip.Color(255, 0, 0));
strip.show();
}}
Rezultat jest taki, że port szeregowy wysyła dane z przepływomierza, natomiast diody nie emitują światła.
Z góry dziękuję za pomoc!
RE: Odczyt z YF-S201 połączony z progress barem 2812B - kaczakat - 03-10-2021
Może na początek ustal, czy w ogóle mogłyby świecić tym kodem, bo rozumiem, że wydruk wartości sugeruje, że jakieś świecenie być powinno, przetestuj inny czy one w ogóle świecą albo tym wstawiając zamiast if(literperhour < 20 ) if(1) (i 0 w pozostałe, by nie mieszać) po kolei w każdy warunek.
A z innej beczki:
else if(literperhour <20 ) // i potem <40, <60 tylko trzeba zaczac od najmniejszej albo odwrotnie zmieniajac tez znak >
{
strip.setPixelColor(0, strip.Color(0, 127, 0));
strip.setPixelColor(1, strip.Color(0, 127, 0));
for(int i=2;i<Pixel_Number;i++)
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.show();
return; //albo break; - zamiast sprawdzac dwa warunki aktywacji tej sekcji kodu i wylaczena nastepnych, skoro nastepne i tak sie nie wydaza, a na koncu funkcji nie ma juz nic ciekawego do zrobienia
}
RE: Odczyt z YF-S201 połączony z progress barem 2812B - Szałot - 03-10-2021
(03-10-2021, 15:11)kaczakat napisał(a): Może na początek ustal, czy w ogóle mogłyby świecić tym kodem, bo rozumiem, że wydruk wartości sugeruje, że jakieś świecenie być powinno, przetestuj inny czy one w ogóle świecą albo tym wstawiając zamiast if(literperhour < 20 ) if(1) (i 0 w pozostałe, by nie mieszać) po kolei w każdy warunek.
A z innej beczki:
else if(literperhour <20 ) // i potem <40, <60 tylko trzeba zaczac od najmniejszej albo odwrotnie zmieniajac tez znak >
{
strip.setPixelColor(0, strip.Color(0, 127, 0));
strip.setPixelColor(1, strip.Color(0, 127, 0));
for(int i=2;i<Pixel_Number;i++)
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.show();
return; //albo break; - zamiast sprawdzac dwa warunki aktywacji tej sekcji kodu i wylaczena nastepnych, skoro nastepne i tak sie nie wydaza, a na koncu funkcji nie ma juz nic ciekawego do zrobienia
}
Bardzo dziękuję za pomoc! Przetestowałem na najprostszym kodzie dla WS2812B i jak się okazało wlutowałem przewody z "drugiej strony" taśmy, kiedy DATA jest ukierunkowana.
RE: Odczyt z YF-S201 połączony z progress barem 2812B - kaczakat - 03-10-2021
Każda led ma data in i data out, oczywiście to tworzy ukierunkowanie.
|