Temperature data is not updating on my OLED. The temperature number stays the same no matter what.
I am using an NodeMCU ESP8266 with a DHT11 temp/humid sensor, an Adafruit ssd1306 oled, and 2 buttons.
My code displays the temperature on a web server which works and updates just fine on page refresh.
Right now, if you push one button, the string "Test!" will appear on the oled. If you push the other button, the temperature will display.
But the temperature never updates if I press the button again or press the "Test!" button and the temperature button again.
So it's not refreshing with the current temperature data.
I'm not sure if it is just an issue where my oled is not clearing properly or if my code does not allow the buttonpress() function to update with new temp data. Or maybe it's both?
Any suggestions on what I could do to get the oled to refresh with current temperature data like the web server does?
(note: there may be some junk about LEDs in there which I'm now not using. Just ignore that.)
// Including the ESP8266 WiFi library
#include <ESP8266WiFi.h>
#include <DHT.h> // temp and humid sensor
// We need to include Wire.h for I2C communication
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET LED_BUILTIN
Adafruit_SSD1306 display(OLED_RESET);
// Uncomment one of the lines below for whatever DHT sensor type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
int pushButton1 = 16;
int pushButton2 = 10;
int buttonState1 = 0;
int buttonState2 = 0;
// Replace with your network details
const char* ssid = "MyUsername";
const char* password = "MyPassword";
// Web Server on port 80
WiFiServer server(80);
// DHT Sensor
const int DHTPin = 2;
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);
// Temporary variables
static char celsiusTemp[7];
static char fahrenheitTemp[7];
static char humidityTemp[7];
void setup() {
pinMode(pushButton1, INPUT);
pinMode(pushButton2, INPUT);
// Initializing serial port for debugging purposes
Serial.begin(115200);
delay(10);
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
display.begin(SSD1306_SWITCHCAPVCC, 0x3D); // initialize with the I2C addr 0x3D (for the 128x64)
// init done
// Show image buffer on the display hardware.
// Since the buffer is intialized with an Adafruit splashscreen
// internally, this will display the splashscreen.
display.display();
delay(2000);
// Clear the buffer.
display.clearDisplay();
dht.begin();
// Connecting to WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Starting the web server
server.begin();
Serial.println("Web server running. Waiting for the ESP IP...");
delay(10000);
// Printing the ESP IP address
Serial.println(WiFi.localIP());
}
// runs over and over again
void loop() {
buttonpress();
WiFiClient client = server.available();
if (client) {
Serial.println("New client");
// bolean to locate when the http request ends
boolean blank_line = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && blank_line) {
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
strcpy(celsiusTemp,"Failed");
strcpy(fahrenheitTemp, "Failed");
strcpy(humidityTemp, "Failed");
}
else{
// Computes temperature values in Celsius + Fahrenheit and Humidity
float hic = dht.computeHeatIndex(t, h, false);
dtostrf(hic, 6, 2, celsiusTemp);
float hif = dht.computeHeatIndex(f, h);
dtostrf(hif, 6, 2, fahrenheitTemp);
dtostrf(h, 6, 2, humidityTemp);
// You can delete the following Serial.print's, it's just for debugging purposes
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.print(" *F");
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
}
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
// your actual web page that displays temperature and humidity
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head></head><body><h1>ESP8266 - Temperature and Humidity</h1><h3>Temperature in Celsius: ");
client.println(celsiusTemp);
client.println("*C</h3><h3>Temperature in Fahrenheit: ");
client.println(fahrenheitTemp);
client.println("*F</h3><h3>Humidity: ");
client.println(humidityTemp);
client.println("%</h3><h3>");
client.println("</body></html>");
break;
}
if (c == '\n') {
// when starts reading a new line
blank_line = true;
}
else if (c != '\r') {
// when finds a character on the current line
blank_line = false;
}
}
}
// closing the client connection
delay(1);
client.stop();
Serial.println("Client disconnected.");
}
}
void buttonpress() {
// read the state of the pushbutton value:
buttonState1 = digitalRead(pushButton1);
buttonState2 = digitalRead(pushButton2);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState1 == LOW) {
// turn LED on:
Serial.println("Button 1 Pushed");
// text display tests
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Test!");
display.display();
delay(400);
display.clearDisplay();
}
if (buttonState2 == LOW) {
// turn LED on:
Serial.println("Button 2 Pushed");
// text display tests
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
float f = dht.readTemperature(true);
display.println(f);
display.display();
delay(400);
display.clearDisplay();
}
}