С платой NODEMCU V1.0 приведенный ниже код работает нормально после загрузки/подключения к серверу.
Кажется, что все функции (кнопки) на веб-странице работают нормально, как я и предполагал.
Однако, когда я оставляю веб-страницу на случайное время
без нажатия кнопок или ввода текста, сервер автоматически отключен.
(Время или число отображения больше не менялись.)
Последовательная печать Arduino одновременно показывает «Клиент WebSocket отключен».
Поскольку я использую функцию arduino millis() для отображения времени, когда я перезагружаю веб-страницу после ее отключения, время обычно обновляется до ожидаемого значения независимо от подключения/отключения.
/>Кстати Я серьезно новичок в этом. Так что любое решение мне очень поможет. Спасибо
Код: Выделить всё
#include
#include
const char* ssid = "SSID";
const char* password = "PASSWORD";
AsyncWebServer server(80);
AsyncWebSocket ws("/ws"); // WebSocket path
// read value of A0
int analogValue1;
// Reset displaying time
unsigned long millisOffset = 0;
// WiFi connection
void WifiConnect() {
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
// WebSocket Event process
void onWebSocketEvent(AsyncWebSocket *server,
AsyncWebSocketClient *client,
AwsEventType type,
void *arg,
uint8_t *data,
size_t len) {
//
if (type == WS_EVT_CONNECT) {
Serial.println("WebSocket Client Connected");
//
} else if (type == WS_EVT_DISCONNECT) {
Serial.println("WebSocket Client Disconnected");
// Received data
} else if (type == WS_EVT_DATA) {
String receivedData = "";
for (size_t i = 0; i < len; i++) {
receivedData += (char)data[i];
}
// LED Control
if (receivedData == "LED_ON") {
digitalWrite(D0, HIGH);
Serial.println("LED turned ON");
} else if (receivedData == "LED_OFF") {
digitalWrite(D0, LOW);
Serial.println("LED turned OFF");
// Reset display time
} else if (receivedData == "reset") {
millisOffset = millis();
}
}
}
// Arduino setup
void setup() {
Serial.begin(115200);
delay(10);
pinMode(D0, OUTPUT);
digitalWrite(D0, LOW);
WifiConnect();
// WebSocket event handler
ws.onEvent(onWebSocketEvent);
server.addHandler(&ws);
// HTML page
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send_P(200, "text/html", R"rawliteral(
Real-Time A0 Logger with LED Control
body { font-family: Arial, sans-serif; }
#log { max-height: 400px; overflow-y: scroll; border: 1px solid #ccc; padding: 10px; margin-bottom: 10px; }
button { margin: 5px; }
#event-status { color: red; font-weight: bold; margin-top: 10px; }
let socket = new WebSocket("ws://" + window.location.host + "/ws");
let logging = false;
let logContainer;
let logs = []; // All log
let displayLogs = []; // Newest log
let logIndex = 1; // log number
let maxEntries = 100; // limit of log for save (initial = 100)
window.onload = function() {
logContainer = document.getElementById('log');
const maxEntriesInput = document.getElementById('max-entries');
const eventStatus = document.getElementById('event-status');
// WebSocket message
socket.onmessage = function(event) {
const [millis, value] = event.data.split(',');
if (logging) {
if (logs.length < maxEntries) {
const logEntry = formatLogEntry(logIndex, millis, value);
logs.push(logEntry);
} else {
eventStatus.innerText = "Event collected";
}
logIndex++;
const displayLogEntry = formatLogEntry(logIndex, millis, value);
displayLogs.push(displayLogEntry);
if (displayLogs.length > 100) {
displayLogs.shift();
}
updateDisplayLogs();
}
document.getElementById('current-value').innerText = `Value: ${value}, Time: ${millis} ms`;
};
// 버튼 동작
document.getElementById('start').onclick = () => {
logging = true;
eventStatus.innerText = "";
};
document.getElementById('stop').onclick = () => { logging = false; };
document.getElementById('reset').onclick = () => {
logs = [];
displayLogs = [];
logContainer.innerHTML = '';
logIndex = 1;
eventStatus.innerText = "";
socket.send("reset");
};
document.getElementById('download').onclick = () => {
downloadLogs();
};
document.getElementById('led-on').onclick = () => {
socket.send("LED_ON");
};
document.getElementById('led-off').onclick = () => {
socket.send("LED_OFF");
};
document.getElementById('set-size').onclick = () => {
const newSize = parseInt(maxEntriesInput.value, 10);
if (!isNaN(newSize) && newSize > 0) {
maxEntries = newSize;
eventStatus.innerText = `Max entries updated to ${maxEntries}`;
} else {
alert("Please enter a valid positive number.");
}
};
};
function updateDisplayLogs() {
logContainer.innerHTML = '';
displayLogs.forEach((log) => {
const logElement = document.createElement('div');
logElement.textContent = log;
logContainer.appendChild(logElement);
});
logContainer.scrollTop = logContainer.scrollHeight;
}
function formatLogEntry(index, millis, value) {
return `#${index.toString().padStart(5, '0')} ${millis} ms ${value.toString().padStart(4, '0')}`;
}
function downloadLogs() {
const blob = new Blob([logs.join('\n')], { type: 'text/plain' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'logs.txt';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
Real-Time A0 Logger with LED Control
Current A0 Value: Waiting...
Start Display
Stop Display
Reset Log
Download Log
LED ON
LED OFF
Max Entries:
Set Size
)rawliteral");
});
server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send(204);
});
server.begin();
}
void loop() {
analogValue1 = analogRead(A0);
String message = String(millis() - millisOffset) + "," + String(analogValue1);
ws.textAll(message);
delay(10);
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... ndom-times