Zaloguje się
or
Tel +48 698615740

Kontrola wilgotności gleby wraz z kontrolą wody w zbiorniku

17 stycznia, 2022

W tym artykule przedstawimy układ realizujący pomiar wilgotności gleby z funkcją weryfikacji występowania wody w zbiorniku. Dodatkowo do układu podłączymy potencjometr dający możliwość regulacji minimalnego progu wilgotności.

Spis treści

  • Krótki opis
  • Specyfikacja
  • Kod programu
  • Pliki źródłowe

Krótki opis

Główną ideą projektu jest możliwość kontroli wilgotności gleby w doniczce. Zastosowany w układzie pływak pozwala na kontrolowanie w naczyniu ilości wody służącej do podlewania kwiatka. Na potrzeby projektu do układu zostały podłączone cztery diody informujące odpowiednio o stanie wody oraz prawidłowości poziomu wilgotności gleby.

Specyfikacja

Użyte elementy
  • Płytka arduino leonardo
  • Pływak
  • Czujnik wilgotności gleby CSMS v1.2
  • Potencjometr B50K
  • 4 diody LED (2 zielone, 2 czerwone)
  • 4 rezystory 230 Ω
  • 2 szybkozłącza
  • 15 kabli typu męsko-męskich
  • Płytka stykowa
Schemat podłączenia układu

Kod programu

Początkowo  definiujemy wszystkie zmienne potrzebne do poprawnego działania naszego programu. Przypisanie do odpowiednich pinów nazw odpowiadających za ich działanie nie jest koniecznie, natomiast znacznie poprawi czytelność kodu.

/* Przypisanie nazw do odpowiednich pinów */
#define brak_wody 9 
#define jest_woda 10
#define poprawna_wilgotnosc 11
#define zla_wilgotnosc 12
int wartosc_potencjometr = 0; // Zdefiniowanie zmiennej przetrzymującej wartość z przetwornika A/C dla potencjometru
int wartosc_wilgotnosc = 0; // Zdefiniowanie zmiennej przetrzymującej wartość z przetwornika A/C dla czujnika wilgotności 
int wartosc_plywak = 0; // Zdefiniowanie zmiennej przetrzymującej wartość z przetwornika A/C dla pływaka

Zasada działania funkcji map()  jest bardzo prosta. Jako pierwszy argument przyjmuje wartość którą chcemy skonwertować na odpowiedną wartość procentową. Kolejno ustalamy dolną i górną granicę zakresu liczbowego na jakim będziemy operować. Pozostałe dwa argumenty funkcji odpowiadają kolejno dolnej i górnej wartości procentowej, jakie chcemy przypisać do naszych granic liczbowych. W tym przykładzie dolną granicą jest 1023 co odpowiada wartości 0%, a górną granicą  jest 0 co odpowiada 100 %. Zastosowanie takiego rozwiązania pozwala na bardziej intuicyjne korzystanie z potencjometru. Przekręcając go w prawą stronę zmniejszamy wartość napięcia, więc chcąc uzyskać dodatnie zmiany wartości procentowej w prawą stronę, musimy zastosować taką zamianę.

int zamiana_na_procenty(int wartosc) // Funkcja zwracająca otrzymaną wartość w procentach
{
  int procenty = map(wartosc, 1023, 0, 0, 100); // Zamiana wartości liczbowej na odpowiadającą jej wartość w procentach
  return procenty;
}

Poniższa funkcja sprawdza czy procentowa wartość wilgotności gleby jest mniejsza czy większa od procentowej wartości ustawionej na potencjometrze. Jeżeli jest mniejsza, to sygnalizujemy to poprzez zapalenie czerwonej diody. W przeciwnym wypadku dioda czerwona jest zgaszona, a zapalana jest zielona.

void sprawdzanie_poziomu_wilgotnosci (int procent_wilgotnosc, int procent_potencjometr) // Funkcja zapalająca i gasząca odpowiednie diody dla czujnika wilgotności
{
   if(procent_wilgotnosc<procent_potencjometr) // Warunek sprawdzający, czy aktualna wartość procentowa wilgotności gleby jest mniejsza od ustawionej wartości procentowej za pomocą potencjometru
  {
  digitalWrite(poprawna_wilgotnosc, LOW); // Wyłączenie diody zielonej dla czujnika wilgotności
  digitalWrite(zla_wilgotnosc, HIGH); // Włączenie diody czerwonej dla czujnika wilgotności
  }
  else
  {
  digitalWrite(poprawna_wilgotnosc, HIGH); // Włączenie diody zielonej dla czujnika wilgotności
  digitalWrite(zla_wilgotnosc, LOW); // Wyłączenie diody czerwonej dla czujnika wilgotności
  }
}

