En luftkonditioneringen remote ersättning (2 / 4 steg)
Steg 2: Programmering - Arduino sida
För IR avlägsen del kommer vi använda IRremote Arduino biblioteket (https://github.com/shirriff/Arduino-IRremote). Detta bibliotek kan användas för att skicka fördefinierade data via IR, liksom LIRC. Men vi använder det bara för dess hjälpare funktioner (ställa in 38KHz frekvens för IR och hantera timings när du skickar meddelanden).
I den tidigare instructable fann vi att vi behövde skicka en låssekvens, en ständig introduktion, lås sekvensen igen, då den faktiska nyttolasten för att kommunicera kommandon till luftkonditioneringen. Bra Arduino kan mycket väl ha införandet i sin kod och bara vänta för nyttolasten. Vi kunde bara skicka alternativ värden och göra Arduino ändra en mall med dessa värden, men för att hålla det enkelt vi bara ge hela nyttolasten och låta det skicka det som det är. För att skicka bitarna kommer det slå på IR LED och av enligt den timings hittade tidigare.
Här fungerar Arduino som en "slav", aldrig inleda själva meddelandet. Som jag avser att göra flera användningsområden för denna enhet börjar jag kommunikationen med ett tecken "I" vilket betyder "skicka via IR", följt av 19 byte nyttolast. Arduinoen skickar sedan meddelandet till luftkonditioneringen.
På Arduino sida kan koden se ut lite över-invecklat, men det är eftersom det är tänkt för att fungera som en radio relä också, så kommunikationen mellan Pi och Arduino via det seriella gränssnittet inte kommer alltid att bara för att skicka IR meddelande.
Här är den arduino källa som används för att skicka kommandon till luftkonditioneringen.
Lite förklaring:
-> de loop kod bara kontrollerna om ett kommando är klar. I så fall utför det kommandot (för nu bara "skicka en IR meddelande").
-> SerialEvent() kallas efter en loop(), om seriell data i bufferten. I denna funktion kommandot läses, nyttolasten är beredd, då en flagga är inställd att tala funktionen loop() att ett kommando är redo
serialEvent får ASCII-tecken som representerar HEX värden. För att konvertera den vi använder funktionen sscanf med %x: et (hexadecimalt) format alternativet. Vi lagrar de mottagna tecken i en 5 char utbud och fylla den med: "0 x" + de 2 tecken + '\0' (till slut strängen).
char hexConvert [5] = "0 x";
ASCII tas emot
för (int jag = 0; jag < 19; i ++) {
hexConvert [2] = Serial.read();
hexConvert [3] = Serial.read();
hexConvert [4] = '\0';
konvertera de mottagna tecken till ett numeriskt värde i nyttolasten [i]
sscanf (hexConvert, "%x", och (payload[i]));
}
På denna punkt innehåller nyttolast [i] det binära värdet representeras av mottagna tecken.
I skicka används kommandot rätt timings för att skicka lås, introduktion och nyttolast. För att skicka data, har koden att skicka varje bit separat med funktionen irsend.mark(duration) och irsend.space(duration). Som förklaras i den tidigare instructable varar för om 400us (ska egentligen vara närmare 420 tror jag) för märket (på staten), och antingen 400us eller 1300us för utrymme (OFF state) skicka en 0 eller 1, respektive.
Skicka varje bit av varje byte i följande kod används:
för (int s = 0; s < payloadSize; s + +) {
för (int jag = 7; jag > = 0; i--) {/ / mest signifikanta biten kommer först
irsend.mark(irSpace);
irsend.Space ((nyttolast [s] >> i) & 1 == 1? irOne: irZero);
}
}
Om du inte är bekant med bitvis operationer finns gott om tutorials på nätet.
Vad som händer här är:
För varje byte av nyttolasten (fungerar på samma sätt med intro):
För jag kommer från 7 till 0
flytta byten för jag rangordnar till höger
titta på den sista biten
om den biten är en, skicka en signal om "irOne" (1300us), annars skicka en signal om "irZero" (400us)
I grund och botten är vad vi får genom att flytta byten just av N rangordnar (lägga till nollor till vänster) den Nth lite på längst till höger. När maskering med en bitvis AND (och) 1 tar vi bara längst till höger lite, får så globalt vi Nth bitvärdet.
Exempel med 5B i hexa = 0101 1011 i binär. Parentesen är här att betona de skiftade bitarna, för läsbarhet...
Jag = 7 = > Skift (0) 101 1011 för 7 rangordnar = > 0000 000(0)
mask med 1 = > 0000 0000 & 0000 0001 = 0 = > Skicka irZero
Jag = 6 = > Skift (01) 01 1011 för 6 rangordnar = > 0000 00(01)
mask med 1 = > 0000 0001 & 0000 0001 = 1 = > Skicka irOne
Jag = 5 = > Skift (010) 1 1011 för 5 rangordnar = > 0000 0(010)
mask med 1 = > 0000 0010 & 0000 0001 = 0 = > Skicka irZero
Jag = 4 = > flytta (0101) 1011 för 4 rangordnar = > 0000 (0101)
mask med 1 = > 0000 0101 & 0000 0001 = 1 = > Skicka irOne
Jag = 3 = > Skift (0101 1) 011 för 3 rangordnar = > 000 (0 1011)
mask med 1 = > 0000 1011 & 0000 0001 = 1 = > Skicka irOne
Jag = 2 = > Skift (0101 10) 11 för 2 rangordnar = > 00 (01-0110)
mask med 1 = > 0001 0110 & 0000 0001 = 0 = > Skicka irZero
Jag = 1 = > Skift (0101 101) 1 för 1 rank = > 0(010 1101)
mask med 1 = > 0010 1101 & 0000 0001 = 1 = > Skicka irOne
Jag = 0 = > shift (0101 1011) för 0 rang = > (0101 1011)
mask med 1 = > 0101 1011 & 0000 0001 = 1 = > Skicka irOne
Så vi skickade bitar i vänster till rätt ordning.
Observera att IRremote bibliotek använder pin3 för att skicka meddelanden. Jag antar att det kan vara möjligt att använda stift 11 (samma timer för PWM) genom att ändra målet stiftet i biblioteket koden, men jag har inte testat den.