En luftkonditioneringen remote ersättning (3 / 4 steg)
Steg 3: Programmering - PC-sidan
Programmet kommer att bygga kommandot nyttolasten enligt kommandoradsalternativ (se behandling) och skicka kommandot till enheten är ansluten till USB-porten.
Porten kan anges med alternativet -u, annars det kommer prova/dev/ttyUSB0, / dev/ttyUSB0, / dev/ttyACM0, /dev/ttyACM1, som arduinos kan mappas som (minst) dessa filer, beroende på arduino typ och frånkopplingar/återanslutningar.
Som framgår av inledningen Arduino måste ha sin autoreset funktion inaktiverad, annars återställs varje gång en anslutning görs. På det sättet IDE kan programmera chip, men det är inte önskvärt i vårt fall. Om du vill testa koden med en autoreset aktiverade arduino, du bör lägga till ett sleep(2) kommando efter anslutningen (efter öppna filen tty) Låt arduino återställa och kunna få meddelanden.
Som väntat koden skickar ett "I" karaktär till Arduino, sedan skickar nyttolasten och läsa filen för att vänta den Arduino svar. Detta steg är inte avgörande för en enkel kommandot Skicka, men det kommer att bli om målet är att hämta information från Arduino själv eller någon annan enhet kontrolleras av radio. För nu Arduino bara svarar "OK" så programmet bara visar Svaren som är.
När det gäller den Arduino delen är det en del av koden där meddelandet konverteras till ASCII-representation av binära meddelandet.
meddelande [0] = "I";
vrida binära nyttolast till ASCII-tecken (HEX framställning)
för (jag = 1, j = 0; jag < 39; i + = 2, j ++) {
meddelande [i] = (nyttolast [j] & 0xF0) >> 4.
om (meddelande [i] < 10) {
meddelande [i] + = "0"; ASCII
} annat {
meddelande [i] += "A" - 10.
}
meddelande [jag + 1] = nyttolast [j] & 0x0F;
om (meddelande [jag + 1] < 10) {
meddelande [jag + 1] += "0"; ASCII
} annat {
meddelande [jag + 1] += "A" - 10.
}
printf ("0 x %c %c", meddelande [i], message[i+1]);
}
Än en gång bitvisa operatorer används för att markera och flytta de första eller sista 4 bitarna och konvertera den till en siffra eller ett tecken (A till F):
meddelande [i] = (nyttolast [j] & 0xF0) >> 4.
Här tar vi byten och tillämpa en mask 11110000 så vi får bara de främsta vänstra bitarna, och vi flytta dessa bitar till höger
meddelande [jag + 1] = nyttolast [j] & 0x0F;
Samma här men valda bitar är redan till höger om byten så ingen förändring är nödvändig.
om (meddelande [i] < 10) {
meddelande [i] + = "0"; ASCII
} annat {
meddelande [i] += "A" - 10.
}
Här om siffran är < 10 ASCII-värdet består mellan 48 och 57 (decimal), och vi bara har att lägga representerade värdet till det tecken '1'-värdet (som är 48 men '1' är användbart utan att veta ASCII-tabellen utantill ;)). Samma gäller tecken A till F men A(Hex) är 10(Decimal) så om vi lagt representerade värdet till ASCII-värdet för "A" skulle vi vara 10 värden till hög. Så lägger vi värde -10 och slut ihop med riktig karaktär.
Nu kanske du undrar varför vi bry konvertering från Hex till ASCII och från ASCII till Hex på andra sidan. Du skulle vara rätt att ;)
Ja, i så fall är det meningslöst, och den första versionen av koden arbetat direkt med binära värden. Faktiskt det fungerade genom att skicka endast 5 byte som är faktiskt användbara och Arduino gjorde uppdateringen av mallen nyttolast. Så nu skickar vi 40 byte istället för 5. Av vilken anledning?
Tja, även om detta är av denna speciella instructable angav jag att jag hade en andra micro controller i mitt rum för andra luftkonditioneringen enheten. Detta chip är ett Seeediuno Wifi bi. Jag fann det svårt att genomföra den rätta beteendet i detta chip med uttag så jag slutade med den inbyggda minimalistiska webbservern, så jag skicka kommandot full IR i URL-adressen i Hex-tecken.
Nu har du anledningen: Jag ville använda samma kod för att styra båda enheterna, skickar data till USB eller över WiFi men manipulera samma meddelande, i samma format.