Skocz do zawartości

System wyrownywania poziomu wody w akwarium


Pomocna odpowiedź

Napisano (edytowany)

Witam.

Jestem tutaj nowy a to moj pierwszy post.

Buduje urzadzenie do automatycznego wyrownywania poziomiu wody w akwarium. Wykorzystuje do tego:

- Czujnik poziomu cieczy  RKI-2350

-Arduino MEGA 2560

-Przekaznik do zalaczania pompki

O ile polaczenie elektryczne nie jest dla mnie problemem to potrzebuje pomocy z kodem.

Na minimalnym poziomie wody uruchamia sie pompka na pinie 11 jednak wylacza sie tuz po chwili jak poziom wody wzrasta ponad minimum.

 

Tutaj jest moj kod:

void setup(){
  Serial.begin(9600);
  pinMode(11, OUTPUT);
}
void loop(){

  int sensor=analogRead(A1);
Serial.println(sensor);

   if(digitalRead (A1) == 200<630){
  digitalWrite(11, HIGH);
}  
else{
  digitalWrite(11, LOW);
  }
}

Moze mi ktos powiedziec, co mam tu zmienic?

Z gory dziekuje 😉

Edytowano przez Maks22

@Maks22 witam na forum 🙂

12 godzin temu, Maks22 napisał:

Na minimalnym poziomie wody uruchamia sie pompka na pinie 11 jednak wylacza sie tuz po chwili jak poziom wody wzrasta ponad minimum.

A jak chciałbyś, aby działało?

Co miał robić poniższy fragment kodu? Z góry podpowiem, że na pewno nie robi tego co miał robić, bo taka konstrukcja jest niepoprawna. Napisz co chciałeś uzyskać to naprowadzimy na rozwiązanie:

if(digitalRead (A1) == 200<630){

 

void setup(){
  Serial.begin(9600);
  pinMode(11, OUTPUT);
}
void loop(){

int sensor=analogRead(A1);        //dotad byla definicja wszystkiego
Serial.println(sensor);       

   if(analogRead(A1) <200){       //jesli poziom wody spadl do 200
  digitalWrite(11, HIGH);         //wlacz pompke na 10 sek.
     delay(10000);               
}  
else{
  digitalWrite(11, LOW);         //a jesli poziom nie spadl lub pompka dopompowala wody to nie rob nic
  }
}

ja bym napisal to w ten sposob

a tak poza tym, to po co ci do tego Arduino Mega 2560, Attiny jest 100 razy tańsze a też wystarczy, a tak masz niewykorzystany potencjał potwora jakim jest ardu mega 

Chyba że chcesz dorobić coś jeszcze?

Chętnie obejrzymy...  😉

A to niedobrze byś napisał.

Po co dwa razy czytasz A1, raz żeby wyświetlić a drugi raz aby użyć w programie?

Czemu jakiś delay a nie uczciwa histereza? Dlaczego 10 sekund?

 

(edytowany)

@ethanak A co ci przeszkadza delay? Ostatecznie to całkiem możliwy sposób, natomiast histereza... nie mogę nie przyznać ci racji bo w sumie mogłem tak zrobić. Jakoś tak nie wpadłem na to.

Wersja poprawiona kodu:

void setup(){
  Serial.begin(9600);
  pinMode(11, OUTPUT);
}
void loop(){

int sensor=analogRead(A1);        //dotad byla definicja wszystkiego     

  if(sensor <= 200 - 50){             //jesli poziom wody spadl o 50 lub wiecej ponizej 200
  digitalWrite(11, HIGH);         //wlacz pompke do czasu az poziom wzrośnie do 200
     Serial.println(sensor);      //wyswietl na serial monitorze (chociaz w sumie nie wiem po co to co chwile wyswietlac)           
}  
else{
  digitalWrite(11, LOW);          //a jesli poziom nie spadl lub pompka dopompowala wody to nie rob nic
  }
}

Może być? Kompilacja przebiegła pomyślnie.

Edytowano przez Gość

Będzie. Ten z pierwszego posta też będzie.

Oba będą działać źle (Twój lepiej, ale nie całkiem dobrze).

Zacznijmy jeszcze inaczej: pokazujesz początkującemu użytkownikowi kod, informując go że coś tam robi (w tym przypadku, że powyżej 200 pompka jest wyłączona). Pokaż dokładnie miejsce w kodzie, gdzie jest to sprawdzane.

Bo faktycznie, powyżej 200 pompka jest wyłączona. Powyżej 175 też. A nawet powyżej 1020.

(edytowany)

Ja bym zaś proponował sobie najpierw czujnik wyskalować, czyli zdjąć jego charakterystykę. Z tego co widzę to bardzo proste urządzonko, które zwraca... no właśnie co? Napięcie. prąd ? w jakim zakresie? 

Jak zdejmiesz sobie charakterystykę, to przynajmniej nie będziesz zgadywał wartości, no i będziesz wiedział jak, się to zachowuje, w warunkach eksploatacji.

Edytowano przez BlackJack
43 minuty temu, ethanak napisał:

Będzie. Ten z pierwszego posta też będzie.

Oba będą działać źle (Twój lepiej, ale nie całkiem dobrze).

Zacznijmy jeszcze inaczej: pokazujesz początkującemu użytkownikowi kod, informując go że coś tam robi (w tym przypadku, że powyżej 200 pompka jest wyłączona). Pokaż dokładnie miejsce w kodzie, gdzie jest to sprawdzane.

Bo faktycznie, powyżej 200 pompka jest wyłączona. Powyżej 175 też. A nawet powyżej 1020.

Mamy IF, które będzie załączać pompkę jeśli poziom spadnie poniżej 150. I teraz zauważyłem błąd, że zamiast dać jakieś sprawdzanie czy jest 200 to będzie cały czas oscylować wokół 150, a co za tym idzie pompka dostanie szału z włączaniem się i wyłączaniem. ZGADZA SIĘ?

czyli histerezy tak naprawdę nie ma

zaraz poprawię

(edytowany)
void setup(){
	pinMode(11, OUTPUT);
}
void loop(){
	while(analogRead(A1) > 150);
	digitalWrite(11, HIGH);
	while(analogRead(A1) < 200);
	digitalWrite(11, LOW); 
}

podpowiem że średniki za while są istotne 😉

Edytowano przez Chumanista

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