IoT Weather Station – NodeMCU & NodeRed
As a weekend project, while I was bored out of my skull, I grabbed a couple of sensors trying to make something of a NodeMcu board I had lying around.
So I made a quick(yeah I know, ugly) schematic using the best in a rush schematic drawing application…Microsoft Paint !!

Then I made it happen and started coding.
I’ll add an LCD, but I have to order a power supply anyway. The whole idea is to turn it on, it connects to wifi and show the IP on the LCD.

Now, how would I allow the user to mod the SSID and pass…well..

Anyway, in the mean time, I made it provide custom data from the sensors to the NodeRed instance.
I use a max6675, a DHT11 and a photo-resitor.
Here we can admire a small board I built myself (it even has solder mask and my name on it ๐ )

Here is the Arduino IDE compatible NodeMcu code for this appliance.
/* Weather Station using NodeMCU and NodeRed Philippe Florent 2022 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - install nodered - launch it with .node-red - browse http://127.0.0.1:1880/ui - setup : http://127.0.0.1:1880/ */ //----------- http #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClient.h> //----------- sensors #include "DHTesp.h" #include "max6675.h" //------- MAX6675 int thermoDO = 12; int thermoCS = 15; int thermoCLK = 14; MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO); //-----photores #define PhotoresistorPin A0 // for Arduino microcontroller //-------- dht #define DHTpin 0 //D3 of NodeMCU is GPIO0 DHTesp dht; //----------- http const char* ssid = "@D3gageP3t1teS@lope"; const char* password = "ompelstilchen12"; //Your Domain name with URL path or IP address with path const char* serverName = "http://192.168.1.50:1880/update-sensor"; unsigned long lastTime = 0; unsigned long timerDelay = 100; // ms void setup() { Serial.begin(115200); //---------sensors dht.setup(DHTpin, DHTesp::DHT11); //for DHT11 Connect DHT sensor to GPIO 17 pinMode(PhotoresistorPin,INPUT); // photoresistor //------- MAX6675 // wait for MAX chip to stabilize delay(500); //------- http WiFi.begin(ssid, password); Serial.println("Connecting"); while(WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } //Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); lastTime = millis(); } void loop() { //--------- dht11 delay(dht.getMinimumSamplingPeriod()); float humidity = dht.getHumidity(); float temperature1 = dht.getTemperature(); float temperature1F = dht.toFahrenheit(temperature1); float temperature1Index = dht.computeHeatIndex(temperature1, humidity, false); float temperature1FIndex = dht.computeHeatIndex(dht.toFahrenheit(temperature1), humidity, true); Serial.println(); Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)\tHeatIndex (C)\t(F)"); Serial.print(dht.getStatusString()); Serial.print("\t"); Serial.print(humidity, 1); Serial.print("\t\t"); Serial.print(temperature1, 1); Serial.print("\t\t"); Serial.print(temperature1F, 1); Serial.print("\t\t"); Serial.print(temperature1Index, 1); Serial.print("\t\t"); Serial.println(temperature1FIndex, 1); //----------- photo res int analog_value = analogRead(PhotoresistorPin); //int brightness = map(analog_value, 0, 1023, 0, 99); //#define MAX_BRIGHTNESS_VOLTAGE 2.269 //#define BRIGHTNESS_RATIO = (MAX_BRIGHTNESS_VOLTAGE / 1023.0f) //float brightness=((float)analog_value)*BRIGHTNESS_RATIO; float brightness=((float)analog_value) / 1023.0f; brightness=brightness*100; Serial.print(analog_value); Serial.print(" "); Serial.println(brightness); delay(10); //------- MAX6675 float temperature2=thermocouple.readCelsius(); float temperatureF2=thermocouple.readFahrenheit(); Serial.print("C = "); Serial.println(temperature2); Serial.print("F = "); Serial.println(temperatureF2); // For the MAX6675 to update, you must delay AT LEAST 250ms between reads! delay(1000); if ((millis() - lastTime) > timerDelay) { //Check WiFi connection status if(WiFi.status()== WL_CONNECTED){ WiFiClient client; HTTPClient http; // Your Domain name with URL path or IP address with path http.begin(client, serverName); // If you need Node-RED/server authentication, insert user and password below //http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD"); // If you need an HTTP request with a content type: application/json, use the following: http.addHeader("Content-Type", "application/json"); String post="{\"api_key\":\"tPmAT5Ab3j7F9\",\"humidity\":\""+String(humidity)+"\",\"temperature1\":\""+String(temperature1)+"\",\"temperature1F\":\""+String(temperature1F)+"\",\"temperature1Index\":\""+String(temperature1Index)+"\",\"temperature1FIndex\":\""+String(temperature1FIndex)+"\",\"brightness\":\""+String(brightness)+"\",\"temperature2\":\""+String(temperature2)+"\",\"temperatureF2\":\""+String(temperatureF2)+"\"}"; Serial.println(post); int httpResponseCode = http.POST(post); // If you need an HTTP request with a content type: text/plain //http.addHeader("Content-Type", "text/plain"); //int httpResponseCode = http.POST("Hello, World!"); Serial.print("HTTP Response code: "); Serial.println(httpResponseCode); // Free resources http.end(); } else { Serial.println("WiFi Disconnected"); } lastTime = millis(); } }
NodeRed gets started as any node.js app

It allows to create a dashboard in a WYSIWYG way.

And provides enough tweaking and options so that one can easily pipe the data flow to something graphically readable.

So in the end, I get a “nice” UI. I mean it’s not great but I did not have to code anything. TADAAA !!

Sources :
Interfacing DHT11 with NodeMCU Example Resistor Tutorial for Arduino, ESP8266 and ESP32 ESP8266 NodeMCU: K-Type Thermocouple with MAX6675 Amplifier How to Interface PCF8574 I2C LCD with ESP8266 NodeMCU?https://create.arduino.cc/projecthub/arcaegecengiz/using-dht11-b0f365