Door Sensor (Battery, RF, Sleep, WDT, Battery Level)
3 berichten
• Pagina 1 van 1
- degiel1982
- Berichten: 9
- Geregistreerd: 07 Nov 2020, 06:27
Door Sensor (Battery, RF, Sleep, WDT, Battery Level)
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
https://www.instructables.com/DoorWindow-Sensor-RF433-Battery-Low-Power/
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
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
- degiel1982
- Berichten: 9
- Geregistreerd: 07 Nov 2020, 06:27
Re: Door Sensor (Battery, RF, Sleep, WDT, Battery Level)
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.
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);
}
}
}
}
Re: Door Sensor (Battery, RF, Sleep, WDT, Battery Level)
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
shooter@home.nl
3 berichten
• Pagina 1 van 1
Terug naar Afgeronde projecten
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten