Zpožděné sepnutí relé 2x spínač s millis
Napsal: 16 srp 2021, 22:53
Ahoj, potřeboval bych poradit s projektem na automatické zavírání branky po setmění. Mám funkční program, ale funguje pouze pokud ho ovládám jedním spínačem (fotobuňkou). Potřeboval bych ale ještě přidat jeden spínač (koncák pro kontrolu stavu zavřeno/otevřeno), aby po setmění a při otevřené brance po určitém čase sepnulo relé a branka se zavřela. Myslel jsem si, že jenom upravím podmínku, aby se relé sepnulo jen pokud bude sepnutá fotobuňka a zároveň sepnutý spínač koncáku, ale takto to nefunguje. Spíná to i pokud zapnu jenom jeden ze spínačů. Poradí mi prosím někdo co s tím?
Díky
Tady můj kód:
Díky
Tady můj kód:
Kód: Vybrat vše
//Automaticke zavirani branky po setmeni.
#define KONCAK 2 // koncak vrat
#define FOTOBUNKA 3 // fotobunka
#define CHODEC 4 // rele ovladani branky - zelena LED
unsigned long FotobunkaMillis; // cas sepnuti fotobunky
unsigned long ChodecSepnuto; // CHODEC sepnuto
unsigned long ZpozdeneSepnuti = 5000; // zpozdeni sepnuti
unsigned long ZpozdeneVypnuti = 500; // zpozdeni vypnuti
bool ChodecReady = false; // vypnuti po zpozdeni
bool ChodecStav = false; // stav sepnuti
void setup() {
pinMode(FOTOBUNKA, INPUT);
pinMode(KONCAK, INPUT);
pinMode(CHODEC, OUTPUT);
digitalWrite(CHODEC, LOW);
}
void loop() {
unsigned long currentMillis = millis();
//if (digitalRead(FOTOBUNKA) == LOW) { //funkcni, ale pouze s jednim spinacem (fotobunkou)
if ((digitalRead(FOTOBUNKA) == LOW) && (digitalRead(KONCAK) == LOW)) { //takto to nefunguje 2x spinac (fotobunka+koncak)
FotobunkaMillis = currentMillis;
ChodecReady = true;
}
if (ChodecReady) {
if ((unsigned long)(currentMillis - FotobunkaMillis) >= ZpozdeneSepnuti) {
digitalWrite(CHODEC, HIGH);
ChodecStav = true;
ChodecSepnuto = currentMillis;
ChodecReady = false; // odkomentovat pro zmenu reakce na tlacitko - zakom. porad sviti pri drzeni
}
}
if (ChodecStav) {
if ((unsigned long)(currentMillis - ChodecSepnuto) >= ZpozdeneVypnuti) {
ChodecStav = false;
digitalWrite(CHODEC, LOW);
}
}
}