Kyl dörr detektor larm (3 / 13 steg)
Steg 3: Programming Software Development
Steg för att ansluta ATtiny85 till Arduino Uno för programmering:
- Ladda ner denna fil: https://github.com/damellis/attiny/zipball/Arduino1
- Packa upp och sätta mappen "attiny" i mappen "maskinvara" där tha Arduino är installerat på din dator. Banan ser ut så här: dokument > Arduino > Hårdvara > attiny > (andra nedladdade filer... etc)
- Startar Arduino programmet och öppna ArduinoISP från filen > exempel på menyn
- Ladda upp skissen till Arduino Uno.
- Nu ändra följande inställningar:
- Kolla ATtiny85 (8 Mhz) kryssrutan i den Verktyg > styrelsen menyn.
- Kolla den: "Arduino som ISP" i den Verktyg > programmerare menyn.
Jag har lagt upp två versioner av programvaran.
De första arbetena på Arduino Uno endast och detta är eftersom jag gjorde den experimentella kretsen på Arduino för det första. Se bilder för camponent arrangemang som jag gjort. Du har ett val av massor av stift för in- och utgångar, så det beror på dig hur du namnger dem i kodningen. Jag använde pin A0 för analog input från LDR och då har jag stift 2, 3 och 4 för resten av kretsen.
Kan du hoppa över ansluta alla komponenter till Arduino föredrar du. Det finns ingen anledning att göra det, kan du gå rakt på ATtiny-programmering.
Grundläggande programvara förståelse - läsa här att se hur programmet fungerar
Det grundläggande konceptet är att varje sekund det är ett stift som driver LDR och några aktuella flöden igenom det och den varierande resistorn. Sedan den mellersta punkten mellan LDR och variabelt motstånd mäts från mikrokontroller och mätning (spänning mellan 0 och 5 volt) jämförs med ett inställt värde (2.5 volt i mitt fall) och logik beslut fattas.
I ett fall ingenting händer och mätning fortsätter på och på.
I det andra fallet lyser en LED upp för att visa att dörren har öppnats. Samtidigt börjar en timer räkna sekunder och om den når ange antalet sekunder (dvs. 10 sekunder), sedan ett pip hörs tills dörren är stängd. Medan sekunder räknas och pip ljud, mätningar tas också att se hur är det med dörren. Vi kommer att använda en Arduinho Uno för att programmera ATtiny85.
För den Attiny versionen 02:
/ * Kylskåp dörren larm detektor Version 02 Skrivet av Pavel Mihaylov och Tatqna Mihaylova 11 September 2012 denna version är redo att laddas upp till ATtiny85 microcontroller med Arduino Uno som programmerare. * / int pwr = 1; (Kan vara stift 3 på Arduino) hårda stift 6 på ATtiny int larm = 4; (Kan vara stift 4 på Arduino) hårda stift 3 på ATtiny int dörren = 2; (Kan vara stift 5 på Arduino) hårda stift 7 på ATtiny int LDR = 3; (Kan vara pin A0 på Arduino) hårda stift 2 på ATtiny int time_door_open = (3) * 1000; Tid som sätter pipet larm på efter kylskåpsdörren öppnas int tid = 50; Tid försening int time_tone = 40; Tid försening att sända ut en tonsignal tonar int time_tone2 = 20; Dags dröjsmål göra beep tone float trig = 4,5; Utlösa nivå för LDR flötet LDRval = 0; Startvärde för LDR mätning nivå int door_left = 0; Variabel för att ange om dörren är kvar öppnas (1) eller stängda (0) extern flyktiga osignerade långa timer0_overflow_count; Detta krävs för att veta när en överrullning inträffar void setup() {pinMode (pwr, produktionen); pinMode (larm, OUTPUT); pinMode (dörr, OUTPUT); pinMode (LDR, indata);} //Main program loop void loop() {if(read_light()) {door_left = 1; timer0_overflow_count = 0; osignerade långa start = millis(); / / Detta är tidnedräkningen när dörren öppnas medan ((millis() - start) < = time_door_open) {if(millis() - start < 0) //break medan slinga om rollover occures {break;} if(read_light() == 0) / / om dörren är stängd den programmet gör ingenting och startar igen {door_left = 0; break;} delay(time); dröjsmål behövs} if(door_left == 1) / / om dörren öppnas start pip ljud! {alarm_sound();} } delay(time); Delay(Time); Delay(Time); } //Function att läsa ljussensorn (LDR) och returnera 0 (dörren är stängd) eller 1 (dörren öppnas) int read_light() {digitalWrite (pwr, hög); / / aktivera pwr PIN-koden genom att göra spänningen hög för att en mätning tas delay(10); / / vänta en tid LDRval = analogRead(LDR); / / Läs sensor värde delay(5); / / vänta någon tid digitalWrite (pwr LÅG); Inaktivera pwr PIN-koden genom att spänningen låg LDRval = LDRval/1024 * 5. sensor värdet är i intervallet 0 till 1023 och vi behöver det mellan 0 och 5 - detta är beräkningen krävs if(LDRval<trig) / / Detta kan jämföras med behandlingen till avtryckaren nivå {digitalWrite (dörr, hög); / / slå på extern LED för att visa att dörren öppnas avkastning 1. / / medel dörren öppnas} annat {digitalWrite (dörr, låg); / / stänga den yttre LED av för att visa att dörren är stängd return 0; / / medel dörren stängs}} / * Loop att göra beep ljud först gör tre 3-pip hörs sedan gör 4-beep spunds för evigt om dörren står öppen * / void alarm_sound() {int looop1 = 0; int sound_loop1_skip = 0; while(read_light() & & looop1 < 3 & & sound_loop1_skip == 0) / / Detta gör öglan beep 3 gånger en 3-beep ton {int i, digitalWrite (larm HÖG); göra beep ljud på delay(time_tone); Delay(time_tone2); digitalWrite (larm, låg); göra beep ljud stopp delay(time_tone2); digitalWrite (larm, hög); göra beep ljud på delay(time_tone2); digitalWrite (larm, låg); göra beep ljud stopp delay(time_tone2); digitalWrite (larm, hög); göra beep ljud på delay(time_tone2); digitalWrite (larm, låg); göra beep ljud stopp delay(time_tone2); looop1 ++; read_light(); Delay(290); } //second pip loop nu börjar looop1 = 0; While(read_light()) {delay(300); int jag, digitalWrite (larm, hög), //make beep ljud på delay(time_tone); delay(time_tone); digitalWrite (larm, låg); //make beep ljud stopp delay(time_tone2); digitalWrite (larm, hög); //make pip-ljud på delay(time_tone2); digitalWrite (larm, låg); //make beep ljud stopp delay(time_tone2); digitalWrite (larm, hög); //make pip-ljud på delay(time_tone2), digitalWrite (larm LÅG); göra beep ljud stopp delay(time_tone2); digitalWrite (larm, hög); göra beep ljud på delay(time_tone2); digitalWrite (larm, låg); göra beep ljud stopp delay(time_tone2); Delay(270); {} //now gå å pipa om dörren är fortfarande öppnade if(read_light()) {sound_loop1_skip = 1; / / Detta kommer att göra programmet hoppa över 3-pip-ljud och fortsätta 4-beep ljud delay(2000); alarm_sound();} annat {sound_loop1_skip = 0;}}
För den ATtiny versionen 03:
Ändringar av v02 - i princip viloläge är aktiverat. ATtiny sover på varje cykel under 4 sekunder. Medan sova strömförbrukning är mycket liten - i storleksordningen 7uA.
/ * Kylskåp dörren larm detektor Version 03 skriven av Pavel Mihaylov och Tatqna Mihaylova 09 oktober 2012 denna version är redo att laddas upp till ATtiny85 microcontroller med Arduino Uno som programmerare. För fullständiga instruktioner se: * / / / efter linjer är viktigt att aktivera viloläge #include < avr/sleep.h > #include < avr/wdt.h > #ifndef cbi #define cbi (sfr, lite) (_SFR_BYTE(sfr) & = ~_BV(bit)) #endif #ifndef sbi #define sbi (sfr, lite) (_SFR_BYTE(sfr) | = _BV(bit)) #endif flyktiga boolean f_wdt = 1; int pwr = 1; (Kan vara stift 3 på Arduino) hårda stift 6 på ATtiny int larm = 4; (Kan vara stift 4 på Arduino) hårda stift 3 på ATtiny int dörren = 2; (Kan vara stift 5 på Arduino) hårda stift 7 på ATtiny int LDR = 3; (Kan vara pin A0 på Arduino) hårda stift 2 på ATtiny int time_door_open = (3) * 300; Tid som sätter pipet larm på efter kylskåpsdörren öppnas int tid = 50; Tid försening int time_tone = 40; Tid försening att sända ut en tonsignal tonar int time_tone2 = 20; Dags dröjsmål göra beep tone float trig = 3.5. Utlösa nivå för LDR flötet LDRval = 0; Startvärde för LDR mätning nivå int door_left = 0; Variabel för att ange om dörren är kvar öppnas (1) eller stängda (0) extern flyktiga osignerade långa timer0_overflow_count; Detta är obligatoriskt att veta när en överrullning inträffar //Pins setup void setup() {pinMode (pwr, produktionen); pinMode (larm, OUTPUT); pinMode (dörr, OUTPUT); pinMode (LDR, indata); setup_watchdog(8); / / ca 4 sekunder sova / / 0 = 16ms, 1 = 32ms, 2 = 64ms, 3 = 128ms, 4 = 250ms, 5 = 500ms 6 = 1 SEK, 7 = 2 sek, 8 = 4 SEK, 9 = 8 SEK} //Main program loop void loop() {/ / om (f_wdt == 1) {/ / vänta timeout watchdog / flaggan anges när en vakthund timeout inträffar f_wdt = 0; / / återställa flaggan / / if(read_light()) //In fall dörren öppnas detta uttalande kommer att vara sanna {door_left = 1; timer0_overflow_count = 0; osignerade långa start = millis(); / / Detta är tidnedräkningen när dörren öppnas medan ((millis() - start) < = time_door_open) {if(millis() - start < 0) paus; //break medan slinga om rollover occures if(read_light() == 0) / / om dörren stängs programmet gör ingenting och startar igen {door_left = 0; break;} delay(time); //delay behövs} om () door_left == 1) alarm_sound(); Om dörren öppnas börjar pip ljud! } //Now ställa in systemet för att sova system_sleep(); {}} //Function att läsa ljussensorn (LDR) och returnera 0 (dörren är stängd) eller 1 (dörren öppnas) int read_light() {digitalWrite (pwr, hög); / / slå pwr pin på genom att spänningen hög för att en mätning tas LDRval = analogRead(LDR); / / läsa sensor värde digitalWrite (pwr, låg); / / inaktivera pwr PIN-koden genom att spänningen låg LDRval = LDRval/1024 * 5. / / sensor värdet är i intervallet 0 till 1023 och vi behöver det mellan 0 och 5 - detta är beräkningen krävs if(LDRval<trig) / / Detta kan jämföras med behandlingen till avtryckaren nivå {digitalWrite (dörr, hög); / / slå på extern LED för att visa att dörren öppnas avkastning 1. / / medel dörren öppnas} annat {digitalWrite (dörr, låg); / / stänga den yttre LED av för att visa att dörren är stängd return 0; / / medel dörren stängs}} / * Loop att göra beep ljud först gör tre 3-pip hörs sedan gör 4-beep spunds för evigt om dörren står öppen * / void alarm_sound() {int looop_1_count = 0; int sound_loop1_skip = 0; while(read_light() & & looop_1_count < 3 & & sound_loop1_skip == 0) / / Detta gör öglan beep 3 gånger en 3-beep ton {digitalWrite (larm, hög), //make beep ljud på delay(time_tone), delay(time_tone2), digitalWrite (larm LÅG); göra beep ljud stopp delay(time_tone2); digitalWrite (larm, hög); göra beep ljud på delay(time_tone2); digitalWrite (larm, låg); göra beep ljud stopp delay(time_tone2); digitalWrite (larm, hög); göra beep ljud på delay(time_tone2); digitalWrite (larm, låg); göra beep ljud stopp delay(time_tone2); looop_1_count ++; read_light(); Delay(290); } //second pip loop nu börjar looop_1_count = 0; While(read_light()) {digitalWrite (larm, hög), //make beep ljud på delay(time_tone), delay(time_tone); digitalWrite (larm, låg); //make beep ljud stopp delay(time_tone2); digitalWrite (larm, hög); //make pip-ljud på delay(time_tone2); digitalWrite (larm, låg); //make beep ljud stopp delay(time_tone2); digitalWrite (larm, hög); //make pip-ljud på delay(time_tone2); digitalWrite (larm, låg); //make beep ljud stopp delay(time_tone2), digitalWrite (larm HÖG); göra beep ljud på delay(time_tone2); digitalWrite (larm, låg); göra beep ljud stopp delay(time_tone2); Delay(570); } //now gå å pipa om dörren är fortfarande öppnade if(read_light()) {sound_loop1_skip = 1; / / Detta kommer att göra programmet hoppa över 3-pip-ljud och fortsätta 4-beep ljud delay(2000); if(read_light()) alarm_sound();} annat sound_loop1_skip = 0; } / / ställa in systemet i lågeffektläge enligt / / system vaknar upp när wtchdog är timeout void system_sleep() {cbi(ADCSRA,ADEN); / / växla Analog till Digitalconverter av set_sleep_mode(SLEEP_MODE_PWR_DOWN); / / viloläge finns här sleep_enable(); sleep_mode(); / / System sover här sleep_disable(); / / System fortsätter utförande här när watchdog timeout sbi(ADCSRA,ADEN); / / växla Analog till Digitalconverter på} / / 0 = 16ms , 1 = 32ms, 2 = 64ms, 3 = 128ms, 4 = 250ms, 5 = 500ms / / 6 = 1 SEK, 7 = 2 sek, 8 = 4 SEK, 9 = 8 SEK void setup_watchdog (int ii) {byte bb; int ww; om (ii > 9) ii = 9; bb = ii & 7; om (ii > 7) bb| = (1 << 5), bb| = (1 << WDCE); ww = bb; MCUSR & = ~ (1 << WDRF); Starta tidsinställda ordning WDTCR | = (1 << WDCE) | (1 << Mimmi); Ange nya watchdog timeout-värde WDTCR = bb; WDTCR | = _BV(WDIE); } / / Watchdog avbryta tjänsten / exekveras när watchdog timeout ISR(WDT_vect) {f_wdt = 1; / / set global flagga}
För Arduino Version 01:
/ * Kylskåp dörren larm detektor Version 01 Skrivet av Pavel Mihaylov och Tatqna Mihaylova 11 September 2012 denna version är redo att laddas upp till Arduino Uno microcontroller med Arduino Uno som programmerare. * / int led = 2; int pwr = 3; int larm = 4; int dörren = 5; int LDR = A0; int time_door_open = (3) * 1000; värdet inom parentes är i sekunder int tid = 500. int time2 = tid * 2. int time_tone = 80. att sända ut en tonsignal tonar int tx = 1; Ange 1 om du vill övervaka den seriella porten felsökning info, 0 annars flyter trig = 2.5. flyta LDRval = 0; int door_left = 0; om dörren är kvar öppnas (1) eller stängda (0) extern flyktiga osignerade långa timer0_overflow_count; Rutinen installationsprogrammet körs en gång när du trycker på reset: void setup() {/ / initiera digital PIN-koden som en utgång. if(tx) Serial.begin(9600); pinMode (ledde, OUTPUT); pinMode (pwr, produktionen); pinMode (larm, OUTPUT); pinMode (dörr, OUTPUT); pinMode (LDR, indata);} / / loop rutin kör om och om igen för alltid: void loop() {om (tx) delay(time); om (tx) {Serial.print("---\n");} read_light(); if(read_light()) {om (tx) delay(time); om (tx) {Serial.print ("dörren precis öppnat! \n");} digitalWrite (dörr HÖG); door_left = 1; int n = 0; timer0_overflow_count = 0; osignerade långa start = millis(); medan ((millis() - start) < = time_door_open) {if(millis() - start < 0) //break medan slinga om rollover occures {om (tx) {Serial.print ("ROLLOVER UPPSTOD");} bryta;} om (tx) {Serial.print ("räkna sekunder down\n");} om (tx) {Serial.print(millis());} n ++; read_light(); if(read_light() == 0) {om (tx) delay(time); om (tx) {Serial.print ("bara stängd dörr! \n");} digitalWrite (dörr, låg), door_left = 0; break;} delay(time); //delay behövs} om (tx) {Serial.print ("ur medan loop! \n");} if(door_left == 1) {om (tx) delay(time); om (tx) {Serial.print (">>> larm utlöst! \n");} alarm_sound(); {} annat {om (tx) delay(time); om (tx) {Serial.print ("larm inte utlöste! \n");}}} annat {om (tx) delay(time); om (tx) {Serial.print ("dörren kan det vara! \n");}} delay(time2); } //Function att läsa ljussensorn (LDR) och returnera 0 (dörren är stängd) eller 1 (dörren öppnas) int read_light() {digitalWrite (ledde, högt); / / aktivera LED genom att göra den spänningen hög digitalWrite (pwr, hög); / / aktivera pwr PIN-koden genom att göra spänningen hög för att en mätning tas delay(30); / / vänta en tid LDRval = analogRead(LDR); / / Läs sensor värde delay(10); / / vänta någon tid digitalWrite (ledde LÅG); Inaktivera LED genom att göra spänning låg digitalWrite (pwr, låg); Inaktivera pwr PIN-koden genom att spänningen låg LDRval = LDRval/1024 * 5. sensor värdet är i intervallet 0 till 1023 och vi behöver det mellan 0 och 5 - detta är beräkningen krävs om (tx) {Serial.print ("\nLDR värde i volt ="); Serial.println(LDRval); } if(LDRval<trig) {tillbaka 1. / / medel dörren öppnas} annat {return 0; / / medel dörren stängs}} / * Loop att göra beep ljud först gör tre 3-pip hörs sedan gör 4-beep ljud * / void alarm_sound() {/ / digitalWrite (larm, hög); int looop1 = 0; while(read_light() & & looop1 < 3) {om (tx) delay(time); om (tx) {Serial.print ("dörren fortfarande öppnas-pip nu andra gången! \n");} int i, digitalWrite (larm HÖG); göra beep ljud delay(80); digitalWrite (larm, låg); göra beep ljud delay(320); digitalWrite (larm, låg); göra beep ljud delay(time_tone); digitalWrite (larm, låg); göra beep ljud för (jag = 15; jag > = 0; i--) {digitalWrite (larm, hög); //make beep ljud delay(i); digitalWrite (larm, låg); //make beep ljud} digitalWrite (larm, låg); göra beep ljud delay(time_tone); digitalWrite (larm, låg); göra beep ljud för (jag = 18; jag > = 0; i--) {digitalWrite (larm, hög); //make beep ljud delay(i); digitalWrite (larm, låg); //make beep ljud} digitalWrite (larm, låg); göra beep ljud delay(time_tone); digitalWrite (larm, låg); göra beep ljud delay(1500); looop1 ++; read_light(); } delay(2000); andra beep loop nu börjar looop1 = 0; While(read_light() & & looop1 < 3) {om (tx) delay(time); om (tx) {Serial.print ("dörren fortfarande öppnas-pip nu andra gången!\n");} int i; digitalWrite (larm, hög); göra beep ljud delay(80); digitalWrite (larm, låg); göra beep ljud delay(320); digitalWrite (larm, låg); göra beep ljud delay(time_tone); digitalWrite (larm, låg); göra beep ljud för (jag = 15; jag > = 0; i--) {digitalWrite (larm, hög); //make beep ljud delay(i); digitalWrite (larm, låg); //make beep ljud} digitalWrite (larm, låg); göra beep ljud delay(time_tone); digitalWrite (larm, låg); göra beep ljud för (jag = 18; jag > = 0; i--) {digitalWrite (larm, hög); //make beep ljud delay(i); digitalWrite (larm, låg); //make beep ljud} digitalWrite (larm, låg); göra beep ljud delay(time_tone); digitalWrite (larm, låg); göra beep ljud för (jag = 18; jag > = 0; i--) {digitalWrite (larm, hög); //make beep ljud delay(i); digitalWrite (larm, låg); //make beep ljud} delay(1000); looop1 ++; read_light(); {} //now gå om dörren är fortfarande öppnade if(read_light()) {delay(3000); //time starta om två pip loopar alarm_sound();} annat {/ / digitalWrite (larm, låg), om (tx) delay(time); om (tx) {Serial.print ("bara var dörren stängd av arg kille! \n");} digitalWrite (dörr, låg);}}