Initial Commit.
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
|
||||
#include <nodemanager_config.h>
|
||||
#include <MySensors.h>
|
||||
#include <NodeManager.h>
|
||||
|
||||
|
||||
#define SENSOR_CHECK_INTERVAL 2000
|
||||
#define MSG_SEND_CYCLES 0
|
||||
|
||||
#define PIN_DHT 4
|
||||
#define PIN_LDR A0
|
||||
#define PIN_BAT A1
|
||||
#define PIN_MOSFET 8
|
||||
|
||||
#define SENSOR_ID_DHT_TEMP 0
|
||||
#define SENSOR_ID_DHT_HUM 1
|
||||
#define SENSOR_ID_LDR 2
|
||||
#define SENSOR_ID_VCC 210
|
||||
|
||||
|
||||
// For convenience
|
||||
typedef SensorDHT<DHT22, PIN_DHT, SENSOR_ID_DHT_TEMP, SENSOR_ID_DHT_HUM, SENSOR_CHECK_INTERVAL, MSG_SEND_CYCLES> MySensorDHT;
|
||||
|
||||
|
||||
// create a NodeManager instance
|
||||
typedef NodeManager<
|
||||
Tuple<
|
||||
MySensorDHT,
|
||||
SensorLDR<PIN_LDR, SENSOR_ID_LDR, SENSOR_CHECK_INTERVAL, MSG_SEND_CYCLES>,
|
||||
SensorVcc<SENSOR_ID_VCC, SENSOR_CHECK_INTERVAL, MSG_SEND_CYCLES>
|
||||
>
|
||||
> MyNodeManagerBase;
|
||||
|
||||
class MyNodeManager : public MyNodeManagerBase {
|
||||
protected:
|
||||
virtual void _power_on_before() override {
|
||||
if (pin_backup_valid) {
|
||||
// Restore pin state
|
||||
DDRB = ddrb_backup;
|
||||
PORTB = portb_backup;
|
||||
DDRC = ddrc_backup;
|
||||
PORTC = portc_backup;
|
||||
DDRD = ddrd_backup;
|
||||
PORTD = portd_backup;
|
||||
}
|
||||
}
|
||||
virtual void _power_on_after() override {
|
||||
// Enable NRF24
|
||||
power_spi_enable();
|
||||
transportInit();
|
||||
}
|
||||
virtual void _power_off_after() override {
|
||||
power_spi_disable();
|
||||
// Set all pins as INPUTS and disable pull-ups to avoid current leakage
|
||||
ddrb_backup = DDRB;
|
||||
portb_backup = PORTB;
|
||||
DDRB = 0x00;
|
||||
PORTB = 0x00;
|
||||
ddrc_backup = DDRC;
|
||||
portc_backup = PORTC;
|
||||
DDRC = 0x00;
|
||||
PORTC = 0x00;
|
||||
ddrd_backup = DDRD;
|
||||
portd_backup = PORTD;
|
||||
DDRD = 0x00;
|
||||
PORTD = 0x00;
|
||||
pin_backup_valid = true;
|
||||
}
|
||||
virtual void _sleep_before() override {
|
||||
powerOff();
|
||||
}
|
||||
virtual void _sleep_after() override {
|
||||
powerOn();
|
||||
wdt_enable(WDTO_2S);
|
||||
WDTCSR &= ~_BV(WDIE); /* Disable the WD interrupt. */
|
||||
}
|
||||
|
||||
uint8_t ddrb_backup, ddrc_backup, ddrd_backup;
|
||||
uint8_t portb_backup, portc_backup, portd_backup;
|
||||
bool pin_backup_valid = false;
|
||||
} nodeManager;
|
||||
|
||||
|
||||
void before() {
|
||||
nodeManager.setSleep(POWER_DOWN_WDT, 5, MINUTES);
|
||||
nodeManager.setPowerPins(PIN_MOSFET, -1, 0);
|
||||
nodeManager.setAutoPowerPins(false);
|
||||
nodeManager.setBatteryInternalVcc(false);
|
||||
nodeManager.setBatteryPin(PIN_BAT);
|
||||
nodeManager.setBatteryVoltsPerBit(5.0 / 1023.0);
|
||||
nodeManager.setBatteryReportCycles(0);
|
||||
nodeManager.setBatteryMax(4.1);
|
||||
nodeManager.setBatteryMin(3.4);
|
||||
nodeManager.before();
|
||||
}
|
||||
|
||||
|
||||
void presentation() {
|
||||
nodeManager.presentation();
|
||||
}
|
||||
|
||||
|
||||
void receive(const MyMessage &message) {
|
||||
nodeManager.receive(message);
|
||||
}
|
||||
|
||||
|
||||
void receiveTime(unsigned long ts) {
|
||||
nodeManager.receiveTime(ts);
|
||||
}
|
||||
|
||||
|
||||
void setup() {
|
||||
ACSR &= (1<<7); // Disable the AC
|
||||
DIDR0 = 0xFF; // We don't use need digital input from the analog pins, so disable the digital input buffer
|
||||
//DIDR1 = 0x3; // The same for the AC pins?
|
||||
nodeManager.setup();
|
||||
}
|
||||
|
||||
|
||||
void loop() {
|
||||
nodeManager.loop();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user