• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу