Door Sensor (Battery, RF, Sleep, WDT, Battery Level)

Toon hier Uw afgeronde projecten aan anderen.
Berichten: 9
Geregistreerd: 07 Nov 2020, 06:27

Door Sensor (Battery, RF, Sleep, WDT, Battery Level)

Berichtdoor degiel1982 » 14 Feb 2021, 10:11

Ik ben 2 maanden geleden begonnen als newbie en heb nooit code of electronica geleerd.
ik wilde goedkoop en makkelijk te repareren sensors hebben gebaseerd op rf en batterijen naar mijn keuze.
Veel geleerd van alle forums en websites zoals marcelpost :)

Afbeelding


https://www.instructables.com/DoorWindow-Sensor-RF433-Battery-Low-Power/

Code: Alles selecteren

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <RCSwitch.h>

#define adc_disable() (ADCSRA &= ~(1<<ADEN))
#define INTERRUPT_PIN PCINT3
#define INT_PIN PB3
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

RCSwitch mySwitch = RCSwitch();

int timerhigh = 0;
int timerlow = 0;
boolean wdt = 0;
int wdtcounter = 0;
void initADC()
{
  ADMUX = (1 << ADLAR) | (0 << REFS1) | (0 << REFS0) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (0 << MUX0);     
  ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0);
}

void setup() {
   mySwitch.enableTransmit(1);
   mySwitch.setProtocol(1);
   mySwitch.setPulseLength(320);
   mySwitch.setRepeatTransmit(5);
   pinMode(INT_PIN, INPUT_PULLUP);
   pinMode(0, INPUT_PULLUP);
   pinMode(2, INPUT_PULLUP);
   pinMode(5, INPUT_PULLUP);
   external_interrupt();
}

ISR (PCINT0_vect){
  MCUCR&=~(1<<SE);
}

ISR(WDT_vect)
{
 MCUCR&=~(1<<SE);
 wdt = 1;
 wdtcounter++;
 
}

void external_interrupt()
{
  sei();                //enabling global interrupt
  GIMSK|= (1<<PCIE);    //Pin change interrupt enable
  PCMSK|=(1<<INTERRUPT_PIN);
}

void enters_sleep()
{
  adc_disable();
  setup_watchdog(9);
  MCUCR|=(1<<SM1);      // enabling sleep mode and powerdown sleep mode
  MCUCR|= (1<<SE);     //Enabling sleep enable bit
  __asm__ __volatile__ ( "sleep" "\n\t" :: ); //Sleep instruction to put controller to sleep
  //controller stops executing instruction after entering sleep mode


void setup_watchdog(int ii)
{
  // 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
  // 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
  uint8_t bb;
  if (ii > 9 ) ii=9;
  bb=ii & 7;
  if (ii > 7) bb|= (1<<5);
  bb|= (1<<WDCE);
  MCUSR &= ~(1<<WDRF);
  // start timed sequence
  WDTCR |= (1<<WDCE) | (1<<WDE);
  // set new watchdog timeout value
  WDTCR = bb;
  WDTCR |= _BV(WDIE);
}

void loop() {
//this will loop the watchdog 225 times 8 seconds
 if(wdt == 1 && wdtcounter < 225){
   wdt = 0;
   enters_sleep();
 }
 else if (wdt == 1 && wdtcounter == 225){
  initADC();
  wdtcounter = 0;
  ADCSRA |= (1 << ADSC);       
   while (ADCSRA & (1 << ADSC) );
   if (ADCH > 181){
    mySwitch.send(10109100, 24);
    delay(1000);
    mySwitch.send(10109100, 24);
    delay(1000);
    wdt = 0;
    enters_sleep();
   }
   else if(ADCH < 182 && ADCH > 177){
    mySwitch.send(10109075, 24);
    delay(1000);
    mySwitch.send(10109075, 24);
    delay(1000);
    wdt = 0;
    enters_sleep();     
   }
   else if(ADCH < 178 && ADCH > 174){     
    mySwitch.send(10109050, 24);     
    delay(1000);   
    mySwitch.send(10109050, 24);   
    delay(1000);     
    wdt = 0;   
    enters_sleep();         
   }
   else if(ADCH < 175){   
    mySwitch.send(10109025, 24);   
    delay(1000);   
    mySwitch.send(10109025, 24);   
    delay(1000);   
    wdt = 0; 
    enters_sleep();       
   }
  } 
 else{
  if( digitalRead(INT_PIN) == HIGH && timerhigh < 5  ) {
   timerlow = 0;
   mySwitch.send(10109000, 24);
   delay(1000);
   timerhigh++;
  }
  else if( digitalRead(INT_PIN) == LOW && timerlow < 5  ){
   timerhigh = 0;
   mySwitch.send(10109500, 24);
   delay(1000);
   timerlow++;
  }
  else{
   delay(1000);
   timerhigh = 0;
   timerlow = 0;
   enters_sleep();
  }
 }
}



Advertisement

Berichten: 9
Geregistreerd: 07 Nov 2020, 06:27

Re: Door Sensor (Battery, RF, Sleep, WDT, Battery Level)

Berichtdoor degiel1982 » 14 Feb 2021, 13:09

Vandaag geupdate
minder code, transmissies en geen delays(vervangen met sleep)
als de staat binnen 3 seconden veranderd dan slaapt hij niet en anders wel.
Code: Alles selecteren
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <RCSwitch.h>

#define adc_disable() (ADCSRA &= ~(1<<ADEN))
#define INTERRUPT_PIN PCINT3
#define INT_PIN PB3
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

RCSwitch mySwitch = RCSwitch();
boolean interrupt = 0;
boolean wdt = 0;
boolean changesleep = 0;

int wdtcounter = 0;

void initADC(){
 ADMUX = (1 << ADLAR) | (0 << REFS1) | (0 << REFS0) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (0 << MUX0);     
 ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0);
}

