Etape 3: Développement de logiciels de programmation
Étapes pour se connecter ATtiny85 à Arduino Uno pour la programmation :
- Téléchargez ce fichier : https://github.com/damellis/attiny/zipball/Arduino1
- Décompresser et placer le dossier « attiny » dans le dossier de « matériel » où tha Arduino est installé sur votre PC. Le chemin ressemble à ceci : Documents > Arduino > Matériel > attiny > (autres fichiers téléchargés... etc)
- Démarrez l’Application de l’Arduino et ouvrir la ArduinoISP du fichier > menu exemples
- Téléchargez le croquis sur l’Arduino Uno.
- Maintenant modifier les paramètres suivants :
- Vérifier la ATtiny85 (8 Mhz) case à cocher dans la Outils > menu Board.
- Vérifier la: « Arduino comme fournisseur de services Internet » dans le Outils > menu programmeur.
J’ai téléchargé deux versions du logiciel.
Les premiers travaux sur l’Arduino Uno seulement et ce sont parce que j’ai fait le circuit expérimental sur l’Arduino, d’abord. Voir les photos de l’arrangement de camponent que j’ai fait. Vous avez le choix des lots d’épingles pour les entrées et sorties, donc cela dépend de vous comment vous les nommez dans le codage. J’ai utilisé des broches A0 pour l’analogue de la LDR et puis j’ai broches 2, 3 et 4 pour le reste du circuit.
Vous pouvez sauter connexion tous les composants à l’Arduino, si vous préférez. Il n’y a pas besoin de le faire, vous pouvez aller directement sur la programmation ATtiny.
Compréhension de base du logiciel - lire ce à voir logiciel de fonctionnement du
Le concept de programme de base est que chaque seconde il y a une tige qui actionne la LDR et certains courant passe à travers elle et la résistance variable. Ensuite, le point médian entre la LDR et la résistance variable est mesuré à partir du microcontrôleur et la mesure (tension entre 0 et 5 volts) est comparée à une valeur définie (2,5 volts dans mon cas) et une décision logique est faite.
Dans un cas, rien ne se passe et la mesure continue sur et sur.
Dans le cas contraire une LED s’allume pour montrer que la porte a été ouverte. En même temps une minuterie commence à compter les secondes, et s’il atteint le nombre de secondes (c.-à-d. 10 secondes), puis un bip est émis jusqu'à ce que la porte est fermée. Tandis que les secondes sont comptées vers le bas et les bips sonores, des mesures sont également prises pour voir quelle est la situation avec la porte. Nous utiliserons un Arduinho Uno pour programmer le ATtiny85.
Pour la Version Attiny 02 :
/ * Réfrigérateur porte alarme détecteur Version 02 écrite par Pavel Mihaylov et Tatqna Mihaylova 11 septembre 2012 cette version est prêt à être téléchargé sur ATtiny85 microcontrôleur à l’aide de Arduino Uno en tant que programmeur. * / int pwr = 1 ; (Pourrait être broche 3 sur Arduino) dur broche 6 ATtiny int alarme = 4 ; (Pourrait être broche 4 sur Arduino) dure broche 3 sur ATtiny int porte = 2 ; (Peut être la broche 5 sur Arduino) dur broche 7 sur ATtiny int LDR = 3 ; (Pourrait être épingler A0 sur Arduino) dur broche 2 sur ATtiny int time_door_open = (3) * 1000 ; Temps qui définit le bip d’alarme sur après l’ouverture de la porte du réfrigérateur int temps = 50 ; Temps retard int time_tone = 40 ; Temporisation pour rendre le bip sonore int time_tone2 = 20 ; Temporisation pour rendre le flotteur de tonalité bip trig = 4,5 ; Nécessaire pour le flotteur LDR LDRval = 0 ; Première valeur de la LDR mesure niveau int door_left = 0 ; Variable pour définir si on laisse la porte ouverte (1) ou fermé (0) extern volatils unsigned long timer0_overflow_count ; Ceci est requis pour savoir qu’un renversement produit void setup() {pinMode (pwr, sortie); pinMode (alarme, sortie); pinMode (porte, sortie); pinMode (entrée, LDR);} //Main programme boucle void loop() {if(read_light()) {door_left = 1; timer0_overflow_count = 0; unsigned long début = millis(); / / Ceci est le compte à rebours lorsque la porte est ouverte alors que ((millis() - start) < = time_door_open) {if(millis() - start < 0) //break boucle while si retournement a lieu {break;} if(read_light() == 0) / / si la porte est fermée le programme ne fait rien et recommence {door_left = 0; break;} delay(time) ; délai nécessaire} if(door_left == 1) / / si la porte est ouverte, démarrez le bip sonore ! {alarm_sound();} } delay(time) ; Delay(Time) ; Delay(Time) ; } //Function à lire le capteur de lumière (LDR) et retourne 0 (la porte est fermée) ou 1 (la porte est ouverte) int read_light() {digitalWrite (pwr, HIGH); / / activer le code pin pwr en rendant la tension élevée pour permettre une mesure est prise delay(10); / / attendre pendant un certain temps LDRval = analogRead(LDR); / / lecture du capteur valeur delay(5); / / attendre quelques temps digitalWrite (pwr FAIBLE) ; désactiver le code pin pwr en rendant la tension basse LDRval = LDRval/1024 * 5 ; valeur de la sonde est dans la plage 0 à 1023 et nous en avons besoin entre 0 et 5 - c’est le calcul requis if(LDRval<trig) / / cela compare à la lecture pour le niveau de déclenchement {digitalWrite (porte haute); / / allumer le LED externe pour montrer que la porte est ouverte 1 retour; / / ouverture de porte de moyens} d’autre {digitalWrite (porte, faible); / / arrête l’extérieur LED pour montrer que la porte est fermée return 0; / / moyens porte est fermée}} / * boucle pour faire le bip retentit d’abord fait trois 3-bip sonore puis fait bip-4 spunds à jamais si la porte reste ouverte * / void alarm_sound() {int looop1 = 0; int sound_loop1_skip = 0; while(read_light() & & looop1 < 3 & & sound_loop1_skip == 0) / / ce qui rend la boucle bip 3 fois un 3-bip sonore {int i; digitalWrite (alarme ÉLEVÉ) ; faire bip sonore sur delay(time_tone) ; Delay(time_tone2) ; digitalWrite (alarme, faible) ; faire bip sonore arrêt delay(time_tone2) ; digitalWrite (alarme, HIGH) ; faire bip sonore sur delay(time_tone2) ; digitalWrite (alarme, faible) ; faire bip sonore arrêt delay(time_tone2) ; digitalWrite (alarme, HIGH) ; faire bip sonore sur delay(time_tone2) ; digitalWrite (alarme, faible) ; faire bip sonore arrêt delay(time_tone2) ; looop1 ++ ; read_light() ; Delay(290) ; } boucle bip //second commence maintenant looop1 = 0 ; while(read_light()) {delay(300) ; int j’ai digitalWrite (alarme, haut) //make bip sonore sur delay(time_tone) ; delay(time_tone) ; digitalWrite (alarme, faible); //make bip sonore arrêt delay(time_tone2) ; digitalWrite (alarme, HIGH); //make bip sur delay(time_tone2) ; digitalWrite (alarme, faible); //make bip sonore arrêt delay(time_tone2) ; digitalWrite (alarme, HIGH); //make bip sur delay(time_tone2) ; digitalWrite (alarme FAIBLE) ; faire bip sonore arrêt delay(time_tone2) ; digitalWrite (alarme, HIGH) ; faire bip sonore sur delay(time_tone2) ; digitalWrite (alarme, faible) ; faire bip sonore arrêt delay(time_tone2) ; Delay(270) ; } //now aller au bip si la porte est toujours ouverte if(read_light()) {sound_loop1_skip = 1; / / cela rendra le programme sauter le 3-bip et continuer le delay(2000) de 4-bip sonore ; alarm_sound();} else {sound_loop1_skip = 0;}}
Pour la Version ATtiny 03 :
Changements à v02 - fondamentalement le mode veille est activé. Le ATtiny dort sur chaque cycle pour la durée de 4 secondes. Alors que dormir la consommation d’énergie est très faible - de l’ordre de 7uA.
/ * Réfrigérateur porte alarme détecteur Version 03 écrite par Pavel Mihaylov et Tatqna Mihaylova 9 octobre 2012 cette version est prêt à être téléchargé sur ATtiny85 microcontrôleur à l’aide de Arduino Uno en tant que programmeur. Pour des instructions complètes, consultez : * / / / suite de lignes sont indispensables pour activer le mode "veille" #include < avr/sleep.h > #include < avr/wdt.h > #ifndef DRAS #define DRAS (sfr, bit) (_SFR_BYTE(sfr) & = ~_BV(bit)) #endif #ifndef sbi #define sbi (sfr, bit) (_SFR_BYTE(sfr) | = _BV(bit)) #endif volatils booléenne f_wdt = 1 ; pwr int = 1 ; (Pourrait être broche 3 sur Arduino) dur broche 6 ATtiny int alarme = 4 ; (Pourrait être broche 4 sur Arduino) dure broche 3 sur ATtiny int porte = 2 ; (Peut être la broche 5 sur Arduino) dur broche 7 sur ATtiny int LDR = 3 ; (Pourrait être épingler A0 sur Arduino) dur broche 2 sur ATtiny int time_door_open = (3) * 300 ; Temps qui définit le bip d’alarme sur après l’ouverture de la porte du réfrigérateur int temps = 50 ; Temps retard int time_tone = 40 ; Temporisation pour rendre le bip sonore int time_tone2 = 20 ; Temporisation pour rendre le flotteur de tonalité bip trig = 3,5 ; Nécessaire pour le flotteur LDR LDRval = 0 ; Première valeur de la LDR mesure niveau int door_left = 0 ; Variable pour définir si on laisse la porte ouverte (1) ou fermé (0) extern volatils unsigned long timer0_overflow_count ; Ceci est nécessaire pour savoir qu’un renversement produit //Pins d’installation void setup() {pinMode (pwr, sortie); pinMode (alarme, sortie); pinMode (porte, sortie); pinMode (entrée, LDR); setup_watchdog(8); / / dormir environ 4 secondes / / 0 = 16ms, 1 = 32ms, 2 = 64ms, 3 = 128ms, 4 = 250 ms, 5 = 500ms 6 = 1 sec, 7 = 2 s, 8 = 4 sec, 9 = 8 sec} //Main programme boucle void loop() {/ / if (f_wdt == 1) {/ / attendre expiré de chien de garde / indicateur est défini lorsqu’un délai d’attente de chien de garde produit f_wdt = 0; / / réinitialiser l’indicateur / / if(read_light()) //In cas la porte est ouverte, cela déclaration sera vraie {door_left = 1; timer0_overflow_count = 0; unsigned long début = millis(); / / c’est le compte à rebours lorsque la porte est ouverte tandis que ((millis() - start) < = time_door_open) {if(millis() - start < 0) break ; //break boucle while si retournement a lieu if(read_light() == 0) / / si la porte est fermée le programme ne fait rien et qu’il recommence {door_left = 0; break;} delay(time) ; //delay nécessaire} si () door_left == 1) alarm_sound() ; Si la porte est ouverte, démarrez le bip sonore! } //Now mettre le système de sommeil system_sleep() ; //Function}} pour lire le capteur de lumière (LDR) et retourner 0 (la porte est fermée) ou 1 (la porte est ouverte) int read_light() {digitalWrite (pwr, HIGH); / / tourner la broche pwr sur grâce à la tension élevée pour permettre une mesure est prise LDRval = analogRead(LDR); / / lecture du capteur valeur digitalWrite (pwr, faible); / / désactiver le code pin pwr en rendant la tension basse LDRval = LDRval/1024 * 5; / / valeur de la sonde est dans la plage 0 à 1023 et nous en avons besoin entre 0 et 5 - c’est le calcul requis if(LDRval<trig) / / cela compare à la lecture pour le niveau de déclenchement {digitalWrite (porte haute); / / allumer le LED externe pour montrer que la porte est ouverte 1 retour; / / ouverture de porte de moyens} d’autre {digitalWrite (porte, faible); / / arrête l’extérieur LED pour montrer que la porte est fermée return 0; / / moyens porte est fermée}} / * boucle pour faire le bip retentit d’abord fait trois 3-signal sonore puis fait 4-bip spunds pour toujours si la porte reste ouverte * / void alarm_sound() {int looop_1_count = 0; int sound_loop1_skip = 0; while(read_light() & & looop_1_count < 3 & & sound_loop1_skip == 0) / / ce qui rend la boucle bip 3 fois un 3-bip sonore {digitalWrite (alarme, haut) //make bip sonore sur delay(time_tone) ; delay(time_tone2) ; digitalWrite (alarme FAIBLE) ; faire bip sonore arrêt delay(time_tone2) ; digitalWrite (alarme, HIGH) ; faire bip sonore sur delay(time_tone2) ; digitalWrite (alarme, faible) ; faire bip sonore arrêt delay(time_tone2) ; digitalWrite (alarme, HIGH) ; faire bip sonore sur delay(time_tone2) ; digitalWrite (alarme, faible) ; faire bip sonore arrêt delay(time_tone2) ; looop_1_count ++ ; read_light() ; Delay(290) ; } boucle bip //second commence maintenant looop_1_count = 0 ; while(read_light()) {digitalWrite (alarme, haut) //make bip sonore sur delay(time_tone) delay(time_tone) ; digitalWrite (alarme, faible); //make bip sonore arrêt delay(time_tone2) ; digitalWrite (alarme, HIGH); //make bip sur delay(time_tone2) ; digitalWrite (alarme, faible); //make bip sonore arrêt delay(time_tone2) ; digitalWrite (alarme, HIGH); //make bip sur delay(time_tone2) ; digitalWrite (alarme, faible); //make bip sonore arrêt delay(time_tone2) ; digitalWrite (alarme ÉLEVÉ) ; faire bip sonore sur delay(time_tone2) ; digitalWrite (alarme, faible) ; faire bip sonore arrêt delay(time_tone2) ; Delay(570) ; } //now aller au bip si la porte est toujours ouverte if(read_light()) {sound_loop1_skip = 1; / / cela rendra le programme sauter le 3-bip et continuer le delay(2000) de 4-bip sonore ; if(read_light()) alarm_sound();} else sound_loop1_skip = 0 ; } / / set système dans l’état de veille / / système réveille wtchdog est expiré system_sleep() Sub {cbi(ADCSRA,ADEN); / / commutateur analogique à Digitalconverter OFF set_sleep_mode(SLEEP_MODE_PWR_DOWN); / / mode "veille" se trouve ici sleep_enable() ; sleep_mode(); / / système dort ici sleep_disable(); / / système poursuit l’exécution ici watchdog expiré sbi(ADCSRA,ADEN); / / commutateur analogique sur Digitalconverter ON} / / 0 = 16ms , 1 = 32ms, 2 = 64ms, 3 = 128ms, 4 = 250 ms, 5 = 500ms / / 6 = 1 sec, 7 = 2 s, 8 = 4 s, 9 = 8sec void setup_watchdog (int ii) {octet bb; int ww ; si ii (ii > 9) = 9; bb = ii & 7; if (ii > 7) bb| = (1 << 5); bb| = (1 << WDCE); ww = bb ; MCUSR & = ~ (1 << WDRF) ; Démarrer la séquence chronométrée WDTCR | = (1 << WDCE) | (1 << WDE) ; Définissez la nouvelle valeur de délai d’attente de chien de garde WDTCR = bb ; WDTCR | = _BV(WDIE) ; } / / Interrupt Service de chien de garde / est exécutée lorsque le chien de garde a expiré ISR(WDT_vect) {f_wdt = 1; / / set indicateur global}
Pour la Version Arduino 01 :
/ * Réfrigérateur porte alarme détecteur Version 01 écrit par Pavel Mihaylov et Tatqna Mihaylova 11 septembre 2012 cette version est prêt à être transféré à microcontrôleur Arduino Uno en utilisant Arduino Uno en tant que programmeur. * / int a = 2 ; pwr int = 3 ; alarme int = 4 ; porte int = 5 ; int LDR = A0 ; int time_door_open = (3) * 1000 ; valeur entre parenthèses est en temps int secondes = 500 ; time2 int = temps * 2 ; int time_tone = 80 ; faire le bip sonore int tx = 1 ; Cela mis à 1 si vous souhaitez surveiller le port série débogage info, 0 sinon flotter trig = 2,5 ; float LDRval = 0 ; int door_left = 0 ; Si on laisse la porte ouverte (1) ou fermé (0) extern volatils unsigned long timer0_overflow_count ; la routine d’installation s’exécute une fois que lorsque vous appuyez sur reset : void setup() {/ / initialiser la broche numérique comme une sortie. if(tx) Serial.begin(9600) ; pinMode (led, sortie); pinMode (pwr, sortie); pinMode (alarme, sortie); pinMode (porte, sortie); pinMode (entrée, LDR);} / / la routine de la boucle s’exécute maintes et maintes fois pour toujours : void loop() {si (tx) delay(time) ; if (tx) {Serial.print("---\n");} read_light() ; if(read_light()) {si (tx) delay(time) ; if (tx) {Serial.print ("porte vient d’ouvrir! \n");} digitalWrite (porte ÉLEVÉ) ; door_left = 1 ; int n = 0 ; timer0_overflow_count = 0 ; unsigned long début = millis() ; tandis que ((millis() - start) < = time_door_open) {if(millis() - start < 0) //break boucle while si retournement a lieu {si (tx) {Serial.print ("renversement OCCURED");} break;} si (tx) {Serial.print ("Counting secondes down\n");} si (tx) {Serial.print(millis());} n ++; read_light() ; if(read_light() == 0) {si delay(time) (tx); if (tx) {Serial.print ("porte vient de fermer! \n");} digitalWrite (porte, faible); door_left = 0; break;} delay(time) ; //delay nécessaire} si (tx) {Serial.print ("hors de la boucle while! \n");} if(door_left == 1) {si (tx) delay(time) ; Si (tx) {Serial.print (">>> alarme déclenchée! \n");} alarm_sound() ; } else {si (tx) delay(time) ; if (tx) {Serial.print ("alarme ne déclenchée pas! \n");}}} else {si (tx) delay(time) ; if (tx) {Serial.print ("porte reste fermée! \n");}} delay(time2) ; } //Function à lire le capteur de lumière (LDR) et retourne 0 (la porte est fermée) ou 1 (la porte est ouverte) int read_light() {digitalWrite (conduit, en haut); / / allumer la LED en rendant la tension haute digitalWrite (pwr, HIGH); / / allumer les broches pwr en rendant la tension élevé pour permettre une mesure est prise delay(30); / / attendre pendant un certain temps LDRval = analogRead(LDR); / / lecture du capteur valeur delay(10); / / attendre quelques temps digitalWrite (sous la direction FAIBLE) ; éteindre la LED en rendant la tension basse digitalWrite (pwr, faible) ; désactiver le code pin pwr en rendant la tension basse LDRval = LDRval/1024 * 5 ; valeur de la sonde est dans la plage 0 à 1023 et nous en avons besoin entre 0 et 5 - c’est le calcul requis si (tx) {Serial.print ("\nLDR valeur en volts =") ; Serial.println(LDRval) ; } if(LDRval<trig) {return 1; / / ouverture de porte de moyens} d’autre {return 0; / / moyens porte est fermée}} / * boucle pour rendre le signal sonore d’abord fait trois 3-bip sonore puis fait bip-4 * / void alarm_sound() {/ / digitalWrite (alarme, HIGH); int looop1 = 0; while(read_light() & & looop1 < 3) {si delay(time) (tx); if (tx) {Serial.print ("porte est toujours ouverte-bip maintenant deuxième fois! \n");} int i; digitalWrite (alarme ÉLEVÉ) ; faire bip sonore delay(80) ; digitalWrite (alarme, faible) ; faire bip sonore delay(320) ; digitalWrite (alarme, faible) ; faire bip sonore delay(time_tone) ; digitalWrite (alarme, faible) ; faire bip sonore pour (j’ai = 15; i > = 0; i--) {digitalWrite (alarme, HIGH); //make bip sonore delay(i) ; digitalWrite (alarme, faible); //make bip} digitalWrite (alarme, faible) ; faire bip sonore delay(time_tone) ; digitalWrite (alarme, faible) ; faire bip sonore pour (j’ai = 18; i > = 0; i--) {digitalWrite (alarme, HIGH); //make bip sonore delay(i) ; digitalWrite (alarme, faible); //make bip} digitalWrite (alarme, faible) ; faire bip sonore delay(time_tone) ; digitalWrite (alarme, faible) ; faire bip sonore delay(1500) ; looop1 ++ ; read_light() ; } delay(2000) ; deuxième boucle bip commence maintenant looop1 = 0 ; while(read_light() & & looop1 < 3) {si (tx) delay(time) ; if (tx) {Serial.print ("porte est toujours ouverte-bip maintenant deuxième fois!\n");} int i ; digitalWrite (alarme, HIGH) ; faire bip sonore delay(80) ; digitalWrite (alarme, faible) ; faire bip sonore delay(320) ; digitalWrite (alarme, faible) ; faire bip sonore delay(time_tone) ; digitalWrite (alarme, faible) ; faire bip sonore pour (j’ai = 15; i > = 0; i--) {digitalWrite (alarme, HIGH); //make bip sonore delay(i) ; digitalWrite (alarme, faible); //make bip} digitalWrite (alarme, faible) ; faire bip sonore delay(time_tone) ; digitalWrite (alarme, faible) ; faire bip sonore pour (j’ai = 18; i > = 0; i--) {digitalWrite (alarme, HIGH); //make bip sonore delay(i) ; digitalWrite (alarme, faible); //make bip} digitalWrite (alarme, faible) ; faire bip sonore delay(time_tone) ; digitalWrite (alarme, faible) ; faire bip sonore pour (j’ai = 18; i > = 0; i--) {digitalWrite (alarme, HIGH); //make bip sonore delay(i) ; digitalWrite (alarme, faible); //make bip} delay(1000) ; looop1 ++ ; read_light() ; } //now s’allume si la porte est toujours ouverte if(read_light()) {delay(3000) ; //time de redémarrer les deux bip boucles alarm_sound();} else {/ / digitalWrite (alarme, faible); if delay(time) (tx); if (tx) {Serial.print ("porte était fermée seulement par le gars en colère! \n");} digitalWrite (porte, faible);}}