Код библиотеки Arduino LiquidCrystal предотвращает запуск ESP32. Для отображения символов 16x2
Смотрите внизу для решения.
Я пытаюсь запустить пример библиотеки Arduino LiquidCrystal HelloWorld.ino на ESP32. Похоже, что он даже никогда не выполняет цикл Setup (). ESP сбрасывается через восемь секунд, а затем повторяет цикл.
Я уже много раз использовал символьный ЖК-дисплей (с Arduino), но всегда использовал I2C. Для текущего дизайна я исключаю параллельный чип I2C и вместо этого управляю ЖК-дисплеем непосредственно с ESP32. Я использую 4-битный режим, чтобы уменьшить количество необходимых контактов. Я подключил регистр выбора, включения и D4-D7. Эти сведения не имеют отношения к делу, поскольку ESP32 даже не работает с библиотекой LiquidCrystal.
Я просмотрел код библиотеки и не увидел ничего, что, по моему мнению, могло бы стать проблемой. Но я разработчик аппаратного обеспечения (уже 36 лет), а не программист. Я использую Arduino IDE, потому что это быстрое и простое тестирование оборудования.
Код библиотеки можно найти здесь. https://github.com/arduino-libraries/LiquidCrystal/tree/master/src
Это то, что я получаю от последовательного монитора.
rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1240
load:0x40078000,len:13012
load:0x40080400,len:3648
entry 0x400805f8
ets Jun 8 2016 00:22:57
Я попробовал пример кода, и когда это не сработало, я добавил в код пару строк последовательной печати. Я перечисляю это ниже.
#include <LiquidCrystal.h>
const int rs = 26, en = 25, d4 = 16, d5 = 17, d6 = 18, d7 = 19;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
Serial.begin(115200);
Serial.println("Start");
lcd.begin(16, 2);
lcd.print("hello, world!");
}
void loop() {
delay(1000);
lcd.setCursor(0, 1);
lcd.print(millis() / 1000);
Serial.println(millis() / 1000);
}
Детали, которые я не перечислил выше. Я питаю ЖК-дисплей от 5 вольт. Линии передачи данных/управления ЖК-дисплеем указаны как VinLo = 0,55 В и VinHi = 2,4 вольта. Не то чтобы это имело значение, поскольку приведенный выше код никогда не выполняется. Я использовал Arduino Nano с напряжением 3,3 вольта, выполнив приведенный выше код, чтобы подтвердить, что дисплей действительно работает в этих условиях. Я действительно хочу, чтобы это работало с ESP32-C3. Я пробовал это изначально, но переключился на ESP32, потому что он не работал с кодом.
Я надеюсь, что кто - нибудь сможет дать здесь некоторые рекомендации. Мой другой вариант-не использовать библиотеку и писать свой собственный код, что в конечном итоге оказывается грубой силой и упрощением.
ОБНОВЛЕНИЕ:
Большое спасибо Майенко, который был на высоте. После удаления вызова код выполняется правильно.
@Rudy, 👍0
Обсуждение1 ответ
Лучший ответ:
Мое предположение:
- конструктор вызывает
LiquidCrystal::init()
. LiquidCrystal::init()
вызываетLiquidCrystal::begin()
.LiquidCrystal::begin()
использует задержки.
Эти задержки могут зависеть от того, что еще не настроено при запуске конструкторов, и могут привести к блокировке, вызывающей WDT.
Удалите вызов функции begin()
в функции LiquidCrystal::init ()
, и она должна, по крайней мере, завершить запуск конструктора, чтобы выполнить остальную часть вашего кода.
Совершенно непонятно, почему у них там такой звонок, - это выше моего понимания. Правило номер один при написании библиотеки Arduino: никогда не выполняйте никаких операций, более сложных, чем назначение переменных в конструкторе, поскольку ресурсы, на которые вы можете положиться, возможно, еще не были инициализированы.
Я предполагаю, что причина заключалась в том, что они хотели, чтобы дисплей также работал, если вы не вызываете "begin ()" в " setup ()". Платы AVR не имеют обработки исключений, поэтому общее правило, по-видимому, звучит так: "Давайте всегда лучше угадывать, чего хотел пользователь, когда что-то не так"., @PMF
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- Библиотека ардуино или код для ESP32 для сканирования устройств Bluetooth?
- Параллельная проводка TFT с ESP32
- Невозможно установить библиотеку esp_camera
- Чтение OID SNMP V2 из ESP8266/ESP32
- ESP32 Arduino Bluetooth Serial не подключается повторно после отключения
- Как установить подсветку дисплея 16x2 LCD I2C?
- Arduino создает массив Json с двойными значениями и 2 десятичными знаками
Мое предположение: конструктор вызывает
::init()
.::init()
вызывает::begin()
.::begin()
использует задержки. Эти задержки могут зависеть от того, что еще не настроено при запуске конструкторов, и могут привести к блокировке, вызывающей WDT. Эта библиотека выглядит плохо написанной TBH. Удалите вызов "begin () "в функции":: init ()"., @MajenkoУ меня совсем недавно была похожая проблема. Я пытался заставить дисплей I2C работать на ESP32 с помощью библиотеки adafruit, но безуспешно. Затем я пошел дальше и использовал другую библиотеку ЖК-дисплеев. (Отладка библиотеки была для меня недоступна, так как все, что я хотел сделать, это протестировать шину I2C)., @PMF
Совет: Установите https://github.com/me-no-dev/EspExceptionDecoder. Затем вы можете вставить строку с надписью "Обратный путь" из аварийного дампа ESP32 в этот инструмент и получить хорошую трассировку стека. Очень полезно., @PMF
@PMF Код не выполнялся, так что обратного пути для изучения не было. Майенко попал в точку со своим комментарием "Удалить вызов begin() в функции ::init ()". Я удалил этот вызов, и теперь код выполняется и работает должным образом., @Rudy