Funkcja sprawdzająca obecność diody działa analogicznie do tej omawianej powyżej. Weryfikacja obecności wody opiera się na sprawdzeniu, czy wartość napięcia na pinie A2 przetwornika jest większa od 0.

void sprawdzanie_obecnosci_wody (int wartosc_plywak) // Funkcja zapalająca i gasząca odpowiednie diody dla pływaka
{
   if(wartosc_plywak>0) // Warunek sprawdzający czy pojawia się jakiekolwiek napięcie na pinie A2 przetwornika A/C dla pływaka
  {
    digitalWrite(jest_woda, HIGH); // Włączenie diody zielonej dla pływaka
    digitalWrite(brak_wody, LOW); // Wyłączenie diody zielonej dla pływaka
  }
  else
  {
    digitalWrite(jest_woda, LOW); // Wyłączenie diody zielonej dla pływaka
    digitalWrite(brak_wody, HIGH); // Włączenie diody zielonej dla pływaka
  }
}

Wewnątrz metody wykonującej się po starcie mikrokontrolera uruchamiamy komunikację szeregową oraz ustawiamy tryb wyjściowy dla każdej użytej diody.

void setup() {
  Serial.begin(9600); // Uruchomienie komunikacji szeregowej
  pinMode(brak_wody, OUTPUT); // Ustawienie pinu diody czerwonej pływaka jako wyjście
  pinMode(jest_woda, OUTPUT); // Ustawienie pinu diody zielonej pływaka jako wyjście
  pinMode(poprawna_wilgotnosc, OUTPUT); // Ustawienie pinu diody zielonej czujnika wilgotności jako wyjście
  pinMode(zla_wilgotnosc, OUTPUT); // Ustawienie pinu diody czerwonej czujnika wilgotności jako wyjście

}

Nieskończona pętla programu na początku przypisuje do odpowiednich zmiennych wartości odczytane z przetworników. Następnie wywoływane są obie funkcje sprawdzające, a na końcu czekamy 100 ms aby znowu wrócić na początek pętli.

void loop() {
  wartosc_potencjometr = analogRead(A0); // Przypisanie do zmiennej wartosc_potencjometr wartości odczytanej z przetwornika A/C na pinie A0
  wartosc_wilgotnosc = analogRead(A1); // Przypisanie do zmiennej wartosc_wilgotnosc wartości odczytanej z przetwornika A/C na pinie A1
  wartosc_plywak = analogRead(A2); // Przypisanie do zmiennej wartosc_plywak wartości odczytanej z przetwornika A/C na pinie A2
  sprawdzanie_poziomu_wilgotnosci(zamiana_na_procenty(wartosc_potencjometr),zamiana_na_procenty(wartosc_wilgotnosc)); // Wywołanie funkcji sprawdzającej poziom wilgotności z argumentami w formie zamienionych na procenty wartości z przetwornika dla czujnika wilgotności i potencjometru
  sprawdzanie_obecnosci_wody(wartosc_plywak); // Wywołanie funkcji sprawdzającej obecność wody w zbiorniku
  delay(100); // Czekamy 100 ms
}

Pliki źródłowe

Sticky
Możliwość komentowania Kontrola wilgotności gleby wraz z kontrolą wody w zbiorniku została wyłączona
Mateusz Pacia

Mateusz Pacia

Skończyłem studia na politechnice Wrocławskiej na kierunku Mechatronika. Zajmuje się tworzeniem i programowaniem układów z wykorzystaniem mikrokontrolerów STM32 i Arduino. W wolnych chwilach programuje w języku PHP i Java.

Comments are closed.

Strona korzysta z plików cookies w celu realizacji usługi i zgodnie z Polityką Plików Cookies. Możesz określić warunki przechowywania lub dostępu do plików cookies w Twojej przeglądarce.