Skocz do zawartości

Problem z czujnikiem przepływu YF-S402


Scorpo

Pomocna odpowiedź

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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

Link do komentarza
Share on other sites

#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..

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.