#include <WiFi.h>
#include <HTTPClient.h>
#include "DHTesp.h"
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Define pins
const int DHT_PIN = 25;
#define SD_CS 5
#define SD_CLK 18
#define SD_MISO 19
#define SD_MOSI 23
// LCD settings
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
// Wi-Fi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* apiKey = "9JMFA2N73Q353JMT";
const char* server = "api.thingspeak.com";
// Global objects
WiFiClient espClient;
DHTesp dhtSensor;
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE 50
float temp = 0;
float hum = 0;
bool sdInitialized = false;
// Function to set up Wi-Fi connection
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
// Setup function
void setup() {
pinMode(2, OUTPUT);
Serial.begin(115200);
setup_wifi();
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.init();
lcd.backlight();
SPI.begin(SD_CLK, SD_MISO, SD_MOSI, SD_CS);
if (!SD.begin(SD_CS)) {
Serial.println("SD Card initialization failed!");
sdInitialized = false;
} else {
Serial.println("SD Card initialized.");
sdInitialized = true;
}
}
// Function to log data to the SD card
void logDataToSD(float temperature, float humidity) {
if (sdInitialized) {
File logFile = SD.open("/datalog.csv", FILE_APPEND);
if (logFile) {
logFile.print("Temp: ");
logFile.print(temperature);
logFile.print(" °C, Humidity: ");
logFile.print(humidity);
logFile.println(" %");
logFile.close();
Serial.println("Data logged to SD card.");
} else {
Serial.println("Failed to open log file for writing.");
}
}
}
void readLogFile() {
if (SD.exists("/datalog.csv")) {
File logFile = SD.open("/datalog.csv", FILE_READ);
if (logFile) {
Serial.println("Reading data from SD card:");
while (logFile.available()) {
Serial.write(logFile.read());
}
logFile.close();
} else {
Serial.println("Failed to open log file for reading.");
}
} else {
Serial.println("Log file does not exist.");
}
}
// Main loop
void loop() {
unsigned long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
readLogFile();
TempAndHumidity data = dhtSensor.getTempAndHumidity();
if (isnan(data.temperature) || isnan(data.humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
String tempStr = String(data.temperature, 2);
String humStr = String(data.humidity, 1);
Serial.print("Temperature: ");
Serial.println(tempStr);
Serial.print("Humidity: ");
Serial.println(humStr);
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = String("http://") + server + "/update?api_key=" + apiKey + "&field1=" + tempStr + "&field2=" + humStr;
http.begin(url);
int httpCode = http.GET();
if (httpCode == 200 || httpCode == 201) {
Serial.println("Data sent to ThingSpeak");
} else {
Serial.print("Error sending data: ");
Serial.println(httpCode);
}
http.end();
} else {
Serial.println("WiFi not connected!");
}
logDataToSD(data.temperature, data.humidity);
lcd.setCursor(0, 0);
lcd.print("Temp: " + String(data.temperature, 1) + "\xDF" + "C");
lcd.setCursor(0, 1);
lcd.print("Humidity: " + String(data.humidity, 1) + "%");
}
}