From c2393c7e4c13baf915a615b0794d0b89255fb0f1 Mon Sep 17 00:00:00 2001 From: Nicolae Hodos Date: Fri, 29 Apr 2016 23:16:46 +0200 Subject: [PATCH] initial commit --- window1/window1.ino | 100 ++++++++++++++++++++++++++++ window1_copy/window1_copy.ino | 119 ++++++++++++++++++++++++++++++++++ window2/window2.ino | 97 +++++++++++++++++++++++++++ 3 files changed, 316 insertions(+) create mode 100644 window1/window1.ino create mode 100644 window1_copy/window1_copy.ino create mode 100644 window2/window2.ino diff --git a/window1/window1.ino b/window1/window1.ino new file mode 100644 index 0000000..862bd6e --- /dev/null +++ b/window1/window1.ino @@ -0,0 +1,100 @@ +#include +#include +#include +#include + +// Utility macros +#define adc_disable() (ADCSRA &= ~_BV(ADEN)) // disable ADC (before power-off) +#define adc_enable() (ADCSRA |= _BV(ADEN)) // re-enable ADC +#define enable_pin_interrupts() (GIMSK |= _BV(PCIE)) // Enable Pin Change Interrupts + +// Pins +#define SWITCH 0 +#define SENDER 2 +#define CONTROLLER 4 + +RCSwitch mySwitch = RCSwitch(); +char* WND_OPEN = "00000000000000000000000001000001"; +char* WND_CLOSED = "00000000000000000000000001100001"; + +int counter = 0; +bool currentState; + +void setup() { + + pinMode(SWITCH, INPUT_PULLUP); + pinMode(CONTROLLER, OUTPUT); + digitalWrite(CONTROLLER, LOW); + + mySwitch.enableTransmit(SENDER); + mySwitch.setProtocol(2); + + updateState(); + sendWindowState(); + + set_sleep_mode(SLEEP_MODE_PWR_DOWN); + enable_pin_interrupts(); + enableWdt(); + +} + +void loop() { + sleep(); +} + +void updateState() { + currentState = digitalRead(SWITCH); +} + +void sendWindowState() { + byte state = digitalRead(SWITCH); + if (state == HIGH) { + mySwitch.send(WND_OPEN); + } else { + mySwitch.send(WND_CLOSED); + } +} + +void sleep() { + PCMSK |= _BV(PCINT0); // Use PB0 as interrupt pin + adc_disable(); + + sleep_enable(); // Sets the Sleep Enable bit in the MCUCR Register (SE BIT) + sei(); // Enable interrupts + + sleep_cpu(); // sleep + + cli(); // Disable interrupts + PCMSK &= ~_BV(PCINT0); // Turn off PB0 as interrupt pin + sleep_disable(); // Clear SE bit + adc_enable(); + + sei(); // Enable interrupts +} + +ISR(PCINT0_vect) { + sendWindowState(); +} + +ISR(WDT_vect) { + bool state = digitalRead(SWITCH); + if (state != currentState) { + sendWindowState(); + updateState(); + return; + } + counter++; + if (counter % 76 == 0) { + sendWindowState(); + counter = 0; + } +} + +//enable the wdt for 8sec interrupt +void enableWdt() +{ + MCUSR = 0x00; + WDTCR |= _BV(WDCE) | _BV(WDE); + WDTCR = _BV(WDIE) | _BV(WDP3) | _BV(WDP0); //8192ms +} + diff --git a/window1_copy/window1_copy.ino b/window1_copy/window1_copy.ino new file mode 100644 index 0000000..d288092 --- /dev/null +++ b/window1_copy/window1_copy.ino @@ -0,0 +1,119 @@ +#include +#include +#include +#include +#include + +// Utility macros +#define adc_disable() (ADCSRA &= ~_BV(ADEN)) // disable ADC (before power-off) +#define adc_enable() (ADCSRA |= _BV(ADEN)) // re-enable ADC +#define enable_pin_interrupts() (GIMSK |= _BV(PCIE)) // Enable Pin Change Interrupts + +// Pins +#define SWITCH 0 +#define SENDER 2 +#define CONTROLLER 4 + +RCSwitch mySwitch = RCSwitch(); +char* WND_OPEN = "00000000000000000000000001000001"; +char* WND_CLOSED = "00000000000000000000000001100001"; + +int counter = 0; +//SystemStatus sys = SystemStatus(); + +void setup() { + + pinMode(SWITCH, INPUT_PULLUP); + pinMode(CONTROLLER, OUTPUT); + digitalWrite(CONTROLLER, LOW); + + mySwitch.enableTransmit(SENDER); + mySwitch.setProtocol(2); + + set_sleep_mode(SLEEP_MODE_PWR_DOWN); + enable_pin_interrupts(); + enableWdt(); +// mySwitch.send(26, 32); + +} + +void loop() { + sleep(); +} + +void sendWindowState() { + byte state = digitalRead(SWITCH); + if (state == HIGH) { + mySwitch.send(WND_OPEN); + } else { + mySwitch.send(WND_CLOSED); + } +} + +void sendBatteryStatus() { +// mySwitch.send(sys.getVCC(), 32); +} + +long readVcc() { + // Read 1.1V reference against AVcc + // set the reference to Vcc and the measurement to the internal 1.1V reference + #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + ADMUX = _BV(MUX5) | _BV(MUX0); + #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + ADMUX = _BV(MUX3) | _BV(MUX2); + #else + ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #endif + + delay(2); // Wait for Vref to settle + ADCSRA |= _BV(ADSC); // Start conversion + while (bit_is_set(ADCSRA,ADSC)); // measuring + + uint8_t low = ADCL; // must read ADCL first - it then locks ADCH + uint8_t high = ADCH; // unlocks both + + long result = (high<<8) | low; + + result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 + return result; // Vcc in millivolts +} + +void sleep() { + PCMSK |= _BV(PCINT0); // Use PB0 as interrupt pin + adc_disable(); + + sleep_enable(); // Sets the Sleep Enable bit in the MCUCR Register (SE BIT) + sei(); // Enable interrupts + + sleep_cpu(); // sleep + + cli(); // Disable interrupts + PCMSK &= ~_BV(PCINT0); // Turn off PB0 as interrupt pin + sleep_disable(); // Clear SE bit + adc_enable(); + + sei(); // Enable interrupts +} + +ISR(PCINT0_vect) { + sendWindowState(); +} + +ISR(WDT_vect) { + counter++; + if (counter % 38 == 0) { + sendWindowState(); + counter = 0; + } +} + +//enable the wdt for 8sec interrupt +void enableWdt() +{ + MCUSR = 0x00; + WDTCR |= _BV(WDCE) | _BV(WDE); + WDTCR = _BV(WDIE) | _BV(WDP3) | _BV(WDP0); //8192ms +} + diff --git a/window2/window2.ino b/window2/window2.ino new file mode 100644 index 0000000..4657c12 --- /dev/null +++ b/window2/window2.ino @@ -0,0 +1,97 @@ +#include +#include +#include +#include + +// Utility macros +#define adc_disable() (ADCSRA &= ~_BV(ADEN)) // disable ADC (before power-off) +#define adc_enable() (ADCSRA |= _BV(ADEN)) // re-enable ADC +#define enable_pin_interrupts() (GIMSK |= _BV(PCIE)) // Enable Pin Change Interrupts + +// Pins +#define SWITCH 0 +#define SENDER 2 + +RCSwitch mySwitch = RCSwitch(); +char* WND_OPEN = "00000000000000000000000001000002"; +char* WND_CLOSED = "00000000000000000000000001100002"; + +int counter = 0; +bool currentState; + +void setup() { + + pinMode(SWITCH, INPUT_PULLUP); + + mySwitch.enableTransmit(SENDER); + mySwitch.setProtocol(2); + + updateState(); + sendWindowState(); + + set_sleep_mode(SLEEP_MODE_PWR_DOWN); + enable_pin_interrupts(); + enableWdt(); + +} + +void loop() { + sleep(); +} + +void updateState() { + currentState = digitalRead(SWITCH); +} + +void sendWindowState() { + byte state = digitalRead(SWITCH); + if (state == HIGH) { + mySwitch.send(WND_OPEN); + } else { + mySwitch.send(WND_CLOSED); + } +} + +void sleep() { + PCMSK |= _BV(PCINT0); // Use PB0 as interrupt pin + adc_disable(); + + sleep_enable(); // Sets the Sleep Enable bit in the MCUCR Register (SE BIT) + sei(); // Enable interrupts + + sleep_cpu(); // sleep + + cli(); // Disable interrupts + PCMSK &= ~_BV(PCINT0); // Turn off PB0 as interrupt pin + sleep_disable(); // Clear SE bit + adc_enable(); + + sei(); // Enable interrupts +} + +ISR(PCINT0_vect) { + sendWindowState(); +} + +ISR(WDT_vect) { + bool state = digitalRead(SWITCH); + if (state != currentState) { + sendWindowState(); + updateState(); + return; + } + counter++; + if (counter % 76 == 0) { + sendWindowState(); + counter = 0; + } +} + +//enable the wdt for 8sec interrupt +void enableWdt() +{ + MCUSR = 0x00; + WDTCR |= _BV(WDCE) | _BV(WDE); + WDTCR = _BV(WDIE) | _BV(WDP3) | _BV(WDP0); //8192ms +} +