Skip to content

Commit f336f19

Browse files
committed
Merge pull request #148 from tbowmo/master
Multiple fixes for sensebender sketch
2 parents a3b7666 + 3cf4bb6 commit f336f19

File tree

1 file changed

+38
-9
lines changed

1 file changed

+38
-9
lines changed

libraries/MySensors/examples/SensebenderMicro/SensebenderMicro.ino

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@
2929
*
3030
* Battery voltage is as battery percentage (Internal message), and optionally as a sensor value (See defines below)
3131
*
32+
*
33+
* Version 1.3 - Thomas Bowman Mørch
34+
* Improved transmission logic, eliminating spurious transmissions (when temperatuere / humidity fluctuates 1 up and down between measurements)
35+
*
36+
* Added OTA boot mode, need to hold A1 low while applying power. (uses slightly more power as it's waiting for bootloader messages)
37+
*
3238
*/
3339

3440

@@ -41,15 +47,15 @@
4147
#include <sha204_lib_return_codes.h>
4248
#include <sha204_library.h>
4349
#include <RunningAverage.h>
44-
#include <avr/power.h>
50+
//#include <avr/power.h>
4551

4652
// Define a static node address, remove if you want auto address assignment
4753
//#define NODE_ADDRESS 3
4854

4955
// Uncomment the line below, to transmit battery voltage as a normal sensor value
5056
//#define BATT_SENSOR 199
5157

52-
#define RELEASE "1.2"
58+
#define RELEASE "1.3"
5359

5460
#define AVERAGES 2
5561

@@ -60,6 +66,9 @@
6066
// How many milli seconds between each measurement
6167
#define MEASURE_INTERVAL 60000
6268

69+
// How many milli seconds should we wait for OTA?
70+
#define OTA_WAIT_PERIOD 300
71+
6372
// FORCE_TRANSMIT_INTERVAL, this number of times of wakeup, the sensor is forced to report all values to the controller
6473
#define FORCE_TRANSMIT_INTERVAL 30
6574

@@ -73,6 +82,7 @@
7382

7483
// Pin definitions
7584
#define TEST_PIN A0
85+
#define OTA_ENABLE A1
7686
#define LED_PIN A2
7787
#define ATSHA204_PIN 17 // A3
7888

@@ -97,6 +107,8 @@ int measureCount = 0;
97107
int sendBattery = 0;
98108
boolean isMetric = true;
99109
boolean highfreq = true;
110+
boolean ota_enabled = false;
111+
boolean transmission_occured = false;
100112

101113
// Storage of old measurements
102114
float lastTemperature = -100;
@@ -126,11 +138,19 @@ void setup() {
126138
digitalWrite(TEST_PIN, HIGH); // Enable pullup
127139
if (!digitalRead(TEST_PIN)) testMode();
128140

141+
pinMode(OTA_ENABLE, INPUT);
142+
digitalWrite(OTA_ENABLE, HIGH);
143+
if (!digitalRead(OTA_ENABLE)) {
144+
ota_enabled = true;
145+
}
146+
129147
// Make sure that ATSHA204 is not floating
130148
pinMode(ATSHA204_PIN, INPUT);
131149
digitalWrite(ATSHA204_PIN, HIGH);
132150

133151
digitalWrite(TEST_PIN,LOW);
152+
digitalWrite(OTA_ENABLE, LOW); // remove pullup, save some power.
153+
134154
digitalWrite(LED_PIN, HIGH);
135155

136156
#ifdef NODE_ADDRESS
@@ -160,6 +180,8 @@ void setup() {
160180
raHum.clear();
161181
sendTempHumidityMeasurements(false);
162182
sendBattLevel(false);
183+
if (ota_enabled) Serial.println("OTA FW update enabled");
184+
163185
}
164186

165187

@@ -169,13 +191,14 @@ void setup() {
169191
*
170192
***********************************************/
171193
void loop() {
194+
172195
measureCount ++;
173196
sendBattery ++;
174197
bool forceTransmit = false;
175-
198+
transmission_occured = false;
176199
if ((measureCount == 5) && highfreq)
177200
{
178-
clock_prescale_set(clock_div_8); // Switch to 1Mhz for the reminder of the sketch, save power.
201+
if (!ota_enabled) clock_prescale_set(clock_div_8); // Switch to 1Mhz for the reminder of the sketch, save power.
179202
highfreq = false;
180203
}
181204

@@ -192,7 +215,11 @@ void loop() {
192215
sendBattLevel(forceTransmit); // Not needed to send battery info that often
193216
sendBattery = 0;
194217
}
195-
218+
219+
if (ota_enabled & transmission_occured) {
220+
gw.wait(OTA_WAIT_PERIOD);
221+
}
222+
196223
gw.sleep(MEASURE_INTERVAL);
197224
}
198225

@@ -208,21 +235,20 @@ void loop() {
208235
void sendTempHumidityMeasurements(bool force)
209236
{
210237
bool tx = force;
211-
238+
212239
si7021_env data = humiditySensor.getHumidityAndTemperature();
213-
float oldAvgHum = raHum.getAverage();
214240

215241
raHum.addValue(data.humidityPercent);
216242

217243
float diffTemp = abs(lastTemperature - (isMetric ? data.celsiusHundredths : data.fahrenheitHundredths)/100);
218-
float diffHum = abs(oldAvgHum - raHum.getAverage());
244+
float diffHum = abs(lastHumidity - raHum.getAverage());
219245

220246
Serial.print(F("TempDiff :"));Serial.println(diffTemp);
221247
Serial.print(F("HumDiff :"));Serial.println(diffHum);
222248

223249
if (isnan(diffHum)) tx = true;
224250
if (diffTemp > TEMP_TRANSMIT_THRESHOLD) tx = true;
225-
if (diffHum >= HUMI_TRANSMIT_THRESHOLD) tx = true;
251+
if (diffHum > HUMI_TRANSMIT_THRESHOLD) tx = true;
226252

227253
if (tx) {
228254
measureCount = 0;
@@ -236,6 +262,7 @@ void sendTempHumidityMeasurements(bool force)
236262
gw.send(msgHum.set(humidity));
237263
lastTemperature = temperature;
238264
lastHumidity = humidity;
265+
transmission_occured = true;
239266
}
240267
}
241268

@@ -264,6 +291,7 @@ void sendBattLevel(bool force)
264291

265292
long percent = vcc / 14.0;
266293
gw.sendBatteryLevel(percent);
294+
transmission_occured = true;
267295
}
268296
}
269297

@@ -296,6 +324,7 @@ long readVcc() {
296324

297325
result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
298326
return result; // Vcc in millivolts
327+
299328
}
300329

301330
/****************************************************

0 commit comments

Comments
 (0)