Billiga hem Automation med trådlös utlopp moduler (3 / 6 steg)
Steg 3: Åter genomföra protokollet om din mikrokontroller
Börja med att skriva funktioner för långa och korta pulser. Nedan är några pseudocode att komma igång, enskilda implementeringar kan variera.
void bit_long()
{
set_pin_high();
Delay(HIGH_TIME_LONG);
set_pin_low();
Delay(LOW_TIME_LONG);
}
void bit_short()
{
set_pin_high();
Delay(HIGH_TIME_SHORT);
set_pin_low();
Delay(LOW_TIME_SHORT);
}
Du får de tid konstanterna genom att mäta puls bredder med din analyzer eller scope markören funktioner. Använd funktionen lämpliga fördröjning (mikrosekund/millisekund) att bäst passa uppmätta bredden. På AVR är dessa _delay_us() och _delay_ms(), båda från < util/delay.h > biblioteket.
Sedan börja genomföra dina överföringar. Börja med att göra en funktion för ingress och en funktion för att avsluta sekvensen, sedan göra funktioner för varje knapp interna data. Du kan antingen skriva en funktion för varje knapp, eller om du kan lista ut vad protokollet gör du kan skriva en funktion som bygger meddelandet från outlet nummer och på/av-ingångar. Jag valde förra, som protokollet verkade inte direkt korrelera utlopp nummer och på/av staten i dess data, snarare var det bara en lång puls för knappen intryckt. Till exempel:
void send_preamble()
{
bit_short();
bit_long();
bit_long();
bit_short();
bit_long();
bit_short();
}
Slutligen, använda dessa funktioner i en for-loop att skicka dem cirka 10 - 20 gånger, med lämpliga fördröjningen mellan överföringar (du kan mäta denna försening med räckvidd eller analyzer). Till exempel:
för (int jag = 0; jag < 10; i ++)
{
send_preamble();
send_outlet_1_on();
send_end_sequence();
_delay_ms(10);
}
Sedan bygga en switch/fall eller cascading if/else uttalande med en av dessa block för varje knapp, med utlopp nummer och växla staten som din if/else villkor.
Slutligen, importera en seriell bibliotek eller skriva din egen serieport avbrott rutin. Att avbryta rutin, både antalet uttag och switch staten från mottagna data. Använda flyktiga variabler så att de kan ändras inom en ISR, så att de viktigaste loopen kan plocka upp på de uppsättning variablerna och utföra önskad överföring. Kom ihåg att initiera den seriella porten och ange din baudvärde innan du börjar din huvudloop!