Avec la mise en veille (SLEEP_MODE_PWR_DOWN) et l’utilisation des interruptions (INT0) , le circuit au repos ne consomme que 30µA avec un Attiny85 (1€89 sur ebay) . Avec le jeu de piles AAA ( en fait je n’en ai
mis que 3 en série), le circuit devrait tourner plus d’une année.
A chaque détection de mouvement, le transmetteur 433Mhz envoie une trame qui est reconnue par une Zibase en périphérique B15.
Le détecteur, grâce à la zibase, est intégré au système d’alarme et, avec un scénario, il permet de gérer la lumière de la cuisine.
Consommation avec un Arduino
- Avec un arduino Nano : 43mA !!!
- Arduino M.J duino uno: 6,5mA
- Arduino XDRduino: 25mA
- Arduino Mini Pro: 3,5 mA . En ôtant la LED (on) et le régulateur de tension 5V, on pourrait tomber à moins d’1mA, mais ce sera toujours bien plus qu’un circuit à base de l’Attiny85. Il faudra que j’essaie!
Le script pour Attiny85
Pour programmer l’Attiny85 à l’aide d’un arduino, je me suis inspiré du post d’Erwan http://labalec.fr/erwan/?p=1508. Éventuellement, ne pas oublier de graver la séquence d’initialisation (bootloader) de l’Attiny85.
// **** INCLUDES *****
#include <avr/sleep.h>
#include <avr/interrupt.h>
#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
// Use pin 0 as wake up pin
const int wakeUpPin = 0;
volatile int ledState = LOW;
#define tx 1 // Pin number for the 433mhz OOK transmitter
#define pinLed 4
RCSwitch mySwitch = RCSwitch();
// set system into the sleep state
void system_sleep() {
cbi(ADCSRA,ADEN); // switch Analog to Digitalconverter OFF
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable();
sleep_mode(); // System sleeps here
sleep_disable(); // System continues here
sbi(ADCSRA,ADEN); // switch Analog to Digitalconverter ON
}
void setup()
{
pinMode(wakeUpPin, INPUT);
pinMode(pinLed, OUTPUT);
mySwitch.enableTransmit(tx);
PCMSK |= bit (PCINT0);
GIFR |= bit (PCIF); // clear any outstanding interrupts
GIMSK |= bit (PCIE); // enable pin change interrupts
sei();
}
ISR (PCINT0_vect)
{
ledState = digitalRead(0);
}
void loop()
{
system_sleep();
if (ledState) {
digitalWrite(pinLed, ledState);
mySwitch.switchOn("01111", "00010"); // ZIBASE => B15
delay(500);
digitalWrite(pinLed, !ledState);
}
}
Le script pour Arduino
// **** INCLUDES *****
#include "LowPower.h"
#include
// Use pin 2 as wake up pin
const int wakeUpPin = 2;
volatile int ledState = LOW;
#define tx 4 // Pin number for the 433mhz OOK transmitter
RCSwitch mySwitch = RCSwitch();
void wakeUp()
{
// Just a handler for the pin interrupt.
//Serial.println("RISING on D2");
ledState = !ledState;
digitalWrite(13, ledState);
}
void setup()
{
// Configure wake up pin as input.
// This will consumes few µA of current.
pinMode(wakeUpPin, INPUT);
pinMode(13, OUTPUT);
Serial.begin(9600); // use the serial port
mySwitch.enableTransmit(tx);
}
void loop()
{
attachInterrupt(0, wakeUp, CHANGE);
// Enter power down state with ADC and BOD module disabled.
// Wake up when pin changes
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
// Disable external pin interrupt on wake up pin.
detachInterrupt(0);
// Do something here
// Example: Read sensor, data logging, data transmission.
if (ledState) {
Serial.println("RISING on D2");
mySwitch.switchOn("01111", "00010"); // ZIBASE = A15 ?? 00 15 11
}
else {
Serial.println("FALLING on D2");
}
delay(500);
}