Stamattina, con questa giornata piovosa, mi sono messo a giocare con l'Attiny.
Ho fatto un piccolo circuitino che "gioca" con 3 LED la cui intermittenza può essere cambiata premendo il pulsantino sulla breadboard.
Questo è il codice dello sketch (1176 byte):
#define RED 2
#define YELLOW 1
#define GREEN 0
#define BUTTON 4
byte value=1;
byte state=0;
byte val1=0;
byte val2=0;
byte change=0;
byte sequence=0;
unsigned long timer;
void setup() {
pinMode(RED, OUTPUT);
pinMode(YELLOW, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BUTTON, INPUT);
}
void loop() {
//funzione di Debounce per il pulsantino - da qui....
val1=digitalRead(BUTTON);
delay(10);
val2=digitalRead(BUTTON);
if (val1==val2) {
if (val1!=change) {
if (val1==LOW) {
write_leds(LOW, LOW, LOW);
value++;
if (value>5) { value=0; }
sequence = 0;
timer=millis()-100;
}
}
}
//...a qui
//controlla se non sia ora di far lampeggiare un LED
change=val1;
if (millis() > timer) {
timer = millis()+500;
switch (value) {
case 0:
//tutti spenti
write_leds(LOW, LOW, LOW);
break;
case 1:
//alterna il LED rosso
if (sequence == 0) {
write_leds(LOW, LOW, LOW);
} else {
write_leds(HIGH, LOW, LOW);
}
sequence ^= 1;
break;
case 2:
//alterna il LED giallo
if (sequence == 0) {
write_leds(LOW, LOW, LOW);
} else {
write_leds(LOW, HIGH, LOW);
}
sequence ^= 1;
break;
case 3:
//alterna il LED verde
if (sequence == 0) {
write_leds(LOW, LOW, LOW);
} else {
write_leds(LOW, LOW, HIGH);
}
sequence ^= 1;
break;
case 4:
//alterna i 3 LED in sequenza
switch (sequence) {
case 0:
write_leds(HIGH, LOW, LOW);
break;
case 1:
write_leds(LOW, HIGH, LOW);
break;
case 2:
write_leds(LOW, LOW, HIGH);
break;
}
sequence++;
if (sequence > 2) { sequence = 0; }
break;
case 5:
//tutti accesi
write_leds(HIGH, HIGH, HIGH);
break;
}
}
}
void write_leds(byte state1, byte state2, byte state3) {
//modifica le porte dei 3 LED
digitalWrite(RED, state1);
digitalWrite(YELLOW, state2);
digitalWrite(GREEN, state3);
}
Allegato trovate anche lo schema del circuito e dei collegamenti con l'Arduino.
PRECISAZIONE: il condensatore da 10 uF che vede tra il pin RESET ed il pin GND di Arduino vale solo per le schede Arduino UNO. Per le schede Arduino 2009 dovrebbe essere usata una resistenza da 120 ohm. I LED sono in serie con delle resistenze da 680 ohm: le avevo disponibili e vanno più che bene per proteggerli, non sono stato a fare calcoli esatti. La resistenza di pull-down del pulsantino è da 10 Kohm.
Procedura:
- collegate la breadboard all'Arduino senza condensatore;
- collegate il cavetto USB all'Arduino;
- selezionate come "board" la Uno e poi aprite e caricate sull'Arduino lo sketch "Arduino ISP";
- collegate il condensatore (pin "+" in RESET e pin "-" in GND);
- aprite una nuova finestra dell'IDE e copiateci lo sketch;
- selezionate come "board" la "Attiny85 (w/Arduino as ISP)" e poi caricate lo sketch
- giocate col pulsantino
Do per scontato che abbiate seguito le istruzioni presenti a questa pagina per abilitare l'uso dell'Attiny45/85 con l'IDE di Arduino.
AGGIORNAMENTO:
ho scritto una guida che spiega come abilitare il supporto agli Attiny25/45/85, Attiny24/44/84 e Attiny2313 direttamente nell'IDE:
http://www.leonardomiliani.com/?p=435
La guida contiene tutte le indicazioni per poter utilizzare anche la seriale ed il bus I2C con le librerie da scaricare e le modifiche da applicare. Gli inesperti troveranno allegato alla guida un archivio contenente tutte le librerie già modificate e pronte per essere copiate sul proprio computer nonché tutti gli sketch di esempio presentati nella guida.