[Tuto] Mode sommeil sur Trinket

Posté sur: juil. 19, 2019

Catégories: Arduino

Tags: adafruit , avr , mode , sommeil , trinket , tuto , tutorial , tutoriel

Les modes sommeil permettent de réduire énormément la consommation des cartes électroniques. Sur le Trinket d'Adafruit, il est souvent recommandé de passer par les librairies Adafruit_sleepydog dans cet exemple nous allons passer par l'utilisation d'une librairie plus bas niveau.

Le cœur de l'Adafruit Trinket est un microcontrôleur Attiny 85. Celui-ci est basé sur une architecture de type AVR. Nous allons donc passer dans notre cas par les librairies pour Arduino avr/sleep.h et avr/interrupt.h

Pour faire nos essais, nous allons nous baser sur le sketch exemple "Button" inclue dans l'IDE Arduino. Après quelques modifications de pinout, il est compatible avec le Trinket:

const int buttonPin = 0; // the number of the pushbutton pin
const int ledPin = 1; // the number of the LED pin
int buttonState = 0; // variable for reading the pushbutton status

void setup() {
 // initialize the LED pin as an output:
 pinMode(ledPin, OUTPUT);
 // initialize the pushbutton pin as an input:
 pinMode(buttonPin, INPUT);
}

void loop() {
 // read the state of the pushbutton value:
 buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
 if (buttonState == HIGH) {
 // turn LED on:
 digitalWrite(ledPin, HIGH);
 } else {
 // turn LED off:
 digitalWrite(ledPin, LOW);
 }
 }

Le mode sleep va fonctionner comme ceci:

  • Lorsque le bouton n'est pas pressé
  • La LED s'allume 3 secondes
  • Le mode sleep s'enclenche avec la LED qui reste allumée
  • Lors de l'appuie sur le bouton le Trinket sort du mode sleep

Voici le code que cela donne:


#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <avr/power.h>

const int buttonPin = 0; // the number of the pushbutton pin
const int ledPin = 1; // the number of the LED pin
int buttonState = 0; // variable for reading the pushbutton status

void setup() {
 // initialize the LED pin as an output:
 pinMode(ledPin, OUTPUT);
 // initialize the pushbutton pin as an input:
 pinMode(buttonPin, INPUT_PULLUP);
}

void sleep() {

 GIMSK |= _BV(PCIE); // Enable Pin Change Interrupts
 PCMSK |= _BV(PCINT0); // Use PB0 as interrupt pin 0
 ADCSRA &= ~_BV(ADEN); // ADC off
 set_sleep_mode(SLEEP_MODE_PWR_DOWN); // replaces above statement

 sleep_enable(); // Sets the Sleep Enable bit in the MCUCR Register (SE BIT)
 sei();  // Enable interrupts
 sleep_cpu(); // sleep

 cli();  // Disable interrupts
 PCMSK &= ~_BV(PCINT0); // Turn off PB0 as interrupt pin
 sleep_disable(); // Clear SE bit
 ADCSRA |= _BV(ADEN); // ADC on

 sei();  // Enable interrupts
 } // sleep

ISR(PCINT0_vect) {
 // This is called when the interrupt occurs, but I don't need to do anything in it
 }

void loop() {
 // read the state of the pushbutton value:
 buttonState = digitalRead(buttonPin);

 // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
 if (buttonState == HIGH) {
 // turn LED on:
 digitalWrite(ledPin, HIGH);
 delay(3000);
 sleep();
 } else {
 // turn LED off:
 digitalWrite(ledPin, LOW);
 }
}

A titre de comparaison, sans le mode sleep LED allumée le Trinket consomme 22mA sous 12V avec le mode sleep cela tombe à 13mA soit une économie de 9mA.

laissez un commentaire

Se connecter