Remove WiFiManager because that is Not Simple

This commit is contained in:
James Wood 2020-12-03 16:40:08 +11:00
parent 044a0313c5
commit 31f0b47a92
6 changed files with 87 additions and 143 deletions

3
.gitignore vendored Normal file → Executable file
View File

@ -3,4 +3,5 @@
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch
secrets.h
secrets.h
.DS_Store

0
.vscode/extensions.json vendored Normal file → Executable file
View File

0
.vscode/settings.json vendored Normal file → Executable file
View File

16
platformio.ini Normal file → Executable file
View File

@ -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
knolleary/PubSubClient @ ^2.8
adafruit/Adafruit Unified Sensor @ ^1.1.4
adafruit/DHT sensor library @ ^1.4.0
milesburton/DallasTemperature @ ^3.9.1

10
readme.md Normal file → Executable file
View File

@ -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.
Edit your wifi/mqtt settings and flash your device.

View File

@ -1,30 +1,35 @@
#include <LittleFS.h> //this needs to be first, or it all crashes and burns...
#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager
#include <ArduinoJson.h> //https://github.com/bblanchon/ArduinoJson
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#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.h>
DHT dht(2, DHT11);
#endif
#ifdef ONEWIREMODE
#include <DallasTemperature.h>
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<char[]> 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();
}
}