Skocz do zawartości

Moduł sprawdzający poziom wody w piwnicy


Pomocna odpowiedź

Napisano

Witam, zrobiłem sobie taki mały projekcik potrzebny z racji dużej ilości wody w piwnicy.

Projekt zakłada mierzenie ilości wody od zera do 8 cm i następnie uruchomienie pompy.

Zastosowałem czujnik odbiciowy oraz przekaźnik. do tego dodałem sobie 8 diód LED, które pokazują poziom wody.

Napisałem taki kod... niestety nie mam doświadczenia z rejestrem przesuwnym i jest co jest. Niby wszystko działa ale proszę o konsultację.

#define trigPin 12
#define echoPin 11
int ledustawienie = 13;
int diodapompa = 10;
int pompaONOFF = 2; //pompa ON/OFF

int dodaj = 1;
int sucho = 30;
int woda = 21;
int ustawienie = 31;
int miarkajeden = 29;
int miarkadwa = 28;
int miarkatrzy = 27;
int miarkacztery = 26;
int miarkapiec = 25;
int miarkaszesc = 24;
int miarkasiedem = 23;
int miarkaosiem = 22;


int latchPin = 7;
int clockPin = 4;
int dataPin = 6;
byte data = 0; 
int currentLED = 0;

int buttonStatus=HIGH;
const int button = 8; //klawisz ręcznego odpalania pompy


void setup() {
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
 pinMode(echoPin, INPUT); //a echo, jako wejście
pinMode(pompaONOFF, OUTPUT); //pompa się uruchmia
pinMode(diodapompa, OUTPUT);  
pinMode(ledustawienie, OUTPUT);

 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);

  digitalWrite(button, HIGH); // wewnetrzny rezystor podciagajacy
}

void loop() { 
 Serial.print(zmierzOdleglosc());
 Serial.println(" cm");
 delay(300);

 buttonStatus=digitalRead(button);
 if (HIGH==buttonStatus) {




 if (zmierzOdleglosc() <= woda) {
   digitalWrite(pompaONOFF, HIGH);
   digitalWrite(diodapompa, HIGH);

 } else {
   if (zmierzOdleglosc() >= sucho){
     digitalWrite(pompaONOFF, LOW);
     digitalWrite(diodapompa, LOW);
     } 
     }

if (zmierzOdleglosc() == ustawienie) {
   digitalWrite(ledustawienie, HIGH);
   } else {
     digitalWrite(ledustawienie, LOW);;
     }


if (zmierzOdleglosc() >= woda) {
if (zmierzOdleglosc() == miarkajeden) {
    digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST, 1);
 digitalWrite(latchPin, HIGH);
   } 


if (zmierzOdleglosc() == miarkadwa) {
    digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST, 3);
 digitalWrite(latchPin, HIGH);
   }

    if (zmierzOdleglosc() == miarkatrzy) {
    digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST, 7);
 digitalWrite(latchPin, HIGH);
   }

        if (zmierzOdleglosc() == miarkacztery) {
    digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST, 15);
 digitalWrite(latchPin, HIGH);
   }

        if (zmierzOdleglosc() == miarkapiec) {
    digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST, 31);
 digitalWrite(latchPin, HIGH);
   }

     if (zmierzOdleglosc() == miarkaszesc) {
    digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST, 63);
 digitalWrite(latchPin, HIGH);
   }

       if (zmierzOdleglosc() == miarkasiedem) {
    digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST, 127);
 digitalWrite(latchPin, HIGH);
   }

           if (zmierzOdleglosc() == miarkaosiem) {
    digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST, 255);
 digitalWrite(latchPin, HIGH);
   }

               if (zmierzOdleglosc() >= sucho) {
 digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST, 0);
 digitalWrite(latchPin, HIGH);

   }

} 
} else {
    digitalWrite(pompaONOFF, HIGH);
    digitalWrite(diodapompa, HIGH);
 }

}


int zmierzOdleglosc() {
 long czas, dystans;

 digitalWrite(trigPin, LOW);
 delayMicroseconds(5);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(20);
 digitalWrite(trigPin, LOW);

 czas = pulseIn(echoPin, HIGH);
 dystans = czas / 58;

 return dystans;
}


plytka-czujnika-pompa.jpg

plytka-czujnika-pompa2.jpg

__________

Komentarz dodany przez: Treker

Nie zgodzę się z Tobą.

Kod jest tragiczny - w loop wywołanie zmierzOdległość powinno być wykonane dokładnie jeden raz.

Ergo: tragedia 🙁

ok dzięki za odp 🙂 skoro tragiczny to tragiczny. pobawię się dalej z kodem skoro tragedia !! hehe

Może coś podsuniecie? nakierujecie gdzie czytać? a jak nie to powalczę sam lub zostawię "tragedię" bo działa mimo tragicznego programu 🙂

