Attiny85(RF,Sleep,Interrupt,Timer,Battery Level(3xAAA)
2 berichten
• Pagina 1 van 1
- degiel1982
- Berichten: 9
- Geregistreerd: 07 Nov 2020, 06:27
Attiny85(RF,Sleep,Interrupt,Timer,Battery Level(3xAAA)
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
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
- 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
Re: Attiny85(RF,Sleep,Interrupt,Timer,Battery Level(3xAAA)
En wordt het nu wakker als je hard met de deur gooit?
geintje want er staat geen vraag meer bij.
geintje want er staat geen vraag meer bij.
paul deelen
shooter@home.nl
shooter@home.nl
2 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten