commit
b6be3bdefc
|
|
@ -1,4 +1,7 @@
|
|||
|
||||
/*
|
||||
* Configuration file for EmonTH_V2.ino V3.2.6
|
||||
*
|
||||
*/
|
||||
|
||||
#include <EEPROM.h>
|
||||
|
||||
|
|
@ -46,15 +49,18 @@ static void config (char c) {
|
|||
nodeID = value;
|
||||
break;
|
||||
|
||||
|
||||
case 'b': // set band: 4 = 433, 8 = 868, 9 = 915
|
||||
value = bandToFreq(value);
|
||||
if (value)
|
||||
if (value){
|
||||
RF_freq = value;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'g': // set network group
|
||||
if (value>=0)
|
||||
if (value>=0){
|
||||
networkGroup = value;
|
||||
}
|
||||
break;
|
||||
|
||||
case 's': // Save to EEPROM. Atemga328p has 1kb EEPROM
|
||||
|
|
|
|||
|
|
@ -30,13 +30,15 @@
|
|||
31 - Special allocation in JeeLib RFM12 driver - Node31 can communicate with nodes on any network group
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
Change log:
|
||||
V3.2.5 - (20/09/21) Option for multiple external temperature sensors
|
||||
V3.2.6 - [30/9/21 - RW] Multiple external DS18B20 sensors accepted. No change to config file.
|
||||
V3.2.5 - [30/1/21 - RW] Factory test transmission moved to Grp 1 to avoid interference with recorded data at power-up.
|
||||
Missing declaration of showString( ) added.
|
||||
V3.2.4 - (25/05/18) Add prompt for serial config
|
||||
V3.2.3 - (17/07/17) Fix DIP switch had no effect
|
||||
V3.2.2 - (12/05/17) Fix DIP switch nodeID not being read when EEPROM is configures
|
||||
V3.2.1 - (30/11/16) Fix emonTx port typo
|
||||
V3.2.0 - (13/11/16) Run-time serial nodeID config
|
||||
V3.1.0 - (19/10/16) Test for RFM69CW and SI7021 at startup, allow serial use without RF prescent
|
||||
V3.1.0 - (19/10/16) Test for RFM69CW and SI7021 at startup, allow serial use without RF present
|
||||
V3.0.0 - (xx/10/16) Add support for SI7021 sensor instead of DHT22 (emonTH V2.0 hardware)
|
||||
^^^ emonTH V2.0 hardware ^^^
|
||||
V2.7 - (15/09/16) Serial print serial pairs for emonesp compatiable e.g. temp:210,humidity:56
|
||||
|
|
@ -48,9 +50,12 @@
|
|||
v2.2 - 60s RF transmit period now uses timer1, pulse events are decoupled from RF transmit
|
||||
v2.4 - 5 min default transmisson time = 300 ms
|
||||
v2.1 - Branched from emonTH_DHT22_DS18B20 example, first version of pulse counting version
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
emonhub.conf node decoder:
|
||||
See: https://github.com/openenergymonitor/emonhub/blob/emon-pi/configuration.md
|
||||
NOTE: If the number of external temperature sensors is changed from 1, the 4 lines below: 'names = ...',
|
||||
'datacodes = ...', 'scales = ...' & 'units = ...' must be changed to suit.
|
||||
The maximum recommended is 4.
|
||||
|
||||
[[23]]
|
||||
nodename = emonTH_5
|
||||
|
|
@ -63,12 +68,12 @@
|
|||
units = C,C,%,V,p
|
||||
*/
|
||||
// -------------------------------------------------------------------------------------------------------------
|
||||
#define EXTERNAL_TEMP_SENSORS 1 // Specify number of external temperature sensors that are connected
|
||||
#define NUM_EXTERNAL_TEMP_SENSORS 1 // Specify number of external temperature sensors that are connected.
|
||||
|
||||
boolean debug=1; // Set to 1 to few debug serial output
|
||||
boolean flash_led=0; // Flash LED after each sample (battery drain) default=0
|
||||
|
||||
const unsigned int version = 325; // firmware version
|
||||
const unsigned int version = 326 ; // firmware version
|
||||
// These variables control the transmit timing of the emonTH
|
||||
const unsigned long WDT_PERIOD = 80; // mseconds.
|
||||
const unsigned long WDT_MAX_NUMBER = 690; // Data sent after WDT_MAX_NUMBER periods of WDT_PERIOD ms without pulses:
|
||||
|
|
@ -78,6 +83,7 @@ const unsigned long PULSE_MAX_DURATION = 50;
|
|||
|
||||
|
||||
#define RF69_COMPAT 1 // Set to 1 if using RFM69CW or 0 is using RFM12B
|
||||
#define FACTORYTESTGROUP 1 // R.F. Group for factory test only
|
||||
#include <JeeLib.h> // https://github.com/jcw/jeelib
|
||||
#include <RF69_avr.h>
|
||||
#define REG_SYNCVALUE1 0x2F
|
||||
|
|
@ -125,7 +131,7 @@ boolean DS18B20; // create
|
|||
// https://github.com/openenergymonitor/emonhub/blob/emon-pi/configuration.md
|
||||
typedef struct { // RFM RF payload datastructure
|
||||
int temp;
|
||||
int temp_external[EXTERNAL_TEMP_SENSORS];
|
||||
int temp_external[NUM_EXTERNAL_TEMP_SENSORS];
|
||||
int humidity;
|
||||
int battery;
|
||||
unsigned long pulsecount;
|
||||
|
|
@ -133,8 +139,8 @@ typedef struct { // RFM RF
|
|||
Payload emonth;
|
||||
|
||||
int numSensors;
|
||||
//addresses of sensors, MAX 4!!
|
||||
byte allAddress [4][8]; // 8 bytes per address
|
||||
//addresses of sensors
|
||||
byte allAddress [NUM_EXTERNAL_TEMP_SENSORS][8]; // 8 bytes per address
|
||||
|
||||
volatile unsigned long pulseCount;
|
||||
unsigned long WDT_number;
|
||||
|
|
@ -152,11 +158,15 @@ const char helpText1[] PROGMEM = // Available Se
|
|||
" s - save config to EEPROM\n"
|
||||
" v - Show firmware version\n"
|
||||
;
|
||||
|
||||
static void showString(PGM_P s);
|
||||
|
||||
//################################################################################################################################
|
||||
//################################################################################################################################
|
||||
#ifndef UNIT_TEST // IMPORTANT LINE! // http://docs.platformio.org/en/stable/plus/unit-testing.html
|
||||
|
||||
void setup() {
|
||||
void setup()
|
||||
{
|
||||
//################################################################################################################################
|
||||
|
||||
pinMode(LED,OUTPUT); digitalWrite(LED,HIGH); // Status LED on
|
||||
|
|
@ -164,8 +174,8 @@ void setup() {
|
|||
// Unused pins configure as input pull up for low power
|
||||
// http://electronics.stackexchange.com/questions/43460/how-should-unused-i-o-pins-be-configured-on-atmega328p-for-lowest-power-consumpt
|
||||
// port map: https://github.com/openenergymonitor/emonth2/blob/master/hardware/readme.md
|
||||
pinMode(DHT22_PWR, INPUT_PULLUP); //DHT22 not used on emonTH V2.
|
||||
pinMode(DHT22_DATA, INPUT_PULLUP); //DHT22 not used on emonTH V2
|
||||
pinMode(DHT22_PWR, INPUT_PULLUP); // DHT22 not used on emonTH V2.
|
||||
pinMode(DHT22_DATA, INPUT_PULLUP); // DHT22 not used on emonTH V2
|
||||
pinMode(14, INPUT_PULLUP);
|
||||
pinMode(20, INPUT_PULLUP);
|
||||
pinMode(21, INPUT_PULLUP);
|
||||
|
|
@ -201,7 +211,8 @@ void setup() {
|
|||
// }
|
||||
RF_STATUS=1;
|
||||
|
||||
if (RF_STATUS==1){
|
||||
if (RF_STATUS==1)
|
||||
{
|
||||
load_config(); // Load RF config from EEPROM (if any exist)
|
||||
|
||||
// Add effect of DIP switch positions to nodeID
|
||||
|
|
@ -211,19 +222,7 @@ void setup() {
|
|||
if ((DIP1 == LOW) && (DIP2 == LOW)) nodeID=nodeID+3;
|
||||
|
||||
if (debug) Serial.println("Int RFM...");
|
||||
rf12_initialize(nodeID, RF_freq, networkGroup); // Initialize RFM
|
||||
|
||||
if (debug){
|
||||
Serial.println("RFM Started");
|
||||
Serial.print("Node: ");
|
||||
Serial.print(nodeID);
|
||||
Serial.print(" Freq: ");
|
||||
if (RF_freq == RF12_433MHZ) Serial.print("433Mhz");
|
||||
if (RF_freq == RF12_868MHZ) Serial.print("868Mhz");
|
||||
if (RF_freq == RF12_915MHZ) Serial.print("915Mhz");
|
||||
Serial.print(" Network: ");
|
||||
Serial.println(networkGroup);
|
||||
}
|
||||
rf12_initialize(nodeID, RF_freq, FACTORYTESTGROUP); // Initialize RFM with Factory Test
|
||||
// Send RFM69CW test sequence (for factory testing)
|
||||
for (int i=10; i>-1; i--)
|
||||
{
|
||||
|
|
@ -234,6 +233,20 @@ void setup() {
|
|||
rf12_sendWait(2);
|
||||
emonth.temp=0;
|
||||
// end of factory test sequence
|
||||
|
||||
if (debug)
|
||||
{
|
||||
Serial.println("RFM Started");
|
||||
Serial.print("Node: ");
|
||||
Serial.print(nodeID);
|
||||
Serial.print(" Freq: ");
|
||||
if (RF_freq == RF12_433MHZ) Serial.print("433MHz");
|
||||
if (RF_freq == RF12_868MHZ) Serial.print("868MHz");
|
||||
if (RF_freq == RF12_915MHZ) Serial.print("915MHz");
|
||||
Serial.print(" Network: ");
|
||||
Serial.println(networkGroup);
|
||||
}
|
||||
rf12_initialize(nodeID, RF_freq, networkGroup); // Re-Initialize RFM with 'normal' Group
|
||||
rf12_sleep(RF12_SLEEP);
|
||||
}
|
||||
|
||||
|
|
@ -251,7 +264,8 @@ void setup() {
|
|||
{
|
||||
SI7021_sensor.begin();
|
||||
int deviceid = SI7021_sensor.getDeviceId();
|
||||
if (deviceid!=0) {
|
||||
if (deviceid!=0)
|
||||
{
|
||||
SI7021_status=1;
|
||||
if (debug){
|
||||
si7021_env data = SI7021_sensor.getHumidityAndTemperature();
|
||||
|
|
@ -261,12 +275,14 @@ void setup() {
|
|||
Serial.print("SI7021 h: "); Serial.println(data.humidityBasisPoints/100.0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
SI7021_status=0;
|
||||
if (debug) Serial.println("SI7021 Error");
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
SI7021_status=0;
|
||||
if (debug) Serial.println("SI7021 Error");
|
||||
}
|
||||
|
|
@ -290,7 +306,8 @@ void setup() {
|
|||
else
|
||||
{
|
||||
DS18B20=1;
|
||||
if (debug==1) {
|
||||
if (debug==1)
|
||||
{
|
||||
Serial.print(numSensors); Serial.println(" DS18B20");
|
||||
}
|
||||
}
|
||||
|
|
@ -309,22 +326,28 @@ void setup() {
|
|||
//################################################################################################################################
|
||||
// RF Config mode
|
||||
//################################################################################################################################
|
||||
if (RF_STATUS==1){
|
||||
if (RF_STATUS==1)
|
||||
{
|
||||
Serial.println("");
|
||||
Serial.println("'+++' then [Enter] for RF config mode");
|
||||
Serial.println("(Arduino IDE Serial Monitor: make sure 'Both NL & CR' is selected)");
|
||||
Serial.println("waiting 5s...");
|
||||
start = millis();
|
||||
while (millis() < (start + 5000)){
|
||||
while (millis() < (start + 5000))
|
||||
{
|
||||
// If serial input of keyword string '+++' is entered during 5s power-up then enter config mode
|
||||
if (Serial.available()){
|
||||
if ( Serial.readString() == "+++\r\n"){
|
||||
if (Serial.available())
|
||||
{
|
||||
if ( Serial.readString() == "+++\r\n")
|
||||
{
|
||||
Serial.println("Entering config mode...");
|
||||
showString(helpText1);
|
||||
// char c[]="v"
|
||||
config(char('v'));
|
||||
while(1){
|
||||
if (Serial.available()){
|
||||
while(1)
|
||||
{
|
||||
if (Serial.available())
|
||||
{
|
||||
config(Serial.read());
|
||||
}
|
||||
}
|
||||
|
|
@ -344,7 +367,8 @@ void setup() {
|
|||
// power_timer0_disable(); //don't disable necessary for the DS18B20 library
|
||||
|
||||
// Only turn off LED if both sensor and RF69CW are working
|
||||
if ((RF_STATUS) && (SI7021_status)){
|
||||
if ((RF_STATUS) && (SI7021_status))
|
||||
{
|
||||
digitalWrite(LED,LOW); // turn off LED to indciate end setup
|
||||
}
|
||||
} // end of setup
|
||||
|
|
@ -356,7 +380,8 @@ void loop()
|
|||
//################################################################################################################################
|
||||
{
|
||||
|
||||
if (p) {
|
||||
if (p)
|
||||
{
|
||||
Sleepy::loseSomeTime(PULSE_MAX_DURATION);
|
||||
p=0;
|
||||
}
|
||||
|
|
@ -380,9 +405,11 @@ void loop()
|
|||
sensors.requestTemperatures(); // Send the command to get temperatures
|
||||
dodelay(ASYNC_DELAY); //Must wait for conversion, since we use ASYNC mode
|
||||
|
||||
for(int j=0;j<EXTERNAL_TEMP_SENSORS;j++) {
|
||||
for(int j=0; j<NUM_EXTERNAL_TEMP_SENSORS;j++)
|
||||
{
|
||||
float temp=(sensors.getTempC(allAddress[j]));
|
||||
if ((temp<125.0) && (temp>-40.0)) {
|
||||
if ((temp<125.0) && (temp>-40.0))
|
||||
{
|
||||
emonth.temp_external[j]=(temp*10);
|
||||
}
|
||||
}
|
||||
|
|
@ -403,7 +430,8 @@ void loop()
|
|||
|
||||
// Read SI7021
|
||||
// Read from SI7021 SPI temp & humidity sensor
|
||||
if (SI7021_status==1){
|
||||
if (SI7021_status==1)
|
||||
{
|
||||
power_twi_enable();
|
||||
si7021_env data = SI7021_sensor.getHumidityAndTemperature();
|
||||
emonth.temp = (data.celsiusHundredths*0.1);
|
||||
|
|
@ -413,7 +441,8 @@ void loop()
|
|||
|
||||
|
||||
// Send data via RF
|
||||
if (RF_STATUS){
|
||||
if (RF_STATUS)
|
||||
{
|
||||
power_spi_enable();
|
||||
rf12_sleep(RF12_WAKEUP);
|
||||
dodelay(30); // wait for module to wakup
|
||||
|
|
@ -426,7 +455,8 @@ void loop()
|
|||
power_spi_disable();
|
||||
}
|
||||
|
||||
if (flash_led){
|
||||
if (flash_led)
|
||||
{
|
||||
digitalWrite(LED,HIGH);
|
||||
dodelay(100);
|
||||
digitalWrite(LED,LOW);
|
||||
|
|
@ -439,17 +469,21 @@ void loop()
|
|||
{
|
||||
Serial.print("temp:");Serial.print(emonth.temp); Serial.print(",");
|
||||
|
||||
if (DS18B20){
|
||||
for(int j=0;j<EXTERNAL_TEMP_SENSORS;j++) {
|
||||
if (DS18B20)
|
||||
{
|
||||
for(int j=0;j<NUM_EXTERNAL_TEMP_SENSORS;j++)
|
||||
{
|
||||
Serial.print("tempex");Serial.print(j);Serial.print(":");Serial.print(emonth.temp_external[j]); Serial.print(",");
|
||||
}
|
||||
}
|
||||
|
||||
if (SI7021_status){
|
||||
if (SI7021_status)
|
||||
{
|
||||
Serial.print("humidity:");Serial.print(emonth.humidity); Serial.print(",");
|
||||
}
|
||||
Serial.print("batt:"); Serial.print(emonth.battery);
|
||||
if (emonth.pulsecount > 0) {
|
||||
if (emonth.pulsecount > 0)
|
||||
{
|
||||
Serial.print(",");
|
||||
Serial.print("pulse:"); Serial.print(emonth.pulsecount);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue