• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Załączenie przekaźnika wg czasu RTC
#1
Witam wszystkich !

Mój sprzęt:
- Arduino Leonardo
- LCD Keypad Shield
- Przekaźnik (tradycyjny moduł z allegro, możliwość podnoszenia LOW/HIGH)
- RTC ZS-042
- Czujnik wilgotności gleby YL-38
- 2x Czujnik deszczu FC-37

Sprawa wygląda następująco:

Podlewanie (załączenie przekaźnika) realizowane jest na czas od 0 do 600 minut w zależności od zmierzonego poziomu wilgotności gleby, i rozłączane jest na czas 30 minut w przypadku gdy:
- zabrakło wody w studni (rozłączył się włącznik pływakowy zamontowany 30 cm nad koszem ssawnym pompy), po 30 minutach podlewanie jest wznawiane na brakującą ilość minut, - zaczął padać deszcz (dwie czujki opadu deszczu są muszą być mokre, jeżeli jest tylko jedna mokra to ignoruje odczyt).
 
Jeżeli czujki są mokre po 60 min od pierwszego zmoczenia kolejne podlewanie następnego dnia, jeżeli natomiast czujki są suche po 60 min od zmoczenia wznawia podlewanie o brakującą ilość minut.
Podlewanie rozpoczyna się codziennie o godzinie 20:00 i trwa określoną ilość minut w zależności od zmierzonej wilgotności gleby o godzinie 20:00.

Startowa tabela:
Wilgotność 10%lub mniej = 600 minut podlewania
Wilgotność 10%-20%= 540 minut podlewania
Wilgotność 20%-40%= 480 minut podlewania
Wilgotność 40%-60%= 240 minut podlewania
Wilgotność 60%-80%= 120 minut podlewania
Wilgotność 80%-90%= 60 minut podlewania
Wilgotność powyżej 90% = brak podlewania
 
Wyświetlacz pokazuje:
1. Godzinę z RTC - w górnym rzędzie wyświetlacza
2. Czas ostatniego podlewania w minutach oraz aktualną wilgotność gleby w dolnym rzędzie (odczyt wilgotności co 60 sekund, uśrednione 3 ostatnie pomiary dla pewniejszego odczytu).

Chodzi jak na razie zegar RTC, pomiar wilgotności gleby oraz pomiar opadu deszczu (pada/nie pada)

Aktualny kod:
Kod:
#include <RTClib.h>
#include <DS3231.h>
#include <LiquidCrystal.h>
#include <Wire.h>

DS3231 clock;
RTCDateTime dt;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int relay = A2;

int relaystate = LOW;
unsigned long previousMillis = 0;
unsigned long currentMillis;
long OnTime = 1000000;
long OffTime = 1000000;

void setup()
{
 Wire.begin();
 delay(1000);
 lcd.begin(16, 2);
 lcd.setCursor(0, 0);
 lcd.clear();
 clock.begin();
 pinMode (relay, OUTPUT);
 //clock.setDateTime(__DATE__, __TIME__);
}

void loop()
{
 ZEGAR();
 WILGOTNOSC_STERUJ();
 delay(1000);
}

void WILGOTNOSC_STERUJ()
{
 int odliczanie_start = 0;
 int sensor_wilgotnosc = analogRead(A5);
 int poziom_wilgotnosc = map(sensor_wilgotnosc, 1023, 0, 0, 100);
 Serial.println(poziom_wilgotnosc);

 if (dt.hour >= 20)
 {

   if (poziom_wilgotnosc >= 90)
   {
   }
   if (poziom_wilgotnosc >= 80 && poziom_wilgotnosc < 90)
   {
   }
   if (poziom_wilgotnosc >= 60 && poziom_wilgotnosc < 80)
   {
   }
   if (poziom_wilgotnosc >= 40 && poziom_wilgotnosc < 60)
   {
     unsigned long currentMillis = millis();
     Serial.println(currentMillis);

     if ((relaystate == HIGH) && (currentMillis - previousMillis >= OnTime))
     {
       relaystate = LOW;
       previousMillis = currentMillis;
       digitalWrite(relay, relaystate);
     }
     else if ((relaystate == LOW) && (currentMillis - previousMillis >= OffTime))
     {
       relaystate = HIGH;
       previousMillis = currentMillis;
       digitalWrite(relay, relaystate);
     }
   }
   if (poziom_wilgotnosc >= 20 && poziom_wilgotnosc < 40)
   {
   }
   if (poziom_wilgotnosc >= 10 && poziom_wilgotnosc < 20)
   {
   }
   if (poziom_wilgotnosc < 10)
   {
   }
 }
}

void ZEGAR ()
{
 dt = clock.getDateTime();
 if (dt.day >= 0 && dt.day <= 9) {
   lcd.setCursor(0, 0);
   lcd.print("0");
   lcd.setCursor(1, 0);
   lcd.print(dt.day);
 }
 if (dt.day >= 10 && dt.day <= 31) {
   lcd.setCursor(0, 0);
   lcd.print(dt.day);
 }
 lcd.setCursor(2, 0);
 lcd.print("/");
 if (dt.month >= 0 && dt.month <= 9) {
   lcd.setCursor(3, 0);
   lcd.print("0");
   lcd.setCursor(4, 0);
   lcd.print(dt.month);
 }
 if (dt.month >= 10 && dt.month <= 12) {
   lcd.setCursor(3, 0);
   lcd.print(dt.month);
 }
 if (dt.hour >= 10 && dt.hour <= 24) {
   lcd.setCursor(8, 0);
   lcd.print(dt.hour);
 }
 if (dt.hour >= 0 && dt.hour <= 9) {
   lcd.setCursor(8, 0);
   lcd.print("0");
   lcd.setCursor(9, 0);
   lcd.print(dt.hour);
 }
 lcd.setCursor(10, 0);
 lcd.print(":");
 if (dt.minute >= 10 && dt.minute <= 59) {
   lcd.setCursor(11, 0);
   lcd.print(dt.minute);
 }
 if (dt.minute >= 0 && dt.minute <= 9) {
   lcd.setCursor(11, 0);
   lcd.print("0");
   lcd.setCursor(12, 0);
   lcd.print(dt.minute);
 }
 lcd.setCursor(13, 0);
 lcd.print(":");
 if (dt.second >= 10 && dt.second <= 59) {
   lcd.setCursor(14, 0);
   lcd.print(dt.second);
 }
 if (dt.second >= 0 && dt.second <= 9) {
   lcd.setCursor(14, 0);
   lcd.print("0");
   lcd.setCursor(15, 0);
   lcd.print(dt.second);
 }
}

/*
   int sensorReading1 = analogRead(A4);
   int range = map(sensorReading1, sensorMin, sensorMax, 0, 3);

   switch (range) {
     case 0:
       lcd.setCursor(0, 1);
       lcd.print("Zalewa");
       lcd.setCursor(7, 1);
       lcd.print(" ");
       break;
     case 1:
       lcd.setCursor(0, 1);
       lcd.print("Pada");
       lcd.setCursor(4, 1);
       lcd.print("   ");
       break;
     case 2:
       lcd.setCursor(0, 1);
       lcd.print("Sucho");
       lcd.setCursor(5, 1);
       lcd.print("  ");
       break;
   }*/

Problem:

Zatrzymałem się w miejscu w którym należy odczytać z RTC godzinę 20:00 po czym w zależności od wilgotności gleby uruchomić przekaźnik na daną ilość minut po czym wyłączyć i czekać na dalsze polecenia. 

Za wszelką pomoc, udział w moim wątku - dziękuję.

Pozdrawiam,
Jakub


Załączone pliki Miniatury
   
 
Odpowiedź
  


Wiadomości w tym wątku
Załączenie przekaźnika wg czasu RTC - przez Lvsky - 27-07-2016, 21:06

Skocz do:


Przeglądający: 1 gości