Étape 7 :
Dans cette étape, vous trouverez le Code Morse... euh... code pour Throwdurino.
La grande chose sur l’ajout d’un microcontrôleur, c’est que nous pouvons transporter des informations. Ce croquis permet la même throwie flasher un message préprogrammé en Code Morse. La routine de réglage seuil initial et la méthode de captage de la lumière sont les mêmes que pour le croquis original.
Edit - il y a une erreur dans le code :seuil = (total >> 5) ; la valeur seuil de point (fracture totale de 128) moyen.
devrait probablement être :
seuil = (total >>7) ; la valeur seuil de point (fracture totale de 128) moyen.
Il a travaillé pour moi car c’était, mais cela pourrait causer des problèmes avec la détection de lumière. Je vais vérifier et corriger si nécessaire.
Le moment du Morse n’est pas tout à fait aussi vite qu’il devrait être - les pauses sont beaucoup trop longs vraiment - mais j’ai trouvé le calendrier strict trop vite pour un novice à décoder. Ou trop lourd sur l’utilisation de la batterie. Je pense que c’est assez clair pour le novice Coder de Morse.
Pour modifier le message, trouvez la ligne ci-dessous dans la partie supérieure de l’esquisse :
const char [flashSeq] = {"sombre ici ISNT IT"} ; Message de Morse. Modifier cela.et simplement modifier ce que vous avez besoin.
Afin de limiter la longueur de l’esquisse, il reconnaît seulement majuscules. Tout le reste est considérée comme un « espace ». N’essayez pas d’utiliser plus de 256 caractères ou il est susceptible de se bloquer horriblement.
L’esquisse est fixée et collée ci-dessous. Il devrait compiler vers 1398 octets
Throwduino base - édition de code Morse !
UGI 2012
Licence MIT
Écrit pour fonctionner sur ATtiny25/45/85 en utilisant Arduino Tiny core - http://code.google.com/p/arduino-tiny/
Ne compilera pas pour autres Arduinos (ATMega168, ATMega328 etc.)
Assurez-vous de que sélectionner le bon conseil avant de compiler.
Ref :
Broches de l’ADC :
ADC1 = PB2
ADC2 = PB4
ADC3 = PB3
Si vous voulez juste changer la séquence de clignotement, faites-le ici.
valeur par défaut est :
//
const char [flashSeq] = {"sombre ici ISNT IT"} ; Message de Morse. Modifier cela.
//
Modifier le message avec caractères majuscules seulement.
Autre chose va sortir comme un 1 s retard.
Après la séquence, nous attendons pendant 2 secondes avant de répéter.
const char [flashSeq] = {"sombre ici ISNT IT"} ; Message de Morse. Modifier cela.
const byte seqLength =(sizeof(flashSeq)-1);
Codage Morse code
Stockées sous forme d’un octet par lettre.
5 bits de poids fort sont 1 pour - et 0 commençant par LSB de ces haut-5...
Bas 3 bits donnent nombre d’éclairs (points + tirets).
Morse permet 5 clignotements (pour les nombres) mais nécessitent de lettres maximum 4.
Ce format peut donc être utilisé pour numéros ainsi, mais je n’ai pas implémenté qui.
const byte morse [26] = {}
B00010010, //a
B00001100, //b
B00101100, //c
B00001011, //d
B00000001, //e
B00100100, //f
B00011011, //g
B00000100, //h
B00000010, //i
B01110100, //j
B00101011, //k
B00010100, //l
B00011010, //m
B00001010, //n
B00111011, //o
B00110100, //p
B01011100, //q
B00010011, //r
B00000011, //s
B00001001, //t
B00100011, //u
B01000100, //v
B00110011, //w
B01001100, //x
B01101100, //y
B00011100, //z
};
Maintenant nous allons faire un throwie pour cette séquence...
const int LEDpin = 4 ; Bien que ce soit dans une constante, il y a beaucoup d’accès direct au port
Je n’essaierais pas de changer cela sans aller throu' la totalité du code.
unsigned int seuil = 10 ; Nous allons définir cela correctement pendant l’installation
Cela met en place des bibliothèques et des définitions utilisées avec la fonction Sleep
#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
ISR(WDT_vect) {WDTCR| = B01000000;} / / reset Watchdog Timer Interrupt mode chaque fois.
Déconner avec certains registres à éteindre trucs et définissez des références.
void setup() {}
ADCSRB & = B10111111 ; désactiver comparitor
ACSR | = B10000000 ; Mettez hors tension comparitor
ADCSRA | = B10000000; / / mettez le ADC
DDRB & = B11100000 ; Mettez les à l’entrée
DDRB| = B00011010 ; La valeur 1, 3 et 4 en sortie
PORTB & = B11110111 ; Set PB3 faible - il s’agissait pour la phase de test. Peut sans doute être supprimé maintenant.
PRR & = B11111110 ; claire ADC disable bit en puissance réduction Reg
analogReference(6) ; 2.56v interne de référence avec aucune déviation - INTERNAL2v56NB-
Montrer que nous sommes éveillés :
Flash(3) ; Trois clignotements - nous sommes en cours d’exécution.
Définissez le seuil de détection lumineuse durant les premières 40 secondes.
Nous prenons 148 Mensurations, bin les 20 premiers et puis moyenne la prochaine 128.
total unsigned int = 0 ;
pour (rep octets = 0; rep < 148 ; rep ++) {}
int value=lightLevel() ;
int valeur = 10 ;
if(REP>19) {}
valeur total += ; Teyssandier au total 128 lectures
}
Flash(value) ;
Pause(4); / / a pause(4)
DDRB| = B00011010 ; La valeur 1, 3 et 4 en sortie
PORTB & = B1110000 ; Tout bas
}
seuil = (total >> 7) ; la valeur seuil de point (fracture totale de 128) moyen.
Flash(THRESHOLD) ; C’est principalement pour des fins de débogage.
}
Boucle principale
On mesure le niveau de lumière. S’il est faible alors nous flash notre séquence puis le sommeil pendant 2 secondes.
Si la lumière niveau élevé, nous dormons pour 8 s.
void loop() {}
analogReference(6) ; 2.56v interne de référence avec aucune dérivation
Mesurer le niveau de lumière et si elle est assez basse, afficher notre séquence flash
Si (lightLevel() < seuil) {}
flashMorse() ;
Si nous étions clignotant, nous dormons maintenant pour 4 s
Pause(8) ;
DDRB| = B00011010 ; La valeur 1, 3 et 4 en sortie
PORTB & = B11110111 ; PB3 faible.
}
else {}
Si nous n’étions pas clignote puis nous dormons pour 8 s
Pause(9) ;
DDRB| = B00011010 ; La valeur 1, 3 et 4 en sortie
PORTB & = B11110111 ; PB3 faible.
}
} / / fin de boucle principale
Mesurer le niveau de luminosité en regardant la tension générée par LED connecté à D4 (A2) en broche 3 de la puce.
Sortie et faible pour commencer à s’acquitter de toute accumulation de charge - ne sais pas si nous en avons besoin
int lightLevel() {}
pinMode (LEDpin, sortie) ;
digitalWrite (LEDpin, basse) ;
delayMicroseconds(50) ;
pinMode (entrée, LEDpin) ;
delayMicroseconds(100) ; Laissez-le se stabiliser en tant qu’entrée à nouveau
unsigned int valeur = analogRead(A2) ;
retourne la valeur ;
}
Flash de routine - 70ms, 250 ms désactivé
Répéter certain nombre de fois et ensuite une pause 500ms
void flash(byte No) {}
pinMode (LEDpin, sortie) ;
if (!. Non) {/ / si nous recevons un zéro, juste faire une pause.
Pause(5) ;
DDRB| = B00011010 ; La valeur 1, 3 et 4 en sortie
PORTB & = B11110111 ; PB3 faible.
}
Si nous avions un nombre différent de zéro, des bouffées de chaleur, nous les ferons maintenant
pour (rep octets = 0; rep < non ; rep ++) {}
flashDot(70) ;
}
Faire une pause (sleep)
Pause(5) ;
DDRB| = B00011010 ; La valeur 1 et 3 en sortie
PORTB & = B11110111 ; PB3 faible.
}
Sub {pause (temps octets)
DDRB & = B11100000 ; Mettez les à l’entrée
setup_watchdog(Time) ; mettre en place une période d’attente
system_sleep(); / / sommeil
}
void flashMorse() {}
pour (rep octets = 0; rep < seqLength ; rep ++) {}
index de l’octet = 0 ;
Si (flashSeq [rep] < 65 || flashSeq [rep] > 90) index = 0 ;
autre indice = flashSeq [rep] -64 ;
if(!index) pause(6) ;
else {}
dotdash octets = morse [index-1] >> 3 ; mettre une partie de séquence (5 bits) juste en dotdash
Points et tirets selon la séquence codée en morse]
pour (octet clignote = 0; clignote < ((morse[(index-1)] & B111)); flashs ++) {}
Si (dotdash & 1)flashDot(160) ; Si LSB est 1 puis affichez un tableau de bord
d’autre flashDot(40) ; Sinon, c’est un point
Pause(4) ; faire une pause entre les bouffées de chaleur - 256ms
dotdash >> = 1 ; rouler le long pour le prochain bit
}
Pause(5) ; Fin du mot pause 0. 5 s
}
}
}
clignoter la LED du moment (< ms 256) et pause de 250ms.
void flashDot (temps de l’octet) {}
DDRB| = B00011010 ; La valeur 1, 3 et 4 en sortie
PORTB & = B11110111 ; PB3 faible.
PORTB| = B00010000 ; PB4 haute
Delay(Time) ;
PORTB & = B11101111 ; PB4 faible.
Pause(4) ;
}
Réglage timer chien de garde
C’est spécifique à la ATTiny85 (+ tiny45, & tiny25) et ne sera pas compiler pour ATMega328 etc..
0 = 16ms, 1 = 32ms, 2 = 64ms, 3 = 128ms, 4 = 250 ms, 5 = 500ms
6 = 1 sec, 7 = 2 sec, 8 = 4 s, 9 = 8sec
void setup_watchdog (int période) {}
valeur d’octet ;
Si période (période > 9) = 9 ;
valeur = période & B111 ;
Si value| (période > 7) = (1 << 5) ;
value| = (1 << WDCE) ;
MCUSR & = ~ (1 << WDRF) ;
démarrer le cycle d’horloge-4-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 = valeur ;
WDTCR | = _BV(WDIE) ;
}
mettre le système en état de veille
système se réveille wtchdog est expiré
void system_sleep() {}
CBI(ADCSRA,Aden) ; commutateur analogique/Digitalconverter OFF
set_sleep_mode(SLEEP_MODE_PWR_DOWN) ; mode "veille" est défini ici
sleep_enable() ;
sleep_mode() ; Système dort ici
sleep_disable() ; Système continue l’exécution ici watchdog expiré
SBI(ADCSRA,Aden) ; commutateur analogique-Digitalconverter ON
PRR & = B11111110 ; claire ADC disable bit en puissance réduction Reg
}
UGI 2012
Licence MIT
Écrit pour fonctionner sur ATtiny25/45/85 en utilisant Arduino Tiny core - http://code.google.com/p/arduino-tiny/
Ne compilera pas pour autres Arduinos (ATMega168, ATMega328 etc.)
Assurez-vous de que sélectionner le bon conseil avant de compiler.
Ref :
Broches de l’ADC :
ADC1 = PB2
ADC2 = PB4
ADC3 = PB3
Si vous voulez juste changer la séquence de clignotement, faites-le ici.
valeur par défaut est :
//
const char [flashSeq] = {"sombre ici ISNT IT"} ; Message de Morse. Modifier cela.
//
Modifier le message avec caractères majuscules seulement.
Autre chose va sortir comme un 1 s retard.
Après la séquence, nous attendons 4 s avant de répéter.
const char [flashSeq] = {"sombre ici ISNT IT"} ; Message de Morse. Modifier cela.
const byte seqLength =(sizeof(flashSeq)-1);
Codage Morse code
Stockées sous forme d’un octet par lettre.
5 bits de poids fort sont 1 pour - et 0 commençant par LSB de ces haut-5...
Bas 3 bits donnent nombre d’éclairs (points + tirets).
Morse permet 5 clignotements (pour les nombres) mais nécessitent de lettres maximum 4.
Ce format peut donc être utilisé pour numéros ainsi, mais je n’ai pas implémenté qui.
const byte morse [26] = {}
B00010010, //a
B00001100, //b
B00101100, //c
B00001011, //d
B00000001, //e
B00100100, //f
B00011011, //g
B00000100, //h
B00000010, //i
B01110100, //j
B00101011, //k
B00010100, //l
B00011010, //m
B00001010, //n
B00111011, //o
B00110100, //p
B01011100, //q
B00010011, //r
B00000011, //s
B00001001, //t
B00100011, //u
B01000100, //v
B00110011, //w
B01001100, //x
B01101100, //y
B00011100, //z
};
Maintenant nous allons faire un throwie pour cette séquence...
const int LEDpin = 4 ; Bien que ce soit dans une constante, il y a beaucoup d’accès direct au port
Je n’essaierais pas de changer cela sans aller throu' la totalité du code.
unsigned int seuil = 10 ; Nous allons définir cela correctement pendant l’installation
Cela met en place des bibliothèques et des définitions utilisées avec la fonction Sleep
#include
#include
#ifndef DRAS
#define DRAS (sfr, bit) (_SFR_BYTE(sfr) & = ~_BV(bit))
#endif
#ifndef sbi
#define sbi (sfr, bit) (_SFR_BYTE(sfr) | = _BV(bit))
#endif
ISR(WDT_vect) {WDTCR| = B01000000;} / / reset Watchdog Timer Interrupt mode chaque fois.
Déconner avec certains registres à éteindre trucs et définissez des références.
void setup() {}
ADCSRB & = B10111111 ; désactiver comparitor
ACSR | = B10000000 ; Mettez hors tension comparitor
ADCSRA | = B10000000; / / mettez le ADC
DDRB & = B11100000 ; Mettez les à l’entrée
DDRB| = B00011010 ; La valeur 1, 3 et 4 en sortie
PORTB & = B11110111 ; Set PB3 faible - il s’agissait pour la phase de test. Peut sans doute être supprimé maintenant.
PRR & = B11111110 ; claire ADC disable bit en puissance réduction Reg
analogReference(6) ; 2.56v interne de référence avec aucune déviation - INTERNAL2v56NB-
Montrer que nous sommes éveillés :
Flash(3) ; Trois clignotements - nous sommes en cours d’exécution.
Définissez le seuil de détection lumineuse durant les premières 40 secondes.
Nous prenons 148 Mensurations, bin les 20 premiers et puis moyenne la prochaine 128.
total unsigned int = 0 ;
pour (rep octets = 0; rep < 148 ; rep ++) {}
int value=lightLevel() ;
int valeur = 10 ;
if(REP>19) {}
valeur total += ; Teyssandier au total 128 lectures
}
Flash(value) ;
Pause(4); / / a pause(4)
DDRB| = B00011010 ; La valeur 1, 3 et 4 en sortie
PORTB & = B1110000 ; Tout bas
}
seuil = (total >> 5) ; la valeur seuil de point (fracture totale de 128) moyen.
Flash(THRESHOLD) ; C’est principalement pour des fins de débogage.
}
Boucle principale
On mesure le niveau de lumière. S’il est faible alors nous flash notre séquence puis le sommeil pendant 2 secondes.
Si la lumière niveau élevé, nous dormons pour 8 s.
void loop() {}
analogReference(6) ; 2.56v interne de référence avec aucune dérivation
Mesurer le niveau de lumière et si elle est assez basse, afficher notre séquence flash
Si (lightLevel()
flashMorse() ;
Si nous étions clignotant, nous dormons maintenant pour 4 s
Pause(8) ;
DDRB| = B00011010 ; La valeur 1, 3 et 4 en sortie
PORTB & = B11110111 ; PB3 faible.
}
else {}
Si nous n’étions pas clignote puis nous dormons pour 8 s
Pause(9) ;
DDRB| = B00011010 ; La valeur 1, 3 et 4 en sortie
PORTB & = B11110111 ; PB3 faible.
}
} / / fin de boucle principale
Mesurer le niveau de luminosité en regardant la tension générée par LED connecté à D4 (A2) en broche 3 de la puce.
Sortie et faible pour commencer à s’acquitter de toute accumulation de charge - ne sais pas si nous en avons besoin
int lightLevel() {}
pinMode (LEDpin, sortie) ;
digitalWrite (LEDpin, basse) ;
delayMicroseconds(50) ;
pinMode (entrée, LEDpin) ;
delayMicroseconds(100) ; Laissez-le se stabiliser en tant qu’entrée à nouveau
unsigned int valeur = analogRead(A2) ;
retourne la valeur ;
}
Flash de routine - 70ms, 250 ms désactivé
Répéter certain nombre de fois et ensuite une pause 500ms
void flash(byte No) {}
pinMode (LEDpin, sortie) ;
if (!. Non) {/ / si nous recevons un zéro, juste faire une pause.
Pause(5) ;
DDRB| = B00011010 ; La valeur 1, 3 et 4 en sortie
PORTB & = B11110111 ; PB3 faible.
}
Si nous avions un nombre différent de zéro, des bouffées de chaleur, nous les ferons maintenant
pour (rep octets = 0; rep flashDot(70) ;
}
Faire une pause (sleep)
Pause(5) ;
DDRB| = B00011010 ; La valeur 1 et 3 en sortie
PORTB & = B11110111 ; PB3 faible.
}
Sub {pause (temps octets)
DDRB & = B11100000 ; Mettez les à l’entrée
setup_watchdog(Time) ; mettre en place une période d’attente
system_sleep(); / / sommeil
}
void flashMorse() {}
pour (rep octets = 0; index octets rep = 0 ;
Si (flashSeq [rep] < 65 || flashSeq [rep] > 90) index = 0 ;
autre indice = flashSeq [rep] -64 ;
if(!index) pause(6) ;
else {}
dotdash octets = morse [index-1] >> 3 ; mettre une partie de séquence (5 bits) juste en dotdash
Points et tirets selon la séquence codée en morse]
pour (octet clignote = 0; clignote < ((morse[(index-1)] & B111)); flashs ++) {}
Si (dotdash & 1)flashDot(160) ; Si LSB est 1 puis affichez un tableau de bord
d’autre flashDot(40) ; Sinon, c’est un point
Pause(5) ; faire une pause entre les bouffées de chaleur - 256ms
dotdash >> = 1 ; rouler le long pour le prochain bit
}
Pause(6) ; Fin de mot pause 1 s
}
}
}
clignoter la LED du moment (< ms 256) et pause de 250ms.
void flashDot (temps de l’octet) {}
DDRB| = B00011010 ; La valeur 1, 3 et 4 en sortie
PORTB & = B11110111 ; PB3 faible.
PORTB| = B00010000 ; PB4 haute
Delay(Time) ;
PORTB & = B11101111 ; PB4 faible.
Pause(4) ;
}
Réglage timer chien de garde
C’est spécifique à la ATTiny85 (+ tiny45, & tiny25) et ne sera pas compiler pour ATMega328 etc..
0 = 16ms, 1 = 32ms, 2 = 64ms, 3 = 128ms, 4 = 250 ms, 5 = 500ms
6 = 1 sec, 7 = 2 sec, 8 = 4 s, 9 = 8sec
void setup_watchdog (int période) {}
valeur d’octet ;
Si période (période > 9) = 9 ;
valeur = période & B111 ;
Si value| (période > 7) = (1 << 5) ;
value| = (1 <
MCUSR & = ~(1<
démarrer le cycle d’horloge-4-séquence chronométrée
WDTCR | = (1 < / / définir la nouvelle valeur de délai d’attente de chien de garde
WDTCR = valeur ;
WDTCR | = _BV(WDIE) ;
}
mettre le système en état de veille
système se réveille wtchdog est expiré
void system_sleep() {}
CBI(ADCSRA,Aden) ; commutateur analogique/Digitalconverter OFF
set_sleep_mode(SLEEP_MODE_PWR_DOWN) ; mode "veille" est défini ici
sleep_enable() ;
sleep_mode() ; Système dort ici
sleep_disable() ; Système continue l’exécution ici watchdog expiré
SBI(ADCSRA,Aden) ; commutateur analogique-Digitalconverter ON
PRR & = B11111110 ; claire ADC disable bit en puissance réduction Reg
}