Attiny85(RF,Sleep,Interrupt,Timer,Battery Level(3xAAA)

Hardware geleverd door Arduino
Berichten: 9
Geregistreerd: 07 Nov 2020, 06:27

Attiny85(RF,Sleep,Interrupt,Timer,Battery Level(3xAAA)

Berichtdoor degiel1982 » 13 Feb 2021, 13:12

Hi everybody,

I am creating a battery powered magnetic door sensor based on rf433.
My goal is battery life and best performance with the most options :)

I want to share my project so if anybody sees some improvements or can use it for their own it would be wonderfull.
I see a lot of info scattered and i wanted to slab this in as whole :P
Afbeelding
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);
   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 > 250){                             
    mySwitch.send(10109100, 24);
    delay(1000);
    mySwitch.send(10109100, 24);
    delay(1000);
    wdt = 0;
    enters_sleep();
   }
   else{
    mySwitch.send(10109005, 24);
    delay(1000);
    mySwitch.send(10109005, 24);
    delay(1000);
    wdt = 0;
    enters_sleep();     
   }
 }
 else{
  if( digitalRead(INT_PIN) == HIGH && timerhigh < 5  ) {
   timerlow = 0;
   mySwitch.send(10107000, 24);
   delay(1000);
   timerhigh++;
  }
  else if( digitalRead(INT_PIN) == LOW && timerlow < 5  ){
   timerhigh = 0;
   mySwitch.send(10108000, 24);
   delay(1000);
   timerlow++;
  }
  else{
   delay(1000);
   timerhigh = 0;
   timerlow = 0;
   enters_sleep();
  }
 }
}



Advertisement

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

Re: Attiny85(RF,Sleep,Interrupt,Timer,Battery Level(3xAAA)

Berichtdoor shooter » 15 Feb 2021, 17:54

En wordt het nu wakker als je hard met de deur gooit?
geintje want er staat geen vraag meer bij.
paul deelen
shooter@home.nl

Terug naar Arduino hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 15 gasten