loop() - szenzorok olvasása
Itt az LDR-t olvassuk be, majd egy itt beállított hiszterézissel megállapítjuk, hogy elég sötét van-e az éjszakai üzemmód aktiválásához.//night
if (analogRead(ldr) > dark) night = true;
else if (analogRead(ldr) <= dark - 100) night = false;
Itt az állapotgépet váltjuk 2-es - éjszakai - üzemmódra, ha teljesülnek a feltételek.
A PIR szenzornak ugye van egy fenntartási ideje - amit a szenzoron lévő potméterrel lehet állítani -, így elég csak azt megállapítani van-e jel vagy nincs. Itt lehetne alkalmazni egy újabb millis() időzítést ha programból szeretnénk időzíteni. Én ezzel nem éltem: úgy láttam jónak, ha hardveresen szabályozható marad a timeout.
//PIR night
if (PIR && digitalRead(pir_in) && night && mode == 0) mode = 2; //ha be van kapcsolva a PIR és van mozgás és sötét van és ki van kapcsolva a világítás
else if (mode == 2) if (!PIR || !digitalRead(pir_in) || !night) mode = 0; //vagy ha aktív az éjszakai mód és (ki van kapcsolva a PIR vagy nincs mozgás vagy nincs sötét)
Beraktam még egy takarékos üzemmódot is arra az esetre, ha manuálisan felkapcsolják a világítást, de nem érzékelünk semmi mozgást a helyiségben egy adott ideig.
//PIR eco mode
if (PIR && mode == 1) { //ha be van kapcsolva a PIR és fel van kapcsolva a világítás
if (millis() > eco + 1500000 && light_tl == max_light) { //ha eltelt 25 perc mozgás nélkül és nagy a fényerő
light_tl = 150;
light_bl = night_light;
debugln(F("Entering power saving mode."));
} else if (digitalRead(pir_in) && light_tl != max_light && !dim) { //ha van mozgás és kicsi a fényerő, valamint nincs kézzel levéve
light_tl = max_light;
light_bl = max_b_light;
eco = millis(); //eco időzítő nullázása
debugln(F("Movement detected."));
} else if (digitalRead(pir_in)) eco = millis(); //ha van mozgás a helyiségben, akkor folyamatosan nullázza a türelmi időt
}
A cikk még nem ért véget, kérlek, lapozz!