#include <WiFi.h>
#include <TridentTD_LineNotify.h>
#include <PubSubClient.h>
#include <HTTPClient.h>
#include "DHT.h"
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
const char* host = "petchjai110370.000webhostapp.com";
#define LINE_TOKEN "ZgeHeAZTLiQJVujeKhp1tasppy33inTaaDuvlqUurCz"
#define DHTPIN 26
#define DHTTYPE DHT22
#define swline 2
#define swPie 5
#define swDb 4
DHT dht(DHTPIN, DHTTYPE);
#define RPin 27
#define YPin 14
#define GPin 12
unsigned long R_per = 1000;
unsigned long Y_per = 1000;
unsigned long G_per = 1000;
LiquidCrystal_I2C lcd(0x27, 16, 2);
unsigned long debounceDuration = 50; // millis
unsigned long lastTimeButtonStateChanged = 0;
int a = 0;
const char* ssid = "Secure-AP"; // AP Name
const char* password = "ge.lru.ac.th"; // password connect AP
const char* mqtt_server = "broker.netpie.io";
const int mqtt_port = 1883;
const char* mqtt_Client = "7e7661bd-75ab-478d-9d61-7a838d5338be"; // form Cliend ID
const char* mqtt_username = "z5ZuytpwY9iMPMnr6mMByqv8dvjWuopa"; // form Token
const char* mqtt_password = "HWnDzs4$OhZzRXdUmj#EdrGbQWX~RUYz"; // form Secret
byte lastButtonState = HIGH;
byte lastButtonState1 = HIGH;
byte lastButtonState2 = HIGH;
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[100];
WiFiClient client2;
const int httpPort = 80;
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection…");
if (client.connect(mqtt_Client, mqtt_username, mqtt_password)) {
Serial.println("connected");
client.subscribe("@msg/#"); //subscribe "msg" all messages
}
else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println("try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String message;
String tpc;
for (int i = 0; i < length; i++) {
message = message + (char)payload[i];
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(swline, INPUT_PULLUP);
pinMode(swPie, INPUT_PULLUP);
pinMode(swDb, INPUT_PULLUP);
pinMode(12, OUTPUT);
pinMode(14, OUTPUT);
pinMode(27, OUTPUT);
lcd.init();
dht.begin();
lcd.backlight();
Serial.print("Connecting to ");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
LINE.setToken(LINE_TOKEN);
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
unsigned long MT = millis();
unsigned long currentMillis = millis();
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(h) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
lcd.setCursor(0, 0);
lcd.print("C");
lcd.setCursor(2, 0);
lcd.print(t);
String message = "t = " + String(t) + "\nh = " + String(h);
if (currentMillis - lastTimeButtonStateChanged >= debounceDuration) {
byte buttonState = digitalRead(swline);
if (buttonState != lastButtonState) {
lastTimeButtonStateChanged = currentMillis;
lastButtonState = buttonState;
MT = 0;
if (buttonState == HIGH) {
LINE.notify(message);
Serial.println(message);
Serial.println("Send to Line complete.");
Serial.println("---------------------------------");
//delay(1000); // this speeds up the simulation
Serial.println("======= Press =======");
digitalWrite(12, !digitalRead(2));
digitalWrite(GPin, HIGH);
delay(1000);
}digitalWrite(GPin, LOW);
}
}
unsigned long currentMillis1 = millis();
if (currentMillis1 - lastTimeButtonStateChanged >= debounceDuration) {
byte buttonState1 = digitalRead(swPie);
if (buttonState1 != lastButtonState1) {
lastTimeButtonStateChanged = currentMillis1;
lastButtonState1 = buttonState1;
if (buttonState1 == HIGH) {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
int r = digitalRead(swPie);
String data = "{\"data\":{\"Humidity\": " + String(h) + ",\"Temperature\": " + String(t) + "}}";
Serial.println(data);
data.toCharArray(msg, (data.length() + 1));
client.publish("@shadow/data/update", msg);
client.loop();
digitalWrite(RPin, HIGH);
delay(1000);
}digitalWrite(RPin, LOW);
}
}
}
unsigned long currentMillis2 = millis();
if (currentMillis2 - lastTimeButtonStateChanged >= debounceDuration) {
byte buttonState2 = digitalRead(swDb);
if (buttonState2 != lastButtonState2) {
lastTimeButtonStateChanged = currentMillis1;
lastButtonState2 = buttonState2;
if (buttonState2 == HIGH) {
if (!client2.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
String url = "/get_data2.php?temp=" + String(t); //ชุด Directory ที่เก็บไฟล์ และตัวแปรที่ต้องการจะฝาก
client2.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client2.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client2.stop();
return;
}
}
// Read all the lines of the reply from server and print them to Serial
while (client2.available()) {
String line2 = client2.readStringUntil('\r');
}
Serial.print("Send to database complete");
digitalWrite(YPin, HIGH);
delay(1000);
}
digitalWrite(YPin, LOW);
}
}
}