I changed the delay time in the end of the loop to 3 minutes yesterday (it was 5), and today the system has been working perfectly. Did the pretty long delay cause the trouble and if so, why? Nothing else has changed in the code.
// Kasvihuoneen lämpötilasäädin, eli luukkuautomatiikka.
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 /*-(Connect to Pin 2 )-*/
OneWire ourWire(ONE_WIRE_BUS);
DallasTemperature sensors(&ourWire);
// Määritellään pinnit ja muuttujat
const int raja1 = 3; // limit-switch vent closed
const int raja2 = 4; // limit-switch vent fully open
const int virta = 5; // motor power relay
const int suunnanvaihto1 = 6; // motor polarity change relay 1
const int suunnanvaihto2 = 7; // motor polarity change relay 2
int raja1tila; // state of limit switch 1
int raja2tila; // state of limit switch 2
int lpt; // room temperature
int asento; // vent position
void setup()
{
Serial.begin(9600);
sensors.begin();
pinMode(raja1, INPUT_PULLUP);
pinMode(raja2, INPUT_PULLUP); // Otetaan pinnien 3 ja 4 ylösvetovastukset käyttöön. Muistettava kytkeä rajakytkimet siten että rajatilassa eivät johda!
pinMode(virta, OUTPUT);
pinMode(suunnanvaihto1, OUTPUT);
pinMode(suunnanvaihto2, OUTPUT);
Serial.println("Alkutilanne:");
raja1tila = digitalRead(raja1);
Serial.print("Raja1 = ");
Serial.println(raja1tila);
raja2tila = digitalRead(raja2);
Serial.print("Raja2 = ");
Serial.println(raja2tila);
digitalWrite(virta, HIGH);
digitalWrite(suunnanvaihto1, HIGH);
digitalWrite(suunnanvaihto2, HIGH);
delay(2000);
// Tarkistetaan onko luukku auki ja jos on, suljetaan jotta saadaan varmuus luukun asennosta
Serial.println("Tarkistetaan onko luukku kiinni");
if (raja1tila == 0)
{
digitalWrite(suunnanvaihto1, LOW); // kytketään moottori sulkemissuuntaan
digitalWrite(suunnanvaihto2, LOW); // kytketään moottori sulkemissuuntaan
Serial.println("Suljetaan luukku, suunnanvaihtoreleen pitäisi nyt vetää");
delay (100); // kytkentäviive mahd. häiriöiden välttämiseksi
digitalWrite(virta, LOW); // Kytketään moottorin virta
Serial.println("Virtareleen pitäisi vetää");
while(raja1tila == 0)
{
raja1tila = digitalRead(raja1);
}
digitalWrite(virta, HIGH);
digitalWrite(suunnanvaihto1, HIGH);
digitalWrite(suunnanvaihto2, HIGH);
Serial.println("releiden pitäisi nyt olla pois päältä");
asento = 0;
}
}
void loop() // main loop
{
Serial.println("Varsinainen ohjelma alkaa");
sensors.requestTemperatures(); // Lähetä lukukomento anturille
lpt = sensors.getTempCByIndex(0);
Serial.print("Huoneen lämpötila on ");
Serial.print(lpt);
Serial.println("°C");
delay(1000);
raja1tila = digitalRead(raja1);
raja2tila = digitalRead(raja2);
// Luukun aukaisu lämpötilan ylittäessä 24 C, odotetaan 5 minuuttia jokaisen avaussekvenssin jälkeen.
if (lpt > 24)
{
Serial.print("Luukun asento on ");
Serial.println(asento);
Serial.print("Raja1 = ");
Serial.println(raja1tila);
Serial.print("Raja2 = ");
Serial.println(raja2tila);
if (asento == 60) // Jos luukku on auki 60%, avataan luukku asentoon 100%
{
Serial.println("Avataan luukku asennosta 60% -> 100%");
digitalWrite(virta, LOW); // Kytketään moottorivirta päälle
// Ajetaan päin rajakytkintä 2
while (raja2tila == 0)
{
raja2tila = digitalRead(raja2);
}
asento = 100; // Asetetaan luukun asennoksi "100%"
digitalWrite(virta, HIGH); // Moottorivirta pois päältä
}
if (asento == 30) // Jos luukku on auki 30%, ajetaan luukku asentoon 60%
{
Serial.println("Avataan luukku asennosta 30% -> 60%");
digitalWrite(virta, LOW); // Kytketään moottorivirta päälle
delay(5000); // Moottori käy 5 sekuntia
asento = 60; // Asetetaan luukun asennoksi "60%"
digitalWrite(virta, HIGH); // Pysäytetään moottori
}
if (asento == 0) // Jos luukku on kiinni, ajetaan luukku asentoon 30%
{
Serial.println("Avataan luukku asentoon 30%");
digitalWrite(virta, LOW); // Kytketään moottorivirta päälle
Serial.println("Kytketään moottorivirta päälle");
delay(5000); // Moottori käy 5 sekuntia
asento = 30; // Asetetaan luukun asennoksi "30 %"
digitalWrite(virta, HIGH); // Pysäytetään moottori
Serial.println("Sammutetaan moottorivirta");
}
}
// Luukun sulkeminen lämpötilan laskiessa 24 C:n tai alle. Odotetaan 5 minuuttia jokaisen sulkemissekvenssin jälkeen
if (lpt < 22)
{
if (asento == 30) // Jos luukku on auki 30%, suljetaan luukku kokonaan
{
digitalWrite(suunnanvaihto1, LOW); // Moottorinsuunnanvaihto päälle
digitalWrite(suunnanvaihto2, LOW); // Moottorinsuunnanvaihto päälle
Serial.println("Suljetaan luukku asennosta 30% -> kiinni");
delay(500); // kytkentäviive 0,5 sek mahdollisten häiriöiden välttämiseksi
digitalWrite(virta, LOW); // Kytketään moottorivirta päälle
// Ajetaan päin rajakytkintä 1
while (raja1tila == 0)
{
raja1tila = digitalRead(raja1);
}
asento = 0; // Asetetaan luukun asennoksi "0%"
digitalWrite(virta, HIGH); // Moottorivirta pois päältä
digitalWrite(suunnanvaihto1, HIGH); // Moottorin sunnnanvaihto pois päältä
digitalWrite(suunnanvaihto2, HIGH); // Moottorin sunnnanvaihto pois päältä
}
if (asento == 60) // Jos luukku on auki 60%, ajetaan luukku asentoon 30%
{
digitalWrite(suunnanvaihto1, LOW); // Moottorinsuunnanvaihto päälle
digitalWrite(suunnanvaihto2, LOW); // Moottorinsuunnanvaihto päälle
Serial.println("SUljetaan luukku asennosta 60% -> 30%");
delay(500); // Häiriönestoviive 0,5 sekuntia
digitalWrite(virta, LOW); // Kytketään moottorivirta päälle
delay(4000); // Moottori pyörii 4 sekuntia
asento = 30; // Asetetaan luukun asennoksi "30%"
digitalWrite(virta, HIGH); // Pysäytetään moottori
digitalWrite(suunnanvaihto1, HIGH); // Moottorin sunnnanvaihto pois päältä
digitalWrite(suunnanvaihto2, HIGH); // Moottorin sunnnanvaihto pois päältä
}
if (raja2tila == 1) // Jos luukku on auki 100% , ajetaan luukku asentoon 60%
{
digitalWrite(suunnanvaihto1, LOW); // Moottorinsuunnanvaihto päälle
digitalWrite(suunnanvaihto2, LOW); // Moottorinsuunnanvaihto päälle
Serial.println("Suljetaan luukku asentoon 60%");
delay(500); // Häiriönestoviive 0,5 sekuntia
digitalWrite(virta, LOW); // Kytketään moottorivirta päälle
delay(4000); // Moottori pyörii 4 sekuntia
asento = 60; // Asetetaan luukun asennoksi "60 %"
digitalWrite(virta, HIGH); // Pysäytetään moottori
digitalWrite(suunnanvaihto1, HIGH); // Moottorin sunnnanvaihto pois päältä
digitalWrite(suunnanvaihto2, HIGH); // Moottorin sunnnanvaihto pois päältä
}
}
delay(180000); // Lämpötilantasausviive 3 minuuttia ennen seuraavaa aukaisu-/sulkemissekvenssiä
}// end main loop