Category Archives: 433

Détecteur de mouvement PIR & TX 433Mhz pilotés avec le Microcontrôleur AVR ATTINY85

PIR Atinny85 Sketch_bb

 

pir

Détecteur de mouvement PIR

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

Attiny85

Attiny85

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

sku_334387_1

TX 433.92MHz

  1. Avec un arduino Nano : 43mA !!!
  2. Arduino M.J duino uno: 6,5mA
  3. Arduino XDRduino: 25mA
  4. 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);

}