Xavier Nayrac

Rubyiste accro au TDD, serial blogger, apprenti data scientist, heureux utilisateur de Vim, accordéoniste.
Si vous vous sentez particulièrement généreux, suivez moi sur Twitter.

Fabriquer un sablier à thé électronique 3

| Comments

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.

main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#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

Articles connexes

Commentaires