#include <WiFi.h>
#include <HTTPClient.h>
#include "DHT.h"
#include <Stepper.h>
#include "ThingSpeak.h"
//-----------------------------------------------------------//
//chân cảm biến DHT22
const int DHT_PIN = 15;
const int DHT_TYPE = DHT22;
//chân Led
const int LED_PIN = 13;
//chân cảm biến ánh sáng
const int photoresistorPin = 33;
//chân cảm biến siêu âm
const int trigPin = 5;
const int echoPin = 18;
//chân cảm biến hồng ngoại thụ động
const int pir = 19;
//chân buzzer
const int Buzzer = 21;
//chân led vàng
const int LED_PIN2 = 25;
//chân led đóng, mở rèm
const int LED_DEN = 32;
//DS1307 và Relay module
#define Pump 4 //Relay kích mức cao bằng chân số 4, sử dụng relay để bật tắt bơm
//xác định tốc độ âm thanh tính bằng cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
//chân motor
const float stepmax = 600;
const float steptarget1 = 500;
const float deltaT = 5;
const float GAMMA = 0.7;
const float RL10 = 33;
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
const int WIFI_CHANNEL = 6;
const String apiKey = "AJ1RPII8U9WHAKH7";
const String channelId = "2514553";
// Biến toàn cục
float distanceCm;
float speed1;
float step1 = 0;
unsigned long millis_int1 = 0;
long duration;
float distance;
float rainAmount = 0.0;
//RTC
Stepper Stepper1(stepmax, 12, 14, 27, 26);
DHT dht(DHT_PIN, DHT_TYPE);
WiFiClient client;
//-----------------------------------------------------------//
void setup() {
// Khởi tạo Serial
Serial.begin(115200);
//khai báo Led đỏ
pinMode(LED_PIN, OUTPUT);
//khai báo Led vàng
pinMode(LED_PIN2, OUTPUT);
//khai báo Led đóng, mở rèm che
pinMode(LED_DEN, OUTPUT);
//khai báo cảm biến ánh sáng
pinMode(photoresistorPin, INPUT);
//khai báo cảm biến siêu âm
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
//khai báo cảm biến cảm biến hồng ngoại thụ động
pinMode(pir, INPUT);
//khai báo buzzer
pinMode(Buzzer, OUTPUT);
//Khai báo Relay
pinMode(Pump, OUTPUT);
// Khởi động cảm biến nhiệt độ và độ ẩm
dht.begin();
// Khởi tạo WiFi
Serial.print("Connecting to WiFi...");
WiFi.begin(WIFI_NAME, WIFI_PASSWORD, WIFI_CHANNEL);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("WiFi connected!");
Serial.println("Local IP: " + String(WiFi.localIP()));
}
void gerak(float k) {
step1 = (steptarget1) * (k / (1000));
Stepper1.step(step1);
}
void stop() {
step1 = step1;
}
void stopMotor() {
// Hàm dừng động cơ và đặt vị trí hiện tại về 0
step1 = 0;
}
//-----------------------------------------------------------//
void loop() {
//Đọc giá trị từ cảm biến dht22
float temp = dht.readTemperature();
float humid = dht.readHumidity();
// Đọc giá trị từ điện trở quang (photoresistor)
int lightIntensity = analogRead(photoresistorPin);
float voltage = lightIntensity / 4096.0 * 3.3;
float resistance = 2000 * voltage / (1 - voltage / 3.3);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
digitalWrite(LED_PIN2, lux < 500 ? HIGH : LOW);
// Điều khiển LED dựa trên nhiệt độ và độ ẩm
digitalWrite(LED_PIN, (temp > 35 || temp < 12 || humid > 70 || humid < 40) ? HIGH : LOW);
// Điều khiển Rèm che khi trời sáng hoặc tối
// Điều khiển rèm cửa: mở rèm khi ánh sáng trong khoảng từ 1000 đến 5000, ngược lại thì đóng rèm
if (lux >= 1000 && lux <= 2000) {
digitalWrite(LED_DEN, LOW); // Tắt đèn
Serial.println("Ánh sáng tốt | tắt đèn | đóng rèm");
Stepper1.step(-step1); // Di chuyển động cơ về vị trí 0 ngay lập tức
delay(100); // Đợi một lát để động cơ dừng lại
stopMotor(); // Dừng động cơ và đặt vị trí hiện tại về 0
} else if (lux < 1000) {
digitalWrite(LED_DEN, HIGH); // Bật đèn
Serial.println("Ánh sáng yếu | mở đèn | đóng rèm");
Stepper1.step(-step1); // Di chuyển động cơ về vị trí 0 ngay lập tức
delay(100); // Đợi một lát để động cơ dừng lại
stopMotor(); // Dừng động cơ và đặt vị trí hiện tại về 0
} else if (lux > 2000) {
digitalWrite(LED_DEN, HIGH); // Bật đèn
Serial.println("Ánh sáng mạnh | mở đèn | mở rèm");
Stepper1.step(steptarget1); // Di chuyển động cơ tới vị trí mục tiêu
step1 += steptarget1; // Cập nhật vị trí hiện tại của động cơ
}
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Đọc echoPin, trả về thời gian truyền sóng âm thanh tính bằng micro giây
duration = pulseIn(echoPin, HIGH);
// Tính khoảng cách
distanceCm = duration * SOUND_SPEED / 2;
if (distanceCm < 200) {
// Nếu khoảng cách nhỏ hơn 200cm, motor sẽ chạy theo chiều thuận
Stepper1.step(steptarget1);
step1 += steptarget1; // Cập nhật vị trí hiện tại của motor
} else {
// Nếu khoảng cách lớn hơn hoặc bằng 200cm, motor sẽ quay ngược lại và dừng lại ở vị trí 0
Stepper1.step(-step1); // Di chuyển motor về vị trí 0 ngay lập tức
delay(100); // Đợi một lát để motor dừng lại
stop(); // Dừng motor và đặt vị trí hiện tại về 0
}
int IP = digitalRead(pir);
if (IP == HIGH) {
// Phát ra tiếng từ buzzer với tần số 1000Hz
tone(Buzzer, 1000);
} else {
// Tắt tiếng từ buzzer
noTone(Buzzer);
}
// Send data to ThingSpeak
String url = "http://api.thingspeak.com/update?api_key=" + apiKey + "&field1=" + String(temp) +
"&field2=" + String(humid) + "&field3=" + String(lux) + "&field4=" + String(distanceCm) +
"&field5=" + String(IP);
HTTPClient http;
http.begin(url);
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
Serial.println("Data pushed successfully");
} else {
Serial.println("Push error: " + String(httpCode));
}
http.end();
Serial.println("Temp: " + String(temp, 2) + "°C");
Serial.println("Humidity: " + String(humid, 1) + "%");
Serial.println("Light Intensity: " + String(lux) + "lux");
Serial.println("Distance: " + String(distanceCm) + "Cm");
Serial.println("Pir: " + String(IP));
}