• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Odczyt z YF-S201 połączony z progress barem 2812B
#1
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!
 
Odpowiedź
#2
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
}
 
Odpowiedź
#3
(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.
 
Odpowiedź
#4
Każda led ma data in i data out, oczywiście to tworzy ukierunkowanie.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości