#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHT.h"
#define LED_PIN 15
#define TRIG_PIN 18
#define ECHO_PIN 19
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
DHT dht22(14, DHT22); // Ensure you are using the correct DHT sensor type
double fnc_ultrasonic_distance(int trigPin, int echoPin) {
unsigned long duration;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH, 18000);
Serial.print("Echo Duration: ");
Serial.println(duration);
if (duration == 0) return 999.0;
return (duration / 58.0); // Convert to cm
}
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(32, OUTPUT);
pinMode(2, OUTPUT);
pinMode(4, INPUT);
pinMode(18, OUTPUT);
pinMode(14, INPUT);
pinMode(12, OUTPUT);
pinMode(15, OUTPUT);
pinMode(33, INPUT);
Serial.begin(115200);
Serial.flush();
while (Serial.available() > 0) Serial.read();
dht22.begin(); // Ensure the sensor is properly initialized
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;) ;
}
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
Serial.println("Setup complete");
}
void loop() {
Serial.println("Loop iteration");
yield();
// Read sensor data
double temperature = dht22.readTemperature();
double humidity = dht22.readHumidity();
// Debug statements to check the sensor readings
Serial.print("Temperature: ");
Serial.println(temperature);
Serial.print("Humidity: ");
Serial.println(humidity);
// Check if the readings are valid
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Display temperature and humidity on separate lines
String line1 = "Temp: " + String(temperature, 1) + "C";
String line2 = "Humidity: " + String(humidity, 1) + "%";
String line3;
// Control the LED based on light sensor reading
if (analogRead(35) > 700) {
digitalWrite(32, HIGH); // Turn on LED when there is no light
line3 = "LED: ON";
} else {
digitalWrite(32, LOW);
line3 = "LED: OFF";
}
// Measure water level using ultrasonic sensor
double distance = fnc_ultrasonic_distance(TRIG_PIN, ECHO_PIN);
Serial.print("Distance: ");
Serial.println(distance);
// Assuming a maximum distance of 400 cm (tank empty) and minimum distance of 0 cm (tank full)
int waterLevel = map(distance, 0, 400, 100, 0); // Map distance to percentage
waterLevel = constrain(waterLevel, 0, 100); // Ensure water level is between 0 and 100
String line4 = "Water Level: " + String(waterLevel) + "%";
// Display all information on the OLED
display.clearDisplay();
display.setCursor(0, 0);
display.print(line1);
display.setCursor(0, 10);
display.print(line2);
display.setCursor(0, 20);
display.print(line3);
display.setCursor(0, 30);
display.print(line4);
display.display();
delay(1000);
}