Программа для микроконтроллера ESP32, который взаимодействует с датчиками температуры DS18B20 через интерфейс OneWire и выводит информацию на VGA-дисплей. Сначала подключаются библиотеки: ESP32Video для работы с VGA, шрифт, OneWire и DallasTemperature для датчиков. Потом определяются пины для RGB, синхронизации VGA, датчика и сброса. Создаются объекты для VGA и датчиков.
Переменные deviceCount и numberedDevices, похоже, отслеживают общее количество датчиков и уже пронумерованных. Массив deviceNumbered, вероятно, хранит состояние нумерации каждого датчика.
Функция writeNumberToSensor записывает номер в EEPROM датчика, используя команды OneWire. Номер сохраняется в регистре Alarm High.
Основной цикл проверяет кнопку сброса. Если нажата, вызывается resetNumbering, который обнуляет счетчики и стирает номера в EEPROM всех датчиков. Затем запрашиваются температуры, очищается экран. По факту это аналог программы на Ардуино, но с подключением монитора.
Прогресс-бар отображает процент пронумерованных датчиков. Далее, для каждого непронумерованного датчика проверяется температура. Если выше 27°C, ему присваивается номер, который записывается в EEPROM. Внизу экрана выводится общее количество датчиков и пронумерованных.
Это код для ESP32, который выполняет следующие задачи:
Работа с датчиками температуры DS18B20:
Использует интерфейс OneWire для связи с датчиками
Определяет количество подключенных датчиков (до 60)
Присваивает уникальные номера датчикам при нагреве выше 27°C
Сохраняет номера в EEPROM датчиков
Поддерживает сброс нумерации через отдельную кнопку
Визуализация на VGA-дисплее:
Выводит прогресс-бар с процентом пронумерованных датчиков
Отображает общее количество датчиков и пронумерованных
Использует 3-битный цвет (RGB) для вывода графики
Логика работы:
При первом запуске проверяет существующие номера в EEPROM датчиков
Нумерует датчики по мере их нагрева выше пороговой температуры
Позволяет сбросить нумерацию через физическую кнопку
Обновляет данные каждую секунду
Особенности реализации:
Использует нестандартный видеорежим 320x240 с кастомными таймингами
Хранит номера датчиков в регистре Alarm High (байт 2 скрэтчпада)
Обеспечивает защиту от переполнения (ограничение 60 датчиков)
Имеет индикацию процесса завершения нумерации (зеленый прогресс-бар)
Для работы системы необходимо:
Физическое подключение датчиков к линии OneWire
Наличие кнопки сброса на пине D21
VGA-выход через резистивную схему на указанных пинах
Смотреть скетч
Смотреть скетч + страница мониторинга
Смотреть скетч + страница мониторинга+3f
Хотелось бы сказать о возможности модификации кода с возможностью наблюдать программирование датчиков и одновременно краем гала видеть вспышку. Которая будет указывать на то, что датчик прошился.
Для реализации кратковременной индикации при нумерации каждого датчика с помощью мощного светодиода 5W потребуется внести следующие изменения в код и схему подключения:
Важные рекомендации:
Для питания светодиода используйте отдельный источник 5V/2A
Соедините GND ESP32 с GND источника питания
Используйте радиатор для MOSFET при длительных включениях
Добавьте константу для управления светодиодом:
cpp
const int ledPin = 4; // GPIO для управления светодиодом
В функции setup() инициализируйте пин:
cpp
pinMode(ledPin, OUTPUT);
Модифицируйте блок нумерации датчиков в основном цикле:
cpp
for (int i = 0; i < deviceCount; i++) {
if (sensors.getAddress(tempDeviceAddress, i) && !deviceNumbered[i]) {
float tempC = sensors.getTempC(tempDeviceAddress);
if (tempC > 37.0) {
numberedDevices++;
deviceNumbered[i] = true;
writeNumberToSensor(tempDeviceAddress, numberedDevices);
// Мигание светодиодом
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
Serial.print("Numbered #");
Serial.print(numberedDevices);
Serial.print(" at ");
printAddress(tempDeviceAddress);
Serial.println();
}
}
}