From 31f0b47a92dbf10b7b6c8f47df9a09b8347a9c32 Mon Sep 17 00:00:00 2001 From: James Wood Date: Thu, 3 Dec 2020 16:40:08 +1100 Subject: [PATCH] Remove WiFiManager because that is Not Simple --- .gitignore | 3 +- .vscode/extensions.json | 0 .vscode/settings.json | 0 platformio.ini | 16 ++-- readme.md | 10 +- src/SimpleWeather.cpp | 201 +++++++++++++++------------------------- 6 files changed, 87 insertions(+), 143 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .vscode/extensions.json mode change 100644 => 100755 .vscode/settings.json mode change 100644 => 100755 platformio.ini mode change 100644 => 100755 readme.md diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index 46fe6f7..e902d26 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ .vscode/c_cpp_properties.json .vscode/launch.json .vscode/ipch -secrets.h \ No newline at end of file +secrets.h +.DS_Store diff --git a/.vscode/extensions.json b/.vscode/extensions.json old mode 100644 new mode 100755 diff --git a/.vscode/settings.json b/.vscode/settings.json old mode 100644 new mode 100755 diff --git a/platformio.ini b/platformio.ini old mode 100644 new mode 100755 index 08a38ff..aee3515 --- a/platformio.ini +++ b/platformio.ini @@ -13,12 +13,12 @@ platform = espressif8266 board = esp01 framework = arduino monitor_speed = 115200 -; monitor_port = /dev/cu.usbserial-22430 -; upload_port = /dev/cu.usbserial-22430 ;/dev/cu.usbserial-142320 ; +upload_speed = 460800 +monitor_port = /dev/cu.usbserial-142310 +upload_port = /dev/cu.usbserial-142310 ;/dev/cu.usbserial-142320 ; + lib_deps = - PubSubClient - DHT sensor library - WifiManager - ESP8266WebServer - DNSServer - ArduinoJson@5.9.0 \ No newline at end of file + knolleary/PubSubClient @ ^2.8 + adafruit/Adafruit Unified Sensor @ ^1.1.4 + adafruit/DHT sensor library @ ^1.4.0 + milesburton/DallasTemperature @ ^3.9.1 \ No newline at end of file diff --git a/readme.md b/readme.md old mode 100644 new mode 100755 index 5ed4f72..7892eac --- a/readme.md +++ b/readme.md @@ -6,12 +6,4 @@ I use an ESP-01 to keep things cheap. The goal is to have one of these things pe Keep the ESP separated from the DHT — or else the heat from the wifi module affects the temperature and humidity readings. ### Setup -Flash your device and it will create a wifi network called SimpleWeather. Connect to this and wait for the captive portal, or visit 192.168.4.1 to set up. Fields are: -1. Wifi network to join -2. Wifi password -3. MQTT server address -4. MQTT server port -5. Temperature topic -6. Humidity topic - -If your ESP device needs clearing out (old wifi credentials, etc) then set `resetWifiSettings` to true. Flash and let the device restart, then set it back to false and reflash again. Re-run setup. \ No newline at end of file +Edit your wifi/mqtt settings and flash your device. \ No newline at end of file diff --git a/src/SimpleWeather.cpp b/src/SimpleWeather.cpp index cebaa5e..54b28f4 100755 --- a/src/SimpleWeather.cpp +++ b/src/SimpleWeather.cpp @@ -1,30 +1,35 @@ -#include //this needs to be first, or it all crashes and burns... -#include //https://github.com/esp8266/Arduino -#include -#include -#include //https://github.com/tzapu/WiFiManager -#include //https://github.com/bblanchon/ArduinoJson +#include #include -#include -#define DHTPIN 2 -#define DHTTYPE DHT11 +// #define DHTMODE +#define ONEWIREMODE -const bool resetWifiSettings = false; // set true to clear out old settings and start fresh! -bool shouldSaveConfig = false; -const bool debug = false; +#ifdef DHTMODE + #include + DHT dht(2, DHT11); +#endif + +#ifdef ONEWIREMODE + #include + OneWire oneWire(2); + DallasTemperature sensors(&oneWire); + DeviceAddress insideThermometer; +#endif -DHT dht(DHTPIN, DHTTYPE); WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); -char hostName[40] = "SimpleWeather"; -char mqtt_server[40]; -char mqtt_port[6]; -char humidityTopic[40]; -char temperatureTopic[40]; +const bool debug = false; +const char* ssid = "*******"; +const char* password = "*******"; +const char* hostName = "bedroomTemp"; +const char* mqtt_server = "192.168.1.2"; +const uint16_t mqtt_port = 1883; +const char* statusTopic = "device/bedroomTemp/status"; +const char* humidityTopic = "sensors/bedroom/humidity"; +const char* temperatureTopic = "sensors/bedroom/temperature"; -const long measurementInterval = 5000; +const long measurementInterval = 30000; unsigned long lastMeasureAttempt = 0; void yield(unsigned long yieldDuration) { //overload yield function to allow for any ms delay @@ -32,11 +37,6 @@ void yield(unsigned long yieldDuration) { //overload yield function to allow for while ( (millis() - yieldBegan) < yieldDuration ) yield(); } -void saveConfigCallback () { - if(debug) Serial.println("Should save config"); - shouldSaveConfig = true; -} - void reportResults(float temp, float humid) { if (!isnan(temp) || !isnan(humid)) { if(debug) { @@ -45,16 +45,29 @@ void reportResults(float temp, float humid) { Serial.println("Temperature (°C): " + String(temp)); Serial.println("-----------------------"); } - mqttClient.publish(humidityTopic, String(humid).c_str(), true); - mqttClient.publish(temperatureTopic, String(temp).c_str(), true); + mqttClient.publish(humidityTopic, String(humid).c_str(), false); + mqttClient.publish(temperatureTopic, String(temp).c_str(), false); + } +} + +void reportResults(float temp) { + if (!isnan(temp)) { + if(debug) { + Serial.println("-----------------------"); + Serial.println("Temperature (°C): " + String(temp)); + Serial.println("-----------------------"); + } + mqttClient.publish(temperatureTopic, String(temp).c_str(), false); } } void reconnectMqtt() { while (!mqttClient.connected()) { if(debug) Serial.print("Attempting MQTT connection..."); - if (mqttClient.connect(hostName)) { + // boolean connect (clientID, [username, password], [willTopic, willQoS, willRetain, willMessage], [cleanSession]) + if (mqttClient.connect(hostName, NULL, NULL, statusTopic, 1, true, "offline")) { if(debug) Serial.println("connected"); + mqttClient.publish(statusTopic, "online", true); } else { if(debug) { Serial.print(" failed. MQTT connection error: "); @@ -66,112 +79,50 @@ void reconnectMqtt() { } } +void setup_wifi() { + delay(10); + if(debug){ + Serial.println(); + Serial.print("Connecting to "); + Serial.println(ssid); + } + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, password); + if(debug){ + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.print("\nWiFi connected!\nIP address: "); + Serial.println(WiFi.localIP()); + } +} + void setup() { if(debug) Serial.begin(115200); - if(resetWifiSettings) LittleFS.format(); - if(debug) Serial.println("mounting FS..."); - - if (LittleFS.begin()) { - if(debug) Serial.println("mounted file system"); - if (LittleFS.exists("/config.json")) { - //file exists, reading and loading - if(debug) Serial.println("reading config file"); - File configFile = LittleFS.open("/config.json", "r"); - if (configFile) { - if(debug) Serial.println("opened config file"); - size_t size = configFile.size(); - // Allocate a buffer to store contents of the file. - std::unique_ptr buf(new char[size]); - configFile.readBytes(buf.get(), size); - DynamicJsonBuffer jsonBuffer; - JsonObject& json = jsonBuffer.parseObject(buf.get()); - if(debug) json.printTo(Serial); - if (json.success()) { - if(debug) Serial.println("\nparsed json"); - strcpy(mqtt_server, json["mqtt_server"]); - strcpy(mqtt_port, json["mqtt_port"]); - strcpy(hostName, json["hostName"]); - strcpy(humidityTopic, json["humidityTopic"]); - strcpy(temperatureTopic, json["temperatureTopic"]); - } else { - if(debug) Serial.println("failed to load json config"); - } - configFile.close(); - } - } - } else { - if(debug) Serial.println("failed to mount FS"); - } - //end read - - WiFiManagerParameter custom_mqtt_port("port", "mqtt port", mqtt_port, 6); - WiFiManagerParameter custom_mqtt_server("server", "mqtt server", mqtt_server, 40); - WiFiManagerParameter custom_mqtt_hostname("hostname", "host name", hostName, 40); - WiFiManagerParameter custom_mqtt_humidityTopic("humidityTopic", "humidity topic", humidityTopic, 40); - WiFiManagerParameter custom_mqtt_temperatureTopic("temperatureTopic", "temperature topic", temperatureTopic, 40); - - WiFiManager wifiManager; - - //set config save notify callback - wifiManager.setSaveConfigCallback(saveConfigCallback); - - //add all your parameters here - wifiManager.addParameter(&custom_mqtt_server); - wifiManager.addParameter(&custom_mqtt_port); - wifiManager.addParameter(&custom_mqtt_hostname); - wifiManager.addParameter(&custom_mqtt_humidityTopic); - wifiManager.addParameter(&custom_mqtt_temperatureTopic); - - if (resetWifiSettings) wifiManager.resetSettings(); - if (!wifiManager.autoConnect("SimpleWeather", "password")) { - if(debug) Serial.println("failed to connect and hit timeout"); - delay(3000); - ESP.reset(); - delay(5000); - } - - //if you get here you have connected to the WiFi - if(debug) Serial.println("connected!"); - - //read updated parameters - strcpy(mqtt_port, custom_mqtt_port.getValue()); - strcpy(mqtt_server, custom_mqtt_server.getValue()); - strcpy(hostName, custom_mqtt_hostname.getValue()); - strcpy(humidityTopic, custom_mqtt_humidityTopic.getValue()); - strcpy(temperatureTopic, custom_mqtt_temperatureTopic.getValue()); - - //save the custom parameters to FS - if (shouldSaveConfig) { - if(debug) Serial.println("saving config"); - DynamicJsonBuffer jsonBuffer; - JsonObject& json = jsonBuffer.createObject(); - json["mqtt_server"] = mqtt_server; - json["mqtt_port"] = mqtt_port; - json["hostName"] = hostName; - json["humidityTopic"] = humidityTopic; - json["temperatureTopic"] = temperatureTopic; - - File configFile = LittleFS.open("/config.json", "w"); - if (!configFile) Serial.println("failed to open config file for writing"); - - if(debug) json.printTo(Serial); - json.printTo(configFile); - configFile.close(); - //end save - } - - if(debug) Serial.println("local ip"); - if(debug) Serial.println(WiFi.localIP()); - uint16_t mqtt_port_int = (uint16_t)strtol(mqtt_port, NULL, 10); - mqttClient.setServer(mqtt_server, mqtt_port_int); - dht.begin(); + #ifdef ONEWIREMODE + sensors.begin(); + if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); + sensors.setResolution(insideThermometer, 12); + #endif + #ifdef DHTMODE + dht.begin(); + #endif + setup_wifi(); + mqttClient.setServer(mqtt_server, mqtt_port); } void loop() { if (!mqttClient.connected()) reconnectMqtt(); mqttClient.loop(); if ((millis() - lastMeasureAttempt) > measurementInterval) { - reportResults(dht.readTemperature(), dht.readHumidity()); + #ifdef DHTMODE + reportResults(dht.readTemperature(), dht.readHumidity()); + #endif + #ifdef ONEWIREMODE + sensors.requestTemperatures(); + reportResults(sensors.getTempC(insideThermometer)); + #endif lastMeasureAttempt = millis(); } }