void setup() {
 mySwitch.enableTransmit(1);
 mySwitch.setProtocol(1);
 mySwitch.setPulseLength(320);
 mySwitch.setRepeatTransmit(15);
 pinMode(INT_PIN, INPUT_PULLUP);
 pinMode(0, INPUT_PULLUP);
 pinMode(2, INPUT_PULLUP);
 pinMode(5, INPUT_PULLUP);
 external_interrupt();
}

ISR (PCINT0_vect){
  MCUCR&=~(1<<SE);
  interrupt = 1;
}

ISR(WDT_vect){
 MCUCR&=~(1<<SE);
 interrupt = 0;
  if(changesleep == 0){
   wdtcounter++;
   wdt = 1;
  }
}

void external_interrupt(){
 sei();                //enabling global interrupt
 GIMSK|= (1<<PCIE);    //Pin change interrupt enable
 PCMSK|=(1<<INTERRUPT_PIN);
}

void enters_sleep(int aa){
 adc_disable();
  if(aa == 0){
   changesleep = 0;
   setup_watchdog(9);
  }
  if(aa == 1){
   changesleep = 1;
   setup_watchdog(7);
  }
  if(aa == 2){
   changesleep = 1;
   setup_watchdog(6);
  }
 MCUCR|=(1<<SM1);      // enabling sleep mode and powerdown sleep mode
 MCUCR|= (1<<SE);     //Enabling sleep enable bit
 __asm__ __volatile__ ( "sleep" "\n\t" :: ); //Sleep instruction to put controller to sleep
  //controller stops executing instruction after entering sleep mode


void setup_watchdog(int ii){
 // 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
 // 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
 uint8_t bb;
 if (ii > 9 ) ii=9;
 bb=ii & 7;
 if (ii > 7) bb|= (1<<5);
 bb|= (1<<WDCE);
 MCUSR &= ~(1<<WDRF);
 // start timed sequence
 WDTCR |= (1<<WDCE) | (1<<WDE);
 // set new watchdog timeout value
 WDTCR = bb;
 WDTCR |= _BV(WDIE);
}

void loop() {
//this will loop the watchdog 225 times 8 seconds
 if(wdt == 1 && wdtcounter < 225 && interrupt == 0){
   wdt = 0;
   enters_sleep(0);
 }
 else if (wdt == 1 && wdtcounter == 225 && interrupt == 0){
  wdt = 0;
  initADC();
  wdtcounter = 0;
  ADCSRA |= (1 << ADSC);       
   while (ADCSRA & (1 << ADSC) );
   if (ADCH > 181){
    mySwitch.send(10109100, 24);
    enters_sleep(3);
    enters_sleep(0);
   }
   else if(ADCH < 182 && ADCH > 177){
    mySwitch.send(10109075, 24);
    enters_sleep(3);
    enters_sleep(0);     
   }
   else if(ADCH < 178 && ADCH > 174){     
    mySwitch.send(10109050, 24);     
    enters_sleep(3);
    enters_sleep(0);         
   }
   else if(ADCH < 175){     
    mySwitch.send(10109025, 24);   
    enters_sleep(3);
    enters_sleep(0);       
   }
  } 
 else{
  wdt = 0;
   if ( digitalRead(INT_PIN) == HIGH){
    mySwitch.send(10109125, 24);
    enters_sleep(1);
     if( digitalRead(INT_PIN) == HIGH ){
      enters_sleep(0); 
     }
   }
   if( digitalRead(INT_PIN) == LOW){
    mySwitch.send(10109150, 24);
    enters_sleep(1);
     if( digitalRead(INT_PIN) == LOW ){
      enters_sleep(0); 
     }
   }
  }
 }

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Door Sensor (Battery, RF, Sleep, WDT, Battery Level)

Berichtdoor shooter » 14 Feb 2021, 18:06

dan zul je dus wel merken dat je langer met de batterijen kunt doen. ik zou die vergelijking van ==255 >= maken dan weet je zeker dat er wat gebeurt.
paul deelen
shooter@home.nl

Terug naar Afgeronde projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten