#include <LiquidCrystal.h>
#include "DHTesp.h"
#include <ESP32Servo.h>
#include <WiFi.h>
#include "PubSubClient.h"
const int DHT_PIN = 19;
#define SERVO_PIN 32
DHTesp dhtSensor;
Servo servoMotor;
LiquidCrystal lcd_1(12, 15, 5, 4, 18, 2);
int photoSensor_pin = 34;
int led_red = 21;
int led_white = 22;
int buzzer_pin = 23;
int switch_1 = 13;
int switch_2 = 14;
int switch_3 = 27;
int trig_pin = 26;
int echo_pin = 25;
int relay_pin = 33;
// LDR Characteristics
const float GAMMA = 0.7;
const float RL10 = 50;
//
TaskHandle_t task_changeScreen;
TaskHandle_t task_handle;
long getDistance(){
digitalWrite(trig_pin, LOW);
delayMicroseconds(2);
digitalWrite(trig_pin, HIGH);
delayMicroseconds(10);
digitalWrite(trig_pin, LOW);
long duration = pulseIn(echo_pin, HIGH);
long distanceCm = duration*0.034/2;
return distanceCm;
}
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "test.mosquitto.org";
int port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
void wifiConnect(){
WiFi.begin(ssid,password);
while(WiFi.status()!=WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("Connected!");
}
void mqttReconnect(){
while(!client.connected()){
Serial.print("Attempting MQTT connecction...");
if(client.connect("12345678")){
Serial.println("Connected");
client.subscribe("20127214_20127522/controller");
}else{
Serial.println("Try again in 5 s");
delay(5000);
}
}
}
void callback(char* topic, byte* message, unsigned int length){
Serial.println(topic);
String stMessage;
for(int i=0;i<length;i++){
stMessage +=(char)message[i];
}
Serial.println(stMessage);
}
void setup()
{
lcd_1.begin(16, 2); // Set up the number of columns and rows on the LCD.
pinMode(photoSensor_pin, INPUT);
pinMode(led_red, OUTPUT);
pinMode(led_white, OUTPUT);
pinMode(buzzer_pin, OUTPUT);
pinMode(switch_1, INPUT);
pinMode(switch_2, INPUT);
pinMode(switch_3, INPUT);
pinMode(trig_pin, OUTPUT);
pinMode(echo_pin, INPUT);
pinMode(relay_pin, OUTPUT);
ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
servoMotor.setPeriodHertz(50); // standard 50 hz servo
servoMotor.attach(SERVO_PIN, 500, 2400);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
Serial.begin(9600);
Serial.print("Connecting to WiFi");
wifiConnect();
client.setServer(mqttServer,port);
client.setCallback(callback);
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println(xPortGetCoreID());
xTaskCreatePinnedToCore(
codeForTask_changeScreen, /* Function to implement the task */
"task_changeScreen", /* Name of the task */
10000, /* Stack size in words */
NULL, /* Task input parameter */
0, /* Priority of the task */
&task_changeScreen, /* Task handle. */
0); /* Core where the task should run */
xTaskCreatePinnedToCore(
codeForTask_Handle, /* Function to implement the task */
"task_handle", /* Name of the task */
10000, /* Stack size in words */
NULL, /* Task input parameter */
1, /* Priority of the task */
&task_handle, /* Task handle. */
1); /* Core where the task should run */
}
void man_hinh_1(){
lcd_1.noDisplay();
lcd_1.clear();
lcd_1.print("Cuong do A. Sang");
lcd_1.setCursor(0,1);
int analogValue = analogRead(photoSensor_pin);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
lcd_1.print(lux);
lcd_1.print(" ");
lcd_1.print("lux");
Serial.println(analogValue);
lcd_1.display();
lcd_1.setCursor(0,0);
}
void man_hinh_2(){
lcd_1.noDisplay();
lcd_1.clear();
TempAndHumidity data = dhtSensor.getTempAndHumidity();
lcd_1.print("Nhiet do "+ String(data.temperature,2)+"C");
lcd_1.setCursor(0,1);
lcd_1.print("Do am "+ String(data.humidity,1)+"%");
lcd_1.display();
lcd_1.setCursor(0,0);
}
void change_screen(){
man_hinh_1();
delay(1000);
man_hinh_2();
delay(1000);
}
int getLightInfor()
{
int analogValue = analogRead(photoSensor_pin);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
return lux;
}
void sendSensorInfo(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
int temp = data.temperature;
int humidity = data.humidity;
int light = getLightInfor();
//Serial.println(light);
char buffer[50];
sprintf(buffer, "{\"temperature\":%d, \"humidity\":%d, \"light\": %d }", temp, humidity, light);
client.publish("20127214_20127522/sensorInfo", buffer);
Serial.println("Da truyen du lieu");
}
void handle(){
//sendSensorInfo();
while(digitalRead(switch_1)==1){
//sendSensorInfo();
//Serial.println("Vao Che do tu dong");
// troi toi
if(digitalRead(switch_1)==0){
break;
}
while(analogRead(photoSensor_pin)>1016){
digitalWrite(led_white, HIGH);
}
if(analogRead(photoSensor_pin)<=1016){
digitalWrite(led_white, LOW);
}
// Khi troi vao luc chieu mat, thich hop de tuoi nuoc
while(analogRead(photoSensor_pin)>170 && analogRead(photoSensor_pin)<281){
//Serial.println(analogRead(photoSensor_pin));
servoMotor.write(180);
if(analogRead(photoSensor_pin)<=170 || analogRead(photoSensor_pin)>=281){
servoMotor.write(0);
break;
}
}
// Khi nhiet do khong khi qua cao hoac do am qua thap --> bat voi phun nuoc
while(dhtSensor.getTempAndHumidity().temperature>=35 || dhtSensor.getTempAndHumidity().humidity<30){
digitalWrite(buzzer_pin, HIGH);
digitalWrite(led_red, HIGH);
delay(1);
digitalWrite(led_red, LOW);
digitalWrite(buzzer_pin, LOW);
delay(1);
//Serial.println(analogRead(photoSensor_pin));
servoMotor.write(180);
if(dhtSensor.getTempAndHumidity().temperature<35 && dhtSensor.getTempAndHumidity().humidity>=30){
servoMotor.write(0);
digitalWrite(led_red, LOW);
digitalWrite(buzzer_pin, LOW);
break;
}
}
if(getDistance()>=100){ // khi can nuoc
while(true){
digitalWrite(relay_pin, HIGH);
if(getDistance()<= 10){
digitalWrite(relay_pin, LOW);
break;
}
}
}
}
// che do thu cong
while(digitalRead(switch_1)==0){
//sendSensorInfo();
//Serial.println("Vao Che do thu cong");
if(digitalRead(switch_1)==1){
break;
}
while(digitalRead(switch_2)==1){
if(digitalRead(switch_2)==0){
//Serial.println("Den da tat 1");
digitalWrite(led_white, LOW);
break;
}
//Serial.println("Den dang duoc bat");
// bat den
digitalWrite(led_white, HIGH);
}
if(digitalRead(switch_2)==0){
//Serial.println("Den da tat 2");
digitalWrite(led_white, LOW);
}
while(digitalRead(switch_3)==1){
if(digitalRead(switch_3)==0){
//Serial.println("Voi nuoc da duoc tat 1");
servoMotor.write(0);
break;
}
//Serial.println("Voi nuoc dang duoc mo");
// mo voi phun nuoc
servoMotor.write(180);
}
if(digitalRead(switch_3)==0){
//Serial.println("Voi nuoc da duoc tat 2");
servoMotor.write(0);
}
if(getDistance()>=100){ // khi can nuoc
while(true){
digitalWrite(relay_pin, HIGH);
if(getDistance()<= 10){
digitalWrite(relay_pin, LOW);
break;
}
}
}
}
}
void codeForTask_changeScreen( void * parameter ) {
for (;;) {
change_screen();
}
}
void codeForTask_Handle( void * parameter ) {
for (;;) {
handle();
}
}
void loop()
{
if(!client.connected()){
mqttReconnect();
}
client.loop();
}