#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define DHTPIN 15
#define DHTTYPE DHT22
#define TRIG_PIN 25
#define ECHO_PIN 26
#define BUZZER_PIN 35
const int redLED = 32;
const int yellowLED = 33;
const int greenLED = 34;
DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const float tempRisk = 70.0; //danger Temperature
const float humidityRisk = 20.0; //danger Humidity
void setup() {
Serial.begin(115200);
dht.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
pinMode(redLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
long measureDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
return pulseIn(ECHO_PIN, HIGH) * 0.034 / 2;
}
void loop() {
delay(500);
float h = dht.readHumidity();
float t = dht.readTemperature();
long distance = measureDistance();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print("。C\t");
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
digitalWrite(redLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(greenLED, LOW);
if (t > tempRisk && h < humidityRisk) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("very danger!!");
display.display();
digitalWrite(redLED, HIGH);
} else {
if (t >= 60.0 && t <= 80.0) {
digitalWrite(redLED, HIGH);
} else if (t >= 37.0 && t < 60.0) {
digitalWrite(yellowLED, HIGH);
} else if (t < 37.0) { //normal Temperature
digitalWrite(greenLED, HIGH);
}
if (h < 20.0) {
digitalWrite(redLED, HIGH);
} else if (h < 50.0) {
digitalWrite(yellowLED, HIGH);
} else { //normal Humidity
digitalWrite(greenLED, HIGH);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Humidity: ");
display.print(h);
display.print(" %");
display.setCursor(0, 10);
display.print("Temperature: ");
display.print(t);
display.print(" °C");
display.setCursor(0, 20);
display.print("Distance: ");
display.print(distance);
display.print(" cm");
display.display();
}
if (t > tempRisk || h < humidityRisk) {
tone(32, 1000, 500); //32pin 1000Hz 500ms
}
}