Hem Automation (eller Robot Butler kallas Geoffrey) - iPhone kontrollerade, arduino baserat (11 / 12 steg)
Steg 11: Ändra arduino koden för din utrustning – ny kod
Längst ner i koden hittar du enskilda metoder för varje switch eller ljus (t.ex. kök, sängbord, etc.). När du lägger till en ny artikel eller om du bara vill ändra något som är redan där detta är den del du kommer att behöva redigera först. Strukturen hos en individ på/av metoden är:
void switchName (boolean på, boolean multioff) {
De två Booleans är om växeln är vara påslagen (sant) eller off (falskt) och andra är huruvida det skulle stänga av några tidsinställda run-gånger (att se till att saker slumpmässigt inte slå på/av om du är klar som kräver en körning innan det förväntar dig att bli färdig).
Den om uttalande i metoden avgör om brytaren aktiveras eller inaktiveras med hjälp av en kodrad som liknar denna:
setOnOff (x, x, på);
Detta kräver en metod med namnet "setOnOff". Koden för detta kan ses i slutet av skissen. Detta hand tar om slå på och av enheterna och för feedback genom den seriella porten. Koden är:
setOnOff (int grupp, int plug, boolean på)
Boolean "på" i varje enhet metod säger redan om du vill aktivera eller inaktivera så behöver du bara byta grupp och koppla in värden för varje enhet. Exempelvis skulle om jag ville vända kontakten 4 i grupp 3 då jag skriva:
setOnOff (3, 4, på);
Rulla ner ungefär halvvägs, det finns en del på väg
"/ / / Följande avsnitt är för slå på och av enskilda enheter / / /"
Detta är nästa avsnitt som behöver behandlas.
Nedan följer 12 kodrader mycket liknande söker för olika apparater/ljus.
Den första raden i varje bit följer samma struktur:
annars om (packBuff [0] = 'P' & & packBuff [1] == 'x' & & packBuff [2] == "x")
Detta är den del där du anger vilka väljare från telefonen du döma till. Till exempel, om du vill ange vad som bör göras när du trycker på en knapp som är inställd för att skicka meddelandet P04 du vill ändra ovanstående kod att:
annars om (packBuff [0] = 'P' & & packBuff [1] == '0' & & packBuff [2] == "4")
Eftersom alla växlar har två meddelanden som kan skickas (stickande med exemplet P04 det kan antingen vara P04H eller P04L beroende på Växla har ändrats till) det måste finnas någon logik att bearbeta två separat. Som de båda börjar med P04 bit klokt att ha en andra inbäddat om uttalande.
om (packBuff [3] == "H") {
Detta säger koden vad du gör om den är påslagen. Två utdragsraderna lägre:
annat {
Anger koden vad att göra om den sista bokstaven inte är H (dvs. L) vilket innebär att du kan ange vad du vill göra när den är avstängd.
Om du använder en knapp istället för en växla du kan få bli av med den inbäddat om funktionen eftersom det inte kommer att vara en extra H eller L i meddelandet.
Lina av koden precis under om "(packBuff [3] =="H") {" är åtgärden som ska vidtas när den är på. Till exempel om du vill skrivbordslampa så här aktiverar du anropa metoden "skrivbord" och berätta det att du vill att det ska vara på och som du vill inaktivera alla run-tider som för närvarande kommer:
skrivbord (sant, true);
I uttrycket "annat" kommer du vill stänga av den samma växlar och igen att avbryta någon run-tider är för närvarande i aktion:
skrivbord (falskt, true);
Om du skulle hellre stänga här särskilt knappen inte av några run-gånger sedan den andra variabeln måste vara inställd på false (skrivbord (sant, falskt); och skrivbord (false, false);)
Nästa steg är att mer än en koppla uttaget (t.ex. underhållning slå på eller stänga av TV: N, Xbox och ljudsystem eller alla ljus på/av) när tryckt, kommer att påverka-knappar. För dessa har du helt enkelt mer än en enskild enhet metod kallas (se exempel på detta redan i koden).
Dela upp något mer delaktiga är avsnittet "körning". Ställa in timing automatiseringar kräver några fler ändringar.
Det första du kan göra är att deklarera två variabler innan void(setup). En int som ska fungera som ett booleskt värde och en osignerad länge som lagrar den aktuella tiden.
När du trycker på knappen kommer du att ställa in eller inaktivera något som du vill ha gjort från början. Du kommer att behöva ange den osignerade långa till aktuell tid (i sekunder sedan 1 januari 1970) och sedan int 1 (t.ex. teethStart = now.unixtime(); och teethActive = 1;).
När int == 1 springa-tid börjar. Innan avsnittet där du kan ange vad som händer när varje knapp trycks körningen måste anges. Börja med en if-sats som kontrollerar om int == 1. Om så är fallet, sedan starta körningen (t.ex. om (teethActive == 1) {).
Nästa avsnitt kommer att vara först med timing element. Genom att ställa in om uttalanden som innefattar tiden frågar du kan ställa in saker att sätta på och stänga på ett visst antal sekunder efter knappen trycktes ursprungligen.
Till exempel, om du vill ha något att slå på/av efter tre minuter sedan syntaxen är:
om (teethStart + 120 == now.unixtime()) {
Detta är i grunden att kontrollera om den aktuella tidpunkten är samma som tiden har tryckt på knappen lägga till 120 sekunder.
I slutet av uttrycket i en körning bör aktiveringen int sättas till 0 så runtime är inte längre kollade igenom (att göra hela systemet mer effektivt).
Den aktiva int variabeln (t.ex. teethActive) måste läggas till multiOff uttalande.
Det finns ett annat avsnitt, som ser till att, inte mer än en körning kan köras åt gången. Det håller den senaste en för att köra.
I det här avsnittet alla aktiveringen ints summeras och om svaret är större än 1 sedan mer än en är aktiva samtidigt. Om så är fallet de gånger som de kör-tiderna startades jämförs och runtime med flest hålls aktiva. Du kommer att behöva lägga till några ytterligare körtider i detta avsnitt men titta på den kod som redan finns där det ska vara komma ganska self förklarande.