#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <DHT.h>
#include <LiquidCrystal.h>
#include <SPI.h>
#include <SD.h> // Include the SD library
#define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS (10)
#define DHTPIN 7
#define DHTTYPE DHT22
#define BUTTON_PIN 6
#define SD_CS_PIN 10 // SD card CS pin
DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP280 bmp;
int RS = 12, E = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(RS, E, d4, d5, d6, d7);
int buttonState = 0;
int lastButtonState = 0;
int screen = -1;
File dataFile;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
lcd.begin(16, 2);
dht.begin();
bmp.begin();
Serial.begin(9600);
lcd.print("Weather Station");
delay(2000);
lcd.clear();
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
// Initialize the SD card
if (!SD.begin(SD_CS_PIN)) {
lcd.print("SD Init Failed");
while (1);
}
lcd.print("SD Card Ready");
delay(2000);
lcd.clear();
}
void loop() {
buttonState = digitalRead(BUTTON_PIN);
if (buttonState == HIGH && lastButtonState == LOW) {
screen = (screen + 1) % 4;
updateScreen(screen);
}
lastButtonState = buttonState;
float temp = dht.readTemperature();
float humi = dht.readHumidity();
float pressure = bmp.readPressure() / 100.0;
if (!isnan(humi) && !isnan(temp) && !isnan(pressure)) {
logData(temp, humi, pressure); // Call function to log data
} else {
lcd.setCursor(0, 0);
lcd.print("Sensor Error!");
}
delay(1000);
}
void updateScreen(int screen) {
lcd.clear();
lcd.setCursor(15, 1);
lcd.print(String(screen + 1));
lcd.setCursor(2, 0);
if (screen == 0) {
float temp = dht.readTemperature();
lcd.print("Temperature: ");
lcd.setCursor(3, 1);
lcd.print(temp);
lcd.print(" C");
} else if (screen == 1) {
float humi = dht.readHumidity();
lcd.print("Humidity: ");
lcd.setCursor(3, 1);
lcd.print(humi);
lcd.print(" %");
} else if (screen == 2) {
float pressure = bmp.readPressure() / 100.0;
lcd.setCursor(2, 0);
lcd.print("Pressure: ");
lcd.setCursor(3, 1);
lcd.print(pressure);
lcd.print(" hPa");
} else {
lcd.setCursor(2, 0);
lcd.print("Thank you !");
}
}
// Function to log data to SD card
void logData(float temperature, float humidity, float pressure) {
// Open file in append mode
dataFile = SD.open("weather.txt", FILE_WRITE);
if (dataFile) {
// Write data in CSV format: temperature, humidity, pressure
dataFile.print("Temperature: ");
dataFile.print(temperature);
dataFile.print(" C, Humidity: ");
dataFile.print(humidity);
dataFile.print(" %, Pressure: ");
dataFile.print(pressure);
dataFile.println(" hPa");
dataFile.close(); // Close the file
Serial.println("Data logged to SD.");
} else {
lcd.setCursor(0, 1);
lcd.print("Error Writing SD");
}
}