From 20023c48e02f36e83d378c5a2cc37809df9c67ce Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Mon, 9 May 2016 17:49:24 +0200 Subject: [PATCH] Fixed WDT timer code, still not dynamic --- arduino/HalMultiSensor/HalConfiguration.h | 9 ++-- .../{HalDefinitions.h => HalInclude.h} | 0 arduino/HalMultiSensor/HalInterfaces.h | 16 +++++++ arduino/HalMultiSensor/HalMultiSensor.ino | 44 ++++++++++++------- arduino/HalMultiSensor/Interrupt.cpp | 30 ++++++++----- 5 files changed, 69 insertions(+), 30 deletions(-) rename arduino/HalMultiSensor/{HalDefinitions.h => HalInclude.h} (100%) diff --git a/arduino/HalMultiSensor/HalConfiguration.h b/arduino/HalMultiSensor/HalConfiguration.h index 85715ad3..c8a03155 100755 --- a/arduino/HalMultiSensor/HalConfiguration.h +++ b/arduino/HalMultiSensor/HalConfiguration.h @@ -1,24 +1,27 @@ #ifndef HALCONFIGURATION_H #define HALCONFIGURATION_H +#define ENABLE_DEBUG // comment out to disable debug + +#define TIMER_MILLISECOND 60*1000 // poling in minutes // POWER CONSUMPTION SENSOR #define POWERCON_ENABLED // comment out to disable sensor #define POWERCON_SENSOR SensorBH1750() #define POWERCON_PROTOCOL ProtocolOregon(118) -#define POWER_TIMER_MULTIPLIER 1 // poling in minutes +#define POWER_TIMER_MULTIPLIER 1 // TEMPERATURE SENSOR #define TEMPERATURE_ENABLED // comment out to disable sensor #define TEMPERATURE_SENSOR SensorDHT11(5) #define TEMPERATURE_PROTOCOL ProtocolOregon(100) -#define TEMPERATURE_TIMER_MULTIPLIER 1 // poling in minutes +#define TEMPERATURE_TIMER_MULTIPLIER 1 // LIGHT SENSOR //#define LIGHT_ENABLED // comment out to disable sensor #define LIGHT_SENSOR SensorDH1750() #define LIGHT_PROTOCOL ? -#define LIGHT_TIMER_MULTIPLIER 1 // poling in minutes +#define LIGHT_TIMER_MULTIPLIER 1 #endif // HALCONFIGURATION_H diff --git a/arduino/HalMultiSensor/HalDefinitions.h b/arduino/HalMultiSensor/HalInclude.h similarity index 100% rename from arduino/HalMultiSensor/HalDefinitions.h rename to arduino/HalMultiSensor/HalInclude.h diff --git a/arduino/HalMultiSensor/HalInterfaces.h b/arduino/HalMultiSensor/HalInterfaces.h index c8aac447..9ddf4780 100755 --- a/arduino/HalMultiSensor/HalInterfaces.h +++ b/arduino/HalMultiSensor/HalInterfaces.h @@ -1,6 +1,22 @@ #ifndef HALINTERFACES_H #define HALINTERFACES_H +#include "HalConfiguration.h" + +#ifdef ENABLE_DEBUG + #define DEBUG(msg) \ + Serial.println(msg); \ + Serial.flush(); + #define DEBUGF(msg, ...) \ + static char buffer[80];\ + snprintf(buffer, sizeof(buffer), msg, __VA_ARGS__);\ + Serial.println(buffer);\ + Serial.flush(); +#else + #define DEBUG(msg) + #define DEBUGF(msg, ...) +#endif + class Sensor { diff --git a/arduino/HalMultiSensor/HalMultiSensor.ino b/arduino/HalMultiSensor/HalMultiSensor.ino index c9a9b9b4..2c969790 100755 --- a/arduino/HalMultiSensor/HalMultiSensor.ino +++ b/arduino/HalMultiSensor/HalMultiSensor.ino @@ -2,22 +2,17 @@ A interrupt based sensor device that reads multiple sensors and transmits the data to a central location. */ -#if (ARDUINO >= 100) #include -#else -#include -#endif #include -#include "HalInterfaces.h" -#include "HalDefinitions.h" #include "HalConfiguration.h" +#include "HalInterfaces.h" +#include "HalInclude.h" #include "Interrupt.h" -Interrupt* interrupt; - -unsigned int timerMultiplierMAX; +#define TIMER_MULTIPLIER_MAX \ + POWER_TIMER_MULTIPLIER * TEMPERATURE_TIMER_MULTIPLIER * LIGHT_TIMER_MULTIPLIER unsigned int timerMultiplier = 0; // Sensors @@ -36,12 +31,13 @@ void timerInterruptFunc(); void setup() { - timerMultiplierMAX = POWER_TIMER_MULTIPLIER * TEMPERATURE_TIMER_MULTIPLIER * LIGHT_TIMER_MULTIPLIER; // Find a lowest common denominator - Interrupt::setCallback(timerInterruptFunc); - Interrupt::setupTimerInterrupt(60*1000); // one minute scheduled interrupt - + #ifdef ENABLE_DEBUG + Serial.begin(9600); + #endif + // Setup Sensors and protocols #ifdef POWERCON_ENABLED + DEBUG("Setup POWERCON_SENSOR"); powerSensor = new POWERCON_SENSOR; powerSensor->setup(); powerProtocol = new POWERCON_PROTOCOL; @@ -49,6 +45,7 @@ void setup() #endif #ifdef TEMPERATURE_ENABLED + DEBUG("Setup TEMPERATURE_SENSOR"); tempSensor = new TEMPERATURE_SENSOR; tempSensor->setup(); tempProtocol = new TEMPERATURE_PROTOCOL; @@ -56,28 +53,38 @@ void setup() #endif #ifdef LIGHT_ENABLED + DEBUG("Setup LIGHT_SENSOR"); lightSensor = new LIGHT_SENSOR; lightSensor->setup(); lightProtocol = new LIGHT_PROTOCOL; lightProtocol->setup(); #endif + + DEBUG("Setup INTERRUPT"); + Interrupt::setCallback(timerInterruptFunc); + Interrupt::setupWatchDogInterrupt(TIMER_MILLISECOND); // one minute scheduled interrupt + + DEBUG("Ready"); } void timerInterruptFunc() { ++timerMultiplier; - if (timerMultiplier > timerMultiplierMAX) + if (timerMultiplier > TIMER_MULTIPLIER_MAX) timerMultiplier = 1; } void loop() { + noInterrupts(); + // Send power consumption #ifdef POWERCON_ENABLED if(timerMultiplier == POWER_TIMER_MULTIPLIER) { unsigned int consumption = powerSensor->getConsumption(); + DEBUGF("Read POWERCON_SENSOR= consumption:%d", consumption); powerSensor->reset(); powerProtocol->setConsumption(consumption); powerProtocol->send(); @@ -90,6 +97,7 @@ void loop() { unsigned int temperature = tempSensor->getTemperature(); unsigned int humidity = tempSensor->getHumidity(); + DEBUGF("Read TEMPERATURE_SENSOR= temperature:%d, humidity:%d", temperature, humidity); tempProtocol->setTemperature(temperature); tempProtocol->setHumidity(humidity); tempProtocol->send(); @@ -97,14 +105,20 @@ void loop() #endif // Handle light sensor - #ifdef TEMPERATURE_ENABLED + #ifdef LIGHT_ENABLED if(timerMultiplier == LIGHT_TIMER_MULTIPLIER) { unsigned int lumen = lightSensor->getLuminosity(); + DEBUG("Read LIGHT_SENSOR= lumen:%d", lumen); lightProtocol->setLuminosity(lumen); lightProtocol->send(); } #endif + interrupts(); + + DEBUG("Sleeping"); + Interrupt::sleep(); + DEBUG("Wakeup"); } diff --git a/arduino/HalMultiSensor/Interrupt.cpp b/arduino/HalMultiSensor/Interrupt.cpp index 00be958a..ef75c23c 100755 --- a/arduino/HalMultiSensor/Interrupt.cpp +++ b/arduino/HalMultiSensor/Interrupt.cpp @@ -3,7 +3,7 @@ #include #include #include - +#include "HalInterfaces.h" void emptyFunc(){} InterruptFunction Interrupt::callback = emptyFunc; @@ -18,19 +18,26 @@ void __interruptHandler__() // the interrupt is handled here after wakeup noInterrupts(); // disable all interrupts (Interrupt::getCallback()) (); interrupts(); // enable all interrupts + Interrupt::wakeUp(); + } ISR(Timer1_COMPA_vect) // timer compare interrupt service routine { + //DEBUG("Timer1e Interrupt"); __interruptHandler__(); } -ISR(WDT_vect) { } +ISR(WDT_vect) +{ + //DEBUG("WDT Interrupt"); + //wdt_disable(); + __interruptHandler__(); +} void Interrupt::wakeUp() { - wakeUpNow = true; } @@ -61,15 +68,16 @@ void Interrupt::sleep() power_timer2_disable(); power_twi_disable(); */ - while( ! Interrupt::wakeUpNow) - { + //while( ! Interrupt::wakeUpNow) + //{ + wdt_reset(); sleep_mode(); // here the device is actually put to sleep!! // THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP - } + //} sleep_disable(); // first thing after waking from sleep: // disable sleep... - power_all_enable(); // during normal running time. + //power_all_enable(); // during normal running time. } void Interrupt::setupPinInterrupt(int pin) @@ -112,8 +120,7 @@ void Interrupt::setupWatchDogInterrupt(unsigned int milliseconds) * 1 1 1 Interrupt first, reset on second trigger * 0 x x Reset */ - WDTCSR = 0x00; - WDTCSR |= (1 << WDCE) | (1 << WDIE); + WDTCSR = (1 << WDCE) | (1<