Stap 3: Programmering Softwareontwikkeling
Stappen voor het verbinden van ATtiny85 naar de Arduino Uno voor programmering:
- Download dit bestand: https://github.com/damellis/attiny/zipball/Arduino1
- Unzip en zet de "attiny" map in de map van de "hardware" waar tha Arduino op uw PC is geïnstalleerd. Het pad ziet er als volgt: documenten > Arduino > hardware > attiny > (andere gedownloade bestanden... enz)
- Start de toepassing van de Arduino en de ArduinoISP uit het bestand openen > voorbeelden menu
- Het uploaden van de schets aan de Arduino Uno.
- Nu de volgende instellingen wijzigen:
- De ATtiny85 controleren (8 Mhz) checkbox in de Tools > Pension menu.
- Controleren de: "Arduino als ISP" in de Tools > menu Programmer.
Ik heb geupload twee versies van de software.
De eerste werken op Arduino Uno alleen en dit is omdat ik om te beginnen het experimentele circuit op de Arduino gemaakt. Zie de foto's voor de camponent-arangement die ik heb gemaakt. Je hebt een keuze uit veel pinnen voor de ingangen en uitgangen, dus het hangt af van u hoe u een naam geven in de code. Ik gebruikte pin A0 voor de analoge input van de LDR en dan heb ik pin 2, 3 en 4 voor de rest van het circuit.
Kunt u overslaan alle componenten aansluiten op de Arduino desgewenst. Er is geen behoefte om het te doen, kun je rechtdoor de ATtiny programmering.
Basissoftware begrip - Lees deze om te zien hoe de SOFTWARE werkt
Het concept van de basic-programma is dat elke seconde is er een pin dat de bevoegdheden van de LDR en sommige huidige stroomt door het en de variabele weerstand. Dan het middelste punt tussen de LDR en de variabele weerstand wordt gemeten vanaf de microcontroller en de meting (spanning tussen 0 en 5 volt) wordt vergeleken met een ingestelde waarde (2,5 volt in mijn geval) en een logica uitspraak is gedaan.
In één geval gebeurt er niets en de meting blijft op en op.
In het andere geval lampje een LED-brandt om aan te tonen dat de deur is geopend. Op hetzelfde moment een timer begint tellen seconden en als het bereikt het ingestelde aantal seconden (dat wil zeggen 10 seconden), dan een pieptoon klinkt totdat de deur wordt gesloten. Terwijl seconden ingedrukt worden geteld en het geluid, piept metingen ook gehouden zijn om te zien wat de situatie met de deur. We zullen een Arduinho Uno gebruiken voor het programmeren van de ATtiny85.
Voor de Attiny versie 02:
/ * Koelkast deur Alarm Detector versie 02 geschreven door Pavel Mihaylov en Tatqna Mihaylova 11 September 2012 deze versie is klaar om te worden geüpload naar ATtiny85 microcontroller met behulp van Arduino Uno als een programmeur. * / int pwr = 1; (Zou 3 pin op de Arduino) harde pin 6 op ATtiny int alarm = 4; (Zou 4 pin op de Arduino) harde pin 3 op ATtiny int deur = 2; (Zou 5 pin op de Arduino) harde pin 7 op ATtiny int LDR = 3; (Zou A0 op Arduino pin) harde pin 2 op ATtiny int. time_door_open = (3) * 1000; Tijd waarin het geluidssignaal van alarm op na het openen van de deur van de koelkast int tijd = 50; Tijd vertraging int time_tone = 40; Tijd vertraging te maken van de piep Toon int time_tone2 = 20; Tijd vertraging om de pieptoon tone float trig = 4.5; Trigger niveau voor de LDR float LDRval = 0; Initiële waarde van de LDR meting niveau int door_left = 0; Variabele instellen of de deur blijft geopend (1) of gesloten (0) extern vluchtige unsigned long timer0_overflow_count; Dit is nodig om te weten wanneer een rollover voorkomt void setup {pinMode (pwr, OUTPUT); pinMode (alarm, OUTPUT); pinMode (deur, OUTPUT); pinMode (LDR, INPUT);} //Main programma lus void loop {if(read_light()) {door_left = 1; timer0_overflow_count = 0; unsigned lange start = millis(); / / Dit is het aftellen van de tijd wanneer de deur wordt geopend terwijl ((millis() - start) < = time_door_open) {if(millis() - start < 0) //break while lus als rollover occures {pauze;} if(read_light() == 0) / / als de deur wordt gesloten de programma doet niets en begint opnieuw {door_left = 0; break;} delay(time); vertraging nodig} if(door_left == 1) / / als de deur wordt geopend start de piep geluid! {alarm_sound();} } delay(time); delay(time); delay(time); } //Function te lezen van de lichtsensor (LDR) en retourneren (de deur wordt gesloten) 0 of 1 (de deur is geopend) int read_light() {digitalWrite (pwr, hoge); / / de pwr-pin inschakelen door de spanning hoog om een meting te nemen delay(10); / / wachten voor enige tijd LDRval = analogRead(LDR); / / Lees de sensor waarde delay(5); / / wait sommige tijd digitalWrite (pwr LAAG); de pwr-pin uitschakelen door de lage LDRval spanning = LDRval/1024 * 5; sensor-waarde is in het bereik 0 tot en met 1023 en we hebben het nodig tussen 0 en 5 - Dit is de berekening vereist if(LDRval<trig) / / dit vergelijkt de lezing het triggerniveau {digitalWrite (deur, hoge); / / schakelen de externe ON LED om aan te tonen dat de deur wordt geopend terug 1; / / middelen deur wordt geopend} anders {digitalWrite (deur, laag); / / uitzetten de externe LED om aan te tonen dat de deur is retour 0 gesloten; / / middelen deur is gesloten}} / * lus te maken de pieptoon klinkt eerst drie 3-pieptoon geluiden maakt dan maakt 4-pieptoon spunds voorgoed als blijft de deur geopend * / void alarm_sound() {int looop1 = 0; int sound_loop1_skip = 0; while(read_light() & & looop1 < 3 & & sound_loop1_skip == 0) / / Dit maakt de lus 3 keer een 3-pieptoon pieptoon {int ik; digitalWrite (alarm HOGE); maken van piep geluid op delay(time_tone); delay(time_tone2); digitalWrite (alarm, laag); maken van piep geluid stop delay(time_tone2); digitalWrite (alarm, hoge); maken van piep geluid op delay(time_tone2); digitalWrite (alarm, laag); maken van piep geluid stop delay(time_tone2); digitalWrite (alarm, hoge); maken van piep geluid op delay(time_tone2); digitalWrite (alarm, laag); maken van piep geluid stop delay(time_tone2); looop1 ++; read_light(); delay(290); } //second beep lus begint nu looop1 = 0; while(read_light()) {delay(300); int ik digitalWrite (alarm, hoge) //make piep geluid op delay(time_tone); delay(time_tone); digitalWrite (alarm, laag); //make piep geluid stop delay(time_tone2); digitalWrite (alarm, hoge); //make piepergeluid op delay(time_tone2); digitalWrite (alarm, laag); //make piep geluid stop delay(time_tone2); digitalWrite (alarm, hoge); //make piepergeluid op delay(time_tone2); digitalWrite (alarm LAAG); maken van piep geluid stop delay(time_tone2); digitalWrite (alarm, hoge); maken van piep geluid op delay(time_tone2); digitalWrite (alarm, laag); maken van piep geluid stop delay(time_tone2); delay(270); } //now op gaan piepen als deur is nog geopende if(read_light()) {sound_loop1_skip = 1; / / hierdoor wordt het programma de 3-piepergeluid overslaan en doorgaan met de 4-beep geluid delay(2000); alarm_sound();} else {sound_loop1_skip = 0;}}
Voor de ATtiny versie 03:
Wijzigingen in v02 - in principe de slaapstand is ingeschakeld. De ATtiny slaapt op elke cyclus voor de duur van 4 seconden. Terwijl slapen stroomverbruik zeer kleine - in de volgorde van 7uA is.
/ * Koelkast deur Alarm Detector versie 03 geschreven door Pavel Mihaylov en Tatqna Mihaylova 09 oktober 2012 deze versie is klaar om te worden geüpload naar ATtiny85 microcontroller met behulp van Arduino Uno als een programmeur. Voor volledige instructies, zie: * / / / de volgende regels zijn van essentieel belang om de slaapstand #include < avr/sleep.h > #include < avr/wdt.h > #ifndef cbi #define cbi (sfr, bit) (_SFR_BYTE(sfr) & ~_BV(bit)) #endif #ifndef sbi #define sbi (sfr, beetje) = (_SFR_BYTE(sfr) | _BV(bit)) #endif vluchtige Boole f_wdt = = 1; int pwr = 1; (Zou 3 pin op de Arduino) harde pin 6 op ATtiny int alarm = 4; (Zou 4 pin op de Arduino) harde pin 3 op ATtiny int deur = 2; (Zou 5 pin op de Arduino) harde pin 7 op ATtiny int LDR = 3; (Zou A0 op Arduino pin) harde pin 2 op ATtiny int. time_door_open = (3) * 300; Tijd waarin het geluidssignaal van alarm op na het openen van de deur van de koelkast int tijd = 50; Tijd vertraging int time_tone = 40; Tijd vertraging te maken van de piep Toon int time_tone2 = 20; Tijd vertraging om de pieptoon tone float trig = 3.5; Trigger niveau voor de LDR float LDRval = 0; Initiële waarde van de LDR meting niveau int door_left = 0; Variabele instellen of de deur blijft geopend (1) of gesloten (0) extern vluchtige unsigned long timer0_overflow_count; Dit vereist is om te weten wanneer een rollover voorkomt //Pins setup void setup {pinMode (pwr, OUTPUT); pinMode (alarm, OUTPUT); pinMode (deur, OUTPUT); pinMode (LDR, INPUT); setup_watchdog(8); / / ongeveer 4 seconden slapen / / 0 = 16 MS, 1 = 32ms, 2 = 64ms, 3 = 128ms, 4 = 250ms, 5 = 500ms 6 = 1 sec, 7 = 2 sec, 8 = 4 sec, 9 = 8 sec} //Main programma lus void loop {/ / if (f_wdt == 1) {/ / wachten op de time-out van de watchdog / vlag wordt ingesteld wanneer een watchdog time-out f_wdt optreedt = 0; / / Reset vlag / / if(read_light()) //In geval de deur wordt geopend dit verklaring zal gelden {door_left = 1; timer0_overflow_count = 0; unsigned lange start = millis(); / / Dit is het aftellen van de tijd wanneer de deur wordt geopend terwijl ((millis() - start) < = time_door_open) {if(millis() - start < 0) pauze; //break while lus als rollover occures if(read_light() == 0) / / als deur gesloten is het programma doet niets en begint weer {door_left = 0; break;} delay(time); //delay nodig} als () door_left == 1) alarm_sound(); Als de deur wordt geopend starten de piep geluid! } //Now zet het systeem om te slapen system_sleep(); }} //Function te lezen van de lichtsensor (LDR) en retourneren (de deur wordt gesloten) 0 of 1 (de deur is geopend) int read_light() {digitalWrite (pwr, hoge); / / schakelen de pwr-pin op doordat de spanning hoog om een meting te nemen LDRval = analogRead(LDR); / / Lees de sensor waarde digitalWrite (pwr, laag); / / de pwr-pin uitzetten door de lage LDRval spanning = LDRval/1024 * 5; / / sensor-waarde is in het bereik 0 tot en met 1023 en we nodig tussen 0 en 5 - Dit is de berekening vereist if(LDRval<trig) / / dit vergelijkt de lezing het triggerniveau {digitalWrite (deur, hoge); / / schakelen de externe ON LED om aan te tonen dat de deur wordt geopend terug 1; / / middelen deur wordt geopend} anders {digitalWrite (deur, laag); / / uitzetten de externe LED om aan te tonen dat de deur is retour 0 gesloten; / / middelen deur is gesloten}} / * lus om de pieptoon geluiden te maken eerst drie 3-pieptoon geluiden maakt dan maakt 4-pieptoon spunds voor altijd als de deur geopend blijft * / void alarm_sound() {int looop_1_count = 0; int sound_loop1_skip = 0; while(read_light() & & looop_1_count < 3 & & sound_loop1_skip == 0) / / Dit maakt de lus 3 keer een 3-pieptoon {digitalWrite (alarm, hoge) //make piep geluid op delay(time_tone); delay(time_tone2); digitalWrite (alarm pieptoon LAAG); maken van piep geluid stop delay(time_tone2); digitalWrite (alarm, hoge); maken van piep geluid op delay(time_tone2); digitalWrite (alarm, laag); maken van piep geluid stop delay(time_tone2); digitalWrite (alarm, hoge); maken van piep geluid op delay(time_tone2); digitalWrite (alarm, laag); maken van piep geluid stop delay(time_tone2); looop_1_count ++; read_light(); delay(290); } //second beep lus begint nu looop_1_count = 0; while(read_light()) {digitalWrite (alarm, hoge) //make piep geluid op delay(time_tone); delay(time_tone); digitalWrite (alarm, laag); //make piep geluid stop delay(time_tone2); digitalWrite (alarm, hoge); //make piepergeluid op delay(time_tone2); digitalWrite (alarm, laag); //make piep geluid stop delay(time_tone2); digitalWrite (alarm, hoge); //make piepergeluid op delay(time_tone2); digitalWrite (alarm, LOW); //make piep geluid stop delay(time_tone2); digitalWrite (alarm HOGE); maken van piep geluid op delay(time_tone2); digitalWrite (alarm, laag); maken van piep geluid stop delay(time_tone2); delay(570); } //now op gaan piepen als deur is nog geopende if(read_light()) {sound_loop1_skip = 1; / / Dit zal het programma de 3-piepergeluid overslaan en doorgaan met de 4-beep geluid delay(2000); if(read_light()) alarm_sound();} anders sound_loop1_skip = 0; } / / set systeem in de slaapstand / / systeem wakker wanneer wtchdog een opgetreden nietig system_sleep() time-out is {cbi(ADCSRA,ADEN); / / schakelende analoge naar Digitalconverter OFF set_sleep_mode(SLEEP_MODE_PWR_DOWN); / / slaapstand ligt hier sleep_enable(); sleep_mode(); / / systeem slaapt hier sleep_disable(); / / systeem blijft uitvoering hier als waakhond sbi(ADCSRA,ADEN) time-out; / / schakelende analoge Digitalconverter aan} / / 0 = 16 MS , 1 = 32ms, 2 = 64ms, 3 = 128ms, 4 = 250ms, 5 = 500ms / / 6 = 1 sec, 7 = 2 sec, 8 = 4 sec, 9 = 8 sec void setup_watchdog (int ii) {byte bb; int ww; als (ii > 9) ii = 9; bb = ii & 7; als (ii > 7) bb| = (1 << 5); bb| = (1 << WDCE); ww = bb; MCUSR & = ~ (1 << WDRF); Start van de getimede volgorde WDTCR | = (1 << WDCE) | (1 << WDE); nieuwe waakhond WDTCR time-outwaarde instellen = bb; WDTCR | = _BV(WDIE); } / / Watchdog Service onderbreken / wordt uitgevoerd wanneer de watchdog time-out ISR(WDT_vect) {f_wdt = 1; / / set van globale vlag}
Voor de versie van het Arduino 01:
/ * Koelkast deur Alarm Detector versie 01 geschreven door Pavel Mihaylov en Tatqna Mihaylova 11 September 2012 deze versie is klaar om te worden geüpload naar de Arduino Uno microcontroller met behulp van Arduino Uno als een programmeur. * / int led = 2; int pwr = 3; int alarm = 4; int deur = 5; int LDR = A0; int. time_door_open = (3) * 1000; waarde tussen haakjes is in seconden int tijd = 500; int time2 = tijd * 2; int time_tone = 80; Maak de piep Toon int tx = 1; Dit instellen op 1 als u wilt controleren van de seriële poort debugging info, anders 0 zweven trig = 2.5; zweven LDRval = 0; int door_left = 0; (1) of de deur is links geopend of gesloten (0) extern vluchtige unsigned long timer0_overflow_count; de installatieroutine loopt zodra wanneer u drukt op reset: void Setup {/ / de digitale pin initialiseren als een output. if(tx) Serial.begin(9600); pinMode (leidde, OUTPUT); pinMode (pwr, OUTPUT); pinMode (alarm, OUTPUT); pinMode (deur, OUTPUT); pinMode (LDR, INPUT);} / / de routine lus loopt over en weer forever: void loop {als (tx) delay(time); als (tx) {Serial.print("---\n")}; read_light(); if(read_light()) {als (tx) delay(time); als (tx) {Serial.print ("deur die net geopend! \n");} digitalWrite (deur HOGE); door_left = 1; int n = 0; timer0_overflow_count = 0; unsigned long start = millis(); terwijl ((millis() - start) < = time_door_open) {if(millis() - start < 0) //break while lus als rollover occures {als (tx) {Serial.print ("ROLLOVER geschied");} breken;} als (tx) {Serial.print ("Counting seconden down\n");} als (tx) {Serial.print(millis())}; n ++; read_light(); if(read_light() == 0) {als (tx) delay(time); als (tx) {Serial.print ("net gesloten deur! \n");} digitalWrite (deur, laag); door_left = 0; break;} delay(time); //delay nodig} als (tx) {Serial.print ("Out van while-lus! \n");} if(door_left == 1) {als (tx) delay(time); Als (tx) {Serial.print (">>> Alarm geactiveerd! \n");} alarm_sound(); } else {als (tx) delay(time); als (tx) {Serial.print ("Alarm niet geactiveerd! \n");}}} else {als (tx) delay(time); als (tx) {Serial.print ("deur blijft gesloten! \n");}} delay(time2); } //Function te lezen van de lichtsensor (LDR) en retourneren (de deur wordt gesloten) 0 of 1 (de deur is geopend) int read_light() {digitalWrite (leidde, hoog); / / de LED inschakelen door de spanning hoog digitalWrite (pwr, hoge); / / de pwr-pin inschakelen door de spanning hoog om een meting te nemen delay(30); / / wachten voor enige tijd LDRval = analogRead(LDR); / / Lees de sensor waarde delay(10); / / wait voor sommige digitalWrite van de tijd (onder leiding LAAG); de LED uitschakelen door de lage digitalWrite van spanning (pwr, laag); de pwr-pin uitschakelen door de lage LDRval spanning = LDRval/1024 * 5; sensor-waarde is in het bereik 0 tot en met 1023 en we hebben het nodig tussen 0 en 5 - Dit is de berekening vereist indien (tx) {Serial.print ("\nLDR waarde in volt ="); Serial.println(LDRval); } if(LDRval<trig) {return 1; / / middelen deur wordt geopend} anders {keren 0; / / middelen deur is gesloten}} / * lus om de pieptoon geluiden te maken eerst maakt drie 3-pieptoon klinkt dan maakt 4-pieptoon geluiden * / void alarm_sound() {/ / digitalWrite (alarm, hoge); int looop1 = 0; while(read_light() & & looop1 < 3) {als (tx) delay(time); als (tx) {Serial.print ("deur is nog steeds geopend-nu piept tweede keer! \n");} int ik; digitalWrite (alarm HOGE); maken van piep geluid delay(80); digitalWrite (alarm, laag); maken van piep geluid delay(320); digitalWrite (alarm, laag); maken van piep geluid delay(time_tone); digitalWrite (alarm, laag); piep geluid voor maken (ik = 15; Ik > = 0; i--) {digitalWrite (alarm, hoge); //make piep geluid delay(i) digitalWrite (alarm, laag); //make beep geluid} digitalWrite (alarm, laag); maken van piep geluid delay(time_tone); digitalWrite (alarm, laag); piep geluid voor maken (ik = 18; ik > = 0; i--) {digitalWrite (alarm, hoge); //make piep geluid delay(i) digitalWrite (alarm, laag); //make beep geluid} digitalWrite (alarm, laag); maken van piep geluid delay(time_tone); digitalWrite (alarm, laag); maken van piep geluid delay(1500); looop1 ++; read_light(); } delay(2000); tweede pieptoon lus begint nu looop1 = 0; while(read_light() & & looop1 < 3) {als (tx) delay(time); als (tx) {Serial.print ("deur is nog steeds geopend-nu piept tweede keer!\n");} int i; digitalWrite (alarm, hoge); maken van piep geluid delay(80); digitalWrite (alarm, laag); maken van piep geluid delay(320); digitalWrite (alarm, laag); maken van piep geluid delay(time_tone); digitalWrite (alarm, laag); piep geluid voor maken (ik = 15; Ik > = 0; i--) {digitalWrite (alarm, hoge); //make piep geluid delay(i) digitalWrite (alarm, laag); //make beep geluid} digitalWrite (alarm, laag); maken van piep geluid delay(time_tone); digitalWrite (alarm, laag); piep geluid voor maken (ik = 18; ik > = 0; i--) {digitalWrite (alarm, hoge); //make piep geluid delay(i) digitalWrite (alarm, laag); //make beep geluid} digitalWrite (alarm, laag); maken van piep geluid delay(time_tone); digitalWrite (alarm, laag); piep geluid voor maken (ik = 18; ik > = 0; i--) {digitalWrite (alarm, hoge); //make piep geluid delay(i) digitalWrite (alarm, laag); //make beep geluid} delay(1000); looop1 ++; read_light(); } //now gaan op als deur is nog geopende if(read_light()) {delay(3000); //time opnieuw op te starten van de twee pieptoon lussen alarm_sound();} anders {/ / digitalWrite (alarm, laag); als (tx) delay(time); als (tx) {Serial.print ("deur was net gesloten door de boze man! \n");} digitalWrite (deur, laag);}}