Uno Wifi rev2 - после долгого времени отключается
У вас есть Arduino Uno Wifi Rev2 с этим небольшим Wi-Fi-модулем U-blox NINA.
Все отлично работает, однако через долгое время (точнее сказать не могу, но мы говорим здесь о неделях, если не месяцах) вдруг отключается.
Эта плата находится без присмотра, и единственный способ восстановить ее — перезагрузить Arduino.
Вот мой код:
WiFiServer server(PORT);
void setup() {
connectToWifi();
server.begin();
}
void connectToWifi() {
// попытка подключения к сети Wi-Fi:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Подключиться к сети WPA/WPA2. Измените эту строку, если используете открытую сеть или сеть WEP:
status = WiFi.begin(ssid, pass);
if (status == WL_CONNECTED) break;
// ждем 10 секунд для соединения:
delay(10000);
}
}
void loop() {
// проверить статус WiFi
if (WL_CONNECTED != WiFi.status()) connectToWifi();
WiFiClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
... (other wifi-unrelated code)
// закрыть соединение:
client.stop();
}
}
}
}
Когда он отключается от Wi-Fi, консоль диспетчера dhcp маршрутизатора показывает его статус "ожидание".
Примечание: я единственный клиент, и в Arduino одновременно отправляется только один символ, после чего сокет закрывается. Очень маловероятно, что клиент зависнет, а плата застряла в цикле while.
Это известная проблема, или мне нужно больше разбираться в этом?
Спасибо!
@Daniel, 👍0
Обсуждение1 ответ
Поскольку вы не предоставили подробностей, необходимо кое-что проверить
- ваша прошивка Nina > 1.2.4
- Если нет, обновитесь до последней версии 1.3.0 с помощью WiFi101-FirmwareUpdater-Plugin 0.10. .10 входит в состав ArduinoIDE 1.8.12 или более поздней версии
- Отключиться перед повторным подключением (в случае отключения маршрутизатора) и
- Закройте все соединения перед отправкой/получением. Это освободит сокет на модуле Nina. Остановите клиент после выполнения необходимых действий с помощью
client.stop();
- Если в настройке есть какой-либо код подключения к серверу, его следует запустить в процедуре повторного подключения (поскольку вы не включили настройку) просто в качестве подсказки
Убедитесь, что по прошествии определенного времени
while (status != WL_CONNECTED)
иwhile (client.connected())
не работают, а тестирование ошибок выполняется поместите, например,
if (status==WL_DISCONNECTED || status==WL_CONNECTION_LOST){.. сделайте что-нибудь, чтобы изменить это ..}
Если ничего не помогает, реализуйте процедуру, которая проверяет сигнал и перезапускает скетч, если маршрутизатор отключился (по какой-либо причине).
Код отключения:
void connectToWifi() {
// Эта новая строка необходима для разрыва предыдущего соединения, иначе
// он попытается использовать старое соединение и никогда не переподключится в случае сбоя соединения
status = WiFi.disconnect();
// попытка подключения к сети Wi-Fi:
while (status != WL_CONNECTED) {
.... REST of your code ...
}
}
Подсказка (поскольку вы не показали настройки), если у вас есть что-то вроде
client.connect(server, 80);
переместите его в процедуру переподключения в виде
if (client.connect(server, 80)) {
Serial.println("connecting...");
.... REST of reconnect ...
}
Перезапустить код при потере сигнала Wi-Fi
void(* resetFunc) (void) = 0; // Объявить функцию сброса по адресу 0
void loop() {
if (WiFi.RSSI() == 0) // Проверяет, не потерян ли сигнал Wi-Fi.
{ resetFunc(); // Вызывает сброс
}
// Остальной код идет сюда.
}
Это в целом должно обеспечить долгую и стабильную работу клиента
Спасибо, пункты 1-2-3 могу проверить, когда вернусь к плате. client.stop();
на самом деле вызывается, я обновил Q. server.begin
вызывается только один раз в настройке - Q обновляется. Мне нужно вызывать server.begin
после каждого вызова connectToWifi
?, @Daniel
Нет, не server.begin(), это нормально - пожалуйста, дайте информацию о вашей схеме сети. Есть ли клиенты, подключенные к UNO (server.begin указывает на это), и UNO действует как клиент для другого сервера. Или UNO единственный сервер? . Трудно работать с хлебными крошками (какие библиотеки вы используете, как называется String clas, что прикреплено к UNO, ... Чем больше информации, тем точнее ответы вы получите, @Codebreaker007
UNO работает как сервер. Один клиент очень редко (раз в неделю) подключается к нему, отправляет 1 символ в качестве команды, затем UNO отвечает client.print("response");
(всегда только 1 строка). Очень простая логика: UNO считывает какой-то GPIO и ставит его в ответ., @Daniel
У меня была версия 1.2.4 на NINA, теперь обновлена до 1.3.0. Также добавлена строка status = WiFi.disconnect();
в подпрограмму connectToWifi
. Держу пальцы скрещенными., @Daniel
- Ошибка при загрузке кода в esp8266 через arduino (FatalError('Failed to connect to %s: %s' % (self.CHIP_NAME, last_error)))
- TCCR1B' не был объявлен в этой области
- avrdude: usbdev_open(): невозможно открыть устройство: в доступе отказано
- Пароль MD5 в Sketch
- Строка JSON для Arduino WiFi версии 2
- Могу ли я обойти очень долгое время, чтобы настроить WIFI-соединение WPA2 Personal?
- Отправка значений из arduino uno в wemos d1 r1
- Ошибка Udp.endPacket
Вы используете новейшие версии прошивки и библиотеки?, @Juraj
Я обновил его в конце прошлого года. До тех пор он остается без присмотра, и это уже второй раз, когда такая ситуация. (после первого раза нам пришлось подать питание на плату). Поэтому я не уверен, что это последняя версия, и я не могу ее запросить, так как она находится далеко и потеряла связь., @Daniel