#include <WiFi.h>
#include <WiFiClient.h>
#include "SR04.h"
#define TRIG_PIN 12
#define ECHO_PIN 14
#define LED_PIN 2 // ESP32的GPIO2引脚(注意:GPIO2在某些启动模式下可能需要上拉电阻)
#define BEEP_PIN 5
SR04 sr04(ECHO_PIN, TRIG_PIN);
WiFiClient TCPclient;
// 巴法云服务器地址和端口
#define TCP_SERVER_ADDR "bemfa.com"
#define TCP_SERVER_PORT 8344
// 用户私钥和主题名(在巴法云控制台获取)
String UID = "c93488d0c74d4b12965cba6651f04d98";
String TOPIC = "chaoshengbo";
// 连接WiFi
void startSTA() {
WiFi.disconnect();
WiFi.mode(WIFI_STA);
WiFi.begin("Wokwi-GUEST", ""); // Wokwi仿真平台的默认WiFi设置,实际硬件应使用正确的SSID和密码
}
// 初始化TCP客户端并连接到服务器
void startTCPClient() {
if (TCPclient.connect(TCP_SERVER_ADDR, TCP_SERVER_PORT)) {
Serial.println("Connected to TCP server");
// 发送订阅指令(如果需要)
// String tcpTemp = "cmd=1&uid=" + UID + "&topic=" + TOPIC + "\r\n";
// TCPclient.print(tcpTemp);
} else {
Serial.println("Failed to connect to TCP server");
TCPclient.stop();
}
}
// 发送数据到TCP服务器(巴法云)
void sendToBafaCloud(int distance) {
if (!TCPclient.connected()) {
startTCPClient();
if (!TCPclient.connected()) {
Serial.println("Failed to reconnect to TCP server");
return;
}
}
// 构建发送的数据字符串
String data = "uid=" + UID + "&topic=" + TOPIC + "&distance=" + String(distance) + "\r\n";
TCPclient.print(data);
Serial.println("Sent to Bafa Cloud: " + data);
}
/*
WiFiTick
检查是否需要初始化WiFi
检查WiFi是否连接上,若连接成功启动TCP Client
控制指示灯
*/
void doWiFiTick(){
static bool startSTAFlag = false;
static bool taskStarted = false;
static uint32_t lastWiFiCheckTick = 0;
if (!startSTAFlag) {
startSTAFlag = true;
startSTA();
Serial.printf("Heap size:%d\r\n", ESP.getFreeHeap());
}
//未连接1s重连
if ( WiFi.status() != WL_CONNECTED ) {
if (millis() - lastWiFiCheckTick > 1000) {
lastWiFiCheckTick = millis();
}
}
//连接成功建立
else {
if (taskStarted == false) {
taskStarted = true;
Serial.print("\r\nGet IP Address: ");
Serial.println(WiFi.localIP());
startTCPClient();
}
}
}
// 读取超声波测距模块的距离
int readUltrasonicDistance() {
return sr04.Distance();
}
// 控制LED和蜂鸣器
void controlLEDAndBeep(int distance) {
int ledState = (distance >= 50) ? HIGH : LOW;
digitalWrite(LED_PIN, ledState);
if (ledState == HIGH) {
for (int i = 0; i < 80; i++) {
digitalWrite(BEEP_PIN, HIGH);
delay(5);
digitalWrite(BEEP_PIN, LOW);
delay(5);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(BEEP_PIN, OUTPUT);
startSTA();
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("WiFi connected");
startTCPClient();
}
void loop() {
int distance = readUltrasonicDistance();
Serial.print("Distance: ");
Serial.println(distance);
controlLEDAndBeep(distance);
sendToBafaCloud(distance);
delay(1000); // 每隔一秒读取一次距离并发送数据
}