Witam,
W układzie mam podłączone RTC i chciałbym aby jeden z pinów wyjściowych (np 6) zmieniał stan z niskiego na wysoki co x godzin, po czym wracał do stanu niskiego. Gdzie x będzie początkowo zdefiniowaną zmienną najchętniej typu int. Będzie to aktywowało przekaźnik z czasówką.
Czy ktoś może podpowiedzieć mi jak to zrobić, uwzględniając że zawsze liczy od 6 rano?
Zagadnienie dodatkowe, jak uzależnić żeby relayHeat działał tylko i wyłącznie gdy glight jest włączone?
Poniżej podaję cały kod gdyby był potrzebny.
Z góry dziękuję za pomoc.
W układzie mam podłączone RTC i chciałbym aby jeden z pinów wyjściowych (np 6) zmieniał stan z niskiego na wysoki co x godzin, po czym wracał do stanu niskiego. Gdzie x będzie początkowo zdefiniowaną zmienną najchętniej typu int. Będzie to aktywowało przekaźnik z czasówką.
Czy ktoś może podpowiedzieć mi jak to zrobić, uwzględniając że zawsze liczy od 6 rano?
Zagadnienie dodatkowe, jak uzależnić żeby relayHeat działał tylko i wyłącznie gdy glight jest włączone?
Poniżej podaję cały kod gdyby był potrzebny.
Z góry dziękuję za pomoc.
Kod:
#include <LCDWIKI_GUI.h> //Core graphics library
#include <LCDWIKI_KBV.h> //Hardware-specific library
#include <SPI.h>
#include <DHT.h>
#include <Wire.h>
#include "Sodaq_DS3231.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DS18B20.h>
LCDWIKI_KBV mylcd(ILI9486,40,38,39,-1,41);
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define relayGrowlight 2
#define relayWhitelight 3
#define relayHeat 4
#define relayFan 5
#define relayMist 6
#define relayWater 7
#define SENSOR_1 8
#define SENSOR_1_Type DHT22
#define SENSOR_2 9
#define SENSOR_2_Type DHT22
#define ONE_WIRE_BUS 10
int tempMin = 28;
int tempMax = 30;
int humMin = 60;
int humMax = 80;
int wlightOn_hour = 12;
int wlightOn_min = 0;
int wlightOff_hour = 20;
int wlightOff_min = 05;
int glightOn_hour = 6;
int glightOn_min = 30;
int glightOff_hour = 12;
int glightOff_min = 00;
float wlightOn = (60 * wlightOn_hour) + wlightOn_min;
float wlightOff = (60 * wlightOff_hour) + wlightOff_min;
float glightOn = (60 * glightOn_hour) + glightOn_min;
float glightOff = (60 * glightOff_hour) + glightOff_min;
float currentTime;
boolean glightVal, wlightVal, heatVal, fanVal, mistVal, waterVal;
boolean glightVal_tmp, wlightVal_tmp, heatVal_tmp, fanVal_tmp, mistVal_tmp, waterVal_tmp;
boolean light_1st = 0;
float hum1, temp1, hum1_tmp, temp1_tmp;
float hum2, temp2, hum2_tmp, temp2_tmp;
String tempState, humState, tempState_tmp, humState_tmp;
String dateString, timeString, dayString;
String dateStringTmp, timeStringTmp, dayStringTmp;
DHT dht_1(SENSOR_1, SENSOR_1_Type);
DHT dht_2(SENSOR_2, SENSOR_2_Type);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DS18B20 ds(10);
void setup(void)
{
mylcd.Init_LCD();
mylcd.Fill_Screen(BLACK);
dht_1.begin();
dht_2.begin();
rtc.begin();
Wire.begin();
pinMode(relayGrowlight, OUTPUT);
pinMode(relayWhitelight, OUTPUT);
pinMode(relayHeat, OUTPUT);
pinMode(relayFan, OUTPUT);
pinMode(relayMist, OUTPUT);
pinMode(relayWater, OUTPUT);
sensors.begin();
wlightVal_tmp = !(digitalRead(relayWhitelight));
glightVal_tmp = !(digitalRead(relayGrowlight));
heatVal_tmp = !(digitalRead(relayHeat));
fanVal_tmp = !(digitalRead(relayFan));
mistVal_tmp = !(digitalRead(relayMist));
waterVal_tmp = !(digitalRead(relayWater));
mylcd.Set_Rotation(1);
mylcd.Fill_Screen(BLACK);
mylcd.Set_Text_Mode(0);
mylcd.Set_Text_colour(WHITE);
mylcd.Set_Text_Back_colour(BLACK);
mylcd.Set_Text_Size(2);
mylcd.Print_String("Temp1:", 15, 10);
mylcd.Print_String("Wilg1:", 15, 30);
mylcd.Print_String("Temp2:", 15, 50);
mylcd.Print_String("Wilg2:", 15, 70);
mylcd.Print_String("RELAYS", 40, 120);
mylcd.Print_String("GrowLight:",15, 150);
mylcd.Print_String("WhiteLight:",15, 170);
mylcd.Print_String("Heat1:",15, 190);
mylcd.Print_String("Fan:",15, 210);
mylcd.Print_String("Mist:",15, 230);
mylcd.Print_String("Water:",15, 250);
}
void loop()
{
//while (ds.selectNext())
//uint8_t address[8];
//ds.getAddress(address);
// for (uint8_t i = 0; i < 8; i++);
ds.doConversion();
rtc.begin();
DateTime now = rtc.now(); //get the current date-time
currentTime = (60 * int(now.hour())) + int(now.minute());
hum1 = dht_1.readHumidity();
temp1 = dht_1.readTemperature();
hum2 = dht_2.readHumidity();
temp2 = ds.getTempC();
glightVal = digitalRead(relayGrowlight);
wlightVal = digitalRead(relayWhitelight);
heatVal = digitalRead(relayHeat);
fanVal = digitalRead(relayFan);
mistVal = digitalRead(relayMist);
waterVal = digitalRead(relayWater);
mylcd.Set_Text_colour(WHITE);
if (temp1 == temp1_tmp)
{
goto wilgotnosc;
}
else {
mylcd.Print_Number_Float(temp1,2,100,10,'.',5,' ');
temp1_tmp = temp1;
}
if (hum1 == hum1_tmp)
{
goto temperatura2;
}
else {
wilgotnosc:
mylcd.Print_Number_Float(hum1,2,100,30,'.',5,' ');
hum1_tmp = hum1;
}
temperatura2:
if (temp2 == temp2_tmp)
{
goto wilgotnosc2;
}
else {
mylcd.Print_Number_Float(temp2,2,100,50,'.',5,' ');
temp2_tmp = temp2;
}
wilgotnosc2:
if (hum2 == hum2_tmp)
{
goto data;
}
else {
mylcd.Print_String("", 100, 70);
mylcd.Print_Number_Float(hum2,2,100,70,'.',5,' ');
hum2_tmp = hum2;
}
data:
dayString = getDayOfWeek(now.dayOfWeek());
dateString = String(now.date()) + "/" + String(now.month()) + "/" + (String(now.year())).substring(2) + " "; //use substring to extract last two digits of the year (to save space)
if (now.minute() < 10)
{
timeString = String(now.hour()) + ":0" + String(now.minute()); //add "0" before 0-9 minutes
}
else {
timeString = String(now.hour()) + ":" + String(now.minute());
}
//Print out Day, Date and Time
if (dayString == dayStringTmp)
{
goto wysData;
}
else {
mylcd.Print_String(dayString, 250, 270);
dayStringTmp = dayString;
}
wysData:
if (dateString == dateStringTmp)
{
goto wysCzas;
}
else {
mylcd.Print_String(dateString,1, 270);
dateStringTmp = dateString;
}
wysCzas:
if (timeString == timeStringTmp)
{
goto relays;
}
else {
mylcd.Print_String(timeString,150, 270);
timeStringTmp = timeString;
}
relays:
mylcd.Print_String(relayState(glightVal),145, 150);
mylcd.Print_String(relayState(wlightVal),145, 170);
mylcd.Print_String(relayState(heatVal),145, 190);
mylcd.Print_String(relayState(fanVal),145, 210);
mylcd.Print_String(relayState(mistVal),145, 230);
mylcd.Print_String(relayState(waterVal),145, 250);
//Checking temperature
if (temp2 < tempMin)
{
tempState = "Low temperature ";
if (heatVal == 1)
{
digitalWrite(relayHeat, 0);
heatVal = 0;
}
}
else if (temp2 >= tempMax)
{
tempState = "High temperature";
if (heatVal == 0)
{
digitalWrite(relayHeat, 1);
heatVal = 1;
}
}
else {
tempState = "Temperature OK ";
}
if (heatVal == heatVal_tmp)
{
goto printState;
}
else
{
heatVal_tmp = heatVal;
}
printState:
if (tempState == tempState_tmp)
{
goto checkHum;
}
else
{
// mylcd.Print_String(tempState_tmp,125, 190);
if (tempState == "Temperature OK ")
{
mylcd.Set_Text_colour(GREEN);
}
else
{
mylcd.Set_Text_colour(RED);
}
mylcd.Print_String(tempState,195, 190);
tempState_tmp = tempState;
}
checkHum:
//Checking humidity
if (hum1 < humMin)
{
humState = "Low humidity ";
}
else if (hum1 >= humMax)
{
humState = "High humidity";
}
else
{
humState = "Humidity OK ";
}
if (humState == humState_tmp)
{
goto wlightTimer;
}
else
{
if (humState == "Humidity OK ")
{
mylcd.Set_Text_colour(GREEN);
}
else
{
mylcd.Set_Text_colour(RED);
}
mylcd.Print_String(humState,195, 210);
humState_tmp = humState;
}
wlightTimer:
if (wlightOn <= currentTime < wlightOff)
{
if (wlightVal == 1)
{
digitalWrite(relayWhitelight, 0);
wlightVal = 0;
}
}
if (wlightOn > currentTime || wlightOff <= currentTime)
{
if (wlightVal == 0)
{
digitalWrite(relayWhitelight, 1);
wlightVal = 1;
}
}
if (light_1st == 0)
{
light_1st = 1;
}
if (wlightVal == wlightVal_tmp)
{
goto glightTimer;
}
else {
wlightVal_tmp = wlightVal;
}
glightTimer:
if (glightOn <= currentTime < glightOff)
{
if (glightVal == 1)
{
digitalWrite(relayGrowlight, 0);
glightVal = 0;
}
}
if (glightOn > currentTime || glightOff <= currentTime)
{
if (glightVal == 0)
{
digitalWrite(relayGrowlight, 1);
glightVal = 1;
}
}
if (light_1st == 0)
{
light_1st = 1;
}
if (glightVal == glightVal_tmp)
{
goto wentylator;
}
else {
glightVal_tmp = glightVal;
}
wentylator:
if (hum1 < humMax)
{
if (fanVal == 0)
{
digitalWrite(relayFan, 1);
fanVal = 1;
}
}
else if (hum1 >= humMax)
{
if (fanVal == 1)
{
digitalWrite(relayFan, 0);
fanVal = 0;
}
}
else {
}
if (fanVal == fanVal_tmp)
{
goto koniec;
}
else
{
fanVal_tmp = fanVal;
}
koniec:
delay(2000);
}
void setRTCTime()
{
DateTime dt(2020, 11, 28, 19, 0, 0, 6); // Year, Month, Day, Hour, Minutes, Seconds, Day of Week
rtc.setDateTime(dt); //Adjust date-time as defined 'dt' above
}
String getDayOfWeek(int i)
{
switch (i)
{
case 1: return "Poniedzialek"; break;
case 2: return "Wtorek"; break;
case 3: return "Sroda"; break;
case 4: return "Czwartek"; break;
case 5: return "Piatek"; break;
case 6: return "Sobota"; break;
case 7: return "Niedziela"; break;
default: return "Poniedzialek"; break;
}
}
String relayState(int x)
{
switch (x)
{
case 0: return "ON "; break;
case 1: return "OFF"; break;
default: return "ON "; break;
}
}