Skocz do zawartości

Problem z czujnikiem przepływu YF-S402


Pomocna odpowiedź

Napisano (edytowany)

Dzień dobry,

Piszę w sprawie małego układu, nad którym pracuję. Zasada działania ma być taka: czujnik przepływu cieczy YF-S402 ma wysyłać sygnał (nie interesuje mnie dokładna wartość tylko fakt, że coś przepływa) do mikrokontrolera. W momencie otrzymania sygnału z czujnika program powinien włączyć przekaźnik i buzzer (póki co w prototypie jest dioda LED niebieska i żółta). Po zatrzymaniu przepływu mikrokontroler ma wrócić do stanu początkowego (wyłączyć przekaźnik i buzzer). Dodam tylko, że nie jestem super obeznany z programowaniem, ale póki co poczyniłem coś takiego:

//Program jest wgrywany przy pomocy ArduinoUno oraz "programatora" DIY na ATTiny45-20PU

#include <avr/wdt.h>

#define PRZEKAZNIK 0 //W obwodzie dioda LED niebieska
#define BUZZER 1     //W obwodzie dioda LED żółta
#define flowsensor A1 //Czujnik przepływu cieczy YF-S402
int czujnik;

void setup() {
  wdt_disable();                 //Wyłącz WatchDog
  pinMode(PRZEKAZNIK, OUTPUT);   
  pinMode(BUZZER, OUTPUT);
  pinMode(flowsensor, INPUT);

}

void loop() {
  czujnik=analogRead(flowsensor); //Zbierz informację z pinu A1 Arduino (ATTiny pin 7)

  //135 - 2700 - zakres impulsów czujnika od 0,3 l/h do 6 l/h
  
  if (czujnik > 2) //Załącz w momencie, gdy przepływ będzie większy od 2V z czujnika
{
    digitalWrite(PRZEKAZNIK, HIGH);
    digitalWrite (BUZZER, HIGH);
    delay(10); }
  else
{
    digitalWrite(PRZEKAZNIK, LOW);
    digitalWrite(BUZZER, LOW); 
    delay(10); }
}

Linijka z WD jest tam dlatego, że program jest wgrywany na ATTiny 45-20PU (wgrywam program (jak i bootloader) przez Arduino przez prosty programator DIY) i miałem problem z migającą ciągle diodą na pinie 0 Arduino (pin 5 ATTiny).

Mój problem polega na tym, że o ile diody zapalają się, gdy czujnik jest w ruchu o tyle migają dosyć szybko i nie mogę uzyskać efektu ciągłego świecenia. Dodatkowo po zatrzymaniu czujnika czasami gasną, a czasami nie.

Szczerze mówiąc nie mam już za bardzo pomysłu (chociaż przypadek wydaje się prosty, tylko nie umiem na to chyba "wpaść" z braku wiedzy 😉 ). Prosiłbym o jakieś sugestie jak to można naprawić (ew. czy w ogóle dobrze podszedłem do tematu z kodem).

Dodam, że "programator" ma kondensator 10uF między GND i Resetem Arduino podczas wgrywania.

W razie czego wstawiam też mojego pająka na płytce prototypowej (rezystory do LED mają po 1kΩ, rezystor między Reset a VCC ma 47kΩ, kondensator 10nF, dodatkowo, czego nie ma na obrazku, jest jeszcze rezystor 10kΩ między sygnałem (żółty kabelek) z czujnika a VCC- wg zaleceń producenta) :

76782587_UntitledSketch2_bb.thumb.jpg.cf9b7aa3fb0c212319a0a807ada542f4.jpg

Z góry dziękuję bardzo za odpowiedzi.

Pozdrawiam serdecznie!

Edytowano przez Scorpo
(edytowany)

Ale to jest czujnik dajacy napiecie na wyjsciu? Czy czujnik hallotronowy? Jesli to drugie to pasowalo by do twojego problemu...rowniez raz gasnace a raz nie ledy tez pasuja...ogolnie kod wporzadku...sprawdz za pomoca seriala co tam uzyskujesz na tym pinie analogowym, dopiero wtedy cos mozna doradzic

Edytowano przez farmaceuta
(edytowany)

To jest czujnik hallotronowy. Generalnie udało mi się chyba rozwiązać problem (szukam rozwiązania od wczoraj i chwilę po napisaniu postu chyba znalazłem rozwiązanie 😄 ). Przerobiłem kod następująco:

//Program jest wgrywany przy pomocy ArduinoUno oraz "programatora" DIY na ATTiny45-20PU

#include <avr/wdt.h>

#define PRZEKAZNIK 0 //W obwodzie dioda LED niebieska
#define BUZZER 1     //W obwodzie dioda LED żółta
#define flowsensor A1 //Czujnik przepływu cieczy YF-S402
int czujnik=0;

void setup() {
  wdt_disable();                 //Wyłącz WatchDog
  pinMode(PRZEKAZNIK, OUTPUT);   
  pinMode(BUZZER, OUTPUT);
  pinMode(flowsensor, INPUT);

}

void loop() {
  czujnik=analogRead(flowsensor); //Zbierz informację z pinu A1 Arduino (ATTiny pin 7)
  
  if (czujnik > 2)
{
    digitalWrite(PRZEKAZNIK, HIGH);
    digitalWrite (BUZZER, HIGH);
    delay(czujnik); }            //Zmieniłem czas przerwy zależny od czujnika
  else
{
    digitalWrite(PRZEKAZNIK, LOW);
    digitalWrite(BUZZER, LOW); 
    delay(czujnik); }            //Tu podobnie jak wyżej
}

I uzyskałem efekt, że diody zapalają (światłem ciągłym) się w momencie gdy dmuchnę w czujnik. Jak przestaje się kręcić to gasną.

Została w sumie jedna rzecz- w momencie gdy czujnik jest zatrzymany diody się nie świecą. Jednak gdy wezmę go w rękę i lekko pochylę (słychać jak wirnik w środku się "obija") diody się zapalają (mimo tego, że nie dmuchałem w czujnik) i nie chcą już zgasnąć. Pomaga dopiero przedmuchanie czujnika. Czym to może być spowodowane?

 

Edytowano przez Scorpo
(edytowany)

Jak hallotron to nie uzywaz analogRead a zwyklego digitalRead bo czytasz stan a nie wartosc analogowa...kolejna sprawa to taka ze czujnik moze sie zatrzymac na stanie LOW lub HIGH, wiec trzeba sprawdzac czy czujnik sie juz zatrzymal i zgadic led bez znaczenia czy masz 0 czy 1... 

Edytowano przez farmaceuta

Dzięki za odpowiedź. Po lekkim przerobieniu wygląda to tak:

 

//Program jest wgrywany przy pomocy ArduinoUno oraz "programatora" DIY na ATTiny45-20PU

#include <avr/wdt.h>

#define PRZEKAZNIK 0 //W obwodzie dioda LED niebieska
#define BUZZER 1     //W obwodzie dioda LED żółta
#define flowsensor 2 //Czujnik przepływu cieczy YF-S402
int czujnik=0;

void setup() {
  wdt_disable();                 //Wyłącz WatchDog
  pinMode(PRZEKAZNIK, OUTPUT);   
  pinMode(BUZZER, OUTPUT);
  pinMode(flowsensor, INPUT);

}

void loop() {
  czujnik=digitalRead(flowsensor); //Zbierz informację z pinu 2 Arduino (ATTiny pin 7)
  
  if (czujnik == HIGH && czujnik>0)
{
    digitalWrite(PRZEKAZNIK, HIGH);
    digitalWrite (BUZZER, HIGH);
    delay(czujnik); }
  else
{
    digitalWrite(PRZEKAZNIK, LOW);
    digitalWrite(BUZZER, LOW); 
    delay(czujnik); }   
}

Po przerobieniu nadal mam ten sam problem- diody raz gasną a raz świecą po zatrzymaniu czujnika. Nie wpadłem na inny pomysł jak można by te diody zgasić (to co pisałeś w odpowiedzi). Masz może jakąś radę?

Dodatkowo tak jak wcześniej diody świeciły ciągłym światłem (przy poprzednim kodzie), tak teraz mrugają w zależności od szybkości przepływu.

Pozdrawiam serdecznie

#include <avr/wdt.h>

#define PRZEKAZNIK 0 //W obwodzie dioda LED niebieska
#define BUZZER 1     //W obwodzie dioda LED żółta
#define flowsensor 2 //Czujnik przepływu cieczy YF-S402

bool czujnik = 0;
bool czujnik1 = 0;
bool stan = 0;

void setup() {
  wdt_disable();                 //Wyłącz WatchDog
  pinMode(PRZEKAZNIK, OUTPUT);   
  pinMode(BUZZER, OUTPUT);
  pinMode(flowsensor, INPUT);
  
  czujnik = digitalRead(flowsensor);
  czujnik1 = czujnik;

}

void loop() {
    czujnik=digitalRead(flowsensor); //Zbierz informację z pinu 2 Arduino (ATTiny pin 7)
  
  if (czujnik != czujnik1) {
    digitalWrite(PRZEKAZNIK, HIGH);
    digitalWrite (BUZZER, HIGH);
    czas = millis();
    czujnik1 = czujnik;
    stan = 1;
  }

  if (millis() - czas > 500UL && stan == 1) {
    digitalWrite(PRZEKAZNIK, LOW);
    digitalWrite(BUZZER, LOW); 
    stan = 0;
  }   
}

Teoretycznie powinno dzialac, choc doskonalosci temu kodowi nie da sie zarzucic...lepiej bylo by liczyc ilosc impulsow w stalym interwale,  wtedy wiadomo jaki przeplyw a nie tylko czy plynie, czy nie...no ale o to Ci cgodzilo poki co..

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...