Schemat? jak go narysuję to podeślę. Ta płyta powstała w locie na podstawie arduino płytki podłączonej do płytki prototypowej.

Czy ten schemat może być taki prosty? pokazane połączenia z arduino? czy mam narysować taki prawdziwy schemat 🙂

Ej tam.

Coś w stylu

int odleglosc = zmierzOdleglosc();
If (odleglosc< nie_sienga_do_kolan) cośtam();

Bo jeśli funkcja zmierzOdległość będzie trwała dłużej, to zanim program sprawdzi czy jest mniejsza niż "sienga_do_wonsuf" to rzeczywisty poziom osiągnie wartość "utopiony".

A po co topić użytkownika;)

hehe dobre, na szczęście woda nachodzi w tempie 2-4 godzin by osiągnąć te 8 cm.

ale dzięki za tą podpowiedź.

Zrobiłem tak z Twoim kodem

#define trigPin 12
#define echoPin 11
int ledustawienie = 13;
int diodapompa = 10;
int pompaONOFF = 2; //pompa ON/OFF

int dodaj = 1;
int sucho = 30;
int woda = 21;
int ustawienie = 31;
int miarkajeden = 29;
int miarkadwa = 28;
int miarkatrzy = 27;
int miarkacztery = 26;
int miarkapiec = 25;
int miarkaszesc = 24;
int miarkasiedem = 23;
int miarkaosiem = 22;


int latchPin = 7;
int clockPin = 4;
int dataPin = 6;
byte data = 0; 
int currentLED = 0;

int buttonStatus=HIGH;
const int button = 8; //klawisz ręcznego odpalania pompy




void setup() {
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
 pinMode(echoPin, INPUT); //a echo, jako wejście
pinMode(pompaONOFF, OUTPUT); //pompa się uruchmia
pinMode(diodapompa, OUTPUT);  
pinMode(ledustawienie, OUTPUT);

 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);

  digitalWrite(button, HIGH); // wewnetrzny rezystor podciagajacy
}

void loop() { 
 Serial.print(zmierzOdleglosc());
 Serial.println(" cm");
 delay(300);


int odleglosc = zmierzOdleglosc();
if (odleglosc < sucho) digitalWrite(pompaONOFF, HIGH);
else digitalWrite(pompaONOFF, LOW);

}







int zmierzOdleglosc() {
 long czas, dystans;

 digitalWrite(trigPin, LOW);
 delayMicroseconds(5);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(20);
 digitalWrite(trigPin, LOW);

 czas = pulseIn(echoPin, HIGH);
 dystans = czas / 58;

 return dystans;
}

Działa ale nie tak jak chcę.

Założenie jest takie. poziom sucho czyli zero potem podnosi się ten poziom o 8 cm i dopiero odpala się przekaźnik z pompą i pompuje aż poziom znowu spadnie do 0 cm

Ja u siebie ustawiłem ten poziom zero "brak wody" na 30cm to jest odległość czujnika od posadzki.

w moim poprzednim kodzie ten fragment działał tak jak chciałem

  if (zmierzOdleglosc() <= woda) {
   digitalWrite(pompaONOFF, HIGH);
   digitalWrite(diodapompa, HIGH);

 } else {
   if (zmierzOdleglosc() >= sucho){
     digitalWrite(pompaONOFF, LOW);
     digitalWrite(diodapompa, LOW);
     } 
} else {
    digitalWrite(pompaONOFF, HIGH);
    digitalWrite(diodapompa, HIGH);
 }

dodatkowo w układzie mam dodany button, który pozwala uruchomić pompę w dowolnym momencie za nim system to zrobi. oczywiści wszystko wyłączy się jak dojdzie do poziomu zero sygnał z czujnika.

Jeśli ta część kodu też jest bezsensu to popracuję nad nią. Tak naprawdę w środku tego (kod na samym początku) umieściłem kod dotyczący rejestru przesuwnego i pokazywania poziomu wody co 1 cm na ośmiu diodach LED. Ten fragment mnie zastanawia czy można zrobić to ładniej, inaczej i tak by działał. Jak pisałem pierwszy raz bawię się rejestrem przesuwnym.

Ten Twój kawałek kodu przydał mi się w tym moim "tragicznym" kodzie do uruchamiania klawisza tylko wtedy gdy jest poziom wody po wyżej 0

Czyli teraz nie da się odpalić pompy przez przypadek jak nie ma wody. Super dodatek 🙂

Tak wygląda podłączenie na płytce prototypowej. Wiem że nie jest to schemat ideowy ale tylko chwilę miałem czasu by to zrobić i pokazać.

Przepraszam i proszę o wyrozumiałość.

IMG_5a8463579254f6640.jpg

tak wygląda projekt graficzny

IMG_5a84729a083901298.jpg

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