hal/arduino/HalMultiSensor/HalMultiSensor.ino

126 lines
3 KiB
Arduino
Raw Normal View History

/*
A interrupt based sensor device that reads multiple sensors and transmits
the data to a central location.
*/
2016-02-24 21:51:16 +01:00
#include <Arduino.h>
2016-02-24 21:51:16 +01:00
#include "HalConfiguration.h"
#include "HalInterfaces.h"
#include "HalInclude.h"
2016-02-24 21:51:16 +01:00
#include "Interrupt.h"
#define TIMER_MULTIPLIER_MAX \
POWER_TIMER_MULTIPLIER * TEMPERATURE_TIMER_MULTIPLIER * LIGHT_TIMER_MULTIPLIER
unsigned int timerMultiplier = 0;
// Sensors
SensorPowerConsumption* powerSensor;
SensorTemperature* tempSensor;
SensorLight* lightSensor;
// Protocols
2016-02-24 21:51:16 +01:00
ProtocolPowerConsumption* powerProtocol;
ProtocolTemperature* tempProtocol;
ProtocolLight* lightProtocol;
2016-02-24 21:51:16 +01:00
void timerInterruptFunc();
2016-02-24 15:31:51 +01:00
void setup()
{
#ifdef ENABLE_DEBUG
Serial.begin(9600);
#endif
2016-05-10 16:04:39 +02:00
pinMode(INDICATOR_PIN, OUTPUT);
2016-02-24 15:31:51 +01:00
// Setup Sensors and protocols
#ifdef POWERCON_ENABLED
DEBUG("Setup POWERCON_SENSOR");
powerSensor = new POWERCON_SENSOR;
2016-02-24 21:51:16 +01:00
powerSensor->setup();
powerProtocol = new POWERCON_PROTOCOL;
powerProtocol->setup();
2016-02-24 15:31:51 +01:00
#endif
#ifdef TEMPERATURE_ENABLED
DEBUG("Setup TEMPERATURE_SENSOR");
tempSensor = new TEMPERATURE_SENSOR;
2016-02-24 21:51:16 +01:00
tempSensor->setup();
tempProtocol = new TEMPERATURE_PROTOCOL;
tempProtocol->setup();
2016-02-24 15:31:51 +01:00
#endif
#ifdef LIGHT_ENABLED
DEBUG("Setup LIGHT_SENSOR");
lightSensor = new LIGHT_SENSOR;
2016-02-24 21:51:16 +01:00
lightSensor->setup();
lightProtocol = new LIGHT_PROTOCOL;
lightProtocol->setup();
2016-02-24 15:31:51 +01:00
#endif
DEBUG("Setup SLEEP_INTERRUPT");
Interrupt::setWatchDogCallback(timerInterruptFunc);
Interrupt::setupWatchDogInterrupt(TIMER_MILLISECOND); // one minute scheduled interrupt
2016-05-10 16:04:39 +02:00
pulse(INDICATOR_PIN, 3);
DEBUG("Ready");
2016-02-24 15:31:51 +01:00
}
2016-02-24 21:51:16 +01:00
void timerInterruptFunc()
2016-02-11 16:31:03 +01:00
{
++timerMultiplier;
if (timerMultiplier > TIMER_MULTIPLIER_MAX)
timerMultiplier = 1;
2016-05-02 16:39:39 +02:00
}
2016-05-02 16:39:39 +02:00
void loop()
{
2016-05-10 16:04:39 +02:00
digitalWrite(INDICATOR_PIN, HIGH);
//noInterrupts();
// Send power consumption
2016-02-24 15:31:51 +01:00
#ifdef POWERCON_ENABLED
if(timerMultiplier == POWER_TIMER_MULTIPLIER)
{
2016-05-10 16:04:39 +02:00
static PowerData powerData;
powerSensor->read(powerData); // not needed, only here for future use
DEBUGF("Read POWERCON_SENSOR= consumption:%d", powerData.consumption);
powerProtocol->send(powerData);
2016-02-24 15:31:51 +01:00
}
#endif
// Handle temperature sensor
2016-02-24 15:31:51 +01:00
#ifdef TEMPERATURE_ENABLED
if(timerMultiplier == TEMPERATURE_TIMER_MULTIPLIER)
{
2016-05-10 16:04:39 +02:00
static TemperatureData tempData;
tempSensor->read(tempData);
2016-06-10 19:33:26 +02:00
DEBUGF("Read TEMPERATURE_SENSOR= temperature:%d, humidity:%d", (int)tempData.temperature, (int)tempData.humidity);
2016-05-10 16:04:39 +02:00
tempProtocol->send(tempData);
}
#endif
// Handle light sensor
#ifdef LIGHT_ENABLED
if(timerMultiplier == LIGHT_TIMER_MULTIPLIER)
{
2016-05-10 16:04:39 +02:00
static LightData lightData;
lightSensor->read(lightData);
DEBUG("Read LIGHT_SENSOR= lumen:%d", lightData.lumen);
lightProtocol->send(lightData);
}
#endif
//interrupts();
2016-05-10 16:04:39 +02:00
digitalWrite(INDICATOR_PIN, LOW);
DEBUG("Sleeping");
Interrupt::sleep();
DEBUG("Wakeup");
}