En trådlös Smart Home (var: hem simulator och larm med Arduino eller Atmega328 (Uppdaterad maj 2016)) (10 / 11 steg)
Steg 10: Avancerat koden: Beskrivning
Inledningsvis ställer koden in en hel del variabler och konstanter. Den definierar ett antal makro är särskilt för de specifika Remote Switch kommandona. Jag gör det så är det lätt att ändra dem på en plats om du använder olika växlar.
I uppsättning sätter det upp den seriella porten och tid. Därefter läser det EEPROM för RTC modul om på power ON, några lampor eller enheter ska slås på och det gör man. Jag gör det så vid en ström avbrott och omstart, handkontrollen fortfarande inte vet vad som är på och vad.
Loopen kontrollerar seriella porten för indata (från en bluetooth-modul) och vidtar åtgärder om input hittas. Om inte uppdaterar den tiden.
Sedan är vad det gör i princip cykel genom ett antal uttalanden om att se om det är dags för lite action, byta en enhet ON eller OFF
Om en enhet måste vara påslagen, det hoppar till motsvarande subrutin/funktion, skickar den kommando och det uppdateringar på statusflag och skriver att till EEPROM. Den skickar kommando via ett makro som "HuiskamerAAN" (vardagsrum på). Du måste se till att definitionen i makrots motsvarar kommandot som fjärrkontroll växeln behöver.
Ber om ursäkt för att hålla makrot definitioner på nederländska, men jag har redan använt det engelska ordet för funktioner: använder dvs den funktionen "LivingRoomON" makro "HuiskamerAAN". Under makrodefinitioner hittar du exakt vad som är vad på engelska.
Medan det looping, kontrolleras också kontinuerligt om det kanske redan är rätt datum för DaylightSavingstime eller, om det redan DST, oavsett om det är rätt datum för att stänga som.
Det också håller koll på vilket datum det är så att det kan göra en tillnärmning av solnedgång och soluppgång tid. Det slår på ljuset i vardagsrummet ungefär hälften en timme före solnedgången, om inte det är redan mörkt förr (mulen himmel, åska, oavsett) så är det slår på belysningen förr.
Det gör detta genom att läsa en LDR. Du måste ange nivån för det till din egen situation.
DST beräkning och Sunrise tillnärmning, dessa är giltig för min plats (i NW Europa) du behöva anpassa dem för din situation (och kanske du inte har DST)
När det gäller variablerna tid ett samtal som "now.minute()" läser RTC rätt bort.
Men jag låter kretsar ständigt uppdatera variablerna tid så här:
j = now.year();
Mo = now.month();
d = now.day();
h = now.hour();
m = now.minute();
s = now.second();
Det är alltså OK att använda antingen "h" eller "now.hour()" för att få timmen i hela programmet.
Den enda skillnaden är att med hjälp av "h" förmodligen kommer att vara en tadd snabbare än med "now.hour()" utan "h" kan vara en bråkdel av tid bakom. Jag tror att slingan är cyklade om 150 gånger i sekunden så om jag uppdaterar variablerna i början av slingan och använda dem i slutet av slingan, jag kan vara 1/150 th av en andra bakom. Det verkar verkligen inte som ett problem för mig