• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено Зависание ESP-07 при чтении АЦП

Статус
В этой теме нельзя размещать новые ответы.
Добрый день, господа! Недавно начал проверять данный модуль на работоспособность стандартных ардуиновских команд. Дойдя до analogWrite, столкнулся с переодическими зависаниями устройства. На вход АЦП ничего не подаю, просто оставляю висеть в воздухе, либо прижимаю напрямую к земле. Скетч самый незамысловатый:
Код:
void setup() {
  Serial.begin(115200);
}
void loop() {
  delay(400);  //пробовал разные задержки, результат одинаковый
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (1.0 / 1023.0);
  Serial.println(voltage);
}
При этом выводится несколько показаний и происходит перезагрузка модуля с выводом следующего сообщения (прикрепил изображение).
Заметил, что чем меньше задержка, тем больше показаний модуль успевает выдать, т.е. перезагрузка будто бы связана с каким-то внутренним таймером.
Также тестировал без вывода в UART, просто периодически мигаю диодом и снимаю показания с АЦП. Результат тот же, диод просто на время замирает, а потом снова продолжает мигать.

По железу: CP2102 с напаяным преобразователем LF33 (AMS1117 под рукой не нашлось), DTR, RTS выводы подведены к модулю, прошивается все корректно.
Схема подключения как в этой статье, конденсатор на 100нФ подключен.
 

Вложения

NikitosZs

New member
Питания хватает? У меня вырубалось, пока не поставил довольно большой конденсатор по питанию.
 
Довольно большой это какой? Ток у меня не превышает 0.12А по показаниям USB-амперметра, что для преобразователя напряжения вполне посильно. Конденсатор на 3.3 вольтовой линии есть на модуле USB2UART, но я не знаю емкость.
 

NikitosZs

New member
преобразователь встроен в чип? Типа как cp2102 и прочие или распаян специальный преобразователь на плате преобразователя? Если не знаете ёмкость, то, подозреваю, у вас керамический коричневый конденсатор для фильтрации помех, это не то. Я поставил себе электролитический на 1000мкФ, перестало вырубаться. 1000, конечно, перебор, зватило бы и 270.
 

JustACat

Moderator
Команда форума
Вячеслав, дык у вас же по wdt перезагрузка. Вачдог срабатывает и перегружает модуль. Скорее всего при пользовании циклом нужно сбрасывать wdt в нем постоянно. Я думаю, что так.
 
Про сторожевой таймер я понял из лога. Только вот почему он срабатывает? Ведь периодичность перезагрузок непостоянная, может пройти 5 циклов, а может и больше. Да и задержки я ставил разные.
Насколько я помню, на Мегах в ардуине таймер вачдога использовали под delay(). А если на ESP не так, то как его отключать? И почему он выскакивает при analogRead()?
 

pvvx

Активный участник сообщества
Ваш void loop() не дает работать ни одному системному событию, т.е. таймеру, task и прочим процедурам, отвечающим за работу WiFi и всей операционной системы. WDT по умолчанию 1.6 сек. Сбрасывается по событию таймера в системе каждые 1.6 сек, перед самым срабатыванием, а у вас его сброс сдвигается на 0.2 сек...
delay() использовать нельзя. Вообще. Тут операционная система по событиям, а ядров у CPU всего один :p
loop() использовать тоже нельзя. Только в тупых АрДуринах или многозадачных системах по типу RTOS и то, оно сделано для совместимости для не понимающих логики систем работающих по событиям.
В setup() задаете события и таймеры и описываете их обработчики...
 
