#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <DHT.h>
// #include <Adafruit_GFX.h>
// #include <Adafruit_SSD1306.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd (0x27, 20, 4);


// #define SCREEN_WIDTH 128
// #define SCREEN_HEIGHT 64

// Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);


const char * MQTTServer = "broker.emqx.io";
const char * MQTT_Topic = "dang";
const char * MQTT_Topic2 = "dang2";
const char * MQTT_Topic3 = "dang3";
const char * MQTT_ID = "";
int Port = 1883;

WiFiClient espClient;
PubSubClient client(espClient);
const int ledPin = 19;
const int relay = 14;
#define DHT_TYPE DHT22
#define DHT_PIN 18
#define LDR 36
DHT dht(DHT_PIN,DHT_TYPE);

void WIFIConnect() {
  Serial.println("Connecting to SSID: Wokwi-GUEST");
  WiFi.begin("Wokwi-GUEST", "");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi connected");
  Serial.print(", IP address: ");
  Serial.println(WiFi.localIP());
}

void MQTT_Reconnect() {
  while (!client.connected()) {
    if (client.connect(MQTT_ID)) {
      Serial.print("MQTT Topic: ");
      Serial.print(MQTT_Topic);
      Serial.print(" connected");
      client.subscribe(MQTT_Topic);
      client.subscribe(MQTT_Topic2);
      client.subscribe(MQTT_Topic3);
      Serial.println("");
      lcd.setCursor(0,0);
      lcd.print("Topic: ");
      lcd.print(MQTT_Topic);
      lcd.print(" ket noi");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" kết nối thất bại try again in 5 seconds");
      lcd.setCursor(0,0);
      lcd.print("failed, rc=");
      lcd.println(" kết nối thất bại try again in 5 seconds");
      delay(500);
      lcd.clear();
    }
  }
}

void callback(char* topic, byte* message, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.println(topic);
  Serial.print("Message: ");
  String stMessage;
  String stMessage1;
  String stMessage2;
  
  if (strcmp(topic, MQTT_Topic2) == 0) {
    for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    stMessage += (char)message[i];
  }
  Serial.println();
  if (stMessage == "on") {
    lcd.setCursor(0,2);
    lcd.print("                    ");
    digitalWrite(relay, HIGH);
    lcd.setCursor(0,2);
    lcd.print("on");
  }
  else if (stMessage == "off") {
    lcd.setCursor(0,2);
    lcd.print("                    ");
    digitalWrite(relay, LOW);
    lcd.setCursor(0,2);
    lcd.print("off");
  }else{
    lcd.setCursor(0,3);
    lcd.print("                    ");
    lcd.setCursor(0,3);
    lcd.print(stMessage);
    digitalWrite(ledPin, LOW);
  }
  }
  if(strcmp(topic, MQTT_Topic3) == 0){
    for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    stMessage1 += (char)message[i];
  }
  Serial.println();
  if (stMessage1 == "nguyhiem") {
    lcd.setCursor(0,3);
    lcd.print("nguy hiem");
    digitalWrite(ledPin, HIGH);
  }else{
    //lcd.setCursor(0,3);
    //lcd.print("                    ");
    //digitalWrite(ledPin, LOW);
  }
  }
}

void setup() {
  Serial.begin(115200);
  WIFIConnect();
  client.setServer(MQTTServer, Port);
  client.setCallback(callback);
  pinMode(ledPin, OUTPUT);
  pinMode(LDR, INPUT);
  pinMode(relay, OUTPUT);
  pinMode(12,OUTPUT);
  dht.begin();
  Wire.begin(5,17);
  lcd.init();
  lcd.backlight();


  IPAddress ip = WiFi.localIP();
  String ipStr = String(ip[0]) + "." + String(ip[1]) + "." + String(ip[2]) + "." + String(ip[3]);

  // Print the IP address to the LCD
  lcd.setCursor(0, 1);  // Set the cursor to the second row
  lcd.print("IP: ");
  lcd.print(ipStr);

  // if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
  //   Serial.println(F("SSD1306 allocation failed"));
  //   while(1);
  // }
  // delay(2000);
  // display.clearDisplay();
  // display.setTextSize(1);
  // display.setTextColor(WHITE);
  // display.setCursor(0, 2);
  // display.display(); 
  // display.println("THI");
}

void loop() {
  delay(10);
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  float lx = analogRead(LDR);
  ndpublish();
  if (!client.connected()) {
    MQTT_Reconnect();
  }
  client.loop();

}
void ndpublish() {
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  float lx = analogRead(LDR);
  String nt_da = "{\"nhietdo\":\"" + String(t)+ "\",\"doam\":\"" + String(h)+ "\",\"anhsang\":\"" + String(lx)+"\"}";

  client.publish("dang",String(nt_da).c_str());
  delay(2000);
}
























































































































































































































































































































































































































