Skip to content

Commit f7204cf

Browse files
committed
Enable OTA wait period after each transmission, if A1 is held low during bootup
1 parent 15e6952 commit f7204cf

File tree

1 file changed

+31
-6
lines changed

1 file changed

+31
-6
lines changed

libraries/MySensors/examples/SensebenderMicro/SensebenderMicro.ino

Lines changed: 31 additions & 6 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

@@ -49,7 +55,7 @@
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 1000
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,17 @@ 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)) ota_enabled = true;
144+
129145
// Make sure that ATSHA204 is not floating
130146
pinMode(ATSHA204_PIN, INPUT);
131147
digitalWrite(ATSHA204_PIN, HIGH);
132148

133149
digitalWrite(TEST_PIN,LOW);
150+
digitalWrite(OTA_ENABLE, LOW); // remove pullup, save some power.
151+
134152
digitalWrite(LED_PIN, HIGH);
135153

136154
#ifdef NODE_ADDRESS
@@ -169,13 +187,14 @@ void setup() {
169187
*
170188
***********************************************/
171189
void loop() {
190+
172191
measureCount ++;
173192
sendBattery ++;
174193
bool forceTransmit = false;
175-
194+
transmission_occured = false;
176195
if ((measureCount == 5) && highfreq)
177196
{
178-
// clock_prescale_set(clock_div_8); // Switch to 1Mhz for the reminder of the sketch, save power.
197+
clock_prescale_set(clock_div_8); // Switch to 1Mhz for the reminder of the sketch, save power.
179198
highfreq = false;
180199
}
181200

@@ -192,7 +211,11 @@ void loop() {
192211
sendBattLevel(forceTransmit); // Not needed to send battery info that often
193212
sendBattery = 0;
194213
}
195-
214+
215+
if (ota_enabled & transmission_occured) {
216+
gw.wait(OTA_WAIT_PERIOD);
217+
}
218+
196219
gw.sleep(MEASURE_INTERVAL);
197220
}
198221

@@ -235,6 +258,7 @@ void sendTempHumidityMeasurements(bool force)
235258
gw.send(msgHum.set(humidity));
236259
lastTemperature = temperature;
237260
lastHumidity = humidity;
261+
transmission_occured = true;
238262
}
239263
}
240264

@@ -263,6 +287,7 @@ void sendBattLevel(bool force)
263287

264288
long percent = vcc / 14.0;
265289
gw.sendBatteryLevel(percent);
290+
transmission_occured = true;
266291
}
267292
}
268293

@@ -271,7 +296,7 @@ void sendBattLevel(bool force)
271296
* Internal battery ADC measuring
272297
*
273298
*******************************************/
274-
long readVcc() {/*
299+
long readVcc() {
275300
// Read 1.1V reference against AVcc
276301
// set the reference to Vcc and the measurement to the internal 1.1V reference
277302
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
@@ -295,7 +320,7 @@ long readVcc() {/*
295320

296321
result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
297322
return result; // Vcc in millivolts
298-
*/
323+
299324
}
300325

301326
/****************************************************

0 commit comments

Comments
 (0)