Comme promis, voici le code de mon sablier à thé électronique . C’est le
premier objet que j’ai pensé et fabriqué de A à Z, en me servant d’un
arduino pour réaliser d’abord un prototype. Ce qui fait que, même si le
résultat est moche, j’en suis fier ;)
Tout d’abord le code C qui doit être envoyé dans un micro contrôleur Attiny13,
à l’aide d’un programmateur .
#include <avr/io.h>
#include <util/delay.h>
#define LED PB0
#define BUZZER PB2
#define BUTTON3 PB3 // For 3 minutes
#define BUTTON5 PB4 // For 5 minutes
#define THREE_MINUTES_IN_SECONDS 180
#define FIVE_MINUTES_IN_SECONDS 300
int main ( void )
{
DDRB |= 1 << LED | 1 << BUZZER ; // Outputs declarations.
PORTB |= 1 << LED ; // Switch on the LED.
PORTB &= ~ ( 1 << BUZZER ); // Switch off the buzzer.
DDRB &= ~ ( 1 << BUTTON3 | 1 << BUTTON5 ); // Inputs declarations.
PORTB |= ( 1 << BUTTON3 | 1 << BUTTON5 ); // Pull up for inputs.
// Number of seconds for the timer to buzz.
int g_timer = 0 ;
// Give enough time to enable pull ups.
_delay_ms ( 100 );
while ( 1 ) {
// Button for 3 minutes pressed?
if ( ! ( PINB & ( 1 << BUTTON3 ))) {
_delay_ms ( 10 );
g_timer = THREE_MINUTES_IN_SECONDS ;
break ;
}
// Button for 5 minutes pressed?
if ( ! ( PINB & ( 1 << BUTTON5 ))) {
_delay_ms ( 10 );
g_timer = FIVE_MINUTES_IN_SECONDS ;
break ;
}
}
// Each cycle is approximately 1 second, but this is not really
// accurate.
while ( g_timer > 0 ) {
PORTB ^= 1 << LED ; // LED off cause it was set up to on.
_delay_ms ( 500 );
PORTB ^= 1 << LED ; // LED on.
_delay_ms ( 500 );
g_timer -- ;
}
// Now it's time to bip and blink forever.
while ( 1 ) {
int i ;
for ( i = 0 ; i < 3 ; i ++ ) {
PORTB |= 1 << BUZZER ;
_delay_ms ( 100 );
PORTB &= ~ ( 1 << BUZZER );
_delay_ms ( 100 );
}
for ( i = 0 ; i < 3 ; i ++ ) {
PORTB |= 1 << LED ;
_delay_ms ( 100 );
PORTB &= ~ ( 1 << LED );
_delay_ms ( 100 );
}
}
}
Et voici le contenu du Makefile, qui simplifie les phases de compilation et
d’installation.
DEVICE = attiny13
CLOCK = 1000000
PROGRAMMER = -P /dev/ttyUSB0 -c arduino
BAUDRATE = -b 19200
help:
@echo 'check => check connection with ATtiny13'
@echo 'hex => compile hex file'
@echo 'flash => install hex file'
@echo 'clean => delete unnecessary files'
check:
avrdude -p $(DEVICE) $(PROGRAMMER) $(BAUDRATE)
hex:
avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE) -c main.c
avr-gcc -mmcu=$(DEVICE) -o main.elf main.o
avr-objcopy -O ihex main.elf main.hex
flash:
avrdude -p $(DEVICE) $(PROGRAMMER) -U flash:w:main.hex $(BAUDRATE)
clean:
rm main.o
rm main.elf
Vous pouvez retrouver ce code sur gitub , ainsi que le schéma avec les
composants électroniques.
J’espère me faire bientôt une deuxième version plus jolie et plus sophistiquée.
Lire la partie 1
Lire la partie 2