//Generated Date: Fri, 14 Apr 2023 04:33:19 GMT
#include <WiFi.h>
#include <PubSubClient.h>
#include <ESP32Servo.h> //請先安裝ESP32Servo程式庫
#define MQTT_USER "32043463645"
#define MQTT_PASSWORD "DKH7ZC9G9XYU22WC5P"
#include <Ultrasonic.h>
Servo myServo; //建立一個伺服馬達物件
int dis = 0;
int value = 50;
void servo_rotate_esp(int channel, int angle) {
int val = 7864-angle*34.59;
if (val > 7864)
val = 7864;
else if (val < 1638)
val = 1638;
ledcWrite(channel, val);
}
char _lwifi_ssid[] = "Wokwi-GUEST";
char _lwifi_pass[] = "";
const char* mqtt_server = "iot.cht.com.tw";
const unsigned int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient mqtt_client(espClient);
String mqtt_data = "";
void mqtt_sendText(String topic, String text) {
String clientId = "26396";
if (mqtt_client.connect(clientId.c_str(), MQTT_USER, MQTT_PASSWORD)) {
mqtt_client.publish(topic.c_str(), text.c_str());
}
}
void reconnect() {
while (!mqtt_client.connected()) {
String mqtt_clientId = "26396";
if (mqtt_client.connect(mqtt_clientId.c_str(), MQTT_USER, MQTT_PASSWORD)) {
Serial.println("MQTT OK");
mqtt_client.subscribe("/v1/device/32043463645/sensor/set_ultra_dis/rawdata");
} else {
delay(5000);
}
}
}
Ultrasonic ultrasonic(13, 12);
int read_msg(int i, String r_msg) {
int dis_thd = 0;
String thd_str = "";
while ((mqtt_data).charAt((i - 1)) != '"') {
thd_str = String(thd_str)+String((mqtt_data).charAt((i - 1)));
i = i + 1;
}
dis_thd = thd_str.toInt();
Serial.println((String("threshold:")+String(dis_thd)));
return (dis_thd);
}
String set_msg(String id, String msg) {
return (String("[{")+String(String('"')+String("id")+String('"')+String(":")+String('"')+String(id)+String('"')+String(","))+String(String('"')+String("value")+String('"')+String(":[")+String('"')+String(msg)+String('"')+String("]"))+String("}]"));
}
void setup()
{
//ledcSetup(0, 50, 16);
//ledcAttachPin(4, 0);
Serial.begin(9600);
myServo.attach(4, 500, 2400);
randomSeed(micros());
mqtt_client.setServer(mqtt_server,mqtt_port);
mqtt_client.setCallback(callback);
//mqtt_client.setBufferSize(1024);
servo_rotate_esp(0,90);
Serial.println("wifi 連線....");
WiFi.disconnect();
WiFi.softAPdisconnect(true);
WiFi.mode(WIFI_STA);
WiFi.begin(_lwifi_ssid, _lwifi_pass);
while (WiFi.status() != WL_CONNECTED) { delay(500); }
delay(300);
Serial.println("MQTT 連線....");
}
void loop()
{
if (!mqtt_client.connected()) {
reconnect();
}
mqtt_client.loop();
dis = ultrasonic.read();
mqtt_sendText("/v1/device/32043463645/rawdata", (set_msg("ultra_dis", String(dis))));
Serial.println((String("感設距離:")+String(dis)));
if (dis < value) {
//servo_rotate_esp(0,0);
myServo.write(0);//轉到0度
tone(2, 262);
mqtt_sendText("/v1/device/32043463645/rawdata", (set_msg("servo", "開")));
} else {
//servo_rotate_esp(0,180);
myServo.write(180);//轉到0度
noTone(2);
mqtt_sendText("/v1/device/32043463645/rawdata", (set_msg("servo", "關")));
}
delay(1000);
}
void callback(char* topic, byte* payload, unsigned int length) {
mqtt_data = "";
for (int ci = 0; ci < length; ci++) {
char c = payload[ci];
mqtt_data+=c;
}
if (String(topic)=="/v1/device/32043463645/sensor/set_ultra_dis/rawdata"&&mqtt_data!="[]") {
Serial.println((mqtt_data));
value = read_msg(112, mqtt_data);
}
}