Billiga trådlösa råttfälla larm med en ATtiny85 (6 / 8 steg)
Steg 6: Koden
Ladda ner den bifogade .ino filen och använda din gynnade metod att kompilera och ladda upp till din ATtiny85. Min gynnade metod är att använda en Arduino UNO som programmerare som beskrivs här. Ange din ATtiny att köra på 1MHz innan du lägger upp om möjligt. Om du bara vill få på med det då du har min tillåtelse att hoppa till nästa steg, men jag hoppas du hittar följande bit informativ.
Denna kod utnyttjar den ATtiny85 sova sätt att spara på batteriet. Det går ungefär så här:
Vakna upp >> Switch råttfälla krets på >> Kontrollera råttfälla krets är öppen >> om öppna, slå på sändaren krets för 250 millisekunder >> Switch råttfälla krets av >> gå till vila i 10 minuter... etc.
När i viloläge, använder mikrokontroller en liten liten mängd ström. I teorin kunde det lite cr2032-batteriet hålla den igång månader, eller år. Eftersom det bara vaknar upp för en bråkdel av en sekund hålls varje tio minuter eller så, makt krav låg. Om du verkligen galen i att få ut mesta möjliga av batteriet, kan jag se minst en plats där du kanske kunna lägga ett motstånd till kretsen och det finns några tweaks som du kan göra i koden - men jag ska låta dig räkna ut. Kommentera gärna om du göra!
Så hur vet ATtiny när det är dags att vakna upp? Koden ställer in något som kallas en "Watchdog Timer" (WDT) att utlösa ett avbrott när det timeout (eller flödar över). Som standard kommer en WDT overflow orsaka ATtiny återställa om programmet fastnat av någon anledning, men vi vill inte att detta ska ske här. Lyckligtvis, den här funktionen kan inaktiveras och WDT kan sättas upp bara att avfyra ett avbrott.
Den bifogade uppförandekoden är oftast en ganska standard Arduino skiss. Om du är en Arduinohead som jag är, kan delar av denna kod gränsar på vissa obekant territorium. Det innebär lite bit matte (se denna fantastiska introduktion) med hänvisning till ATtinyx5 datablad. Programmet manipulerar Watchdog Timer kontroll Register över ATtiny85 - se avsnitt 8.5.2 i databladet för detaljer. Detta register är ett åttabitars bit minne i det chip som kontrollerar vad watchdog timer gör. Varje bit av detta register har en viss betydelse för mikrokontroller - de slå vissa funktioner på eller av beroende på om biten är en 1 eller 0. Dessa bitar hanteras i koden av lite av C lite matematik magi!
t.ex.
WDTCR | = (1 << WDCE | 1 << Mimmi)
WDTCR avser Watchdog Timer kontroll registrera, låt oss säga för detta exempel är det inledningsvis 00000001.
Den | = är en förening bitvis eller operatör i C - det är bara ett enkelt sätt av betecknar en OR-operation på en grupp av bitar (8 bitar för WDTCR).
<< är en bitvis vänsterskift operatör. En snabb titt på avsnitt 8.5.2 i databladet visar att WDCE (Watchdog förändring aktiverar) lite av WDTCR registret är den femte från höger. WDCE definieras som 4, därför 1 << 4 skulle flytta en 1 värde från höger till vänster (börjar på 0-läge) för att ge 00010000. Mimmi definieras som 3 som ger 00001000. | är C Notationen för bitvis OR. Så (1 << WDCE | 1 << Mimmi) är (00010000 | 00001000) som ger 00011000.
Därför 00000001 | = 00011000 ger 00011001. Phew!
ISR(WDT_vect) funktion är avbryta tjänsten rutin som kallas varje gång watchdog timer orsakar ett avbrott. WDT_vect identifierar watchdog timer avbrottsvektor. Den maximala tidsgränsen WDT kunde ställas in på är ungefär 8 sekunder. På grund av detta ISR steg en räknare och mikrokontroller kommer bara kolla råttfälla kretsen när räknaren träffar 75, som skulle vara ca 10 minuter.