#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <SD.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Wi-Fi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Server API Key
const char* apikey = "nmEH4A4XqTO7O97OZgvUz3ZF4P9MMY8L";
const char* serverName = "https://api.asksensors.com/write/nmEH4A4XqTO7O97OZgvUz3ZF4P9MMY8L";
// Pin definitions
#define BMP_SCK (12)
#define BMP_MISO (27)
#define BMP_MOSI (14)
#define BMP_CS (15)
#define DHTPIN 4
#define DHTTYPE DHT22
#define CS_PIN 5
#define BUTTON_PIN 2
// Initialize sensor objects
DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variables
int count = 0;
bool lastButtonState = false;
bool buttonState = false;
unsigned long debounceDuration = 50;
unsigned long lastDebounceTime = 0;
File dataFile;
HTTPClient http;
void setup() {
// Initialize Serial communication
Serial.begin(9600);
// Initialize DHT sensor
dht.begin();
// Initialize Wi-Fi connection
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Initialize BMP280 sensor
if (!bmp.begin(0x76)) {
Serial.println("Could not find a valid BMP280 sensor, check wiring!");
while (1);
}
// Initialize LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.print("Smart Weather");
lcd.setCursor(0, 1);
lcd.print("Station");
delay(2000);
lcd.clear();
// Initialize SD card
if (!SD.begin(CS_PIN)) {
lcd.clear();
Serial.println("SD Card initialization failed!");
lcd.setCursor(0, 1);
lcd.print("SD Card failed");
delay(1000);
while (1);
}
lcd.clear();
Serial.println("SD Card initialized");
lcd.setCursor(0, 1);
lcd.print("SD Card initialized");
delay(1000);
// Set up button pin
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(13, OUTPUT);
// Initial LCD display
lcd.clear();
lcd.print("Initializing...");
delay(1000);
}
void loop() {
int reading = digitalRead(BUTTON_PIN);
// Button debounce logic
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDuration) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW) {
count++;
displayData();
}
}
}
lastButtonState = reading;
}
void displayData() {
// Read temperature and humidity data from DHT sensor
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Read pressure from BMP sensor
float pressure = bmp.readPressure() / 100.0F;
// Handle display and data logging for each count step
switch (count) {
case 1:
displayTemperature(temperature);
break;
case 2:
displayHumidity(humidity);
break;
case 3:
displayPressure(pressure);
count = 0; // Reset counter after cycle
break;
}
}
void displayTemperature(float temperature) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temperature:");
lcd.setCursor(12, 0);
lcd.print(temperature);
lcd.setCursor(0, 1);
delay(1000);
lcd.print("Writing to SD...");
// Write data to SD card
writeToSD("Temperature", temperature);
// Send data to server
sendDataToServer("module1", temperature);
}
void displayHumidity(float humidity) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Humidity:");
lcd.setCursor(12, 0);
lcd.print(humidity);
delay(1000);
lcd.setCursor(0, 1);
lcd.print("Writing to SD...");
// Write data to SD card
writeToSD("Humidity", humidity);
// Send data to server
sendDataToServer("module2", humidity);
}
void displayPressure(float pressure) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pressure:");
lcd.setCursor(12, 0);
lcd.print(pressure);
delay(1000);
lcd.setCursor(0, 1);
lcd.print("Writing to SD...");
// Write data to SD card
writeToSD("Pressure", pressure);
// Send data to server
sendDataToServer("module3", pressure);
}
void writeToSD(String dataLabel, float dataValue) {
dataFile = SD.open("weather.txt", FILE_WRITE);
if (dataFile) {
dataFile.print(dataLabel);
dataFile.print(": ");
dataFile.print(dataValue);
dataFile.println();
dataFile.close();
lcd.clear();
lcd.print("Data written to SD");
delay(1000);
} else {
lcd.clear();
lcd.print("Error writing to SD");
delay(1000);
}
}
void sendDataToServer(String module, float dataValue) {
String url = String(serverName) + "?" + module + "=" + String(dataValue);
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
Serial.print("Data sent successfully: ");
Serial.println(httpResponseCode);
} else {
Serial.print("Error sending data: ");
Serial.println(httpResponseCode);
}
http.end();
}