#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#include "DHTesp.h"
#include <SD.h>
#include <LiquidCrystal_I2C.h>
const int DHT_PIN = 2;
DHTesp dhtSensor;
#define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS (10)
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
#define button1 3
#define button2 4
#define button3 5
#define button4 6
#define SD_CS 9 // Chip select pin for SD card
#define ButtonReadSD 7 // Optional button to read from SD card
Adafruit_BMP280 bmp(BMP_CS); // Using SPI
// Set up the LCD
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
// Variables to store previous button states
bool lastButton1State = HIGH;
bool lastButton2State = HIGH;
bool lastButton3State = HIGH;
bool lastButton4State = HIGH;
// Variables to handle button press count for button1
int button1PressCount = 0;
File dataFile;
unsigned long lastSaveTime = 0; // To keep track of the last save time
const unsigned long interval = 3000; // 3 seconds interval for SD card logging
void setup() {
Serial.begin(9600);
while (!Serial) delay(100);
Serial.println(F("Testing BMP280 Sensor"));
if (!bmp.begin()) {
Serial.println(F("BMP280 not found! Check connections."));
while (1) delay(10);
}
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
lcd.begin(20, 4); // Initialize with 20 columns and 4 rows
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(button3, INPUT);
pinMode(button4, INPUT);
pinMode(ButtonReadSD, INPUT_PULLUP); // Initialize button for reading SD
// Initialize SD card
if (!SD.begin(SD_CS)) {
Serial.println("SD card initialization failed!");
return;
}
Serial.println("SD card initialized.");
}
void loop() {
// Read current button states
bool currentButton1State = digitalRead(button1);
bool currentButton2State = digitalRead(button2);
bool currentButton3State = digitalRead(button3);
bool currentButton4State = digitalRead(button4);
// Read sensor data
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float bmpTemp = bmp.readTemperature();
float pressure = bmp.readPressure() / 100.0F; // Convert from Pa to hPa
// Check if it's time to log data to SD card (every 3 seconds)
if (millis() - lastSaveTime >= interval) {
dataFile = SD.open("data.txt", FILE_WRITE);
if (dataFile) {
dataFile.print("T DHT: ");
dataFile.print(data.temperature);
dataFile.print(" C, Humidity: ");
dataFile.print(data.humidity);
dataFile.print("%, T BMP: ");
dataFile.print(bmpTemp);
dataFile.print(" C, Pressure: ");
dataFile.print(pressure);
dataFile.println(" hPa");
dataFile.close();
Serial.println("Data logged to SD card.");
lastSaveTime = millis(); // Update last save time
} else {
Serial.println("Error opening data file on SD card.");
}
}
// Check for button1 press (cycle through different info: temperature, humidity, pressure)
if (currentButton1State == LOW && lastButton1State == HIGH) {
button1PressCount++; // Increment button press count
lcd.clear(); // Clear LCD before displaying new info
switch (button1PressCount % 3) { // Cycle through 3 different displays
case 0:
lcd.setCursor(0, 0);
lcd.print("Temp DHT: ");
lcd.print(data.temperature);
lcd.print(" C");
break;
case 1:
lcd.setCursor(0, 0);
lcd.print("Humidity: ");
lcd.print(data.humidity);
lcd.print(" %");
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("Pressure: ");
lcd.print(pressure);
lcd.print(" hPa");
break;
}
delay(100); // Small delay for button debounce
}
// Check for button2 press (display hot or cold message based on DHT22 temperature)
if (currentButton2State == LOW && lastButton2State == HIGH) {
lcd.clear();
lcd.setCursor(2, 0);
if (data.temperature > 30) { // Adjust the temperature threshold as needed
lcd.print("It's hot");
} else {
lcd.print("It's cold");
}
delay(100);
}
// Check for button3 press (display BMP temperature)
if (currentButton3State == LOW && lastButton3State == HIGH) {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("T BMP: ");
lcd.print(bmpTemp);
lcd.print(" C");
delay(100);
}
// Check for button4 press to display weather condition
if (currentButton4State == LOW && lastButton4State == HIGH) {
lcd.clear();
lcd.setCursor(2, 0);
if (data.temperature > 30) { // Adjust the threshold as needed
lcd.print("It's hot");
} else {
lcd.print("It's cold");
}
delay(100);
}
// Optional: Check if ButtonReadSD is pressed to read from SD card
if (digitalRead(ButtonReadSD) == LOW) {
dataFile = SD.open("data.txt");
if (dataFile) {
while (dataFile.available()) {
Serial.write(dataFile.read());
}
dataFile.close();
} else {
Serial.println("Error opening data file for reading.");
}
delay(100);
}
// Update last button states for the next loop iteration
lastButton1State = currentButton1State;
lastButton2State = currentButton2State;
lastButton3State = currentButton3State;
lastButton4State = currentButton4State;
delay(100); // Small delay to debounce buttons
}