Throwduino Basic - ljus-Sensing blinkande Throwie med 1 extra del - nu med Morsealfabetet (7 / 7 steg)
Steg 7:
I detta steg får du Morsealfabetet... erm... koden för Throwdurino.
Fina med att lägga till en mikrokontroller är att vi kan fortsätta information. Denna skiss kan den samma throwie att blinka ut ett förprogrammerat meddelande i morsekod. Den första tröskeln inställningen rutin och ljus sensing metod är samma som för den ursprungliga skissen.
Redigera - det kan finnas ett fel i koden:tröskel = (totalt >> 5); Ställ in tröskelvärdet i genomsnitt punkt (klyftan totala av 128).
bör nog vara:
tröskel = (totalt >>7); Ställ in tröskelvärdet i genomsnitt punkt (klyftan totala av 128).
Det har fungerat för mig eftersom det var men detta kan orsaka problem med den lätta avkänning. Jag kommer att kontrollera och korrigera om det behövs.
Tidpunkten för i Morse är inte riktigt lika snabbt som det bör vara - pauserna är alldeles för lång egentligen - men jag hittade strikt tidpunkten för fort för en novis att avkoda. Eller för tung på användning av batteriet. Jag tror det är ganska klart för motparten Morse Coder.
För att redigera meddelandet, hitta raden under överst på skissen:
CONST char flashSeq [] = {"mörka här ISNT det"}; Morse meddelande. Redigera den här.och helt enkelt redigera som som du behöver.
För att minimera längden på skissen, erkänner det endast versaler. Allt annat kommer att behandlas som en "utrymme". Försök inte använda fler än 256 tecken eller är det troligt att krascha fruktansvärt.
Skissen är fäst och inklistrade nedan. Det bör sammanställa till omkring 1398 byte
Throwduino grundläggande - morsekod edition!
Ugi 2012
MIT license
Skrivit att köra på ATtiny25/45/85 med Arduino Tiny core - http://code.google.com/p/arduino-tiny/
Kommer inte kompilera för andra Arduinos (ATMega168, ATMega328 etc)
Se till att du väljer rätt styrelsen innan du kompilera.
För Ref:
ADC stift:
ADC1 = PB2
ADC2 = PB4
ADC3 = PB3
Om du bara vill ändra flash mönster, göra det här.
standard är:
//
CONST char flashSeq [] = {"mörka här ISNT det"}; Morse meddelande. Redigera den här.
//
Redigera meddelandet med versaler tecken endast.
Något annat kommer som en 1s dröjsmål.
Efter sekvensen vänta vi på 2s innan du upprepar.
CONST char flashSeq [] = {"mörka här ISNT det"}; Morse meddelande. Redigera den här.
CONST byte seqLength =(sizeof(flashSeq)-1);
Morsealfabetet kodning
Lagras som en byte per bokstav.
High 5 bitar är 1 för - och 0 för början med LSB av dessa high-5...
Låg 3 bitar ge antal blixtar (prickar + bindestreck).
Morse möjliggör 5 blixtar (för tal) men märker kräver 4 maximalt.
Detta format kan således användas för nummer också men jag har inte genomfört som.
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
};
Nu låt oss göra en throwie för att ordna...
CONST int LEDpin = 4; Även om detta i en konstant, finns det en hel del direkt port tillgång
Jag skulle inte försöka ändra på detta utan gå throu "hela koden.
unsigned int tröskel = 10; Vi ska ställa detta ordentligt under installationen
Detta sätter upp några libs och definitioner för användning med insomningstimern
#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
ISR(WDT_vect) {WDTCR| = B01000000;} / / reset Watchdog Timer till avbrottsläge varje gång.
Röra om med några register till inaktivera grejer & Ange referenser.
void setup() {
ADCSRB & = B10111111; Inaktivera comparitor
ACSR | = B10000000; Stäng av strömmen till comparitor
ADCSRA | = B10000000; / / slå på ADC
DDRB & = B11100000; Ange alla att mata in
DDRB| = B00011010; Ange 1,3 och 4
PORTB & = B11110111; Ställ in PB3 låg - detta var för testfasen. Förmodligen kan släppas nu.
PRR & = B11111110; tydlig ADC disable bit i makt minskade Reg
analogReference(6); inre 2.56v referera med ingen bypass - INTERNAL2v56NB-
Visa vi är vakna:
Flash(3); Tre blixtar - vi är igång.
Ställ in tröskelvärdet för ljus sensing under första 40 sekunder.
Vi tar 148 mätningar, bin de första 20 och sedan genomsnittlig nästa 128.
unsigned int totala = 0;
för (byte rep = 0; rep < 148; rep ++) {
int value=lightLevel();
int värde = 10;
IF(rep>19) {
totala += värde; tatke totalt 128 avläsningar
}
Flash(Value);
PAUSE(4); / / var pause(4)
DDRB| = B00011010; Ange 1, 3 och 4
PORTB & = B1110000; Allt låg
}
tröskel = (totalt >> 7); Ställ in tröskelvärdet i genomsnitt punkt (klyftan totala av 128).
Flash(Threshold); Detta är mest för felsökning ändamål.
}
Huvudloop
Vi mäter ljusnivån. Om den är låg blinkar vi våra sekvensen sedan sömn för 2s.
Om ljus nivå hög, vi sover för 8s.
void loop() {
analogReference(6); inre 2.56v referera med ingen bypass
Mäter ljusnivån och om det är tillräckligt låg, visar vår flash sekvens
om (lightLevel() < tröskel) {
flashMorse();
Om vi blinkar, sova vi nu för 4s
PAUSE(8);
DDRB| = B00011010; Ange 1,3 och 4
PORTB & = B11110111; PB3 låg.
}
annat {
Om vi inte blinkar då sover vi för 8s
PAUSE(9);
DDRB| = B00011010; Ange 1,3 och 4
PORTB & = B11110111; PB3 låg.
}
} / / end huvudloop
Mät ljuset genom att titta på spänning genereras av LED ansluten till D4 (A2) å pin 3 chip.
Ställa in produktionen och låg att börja att släppa ut någon avgift för mycket - inte säker på om vi behöver detta
int lightLevel() {
pinMode (LEDpin, OUTPUT);
digitalWrite (LEDpin, låg);
delayMicroseconds(50);
pinMode (LEDpin, indata);
delayMicroseconds(100); Låt det stabilisera som indata igen
unsigned int värde = analogRead(A2);
returnera värdet;
}
Flash rutin - 70ms, 250 ms off
Upprepa visst antal gånger och sedan Pausa 500ms
void flash(byte No) {
pinMode (LEDpin, OUTPUT);
IF (!. Nej) {/ / om vi får en nolla, bara pausa.
PAUSE(5);
DDRB| = B00011010; Ange 1,3 och 4
PORTB & = B11110111; PB3 låg.
}
Om vi hade ett noll antal blixtar, gör vi dem nu
för (byte rep = 0; rep < nej; rep ++) {
flashDot(70);
}
Paus (sova)
PAUSE(5);
DDRB| = B00011010; Ange 1 och 3
PORTB & = B11110111; PB3 låg.
}
Annullera paus (byte tid) {
DDRB & = B11100000; Ange alla att mata in
setup_watchdog(Time); Ställ in vänteperioden
system_sleep(); / / sova
}
void flashMorse() {
för (byte rep = 0; rep < seqLength; rep ++) {
byte index = 0;
om (flashSeq [rep] < 65 || flashSeq [rep] > 90) index = 0;
annat index = flashSeq [rep]-64;
IF(!index) pause(6);
annat {
byte dotdash = morse [index-1] >> 3; tas bara sekvens del (5 bitar) i dotdash
Prickar och streck enligt sekvens kodade i morse]
för (byte blinkar = 0; blinkar < ((morse[(index-1)] & B111)); blinkar ++) {
om (dotdash & 1)flashDot(160); om LSB är 1 sedan display en dash
annat flashDot(40); annars är det en prick
PAUSE(4); paus mellan blinkar - 256ms
dotdash >> = 1; rulla längs till nästa lite
}
PAUSE(5); Slutet av ordet paus 0.5s
}
}
}
Flash LED för tiden (< 256 ms) och paus för 250ms.
void flashDot (byte tid) {
DDRB| = B00011010; Ange 1,3 och 4
PORTB & = B11110111; PB3 låg.
PORTB| = B00010000; PB4 hög
Delay(Time);
PORTB & = B11101111; PB4 låg.
PAUSE(4);
}
Watchdog timer setup
Detta är specifikt för den ATTiny85 (+ tiny45 & tiny25) och kommer inte att kompilera för ATMega328 etc.
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 period) {
bytevärdet;
om (period > 9) period = 9.
värde = period & B111;
om (period > 7) value| = (1 << 5);
Value| = (1 << WDCE);
MCUSR & = ~ (1 << WDRF);
Start 4-klockcykel tt sekvens
WDTCR | = (1 << WDCE) | (1 << Mimmi);
Ange nya watchdog timeout-värde
WDTCR = värde;
WDTCR | = _BV(WDIE);
}
ställa in systemet i lågeffektläge enligt
systemet 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 är inställd här
sleep_enable();
sleep_mode(); Systemet sover här
sleep_disable(); Systemet fortsätter utförande här när watchdog timeout
SBI(ADCSRA,ADEN); Växla Analog till Digitalconverter på
PRR & = B11111110; tydlig ADC disable bit i makt minskade Reg
}
Ugi 2012
MIT license
Skrivit att köra på ATtiny25/45/85 med Arduino Tiny core - http://code.google.com/p/arduino-tiny/
Kommer inte kompilera för andra Arduinos (ATMega168, ATMega328 etc)
Se till att du väljer rätt styrelsen innan du kompilera.
För Ref:
ADC stift:
ADC1 = PB2
ADC2 = PB4
ADC3 = PB3
Om du bara vill ändra flash mönster, göra det här.
standard är:
//
CONST char flashSeq [] = {"mörka här ISNT det"}; Morse meddelande. Redigera den här.
//
Redigera meddelandet med versaler tecken endast.
Något annat kommer som en 1s dröjsmål.
Efter sekvensen vänta vi på 4s innan du upprepar.
CONST char flashSeq [] = {"mörka här ISNT det"}; Morse meddelande. Redigera den här.
CONST byte seqLength =(sizeof(flashSeq)-1);
Morsealfabetet kodning
Lagras som en byte per bokstav.
High 5 bitar är 1 för - och 0 för början med LSB av dessa high-5...
Låg 3 bitar ge antal blixtar (prickar + bindestreck).
Morse möjliggör 5 blixtar (för tal) men märker kräver 4 maximalt.
Detta format kan således användas för nummer också men jag har inte genomfört som.
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
};
Nu låt oss göra en throwie för att ordna...
CONST int LEDpin = 4; Även om detta i en konstant, finns det en hel del direkt port tillgång
Jag skulle inte försöka ändra på detta utan gå throu "hela koden.
unsigned int tröskel = 10; Vi ska ställa detta ordentligt under installationen
Detta sätter upp några libs och definitioner för användning med insomningstimern
#include
#include
#ifndef cbi
#define cbi (sfr, lite) (_SFR_BYTE(sfr) & = ~_BV(bit))
#endif
#ifndef sbi
#define sbi (sfr, lite) (_SFR_BYTE(sfr) | = _BV(bit))
#endif
ISR(WDT_vect) {WDTCR| = B01000000;} / / reset Watchdog Timer till avbrottsläge varje gång.
Röra om med några register till inaktivera grejer & Ange referenser.
void setup() {
ADCSRB & = B10111111; Inaktivera comparitor
ACSR | = B10000000; Stäng av strömmen till comparitor
ADCSRA | = B10000000; / / slå på ADC
DDRB & = B11100000; Ange alla att mata in
DDRB| = B00011010; Ange 1,3 och 4
PORTB & = B11110111; Ställ in PB3 låg - detta var för testfasen. Förmodligen kan släppas nu.
PRR & = B11111110; tydlig ADC disable bit i makt minskade Reg
analogReference(6); inre 2.56v referera med ingen bypass - INTERNAL2v56NB-
Visa vi är vakna:
Flash(3); Tre blixtar - vi är igång.
Ställ in tröskelvärdet för ljus sensing under första 40 sekunder.
Vi tar 148 mätningar, bin de första 20 och sedan genomsnittlig nästa 128.
unsigned int totala = 0;
för (byte rep = 0; rep < 148; rep ++) {
int value=lightLevel();
int värde = 10;
IF(rep>19) {
totala += värde; tatke totalt 128 avläsningar
}
Flash(Value);
PAUSE(4); / / var pause(4)
DDRB| = B00011010; Ange 1, 3 och 4
PORTB & = B1110000; Allt låg
}
tröskel = (totalt >> 5); Ställ in tröskelvärdet i genomsnitt punkt (klyftan totala av 128).
Flash(Threshold); Detta är mest för felsökning ändamål.
}
Huvudloop
Vi mäter ljusnivån. Om den är låg blinkar vi våra sekvensen sedan sömn för 2s.
Om ljus nivå hög, vi sover för 8s.
void loop() {
analogReference(6); inre 2.56v referera med ingen bypass
Mäter ljusnivån och om det är tillräckligt låg, visar vår flash sekvens
om (lightLevel()
flashMorse();
Om vi blinkar, sova vi nu för 4s
PAUSE(8);
DDRB| = B00011010; Ange 1,3 och 4
PORTB & = B11110111; PB3 låg.
}
annat {
Om vi inte blinkar då sover vi för 8s
PAUSE(9);
DDRB| = B00011010; Ange 1,3 och 4
PORTB & = B11110111; PB3 låg.
}
} / / end huvudloop
Mät ljuset genom att titta på spänning genereras av LED ansluten till D4 (A2) å pin 3 chip.
Ställa in produktionen och låg att börja att släppa ut någon avgift för mycket - inte säker på om vi behöver detta
int lightLevel() {
pinMode (LEDpin, OUTPUT);
digitalWrite (LEDpin, låg);
delayMicroseconds(50);
pinMode (LEDpin, indata);
delayMicroseconds(100); Låt det stabilisera som indata igen
unsigned int värde = analogRead(A2);
returnera värdet;
}
Flash rutin - 70ms, 250 ms off
Upprepa visst antal gånger och sedan Pausa 500ms
void flash(byte No) {
pinMode (LEDpin, OUTPUT);
IF (!. Nej) {/ / om vi får en nolla, bara pausa.
PAUSE(5);
DDRB| = B00011010; Ange 1,3 och 4
PORTB & = B11110111; PB3 låg.
}
Om vi hade ett noll antal blixtar, gör vi dem nu
för (byte rep = 0; rep flashDot(70);
}
Paus (sova)
PAUSE(5);
DDRB| = B00011010; Ange 1 och 3
PORTB & = B11110111; PB3 låg.
}
Annullera paus (byte tid) {
DDRB & = B11100000; Ange alla att mata in
setup_watchdog(Time); Ställ in vänteperioden
system_sleep(); / / sova
}
void flashMorse() {
för (byte rep = 0; rep byte index = 0;
om (flashSeq [rep] < 65 || flashSeq [rep] > 90) index = 0;
annat index = flashSeq [rep]-64;
IF(!index) pause(6);
annat {
byte dotdash = morse [index-1] >> 3; tas bara sekvens del (5 bitar) i dotdash
Prickar och streck enligt sekvens kodade i morse]
för (byte blinkar = 0; blinkar < ((morse[(index-1)] & B111)); blinkar ++) {
om (dotdash & 1)flashDot(160); om LSB är 1 sedan display en dash
annat flashDot(40); annars är det en prick
PAUSE(5); paus mellan blinkar - 256ms
dotdash >> = 1; rulla längs till nästa lite
}
PAUSE(6); Slutet av ordet paus 1 s
}
}
}
Flash LED för tiden (< 256 ms) och paus för 250ms.
void flashDot (byte tid) {
DDRB| = B00011010; Ange 1,3 och 4
PORTB & = B11110111; PB3 låg.
PORTB| = B00010000; PB4 hög
Delay(Time);
PORTB & = B11101111; PB4 låg.
PAUSE(4);
}
Watchdog timer setup
Detta är specifikt för den ATTiny85 (+ tiny45 & tiny25) och kommer inte att kompilera för ATMega328 etc.
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 period) {
bytevärdet;
om (period > 9) period = 9.
värde = period & B111;
om (period > 7) value| = (1 << 5);
Value| = (1 <
MCUSR & = ~(1<
Start 4-klockcykel tt sekvens
WDTCR | = (1 < / / ange nya watchdog timeout-värde
WDTCR = värde;
WDTCR | = _BV(WDIE);
}
ställa in systemet i lågeffektläge enligt
systemet 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 är inställd här
sleep_enable();
sleep_mode(); Systemet sover här
sleep_disable(); Systemet fortsätter utförande här när watchdog timeout
SBI(ADCSRA,ADEN); Växla Analog till Digitalconverter på
PRR & = B11111110; tydlig ADC disable bit i makt minskade Reg
}