/*
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js" type="text/javascript"></script>
<script src="https://code.jquery.com/jquery-3.6.1.min.js" type="text/javascript"></script>
</head>
<body>
<p id="Nhietdo"></p>
<p id="Doam"></p>
<p id="Anhsang"></p>
<button class="bat">Bật LED</button>
<button class="tat">Tắt LED</button>

</body>
</html>

<script>
$('.bat').click(function(){
message = new Paho.MQTT.Message("on");
message.destinationName = "dang2";
client.send(message);
});

$('.tat').click(function(){
message = new Paho.MQTT.Message("off");
message.destinationName = "dang2";
client.send(message);
});

client = new Paho.MQTT.Client("broker.emqx.io", Number(8083), "80170395-61ac-4234-825a-2d395a8be325");

client.onConnectionLost = onConnectionLost;
client.onMessageArrived = onMessageArrived;

client.connect({onSuccess:onConnect});

function onConnect() {
client.subscribe("dang");

}

function onConnectionLost(responseObject) {
if (responseObject.errorCode !== 0) {
console.log("onConnectionLost:"+responseObject.errorMessage);
}
}

function onMessageArrived(message) {
console.log("onMessageArrived:"+message.payloadString);
const obj = JSON.parse(message.payloadString);
console.log(obj.nt_da);
document.getElementById("Nhietdo").innerHTML = "Nhiet do: "+ obj.nhietdo+" do C";
document.getElementById("Doam").innerHTML = "Do am: "+obj.doam+" %";
document.getElementById("Anhsang").innerHTML = "Do am: "+obj.anhsang;
}
</script>
*/

/*
!pip install tensorflow
=======================================
!pip install opencv-python
===============================
from tensorflow.keras.models import load_model
import cv2
import numpy as np

model = load_model("./20004195_model.h5")
lb  =['beetle', 'grasshopper', 'mango_hopper', 'mango_mealybug', 'moth']
image = cv2.imread("./beetle (161).jpg")
image = cv2.resize(image,(224,224))

arr = np.array(image, dtype="float32")

arr_re = arr.reshape((-1,224,224,3))

_,output = model.predict(arr_re)
result = lb[np.argmax(output)]
print (result)
print (np.max(output)*100)
================================================
pip install paho-mqtt
============================================
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Kết nối thành công")
    else:
        print("Kết nối thất bại")
def on_publish(client, userdata, mid):
    print("Đã gửi dữ liệu ")

client = mqtt.Client()
client.on_connect = on_connect
client.on_publish = on_publish
client.connect("broker.emqx.io", 1883)

client.publish("THI", "56") # tên topic , nội dung gửi
=============================================
pip install mysql-connector-python
==================================
import mysql.connector

db = mysql.connector.connect(
    host = "localhost",
    user = "root",
    password = "123456",
    database = "plant_disease"
)

if db.is_connected():
    print ("ket noi thanh cong")
cursor = db.cursor()
===================================
sql = "SELECT * from diseases"
cursor.execute(sql)
result = cursor.fetchall()
print(result)
print(len(result))
=================================
import paho.mqtt.client as mqtt
=================================
def on_connect(client, userdata, flags, rc):
    if rc ==0:
        print ("Kết nối thành công")
    else:
        print ("Lỗi kết nối")
def on_publish(client, userdata, mid):
    print("Gửi thành công")

client = mqtt.Client()
client.on_connect = on_connect
client.on_publish = on_publish
client.connect("broker.emqx.io", 1883)

import mysql.connector
db = mysql.connector.connect(
  host = "localhost",
  user = "root",
  password = "123456",
  database = "plaint_disease"
)

if db.is_connected():
    print("Ket noi thanh cong")
cursor = db.cursor()
import datetime
now = datetime.datetime.now()

# hours = now.hour
hours = 8

if  7 <= hours <= 11 or 13 <= hours <= 17:
    sql = f"SELECT * from users where full_name = '{result}'"

    cursor.execute(sql)

    count =  cursor.fetchall()
    if len(count) >0:
        print ("Đã mở cửa")
        client.publish("20004128", "Y" + result)
    else:
        print ("Không có quyền truy cập")
        client.publish("20004128", "N")
else:
    print ("Không có quyền truy cập")
    client.publish("20004128", "N")
=============================
!pip install tensorflow
!pip install opencv-python
!pip install paho-mqtt
!pip install mysql-connector-python

from tensorflow.keras.models import load_model
import cv2
import numpy as np

model = load_model("D:/Dowload/module3/20004195_model.h5")
lb  =['beetle', 'grasshopper', 'mango_hopper', 'mango_mealybug', 'moth']
image = cv2.imread("D:/Dowload/module3/beetle (161).jpg")
image = cv2.resize(image,(224,224))

arr = np.array(image, dtype="float32")

arr_re = arr.reshape((-1,224,224,3))

_,output = model.predict(arr_re)
result = lb[np.argmax(output)]
print (result)
print (np.max(output)*100)

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    if rc ==0:
        print ("Kết nối thành công")
    else:
        print ("Lỗi kết nối")
def on_publish(client, userdata, mid):
    print("Gửi thành công")

client = mqtt.Client()
client.on_connect = on_connect
client.on_publish = on_publish
client.connect("broker.emqx.io", 1883)
client.publish("dang2", result) # tên topic , nội dung gửi

import mysql.connector
db = mysql.connector.connect(
  host = "localhost",
  user = "root",
  password = "",
  database = "knn"
)

if db.is_connected():
    print("Ket noi thanh cong")
cursor = db.cursor()
sql = f"SELECT * from disease where name = '{result}' and is_danger = 1"

cursor.execute(sql)

count =  cursor.fetchall()
if len(count) >0:
    print ("nguyhiem")
    client.publish("dang3", "nguyhiem")
else:
    print ("Khong nguy hiem")
    client.publish("dang3", "khongnguyhiem")
*/
NOCOMNCVCCGNDINLED1PWRRelay Module