Почему ESP8266 не подключается к Wi-Fi при вызове yield()?
Я экспериментирую с ESP8266 и хочу, чтобы он переключался между различными состояниями: включение / выключение светодиода, включение / выключение Wi-Fi и измерение времени подключения, глубокий сон.
Я написал следующий скрипт, используя millis()
для определения временных интервалов. Я вырезал предыдущие части кода, чтобы иметь минимальный тестовый пример.
Я читал, что ESP8266 автоматически включает сторожевой таймер, поэтому я использовал yield()
, когда тратил время на ожидание, вместо того, чтобы использовать пустой цикл while. Я не использовал функцию delay()
, потому что она блокирует дальнейшее выполнение кода, и я стараюсь избегать ее. Я знаю, что это тоже сбросило бы сторожевой таймер.
#include <ESP8266WiFi.h>
const char* ssid = "wifi";
const char* password = "pass";
const int led = 2;
void setup(void){
unsigned long refTime;
pinMode(led, OUTPUT);
Serial.begin(115200);
digitalWrite(led, 1);
refTime = millis();
// исходит отсюда
while ((millis() - refTime) < 3000) { yield(); }
// сюда
Serial.println("Connecting...");
refTime = millis();
WiFi.begin(ssid, password);
Serial.println("");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// никогда не попадает сюда, когда включен код "issue"
Serial.println(millis() - refTime);
digitalWrite(led, 0);
}
void loop(void){
}
Если я использую yield()
, то я никогда не получаю Wi-Fi-соединение (ну, на самом деле это произошло только один раз).
Почему доходность вызывает проблемы?
@FarO, 👍2
Обсуждение1 ответ
Вставьте refTime = millis(); внутри цикла while.
Это не объясняет, почему "выход" мешает установить соединение, @FarO
Как это будет работать? Если вы сделаете это, цикл никогда не закончится., @Nick Gammon
Это не дает ответа на вопрос. Как только у вас будет достаточно [репутации] (https://arduino.stackexchange.com/help/whats-reputation), вы сможете [комментировать любой пост] (https://arduino.stackexchange.com/help/привилегии). /комментарий); вместо этого [дайте ответы, которые не требуют пояснений от спрашивающего](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can -я-делаю-вместо). - [Из обзора](/review/low-quality-posts/55526), @Dmitry Grigoryev
Я хочу, чтобы пользователь, который проголосовал за этот ответ, объяснил свою мотивацию для этого., @Dmitry Grigoryev
- ESP8266 не подключается к Wi-Fi
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Получить час с помощью ctime (библиотека времени с ESP8266)
- Можно ли отключить WiFi на ESP8266?
- Как отключить или остановить точку доступа в ESP8266?
- ESP8266 — действительно ли у него по умолчанию плохой радиус действия Wi-Fi?
- Как подключить ESP8266 с помощью адаптера ESP-01 к Arduino Uno?
- ESP8266 на Wi-Fi без пароля, возможно?
почему бы просто не задержать () 3 секунды?, @dandavis
Потому что таким образом я могу добавить какой-то другой код в основной цикл и все равно получать мерцание вовремя. В этом примере мне это не нужно, но я часто нахожу это полезным. И все же, почему не работает? См. также https://learn.sparkfun.com/tutorials/esp8266-thing-hookup-guide/using-the-arduino-addon., @FarO
код выглядит нормально, но, возможно, попробуйте задержку (1) в цикле вместо yield()..., @dandavis