Код библиотеки 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, потому что он не работал с кодом.

Я надеюсь, что кто - нибудь сможет дать здесь некоторые рекомендации. Мой другой вариант-не использовать библиотеку и писать свой собственный код, что в конечном итоге оказывается грубой силой и упрощением.

ОБНОВЛЕНИЕ:

Большое спасибо Майенко, который был на высоте. После удаления вызова код выполняется правильно.

, 👍0

Обсуждение

Мое предположение: конструктор вызывает ::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


1 ответ


Лучший ответ:

2

Мое предположение:

  • конструктор вызывает LiquidCrystal::init().
  • LiquidCrystal::init() вызывает LiquidCrystal::begin().
  • LiquidCrystal::begin() использует задержки.

Эти задержки могут зависеть от того, что еще не настроено при запуске конструкторов, и могут привести к блокировке, вызывающей WDT.

Удалите вызов функции begin() в функции LiquidCrystal::init (), и она должна, по крайней мере, завершить запуск конструктора, чтобы выполнить остальную часть вашего кода.

Совершенно непонятно, почему у них там такой звонок, - это выше моего понимания. Правило номер один при написании библиотеки Arduino: никогда не выполняйте никаких операций, более сложных, чем назначение переменных в конструкторе, поскольку ресурсы, на которые вы можете положиться, возможно, еще не были инициализированы.

,

Я предполагаю, что причина заключалась в том, что они хотели, чтобы дисплей также работал, если вы не вызываете "begin ()" в " setup ()". Платы AVR не имеют обработки исключений, поэтому общее правило, по-видимому, звучит так: "Давайте всегда лучше угадывать, чего хотел пользователь, когда что-то не так"., @PMF