20-02-2021, 21:34
Dziękuję za pomoc przedmówcom, działa. W prawdzie musiałem wypatroszyć chyba wszystko i napisać od nowa w miarę moich umiejętności żeby to oflagować. Przy okazji troszkę posprzątałem. Program bardzo prosty, zrobiony na if-ach. Czy ktoś z Was widzi po kodzie jakieś zagrożenia które są dla niego oczywiste, a których ja nie dostrzegam? Może macie jakieś sugestie aby coś zrobić inaczej? W pierwowzorze autor używał zmiennych chwilowych i w każdej sekcji najpierw porównywał czy ostatnio zapamiętany parametr (np. temperatura) różni się od obecnego, jeśli nie to przeskakiwał część wykonawczą kodu do następnej sekcji. Czy uważacie że w tak krótkim kodzie ma to sens? Z góry dziękuję.
Kod:
void loop()
{
ds.doConversion();
rtc.begin();
DateTime now = rtc.now();
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);
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());
}
else {
timeString = String(now.hour()) + ":" + String(now.minute());
}
if (temp2 < tempMin) {
tempState = "Low temperature ";
if (flag_relayHeat == false) {
flag_relayHeat =! flag_relayHeat;
}
}
else if (temp2 >= tempMax) {
tempState = "High temperature";
if (flag_relayHeat == true) {
flag_relayHeat =! flag_relayHeat;
}
}
else {
tempState = "Temperature OK ";
}
if (tempState == "Temperature OK ") {
mylcd.Set_Text_colour(GREEN);
}
else {
mylcd.Set_Text_colour(RED);
}
mylcd.Print_String(tempState,195, 190);
if (hum1 < humMin) {
humState = "Low humidity ";
}
else if (hum1 >= humMax) {
humState = "High humidity";
}
else {
humState = "Humidity OK ";
}
if (humState == "Humidity OK ") {
mylcd.Set_Text_colour(GREEN);
}
else {
mylcd.Set_Text_colour(RED);
}
mylcd.Print_String(humState,195, 210);
if (wlightOn <= currentTime && currentTime < wlightOff) {
flag_relayWhite = true;
}
else if (wlightOn > currentTime || wlightOff <= currentTime) {
flag_relayWhite = false;
}
if (glightOn <= currentTime && currentTime < glightOff) {
flag_relayGrow = true;
}
else if (glightOn > currentTime || glightOff <= currentTime) {
flag_relayGrow = false;
}
if (humState == "Low humidity ") {
if (flag_relayFan == true) {
flag_relayFan =! flag_relayFan;
}
}
else if (humState == "High humidity") {
if (flag_relayFan == false) {
flag_relayFan =! flag_relayFan;
}
}
if ( now.hour () == 6 || now.hour () == 16) {
flag_relayMist = true;
}
else {
flag_relayMist = false;
}
if ( now.hour () == 16 && now.minute () == 22 && now.second ()== 20) {
flag_relayWater = true;
}
else {
flag_relayWater = false;
}
digitalWrite(relayWhitelight, flag_relayWhite);
digitalWrite(relayGrowlight, flag_relayGrow);
digitalWrite(relayHeat, flag_relayHeat);
digitalWrite(relayFan, flag_relayFan);
digitalWrite(relayMist, flag_relayMist);
digitalWrite(relayWater,flag_relayWater);
delay(1000);
}
void setRTCTime()
{
DateTime dt(2020, 11, 28, 19, 0, 0, 6);
rtc.setDateTime(dt);
}
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 true: return "ON "; break;
case false: return "OFF" ; break;
default: return "ON "; break;
}
}