• 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ź
#2
Pomoże ktoś ? Smile
 
Odpowiedź
#3
(31-07-2016, 22:41)Lvsky napisał(a): Pomoże ktoś ? Smile

Witam ma coś podobnego lecz do terarium sterowanie przekażnikami - diodami i wytwornicą mgły czas pobiera z DS3231 rtc może pomogłem ,wszystko opisane w codzie
Kod:
#include <Wire.h>

#include <DS3231.h>

#include <Adafruit_ILI9341.h>

#include <EEPROM.h>

#include <TimerOne.h>
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

// For the Adafruit shield, these are the default.
#define TFT_RST 8
#define TFT_DC 9
#define TFT_CS 10

#define TFT_MISO 50
#define TFT_MOSI 51
#define TFT_SCK 52


// Colors for fonts
const uint16_t BLACK = 0x0000;
const uint16_t GREY = 0x7AEF;
const uint16_t BLUE = 0x001F;
const uint16_t RED = 0xF800;
const uint16_t GREEN = 0x07E0;
const uint16_t CYAN = 0x07FF;
const uint16_t MAGENTA = 0xF81F;
const uint16_t YELLOW = 0xFFE0;
const uint16_t WHITE = 0xFFFF;

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
      DS3231 clock;
RTCDateTime dt;
#include <dht.h>

dht DHT;

#define DHT11_PIN 2

#define RELAY1  A0                //przekaźniki 1        
#define RELAY2  A1                              2
#define RELAY3  A2                              3
#define RELAY4  A3                              4

float temperatura_zadana=23;
float wilgotnosc_zadana=75;



void setup() {
 
 
 tft.begin();
 tft.fillScreen(BLACK);
 tft.setRotation(1);
 tft.fillScreen(ILI9341_BLACK);
 clock.begin();
  pinMode(RELAY1, OUTPUT);    // definicja przekaźników 1  
  pinMode(RELAY2, OUTPUT);                              2
  pinMode(RELAY3, OUTPUT);                              3
  pinMode(RELAY4, OUTPUT);                              4
 
   }
 
 
void loop(void) {
 
 
   
   
   
 tft.setTextSize(1);     
 tft.setCursor(1,20);
 tft.println(".....................................................");
 
 

 
 tft.setTextSize(1);
 tft.setTextColor(ILI9341_WHITE,ILI9341_BLACK);    
 tft.setCursor(1,60);
 tft.println("....................................................");
 
 
 
int chk = DHT.read11(DHT11_PIN);
 tft.setTextSize(3);
 tft.setCursor(5, 35);
 tft.setTextColor(ILI9341_RED, ILI9341_BLACK);
 tft.print(" Temp *C= ");
 tft.println(DHT.temperature);
 
 tft.setTextSize(3);
 tft.setCursor(5, 75);
 tft.setTextColor(ILI9341_BLUE, ILI9341_BLACK);
 
 
 tft.print(" Wilg  %= ");
 tft.println(DHT.humidity);
 delay(250);
 
 tft.setTextSize(1);
 tft.setTextColor(ILI9341_WHITE,ILI9341_BLACK);    
 tft.setCursor(1,100);
 tft.println("....................................................");
 
 tft.setTextSize(1);     
 tft.setCursor(1,200);
 tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
 tft.println(".....................................................");
 
 tft.setTextSize(2);
 tft.setCursor(2, 1);
 tft.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);
 
 tft.print("Temp*C");
 tft.setTextSize(2);
 tft.setCursor(170, 2);
 
 
 tft.setTextColor(0x7E0); // Green
 tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);
 tft.setTextSize(2);
 tft.print(clock.readTemperature());
 
 tft.setTextSize(2);
 tft.setCursor(0, 215);
 tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
 tft.print(" ");
 
  dt = clock.getDateTime(); // pobiera czas z zegara
 tft.print("");
 tft.print(dt.year);tft.print("-");
 tft.print(dt.month);  tft.print("-");
 tft.print(dt.day);    tft.print(" ");
 tft.print(dt.hour);   tft.print(":");
 tft.print(dt.minute); tft.print(":");
 tft.print(dt.second); tft.println(" ");
 
 // regulacja temperatury
 if(DHT.temperature >=22);{
   digitalWrite(RELAY4,HIGH);//załączenie wentylatora
 }
 if(DHT.temperature +1 <=22);{
   digitalWrite(RELAY4,LOW);
 }
 
 
 //regulacja mgły
 if(DHT.humidity >=75){
   
 }
   if(DHT.humidity -5 >=75) { //mgła  ON
   digitalWrite(RELAY3,LOW);
   
   }
   
   if(DHT.humidity +2 <=75) { //mgła  OFF
   digitalWrite(RELAY3,HIGH);
 }
 
 
 
 if(dt.hour==07 && dt.minute==00){                             //tu ustawiamy czas włączenia przekaźnika
 digitalWrite(RELAY1, HIGH); // LED CiepłeB podświetlanie ON
 }
 if(dt.hour==19 && dt.minute==00){
 digitalWrite(RELAY1, LOW); // LED CiepłeB podświetlanie  OFF
 }
 if(dt.hour==19 && dt.minute==00){
 digitalWrite(RELAY2, HIGH); // LED RED podświetlanie czerwone on
 }
 if(dt.hour==00 && dt.minute==00){
 digitalWrite(RELAY2, LOW); // LED RED podświetlanie czerwone off
 }
 
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości