-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathESP32_3 (Send)
More file actions
185 lines (162 loc) · 4.84 KB
/
ESP32_3 (Send)
File metadata and controls
185 lines (162 loc) · 4.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// 感測器通信參數(同上)
#define COM 0x55
#define BAUD_RATE 115200
#define TIMEOUT_MS 500
#define MAX_DISTANCE_CM 600.0
// 感測器引腳
#define RXD_BACK 16 // UART2 RX
#define TXD_BACK 17 // UART2 TX
HardwareSerial SerialSensorBack(2);
#define RXD_SIDE_LEFT 18 // UART1 RX
#define TXD_SIDE_LEFT 19 // UART1 TX
HardwareSerial SerialSensorSideLeft(1);
// Wi-Fi設置(同上)
const char* ssid = "ESP32_Webserver";
const char* password = "12345678";
const char* serverUrl = "http://192.168.40.1/update";
// 感測器數據
float currentDistanceBack = -1.0;
float currentDistanceSideLeft = -1.0;
// 緩衝區
unsigned char buffer_Back[4] = {0};
unsigned char buffer_SideLeft[4] = {0};
// 讀取計時
unsigned long lastSensorReadTime = 0;
// 函數宣告(同上)
void setup() {
Serial.begin(BAUD_RATE);
SerialSensorBack.begin(BAUD_RATE, SERIAL_8N1, RXD_BACK, TXD_BACK);
SerialSensorSideLeft.begin(BAUD_RATE, SERIAL_8N1, RXD_SIDE_LEFT, TXD_SIDE_LEFT);
// 連接Wi-Fi(同上)
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
delay(1000);
}
void loop() {
if (millis() - lastSensorReadTime >= 1000) {
// 讀取back
SerialSensorBack.write(COM);
if (readSensorData(SerialSensorBack, buffer_Back)) {
if (validateChecksum(buffer_Back)) {
float newDistance = extractDistance(buffer_Back);
if (newDistance > 0.0 && newDistance <= MAX_DISTANCE_CM) {
currentDistanceBack = newDistance;
}
} else {
Serial.println("Back: Checksum error");
debugRawData(SerialSensorBack, "Back");
}
} else {
Serial.println("Back: No complete data received");
debugRawData(SerialSensorBack, "Back");
clearSerialBuffer(SerialSensorBack);
}
// 讀取side_left
SerialSensorSideLeft.write(COM);
if (readSensorData(SerialSensorSideLeft, buffer_SideLeft)) {
if (validateChecksum(buffer_SideLeft)) {
float newDistance = extractDistance(buffer_SideLeft);
if (newDistance > 0.0 && newDistance <= MAX_DISTANCE_CM) {
currentDistanceSideLeft = newDistance;
}
} else {
Serial.println("Side Left: Checksum error");
debugRawData(SerialSensorSideLeft, "Side Left");
}
} else {
Serial.println("Side Left: No complete data received");
debugRawData(SerialSensorSideLeft, "Side Left");
clearSerialBuffer(SerialSensorSideLeft);
}
// 顯示
Serial.print("Back: ");
if (currentDistanceBack < 0.0) {
Serial.print("N/A");
} else {
Serial.print(currentDistanceBack, 1);
}
Serial.print(" cm, Side Left: ");
if (currentDistanceSideLeft < 0.0) {
Serial.print("N/A");
} else {
Serial.print(currentDistanceSideLeft, 1);
}
Serial.println(" cm");
// 發送數據
sendDataToServer();
lastSensorReadTime = millis();
}
}
void sendDataToServer() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(serverUrl);
http.addHeader("Content-Type", "application/json");
StaticJsonDocument<200> doc;
doc["back"] = currentDistanceBack;
doc["side_left"] = currentDistanceSideLeft;
String json;
serializeJson(doc, json);
int httpCode = http.POST(json);
if (httpCode > 0) {
Serial.printf("HTTP POST code: %d\n", httpCode);
} else {
Serial.println("HTTP POST error");
}
http.end();
} else {
Serial.println("WiFi not connected");
}
}
// 其他函數同上
bool readSensorData(HardwareSerial &sensor, unsigned char *buffer) {
unsigned long startTime = millis();
while (sensor.available() < 4 && millis() - startTime < TIMEOUT_MS) {
// 等待數據或超時
}
if (sensor.available() >= 4) {
if (sensor.read() == 0xFF) {
buffer[0] = 0xFF;
for (int i = 1; i < 4; i++) {
buffer[i] = sensor.read();
}
return true;
} else {
return false; // 第一個字節不是0xFF
}
}
return false; // 數據不足
}
bool validateChecksum(unsigned char *buffer) {
uint8_t cs = buffer[0] + buffer[1] + buffer[2];
return buffer[3] == cs;
}
float extractDistance(unsigned char *buffer) {
int distance_mm = (buffer[1] << 8) + buffer[2]; // 原始距離(毫米)
return distance_mm / 10.0; // 轉換為厘米(浮點數)
}
void clearSerialBuffer(HardwareSerial &sensor) {
while (sensor.available()) {
sensor.read();
}
}
void debugRawData(HardwareSerial &sensor, const char *sensorName) {
Serial.print(sensorName);
Serial.print(" Raw Data: ");
if (sensor.available()) {
while (sensor.available()) {
Serial.print(sensor.read(), HEX);
Serial.print(" ");
}
} else {
Serial.print("No data");
}
Serial.println();
}