#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <SD.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// BMP280 settings
#define BMP_SCK (18)
#define BMP_MISO (19)
#define BMP_MOSI (23)
#define BMP_CS (5)
Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
// DHT22 settings
#define DHTPIN 32
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// LCD settings
#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
// LED settings
#define LED_PIN 13
// Button settings
#define TEMP_BUTTON_PIN 12
#define HUMI_BUTTON_PIN 4
#define PRESS_BUTTON_PIN 14
#define WEATHER_BUTTON_PIN 33
// SD card settings
#define SD_CS_PIN 15
// Wi-Fi settings
const char* ssid = "Wokwi-GUEST"; // Wi-Fi network name
const char* password = ""; // Wi-Fi password
// AskSensors settings
const char* serverUrl = "https://asksensors.com/api/v1/sensors/data"; // AskSensors API endpoint
String apiKey = "2MgRtwKACiuVne02NrElfKHIYdXrm5sg"; // Replace with your AskSensors API Key
int displayMode = 0; // 0: temperature, 1: humidity, 2: pressure, 3: weather forecast
void setup() {
Serial.begin(115200);
Serial.println(F("BMP280 and DHT22 Test"));
// Initialize BMP280
if (!bmp.begin()) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
// Default BMP280 settings
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
// Set up LED pin
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// Initialize DHT22
dht.begin();
// Initialize LCD
lcd.begin(LCD_COLUMNS, LCD_ROWS);
lcd.init();
lcd.backlight();
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Initialize button pins
pinMode(TEMP_BUTTON_PIN, INPUT_PULLUP);
pinMode(HUMI_BUTTON_PIN, INPUT_PULLUP);
pinMode(PRESS_BUTTON_PIN, INPUT_PULLUP);
pinMode(WEATHER_BUTTON_PIN, INPUT_PULLUP);
// Initialize SD card
if (!SD.begin(SD_CS_PIN)) {
Serial.println("SD card initialization failed!");
return;
}
Serial.println("SD card initialized.");
}
void loop() {
// Sensor readings
float humidity = dht.readHumidity();
float temperatureDHT = dht.readTemperature();
float pressure = bmp.readPressure() / 100;
float temperatureBMP = bmp.readTemperature();
if (isnan(humidity) || isnan(temperatureDHT) || isnan(pressure)) {
Serial.println("Sensor error.");
return;
}
// Handle button presses for display mode selection
checkButtons();
// Display data on LCD
displayData(temperatureDHT, humidity, pressure);
// LED temperature threshold check
controlLED(temperatureDHT);
// Log data to SD card
logDataToSD(temperatureDHT, humidity, pressure);
// Send data to AskSensors
sendToAskSensors(temperatureDHT, humidity, pressure);
delay(2000);
}
void checkButtons() {
if (digitalRead(TEMP_BUTTON_PIN) == LOW) {
displayMode = 0;
delay(200); // Debounce
} else if (digitalRead(HUMI_BUTTON_PIN) == LOW) {
displayMode = 1;
delay(200);
} else if (digitalRead(PRESS_BUTTON_PIN) == LOW) {
displayMode = 2;
delay(200);
} else if (digitalRead(WEATHER_BUTTON_PIN) == LOW) {
displayMode = 3;
delay(200);
}
}
void displayData(float temperature, float humidity, float pressure) {
lcd.clear();
if (displayMode == 0) {
lcd.setCursor(0, 0);
lcd.print("Temperature:");
lcd.setCursor(0, 1);
lcd.print(temperature);
lcd.print((char)223);
lcd.print("C");
} else if (displayMode == 1) {
lcd.setCursor(0, 0);
lcd.print("Humidity:");
lcd.setCursor(0, 1);
lcd.print(humidity);
lcd.print(" %");
} else if (displayMode == 2) {
lcd.setCursor(0, 0);
lcd.print("Pressure:");
lcd.setCursor(0, 1);
lcd.print(pressure);
lcd.print(" hPa");
} else if (displayMode == 3) {
lcd.setCursor(0, 0);
lcd.print("Weather: ");
lcd.setCursor(0, 1);
lcd.print(getWeatherForecast(temperature, humidity));
}
}
void controlLED(float temperature) {
if (temperature > 50) {
digitalWrite(LED_PIN, HIGH);
Serial.println("LED ON: Temperature above 50°C");
} else {
digitalWrite(LED_PIN, LOW);
Serial.println("LED OFF: Temperature below 50°C");
}
}
void logDataToSD(float temperature, float humidity, float pressure) {
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.print("Temperature: ");
dataFile.print(temperature);
dataFile.print(" °C, Humidity: ");
dataFile.print(humidity);
dataFile.print(" %, Pressure: ");
dataFile.print(pressure);
dataFile.println(" hPa");
dataFile.close();
Serial.println("Data logged to SD card.");
} else {
Serial.println("Error opening datalog.txt.");
}
}
String getWeatherForecast(float temperature, float humidity) {
if (temperature > 25 && humidity < 60) {
return "Sunny";
} else if (temperature >= 20 && temperature <= 25 && humidity >= 60 && humidity <= 80) {
return "Cloudy";
} else if (temperature < 20 || humidity > 80) {
return "Rainy";
} else {
return "Unknown";
}
}
// Function to send data to AskSensors
void sendToAskSensors(float temperature, float humidity, float pressure) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
// Set up the HTTP request
http.begin(serverUrl); // Specify the AskSensors API endpoint
http.addHeader("Content-Type", "application/json"); // Set content type to JSON
http.addHeader("API-Key", apiKey); // Add your API key to the header
// Prepare JSON data
DynamicJsonDocument doc(1024);
doc["temperature"] = temperature;
doc["humidity"] = humidity;
doc["pressure"] = pressure;
String jsonData;
serializeJson(doc, jsonData); // Serialize the data into JSON format
// Send the HTTP POST request
int httpResponseCode = http.POST(jsonData);
// Handle the response
if (httpResponseCode > 0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
} else {
Serial.print("Error on sending POST: ");
Serial.println(httpResponseCode);
}
// Close the HTTP connection
http.end();
} else {
Serial.println("WiFi Disconnected");
}
}