Последнее редактирование:
Ваш void loop() не дает работать ни одному системному событию, т.е. таймеру, task и прочим процедурам, отвечающим за работу WiFi и всей операционной системы. WDT по умолчанию 1.6 сек. Сбрасывается по событию таймера в системе каждые 1.6 сек, перед самым срабатыванием, а у вас его сброс сдвигается на 0.2 сек...
delay() использовать нельзя. Вообще. Тут операционная система по событиям, а ядров у CPU всего один :p
loop() использовать тоже нельзя. Только в тупых АрДуринах или многозадачных системах по типу RTOS и то, оно сделано для совместимости для не понимающих логики систем работающих по событиям.
В setup() задаете события и таймеры и описываете их обработчики...
Ну а если это так, то для чего тогда нужно вообще мудрить с Arduino IDE? Вот у меня опыт работы с микроконтроллерами вообще ограничен средой ардуины, и логику систем, работающих по событиям, я, увы, почти не понимаю. А может и совсем не понимаю, если это не похоже, скажем, на Delphi.
Я всегда знал, что для серьезных проектов ардуина малопригодна, но далеко не все проекты претендуют на серьезность. А популярность эта среда получила именно благодаря своей простоте и высокому уровню абстракции. И прототип на ардуине обычно можно сделать достаточно быстро, не углубляясь в тонкости архитектуры контроллера. И если всё это так категорично отрезать, то никакого интернета вещей еще долго не будет, ИМХО
И тогда мне все-равно не понятно две вещи: почему нет ни одного примера, в котором данные моменты были бы освещены?
И почему примеры для ESP работают в Arduino IDE без каких-либо нареканий?
 

pvvx

Активный участник сообщества
И тогда мне все-равно не понятно две вещи: почему нет ни одного примера, в котором данные моменты были бы освещены?
Зачем расстраивать героев блогов?
И почему примеры для ESP работают в Arduino IDE без каких-либо нареканий?
Нет ни одного рабочего примера на Arduino IDE без нареканий. Просто вы пока не знаете все тонкости... Обертка и реклама есть - остальное "обществу потребления" не нужно.
Задача помигать светодиодом и описать это в блоге выполняется.
И если всё это так категорично отрезать, то никакого интернета вещей еще долго не будет, ИМХО
Arduino IDE никак не влияет на систему "интернета вещей". Влияют корпорации и их решения. Временно они могут сделать частное решение под модные направления, но только если это даст им прибыль и возможности новой "игры" с потребителем.
 
Последнее редактирование:

Victor

Administrator
Команда форума
столкнулся с периодическими зависаниями
да, на старой версии 1.6.4-673-g8cd3697 (которая сейчас считается "какбэ стабильной") [inline]analogRead(A0)[/inline] часто приводит к срабатыванию WDT.
Но эта ошибка уже исправлена. Установите nightly build из [inline]http://arduino.esp8266.com/staging/package_esp8266com_index.json[/inline] 1.6.4-835-g77d77e8
У меня на желтой отладочной плате на ADC распаян фоторезистор. при выполнении скетча я его плавно накрывал рукой (чтобы значения менялись)
Вот мой лог на вашем скетче:
Код:
0.12
0.12
0.12
0.12
0.12
0.12
0.12
0.12
0.12
0.12
0.12
0.14
0.15
0.15
0.16
0.19
0.23
0.24
0.29
0.31
0.31
0.15
0.12
0.12
0.12
0.12
0.12
delay() использовать нельзя. Вообще.
Для Arduino IDE для ESP8266 это не верно. Наоборот "нужно чаще" использовать (во всех операциях свыше 50мс) [inline]delay()[/inline] или [inline]yield()[/inline] - по этой команде блокируется только скетч, давая возможность отработать стеку WiFi, TCP и другим функциям SDK.

Обновлять Arduino IDE для ESP8266 нужно вот таким корявым образом
1. В BoardsManagers деинсталлируем "esp8266 by esp8266 Community"
2. чистите C:/users/username/Documents/Arduino/libraries и C:/users/username/AppData/Roaming/Arduino15
3. Устанавливаете esp8266 by esp8266 Community

@pvvx, знаю ваше презрительное отношение к NodeMCU, Arduino IDE и прочим, но посмотрите на Arduino IDE более внимательно и вас наверняка восхитит элегантное решение @igrr переключения контекста
Кроме того, я иногда просто поражаюсь как некоторые функции Arduino IDE стабильно работают на этом глюкавом SDK :)
Надеюсь, что скоро эти слова можно будет сказать про любую функцию Arduino IDE.
Просто сейчас, в период активной разработки Arduino IDE для ESP8266, приходится отслеживать issue и внимательно смотреть и тестировать каждую функцию что, разумеется, усложняет разработку.
Сейчас 118 открытых issue, но радует, что закрытых уже 200.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу