@@ 1,11 1,18 @@
#include <FS.h> //this needs to be first, or it all crashes and burns...
+#include "config.h"
+#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
+#ifdef WANT_MDNS
+#include <ESP8266mDNS.h>
+#endif /* WANT_MDNS */
-#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
-#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager
+#ifdef WANT_NTP
#include <NTPClient.h>
+#endif /* WANT_NTP */
+#ifdef WANT_OTA
#include <ArduinoOTA.h>
+#endif /* WANT_OTA */
#include <Arduino.h>
#include <ArduinoJson.h>
#include <SHT1x.h>
@@ 26,10 33,25 @@
* to be reset and the device to enter access point mode.
*/
+#ifdef WANT_OTA
+#define OTA_PASSWORD "7648"
+#endif /* WANT_OTA */
+
#define DEBUG(X...) do{if(Serial)Serial.println(X);}while(0)
#define DEBUGCHAR(X...) do{if(Serial)Serial.print(X);}while(0)
-#define FIRMWARE_REVISION 1024
+
+/* by default, the value of PROJECTNAME will be used as the prefix of the devices's
+ * hostname and the configuration access point ssid.
+ */
+#define PROJECTNAME "ENVSENSOR"
+
+/* when storing data in the pseudo-eeprom of the ESP, you must specify how much space
+ * will be needed for the data stored. changing this value will likely cause existing
+ * data to be lost, so best over-estimate before going live.
+ */
+#define EEPROM_BYTES_NEEDED 50
+
#define SLOW 250
#define MEDIUM 100
@@ 49,13 71,16 @@ WiFiClient wifiClient;
SHT1x sht1x(dataPin, clockPin, SHT1x::Voltage::DC_3_3v);
IPAddress br_adr;
WiFiUDP udp;
-WiFiUDP ntpUdp;
String hubsn;
String airsn;
int reportfreq = 60;
+#ifdef WANT_NTP
+WiFiUDP ntpUdp;
+
NTPClient timeClient(ntpUdp);
+#endif /* WANT_NTP */
// 'flash' button is pin 0
#define BUTTON_PIN 0
@@ 80,7 105,19 @@ void blink(int speed, int count) {
}
digitalWrite(16, ON);
}
+WiFiManagerParameter hub_serial_number("hubsn", "HubSerialNumber", "10010", 7);
+WiFiManagerParameter air_serial_number("airsn", "AirSerialNumber", "10012", 7);
+WiFiManagerParameter report_frequency("reportfreq", "ReportFreq (seconds)", "60", 4);
+void wifi_register_custom_params(WiFiManager * myWifiManager) {
+
+ myWifiManager->addParameter(&hub_serial_number);
+
+ myWifiManager->addParameter(&air_serial_number);
+
+ myWifiManager->addParameter(&report_frequency);
+
+}
//! clear the wifi configuration and restart the device in AP mode.
void resetEverything() {
WiFi.enableSTA(true);
@@ 117,7 154,7 @@ void writeStringToEEPROM(int addrOffset,
String readStringFromEEPROM(int addrOffset)
{
- uint8_t newStrLen;
+ uint8_t newStrLen = 0;
Serial.println("reading a string from eeprom");
EEPROM.get(addrOffset, newStrLen);
@@ 129,6 166,14 @@ String readStringFromEEPROM(int addrOffs
data[newStrLen] = '\0';
return String(data);
}
+
+String wifi_get_mac_subset() {
+ uint8_t mac[6];
+ char macStr[7] = { 0 };
+ wifi_get_macaddr(STATION_IF, mac);
+ sprintf(macStr, "%02X%02X%02X", mac[3], mac[4], mac[5]);
+ return String(macStr);
+}
//***********************************************
void setup() {
@@ 145,14 190,12 @@ void setup() {
//Local intialization. Once its business is done, there is no need to keep it around
WiFiManager wifiManager;
- WiFiManagerParameter hub_serial_number("hubsn", "HubSerialNumber", "10010", 7);
- wifiManager.addParameter(&hub_serial_number);
+ // wifiManager.setDebugOutput(true);
+ String ssid = PROJECTNAME + String("-");
+ ssid += wifi_get_mac_subset();
+ wifi_register_custom_params(&wifiManager);
+ wifiManager.setHostname(ssid.c_str());
- WiFiManagerParameter air_serial_number("airsn", "AirSerialNumber", "10012", 7);
- wifiManager.addParameter(&air_serial_number);
-
- WiFiManagerParameter report_frequency("reportfreq", "ReportFreq (seconds)", "60", 4);
- wifiManager.addParameter(&report_frequency);
//exit after config instead of connecting
wifiManager.setBreakAfterConfig(true);
@@ 175,8 218,8 @@ void setup() {
}
blink(MEDIUM, 2);
-
- ArduinoOTA.onStart([]() {
+#ifdef WANT_OTA
+ ArduinoOTA.onStart([]() {
DEBUG("OTA Start");
});
ArduinoOTA.onEnd([]() {
@@ 194,19 237,22 @@ void setup() {
else if (error == OTA_END_ERROR) DEBUG("OTA: End Failed");
});
- ArduinoOTA.setPassword((const char *)"0681");
-
+ ArduinoOTA.setPassword((const char *)OTA_PASSWORD);
+#endif /* WANT_OTA */
//if you get here you have connected to the WiFi
DEBUG("connected...yay :)");
+
+#ifdef WANT_OTA
ArduinoOTA.begin();
+#endif /* WANT_OTA */
DEBUG("local ip: ");
DEBUG(WiFi.localIP());
br_adr = WiFi.localIP();
br_adr[3] = 255;
- EEPROM.begin(50);
+ EEPROM.begin(EEPROM_BYTES_NEEDED);
if (shouldSaveConfig) {
String hs ="HB-";
@@ 233,24 279,38 @@ void setup() {
udp.begin(SMARTWEATHER_PORT);
- timeClient.begin();
+#ifdef WANT_MDNS
+ MDNS.begin(ssid);
+#endif /* WANT_MDNS */
- delay(1000);
+#ifdef WANT_NTP
+ timeClient.begin();
+#endif /* WANT_NTP */
+
+ delay(100);
Serial.println("ready to read");
btn.attachLongPressStart(resetEverything);
}
void loop() {
+#ifdef WANT_NTP
timeClient.update();
+ // don't update this every loop else you'll waste cpu
+ ts = timeClient.getEpochTime();
+#endif /* WANT_NTP */
+
+#ifdef WANT_OTA
ArduinoOTA.handle();
+#endif /* WANT_OTA */
long tsm = millis();
btn.tick();
if((tsm/1000) > (lastreport + 30)) {
lastreport = millis() / 1000;
+#ifdef WANT_NTP
ts = timeClient.getEpochTime();
-
+#endif /* WANT_NTP */
blink(SLOW, 3);
if (1) {
@@ 292,7 352,9 @@ void loop() {
StaticJsonDocument<250> doc;
blink(FAST, 2);
+#ifdef WANT_NTP
ts = timeClient.getEpochTime();
+#endif /* WANT_NTP */
lastobservation = (tsm/1000);
doc["serial_number"] = airsn;