29
29
*
30
30
* Battery voltage is as battery percentage (Internal message), and optionally as a sensor value (See defines below)
31
31
*
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
+ *
32
38
*/
33
39
34
40
41
47
#include < sha204_lib_return_codes.h>
42
48
#include < sha204_library.h>
43
49
#include < RunningAverage.h>
44
- #include < avr/power.h>
50
+ // #include <avr/power.h>
45
51
46
52
// Define a static node address, remove if you want auto address assignment
47
53
// #define NODE_ADDRESS 3
48
54
49
55
// Uncomment the line below, to transmit battery voltage as a normal sensor value
50
56
// #define BATT_SENSOR 199
51
57
52
- #define RELEASE " 1.2 "
58
+ #define RELEASE " 1.3 "
53
59
54
60
#define AVERAGES 2
55
61
60
66
// How many milli seconds between each measurement
61
67
#define MEASURE_INTERVAL 60000
62
68
69
+ // How many milli seconds should we wait for OTA?
70
+ #define OTA_WAIT_PERIOD 300
71
+
63
72
// FORCE_TRANSMIT_INTERVAL, this number of times of wakeup, the sensor is forced to report all values to the controller
64
73
#define FORCE_TRANSMIT_INTERVAL 30
65
74
73
82
74
83
// Pin definitions
75
84
#define TEST_PIN A0
85
+ #define OTA_ENABLE A1
76
86
#define LED_PIN A2
77
87
#define ATSHA204_PIN 17 // A3
78
88
@@ -97,6 +107,8 @@ int measureCount = 0;
97
107
int sendBattery = 0 ;
98
108
boolean isMetric = true ;
99
109
boolean highfreq = true ;
110
+ boolean ota_enabled = false ;
111
+ boolean transmission_occured = false ;
100
112
101
113
// Storage of old measurements
102
114
float lastTemperature = -100 ;
@@ -126,11 +138,19 @@ void setup() {
126
138
digitalWrite (TEST_PIN, HIGH); // Enable pullup
127
139
if (!digitalRead (TEST_PIN)) testMode ();
128
140
141
+ pinMode (OTA_ENABLE, INPUT);
142
+ digitalWrite (OTA_ENABLE, HIGH);
143
+ if (!digitalRead (OTA_ENABLE)) {
144
+ ota_enabled = true ;
145
+ }
146
+
129
147
// Make sure that ATSHA204 is not floating
130
148
pinMode (ATSHA204_PIN, INPUT);
131
149
digitalWrite (ATSHA204_PIN, HIGH);
132
150
133
151
digitalWrite (TEST_PIN,LOW);
152
+ digitalWrite (OTA_ENABLE, LOW); // remove pullup, save some power.
153
+
134
154
digitalWrite (LED_PIN, HIGH);
135
155
136
156
#ifdef NODE_ADDRESS
@@ -160,6 +180,8 @@ void setup() {
160
180
raHum.clear ();
161
181
sendTempHumidityMeasurements (false );
162
182
sendBattLevel (false );
183
+ if (ota_enabled) Serial.println (" OTA FW update enabled" );
184
+
163
185
}
164
186
165
187
@@ -169,13 +191,14 @@ void setup() {
169
191
*
170
192
***********************************************/
171
193
void loop () {
194
+
172
195
measureCount ++;
173
196
sendBattery ++;
174
197
bool forceTransmit = false ;
175
-
198
+ transmission_occured = false ;
176
199
if ((measureCount == 5 ) && highfreq)
177
200
{
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.
179
202
highfreq = false ;
180
203
}
181
204
@@ -192,7 +215,11 @@ void loop() {
192
215
sendBattLevel (forceTransmit); // Not needed to send battery info that often
193
216
sendBattery = 0 ;
194
217
}
195
-
218
+
219
+ if (ota_enabled & transmission_occured) {
220
+ gw.wait (OTA_WAIT_PERIOD);
221
+ }
222
+
196
223
gw.sleep (MEASURE_INTERVAL);
197
224
}
198
225
@@ -208,21 +235,20 @@ void loop() {
208
235
void sendTempHumidityMeasurements (bool force)
209
236
{
210
237
bool tx = force;
211
-
238
+
212
239
si7021_env data = humiditySensor.getHumidityAndTemperature ();
213
- float oldAvgHum = raHum.getAverage ();
214
240
215
241
raHum.addValue (data.humidityPercent );
216
242
217
243
float diffTemp = abs (lastTemperature - (isMetric ? data.celsiusHundredths : data.fahrenheitHundredths )/100 );
218
- float diffHum = abs (oldAvgHum - raHum.getAverage ());
244
+ float diffHum = abs (lastHumidity - raHum.getAverage ());
219
245
220
246
Serial.print (F (" TempDiff :" ));Serial.println (diffTemp);
221
247
Serial.print (F (" HumDiff :" ));Serial.println (diffHum);
222
248
223
249
if (isnan (diffHum)) tx = true ;
224
250
if (diffTemp > TEMP_TRANSMIT_THRESHOLD) tx = true ;
225
- if (diffHum >= HUMI_TRANSMIT_THRESHOLD) tx = true ;
251
+ if (diffHum > HUMI_TRANSMIT_THRESHOLD) tx = true ;
226
252
227
253
if (tx) {
228
254
measureCount = 0 ;
@@ -236,6 +262,7 @@ void sendTempHumidityMeasurements(bool force)
236
262
gw.send (msgHum.set (humidity));
237
263
lastTemperature = temperature;
238
264
lastHumidity = humidity;
265
+ transmission_occured = true ;
239
266
}
240
267
}
241
268
@@ -264,6 +291,7 @@ void sendBattLevel(bool force)
264
291
265
292
long percent = vcc / 14.0 ;
266
293
gw.sendBatteryLevel (percent);
294
+ transmission_occured = true ;
267
295
}
268
296
}
269
297
@@ -296,6 +324,7 @@ long readVcc() {
296
324
297
325
result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
298
326
return result; // Vcc in millivolts
327
+
299
328
}
300
329
301
330
/* ***************************************************
0 commit comments