Stap 7:
In deze stap vindt u de Morse-Code... erm... code voor Throwdurino.
Het grote ding over het toevoegen van een microcontroller is dat we informatie kunnen uitvoeren. Deze sketch kunt de dezelfde throwie te knipperen een voorgeprogrammeerde boodschap in Morse Code. De eerste drempel instelling routine en licht sensing methode zijn dezelfde als voor de originele schets.
Bewerken - kan er een fout in de code:drempel = (totaal >> 5); drempel gemiddelde punt (kloof totaal per 128) instellen.
waarschijnlijk moet worden:
drempel = (totaal >>7); drempel gemiddelde punt (kloof totaal per 128) instellen.
Op heeft gehanteerd voor mij zoals het was, maar dit leiden problemen met de lichte sensing tot kan. Ik zal controleren en corrigeren indien nodig.
De timing van de Morse is niet vrij zo snel zoals het moet - de pauzes veel te lang zijn werkelijk - maar ik vond de strikte timing te snel voor een beginner om te decoderen. Of te zwaar op batterijgebruik. Ik denk dat dit vrij duidelijk is voor de beginnende Morse Coder.
Als u wilt het bericht bewerken, de lijn onder aan de bovenkant van de schets te vinden:
const char flashSeq [] = {"donker hier niet het"}; Morse bericht. Bewerk dit.en gewoon bewerken die als u nodig hebt.
Voor het minimaliseren van de lengte van de schets, erkent het alleen hoofdletters. Alles zal worden behandeld als een "ruimte". Probeer niet meer dan 256 tekens gebruiken of het dreigt te crashen vreselijk.
De schets is gekoppeld en geplakt hieronder. Het moet compileren tot rond 1398 bytes
Throwduino basic - editie van de Morse-code!
Ugi 2012
MIT-licentie
Geschreven voor ATtiny25/45/85 met behulp van de Arduino Tiny core - http://code.google.com/p/arduino-tiny/
Wordt niet gecompileerd voor andere Arduinos (ATMega168, ATMega328 etc)
Zorg ervoor dat u het juiste bord voordat je compileert.
Voor Ref:
ADC Pins:
ADC1 = PB2
ADC2 = PB4
ADC3 = PB3
Als u wilt gewoon de flash patroon wijzigen, moet u dat hier doen.
Standaard is:
//
const char flashSeq [] = {"donker hier niet het"}; Morse bericht. Bewerk dit.
//
Het bericht met alleen hoofdletters-tekens bewerken.
Iets anders zal komen als een 1s vertraging.
Na de reeks wachten we op 2s voordat herhaald.
const char flashSeq [] = {"donker hier niet het"}; Morse bericht. Bewerk dit.
Const byte seqLength =(sizeof(flashSeq)-1);
Morse code codering
Opgeslagen als één byte per brief.
Hoge 5 bits zijn 1 voor - en 0 voor beginnend met LSB voor die hoog-5...
Lage 3 bits geven aantal flitsen (stippen + streepjes).
Morse zorgt voor 5 flitsen (voor getallen) maar brieven vereisen 4 maximaal.
Deze indeling kan dus worden gebruikt voor getallen zo goed maar ik heb dat niet uitgevoerd.
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 laten we een throwie voor die reeks...
Const int LEDpin = 4; Hoewel dit in een constante, is er een heleboel directe poort toegang
Ik zou niet proberen om dit te veranderen zonder lopende throu' de hele code.
unsigned int drempel = 10; We zullen dit juist ingesteld tijdens de installatie
Dit stelt sommige libs en definities voor gebruik met de sluimer-timer
#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, bit) (_SFR_BYTE(sfr) | = _BV(bit))
#endif
ISR(WDT_vect) {WDTCR| = B01000000;} / / Watchdog-Timer reset naar Interrupt modus elke keer.
Knoeien over met sommige journalen die u wilt uitschakelen van spullen & set referenties.
VOID Setup {}
ADCSRB & = B10111111; uitschakelen van comparitor
ACSR | = B10000000; Schakel stroom comparitor
ADCSRA | = B10000000; / / ADC inschakelen
DDRB & = B11100000; Stel alle invoeren
DDRB| = B00011010; 1,3 en 4 stellen als uitvoerapparaat
PORTB & = B11110111; set PB3 lage - dit was voor de testfase. Waarschijnlijk kan nu worden weggelaten.
PRR & = B11111110; duidelijke ADC uitschakelen bits in macht vermindering Reg
analogReference(6); interne 2.56v verwijst naar met geen bypass - INTERNAL2v56NB-
Tonen dat we wakker zijn:
Flash(3); Drie flitsen - wij zijn gebruiksklaar.
De drempel voor lichte sensing tijdens eerste 40 seconden instellen
Wij nemen 148 metingen, bin van de eerste 20 en vervolgens het gemiddelde van de volgende 128.
unsigned int totaal = 0;
voor (byte rep = 0; rep < 148; rep ++) {}
int value=lightLevel();
int waarde = 10;
if(Rep>19) {}
Total += waarde; tatke totaal 128 lezingen
}
Flash(Value);
pause(4); / / was pause(4)
DDRB| = B00011010; 1, 3 en 4 te stellen als uitvoerapparaat
PORTB & = B1110000; Alle laag ingesteld
}
drempel = (totaal >> 7); drempel gemiddelde punt (kloof totaal per 128) instellen.
Flash(Threshold); Dit is meestal voor foutopsporing.
}
Hoofdlus
We meten het lichtniveau. Als het is laag vervolgens flash wij onze volgorde dan slaap voor 2s.
Als licht niveau hoog, we voor 8s slapen.
void loop {}
analogReference(6); interne 2.56v verwijst naar met geen rondweg
Meten van lichtniveau en als het is laag genoeg, weergeven van onze flash reeks
Als (lightLevel() < drempel) {}
flashMorse();
Indien wij knipperen waren, slapen we nu voor 4s
pause(8);
DDRB| = B00011010; 1,3 en 4 stellen als uitvoerapparaat
PORTB & = B11110111; PB3 laag.
}
else {}
Als we niet waren knippert dan slapen we voor 8s
pause(9);
DDRB| = B00011010; 1,3 en 4 stellen als uitvoerapparaat
PORTB & = B11110111; PB3 laag.
}
} / / einde van de hoofdlus
Lichtniveau meten door te kijken naar spanning gegenereerd door LED verbonden met D4 (A2) op pin 3 van de chip.
Instellen van Output en laag om te beginnen om zich te kwijten van de opbouw van een kosten - niet zeker als we dit nodig
int lightLevel() {}
pinMode (LEDpin, uitvoer);
digitalWrite (LEDpin, laag);
delayMicroseconds(50);
pinMode (LEDpin, INPUT);
delayMicroseconds(100); laat het stabiliseren als input weer
unsigned int waarde = analogRead(A2);
retourwaarde;
}
Flitser routine - 70ms, 250 ms uit
Bepaald aantal keren herhalen en vervolgens onderbreken 500ms
VOID flash(byte No) {}
pinMode (LEDpin, uitvoer);
if (!. No) {/ / als wij een nul ontvangen, gewoon pauzeren.
pause(5);
DDRB| = B00011010; 1,3 en 4 stellen als uitvoerapparaat
PORTB & = B11110111; PB3 laag.
}
Als we een ander getal dan nul flitsen hadden, maken we ze nu
voor (byte rep = 0; rep < No; rep ++) {}
flashDot(70);
}
Pauze (slaap)
pause(5);
DDRB| = B00011010; 1 en 3 instellen als output
PORTB & = B11110111; PB3 laag.
}
VOID pauze (byte keer) {}
DDRB & = B11100000; Stel alle invoeren
setup_watchdog(time); wachttijd instellen
system_sleep(); / / slapen
}
ongeldig flashMorse() {}
voor (byte rep = 0; rep < seqLength; rep ++) {}
byte index = 0;
Als (flashSeq [rep] < 65 || flashSeq [rep] > 90) index = 0;
anders index = flashSeq [rep]-64;
if(!index) pause(6);
else {}
byte dotdash = morse [index-1] >> 3; slechts reeks deel (5 bits) gestoken dotdash
Punten en strepen volgens volgorde gecodeerd in morse]
voor (byte knippert = 0; knippert < ((morse[(index-1)] & B111)); flitsen ++) {}
Als (dotdash & 1)flashDot(160); Als LSB 1 dan display a dash is
anders flashDot(40); anders is het een stip
pause(4); pauze tussen flitsers - 256ms
dotdash >> = 1; Roll langs met de volgende bit
}
pause(5); Einde van woord pauze 0.5s
}
}
}
flitser de LED voor tijd (< 256 ms) en pauze voor 250ms.
VOID flashDot (byte keer) {}
DDRB| = B00011010; 1,3 en 4 stellen als uitvoerapparaat
PORTB & = B11110111; PB3 laag.
PORTB| = B00010000; PB4 hoog
delay(time);
PORTB & = B11101111; PB4 laag.
pause(4);
}
Watchdog-timer-installatie
Dit is specifiek voor de ATTiny85 (+ tiny45, & tiny25) en zal niet compileren voor ATMega328 enz.
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 periode) {}
de waarde van de byte;
Als (periode > 9) periode = 9;
waarde = periode & B111;
Als (periode > 7) value| = (1 << 5);
Value| = (1 << WDCE);
MCUSR & = ~ (1 << WDRF);
Start 4-klok-cycle getimede opeenvolging
WDTCR | = (1 << WDCE) | (1 << WDE);
nieuwe waakhond-outwaarde instellen
WDTCR = waarde;
WDTCR | = _BV(WDIE);
}
systeem in de slaapstand
systeem wakker wanneer wtchdog een time-out opgetreden is
ongeldig system_sleep() {}
CBI(ADCSRA,ADEN); switch analoog naar Digitalconverter af
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 time-out
SBI(ADCSRA,ADEN); switch analoog aan Digitalconverter
PRR & = B11111110; duidelijke ADC uitschakelen bits in macht vermindering Reg
}
Ugi 2012
MIT-licentie
Geschreven voor ATtiny25/45/85 met behulp van de Arduino Tiny core - http://code.google.com/p/arduino-tiny/
Wordt niet gecompileerd voor andere Arduinos (ATMega168, ATMega328 etc)
Zorg ervoor dat u het juiste bord voordat je compileert.
Voor Ref:
ADC Pins:
ADC1 = PB2
ADC2 = PB4
ADC3 = PB3
Als u wilt gewoon de flash patroon wijzigen, moet u dat hier doen.
Standaard is:
//
const char flashSeq [] = {"donker hier niet het"}; Morse bericht. Bewerk dit.
//
Het bericht met alleen hoofdletters-tekens bewerken.
Iets anders zal komen als een 1s vertraging.
Na de reeks wachten we op 4s voordat herhaald.
const char flashSeq [] = {"donker hier niet het"}; Morse bericht. Bewerk dit.
Const byte seqLength =(sizeof(flashSeq)-1);
Morse code codering
Opgeslagen als één byte per brief.
Hoge 5 bits zijn 1 voor - en 0 voor beginnend met LSB voor die hoog-5...
Lage 3 bits geven aantal flitsen (stippen + streepjes).
Morse zorgt voor 5 flitsen (voor getallen) maar brieven vereisen 4 maximaal.
Deze indeling kan dus worden gebruikt voor getallen zo goed maar ik heb dat niet uitgevoerd.
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 laten we een throwie voor die reeks...
Const int LEDpin = 4; Hoewel dit in een constante, is er een heleboel directe poort toegang
Ik zou niet proberen om dit te veranderen zonder lopende throu' de hele code.
unsigned int drempel = 10; We zullen dit juist ingesteld tijdens de installatie
Dit stelt sommige libs en definities voor gebruik met de sluimer-timer
#include
#include
#ifndef cbi
#define cbi (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;} / / Watchdog-Timer reset naar Interrupt modus elke keer.
Knoeien over met sommige journalen die u wilt uitschakelen van spullen & set referenties.
VOID Setup {}
ADCSRB & = B10111111; uitschakelen van comparitor
ACSR | = B10000000; Schakel stroom comparitor
ADCSRA | = B10000000; / / ADC inschakelen
DDRB & = B11100000; Stel alle invoeren
DDRB| = B00011010; 1,3 en 4 stellen als uitvoerapparaat
PORTB & = B11110111; set PB3 lage - dit was voor de testfase. Waarschijnlijk kan nu worden weggelaten.
PRR & = B11111110; duidelijke ADC uitschakelen bits in macht vermindering Reg
analogReference(6); interne 2.56v verwijst naar met geen bypass - INTERNAL2v56NB-
Tonen dat we wakker zijn:
Flash(3); Drie flitsen - wij zijn gebruiksklaar.
De drempel voor lichte sensing tijdens eerste 40 seconden instellen
Wij nemen 148 metingen, bin van de eerste 20 en vervolgens het gemiddelde van de volgende 128.
unsigned int totaal = 0;
voor (byte rep = 0; rep < 148; rep ++) {}
int value=lightLevel();
int waarde = 10;
if(Rep>19) {}
Total += waarde; tatke totaal 128 lezingen
}
Flash(Value);
pause(4); / / was pause(4)
DDRB| = B00011010; 1, 3 en 4 te stellen als uitvoerapparaat
PORTB & = B1110000; Alle laag ingesteld
}
drempel = (totaal >> 5); drempel gemiddelde punt (kloof totaal per 128) instellen.
Flash(Threshold); Dit is meestal voor foutopsporing.
}
Hoofdlus
We meten het lichtniveau. Als het is laag vervolgens flash wij onze volgorde dan slaap voor 2s.
Als licht niveau hoog, we voor 8s slapen.
void loop {}
analogReference(6); interne 2.56v verwijst naar met geen rondweg
Meten van lichtniveau en als het is laag genoeg, weergeven van onze flash reeks
Als (lightLevel()
flashMorse();
Indien wij knipperen waren, slapen we nu voor 4s
pause(8);
DDRB| = B00011010; 1,3 en 4 stellen als uitvoerapparaat
PORTB & = B11110111; PB3 laag.
}
else {}
Als we niet waren knippert dan slapen we voor 8s
pause(9);
DDRB| = B00011010; 1,3 en 4 stellen als uitvoerapparaat
PORTB & = B11110111; PB3 laag.
}
} / / einde van de hoofdlus
Lichtniveau meten door te kijken naar spanning gegenereerd door LED verbonden met D4 (A2) op pin 3 van de chip.
Instellen van Output en laag om te beginnen om zich te kwijten van de opbouw van een kosten - niet zeker als we dit nodig
int lightLevel() {}
pinMode (LEDpin, uitvoer);
digitalWrite (LEDpin, laag);
delayMicroseconds(50);
pinMode (LEDpin, INPUT);
delayMicroseconds(100); laat het stabiliseren als input weer
unsigned int waarde = analogRead(A2);
retourwaarde;
}
Flitser routine - 70ms, 250 ms uit
Bepaald aantal keren herhalen en vervolgens onderbreken 500ms
VOID flash(byte No) {}
pinMode (LEDpin, uitvoer);
if (!. No) {/ / als wij een nul ontvangen, gewoon pauzeren.
pause(5);
DDRB| = B00011010; 1,3 en 4 stellen als uitvoerapparaat
PORTB & = B11110111; PB3 laag.
}
Als we een ander getal dan nul flitsen hadden, maken we ze nu
voor (byte rep = 0; rep flashDot(70);
}
Pauze (slaap)
pause(5);
DDRB| = B00011010; 1 en 3 instellen als output
PORTB & = B11110111; PB3 laag.
}
VOID pauze (byte keer) {}
DDRB & = B11100000; Stel alle invoeren
setup_watchdog(time); wachttijd instellen
system_sleep(); / / slapen
}
ongeldig flashMorse() {}
voor (byte rep = 0; rep byte index = 0;
Als (flashSeq [rep] < 65 || flashSeq [rep] > 90) index = 0;
anders index = flashSeq [rep]-64;
if(!index) pause(6);
else {}
byte dotdash = morse [index-1] >> 3; slechts reeks deel (5 bits) gestoken dotdash
Punten en strepen volgens volgorde gecodeerd in morse]
voor (byte knippert = 0; knippert < ((morse[(index-1)] & B111)); flitsen ++) {}
Als (dotdash & 1)flashDot(160); Als LSB 1 dan display a dash is
anders flashDot(40); anders is het een stip
pause(5); pauze tussen flitsers - 256ms
dotdash >> = 1; Roll langs met de volgende bit
}
pause(6); Einde van woord pause 1 s
}
}
}
flitser de LED voor tijd (< 256 ms) en pauze voor 250ms.
VOID flashDot (byte keer) {}
DDRB| = B00011010; 1,3 en 4 stellen als uitvoerapparaat
PORTB & = B11110111; PB3 laag.
PORTB| = B00010000; PB4 hoog
delay(time);
PORTB & = B11101111; PB4 laag.
pause(4);
}
Watchdog-timer-installatie
Dit is specifiek voor de ATTiny85 (+ tiny45, & tiny25) en zal niet compileren voor ATMega328 enz.
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 periode) {}
de waarde van de byte;
Als (periode > 9) periode = 9;
waarde = periode & B111;
Als (periode > 7) value| = (1 << 5);
Value| = (1 <
MCUSR & ~(1< =
Start 4-klok-cycle getimede opeenvolging
WDTCR | = (1 < / / nieuwe waakhond-outwaarde instellen
WDTCR = waarde;
WDTCR | = _BV(WDIE);
}
systeem in de slaapstand
systeem wakker wanneer wtchdog een time-out opgetreden is
ongeldig system_sleep() {}
CBI(ADCSRA,ADEN); switch analoog naar Digitalconverter af
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 time-out
SBI(ADCSRA,ADEN); switch analoog aan Digitalconverter
PRR & = B11111110; duidelijke ADC uitschakelen bits in macht vermindering Reg
}