pinport
Таймер обратного отсчёта
Минуты и секунды на четырёх разрядах. Кнопка запускает и сбрасывает, а отсчёт идёт по millis, а не по delay.
NVS: сохранение рекордов
Запись только при изменении. Ресурс флеша конечен, и переписывать одно и то же в цикле не стоит.
Метеостанция с журналом
Датчик, часы и карта вместе: раз в минуту строка в файл, имя файла — из даты.
Часы с мигающим двоеточием
Отдельного двоеточия у индикатора нет: это старший разряд второй цифры. Отсюда и способ им мигать.
NTPClient: время из сети
Библиотека поверх UDP: свой пакет, свой разбор, свой период обновления. Отличие от configTime — в том, кто владеет временем.
Веб-сервер: щиток из двух реле
Два канала, состояние каждого и кнопка «всё выключить». Показывает, как одна страница управляет несколькими нагрузками и как перед…
Расписание: свет по часам
Включать нагрузку в заданные часы. Проверка написана так, чтобы работать и на промежутке через полночь.
Индикатор духоты
Три величины сводятся в одну оценку. Гистерезис в пороге — иначе индикатор мигает на границе.
Дополняющий фильтр
Акселерометр шумит, гироскоп уплывает. Одна строка фильтра берёт от каждого лучшее — и объясняет, почему.
TM1637: четыре разряда
Индикатор на двух проводах: не I2C, хотя и похоже. Числа, ведущие нули и то, чем показ отличается от вычисления.
Сигнал перегруза
Порог с гистерезисом и усреднением. Заодно — что делает power_down и зачем он нужен на батарее.
TimeLib: время без часов
Библиотека не знает, откуда время, — она его считает. Отсюда её сила и её главная ловушка.
Секундомер
Пуск, стоп, сброс одной кнопкой по длительности нажатия. Состояние — три поля и переход между ними.
NVS: настройки прибора
Строки и числа под именами. Команды из Serial меняют настройки, и они остаются после перезапуска.
Форматирование вывода
Ширина поля, знаки после запятой, шестнадцатеричный вид. Читаемый лог экономит куда больше времени, чем кажется.
Будильник: раз в минуту
Будильник внутри микросхемы: она сама сравнивает время и поднимает признак. Плата может в это время спать.
Матрица 8×8: первая точка
Микросхема после подачи питания выключена, и это первое, обо что спотыкаются. Дальше — точки, строки и вся матрица.
Высота по давлению
Барометрическая высота: считается от давления на уровне моря, и ошибка в этом одном числе смещает всю шкалу.
Датчик освещённости: фоторезистор и АЦП
Фоторезистор включают в делитель с постоянным резистором: U = 3,3·R/(R+R_ф). На свету сопротивление фоторезистора падает до килоом…
Какой стороной вверх
Шесть положений кубика из знаков трёх ускорений. Простая задача, на которой видно, зачем нужен порог уверенности.
Жизнь на матрице
Игра «Жизнь» на поле 8×8 с замыканием краёв. Считается в двух буферах — иначе клетки видят соседей уже нового поколения.
Яркость и выключение
У микросхемы шестнадцать ступеней яркости и настоящее выключение. И то и другое видно на схеме.
Яркость и ночной режим
Восемь ступеней яркости и настоящее гашение. Ночью индикатор в спальне светит как прожектор — отсюда и пример.
Кухонные весы
Вес на индикаторе с округлением до грамма и подавлением дрожания последнего разряда.
HX711: сырые отсчёты
Двадцать четыре разряда тактами и признак готовности на линии данных. С этого начинается всё остальное.
Конфиг в JSON и в памяти
Настройки хранятся строкой JSON в NVS: одно поле вместо десяти ключей, и добавить новое можно не ломая старое.
Несколько задач по времени
Три независимых периода в одном loop(). Каждая задача помнит своё время последнего запуска.
Аппаратный таймер
Прерывание строго по расписанию, независимо от того, чем занят loop(). Точнее любого millis().
FreeRTOS: задачи по ядрам
У ESP32 два ядра. xTaskCreatePinnedToCore прибивает задачу к одному из них — и это видно по xPortGetCoreID().
Веб-сервер: JSON с показаниями
Машиночитаемый ответ вместо страницы. Откройте «Веб-интерфейс» и наберите /data — отсюда данные забирает что угодно, от скрипта до…
Косинус фи: почему двигатель берёт больше, чем написано на шильдике
Двигатель на 1,1 кВт при косинусе 0,8 берёт из сети около 6 ампер, а не 4,8, как следовало бы из одной мощности. Разницу даёт реак…
Второй UART и мост
У ESP32 три аппаратных UART. Второй выводится на любые выводы и работает независимо от отладочного.
Часы: поставить время и читать
Первое, с чего начинается любой скетч с часами: проверить, шли ли они, и поставить время только если нет.
Настольные часы на OLED
Часы и экран на одной шине I2C: два устройства, два провода. Экран перерисовывается только когда сменилась секунда.
Температура из часов
У DS3231 внутри свой термометр — им микросхема поправляет ход кварца. Его можно читать и просто так.
Журнал на карту с отметкой времени
Часы и карта вместе: каждая запись получает время, а не «столько-то миллисекунд с включения».
Реле: слабая кнопка управляет сильной нагрузкой
Кнопка в салоне не рассчитана на ток звукового сигнала. Поэтому кнопка включает катушку реле — тридцать миллиампер, — а контакт ре…
Будни и выходные
День недели микросхема хранит отдельным регистром. Пример показывает, как на нём строить недельное расписание.
Режим по требованию и экономия
Датчик умеет спать между измерениями. Разница режимов и то, чем за неё платят.
Сечение кабеля и номинал автомата
Автомат защищает не прибор, а провод. Пара «C16 на кабеле 1,5 мм²» — самая частая ошибка домашнего щитка: при нагрузке в двадцать…
Уровень: крен и тангаж
Углы считаются из вектора силы тяжести — двумя арктангенсами. Покрутите наклон в свойствах датчика и смотрите на пузырёк.
Свободное падение
Падающий датчик не чувствует силы тяжести: длина вектора уходит к нулю. На этом и строится определение падения.
Шагомер
Шаг — это всплеск длины вектора. Считать всплески без гистерезиса и паузы бесполезно: один шаг насчитается пятью.
Калибровка нуля
У лежащего неподвижно датчика гироскоп показывает не ноль. Смещение снимают один раз при старте и вычитают дальше.
Семисегментный: счётчик
Та же микросхема, другой индикатор. Цифры рисует она сама — если включить знакогенератор.
Термометр на индикаторе
Показать -3.7°C на семисегментном индикаторе: знак, десятые и буква. Буквы C знакогенератор не знает — значит рисуем сегментами са…
Щиток однокомнатной квартиры
Собранный целиком щиток: ввод, счётчик, вводной автомат, противопожарное УЗО и три группы — свет, розетки комнаты, розетки кухни…
Термометр с буквой
Показать -3.7C на четырёх разрядах: знак, десятые и буква. Сегменты приходится задавать руками.
Тара и отрицательный вес
Ноль весов — это не ноль датчика. Что происходит, когда груз снимают после тары, и почему это нормально.
Калибровка: из отсчётов в граммы
Коэффициент подбирается известным грузом один раз и записывается в скетч. Без него на экране будут отсчёты, а не вес.
Preferences: что переживает перезагрузку
Счётчик запусков в NVS. Три строки кода и одна мысль: сброс платы — это не выключение питания, а для NVS разницы нет вовсе.
Preferences: настройки прибора
Несколько значений разных типов, значения по умолчанию и сброс к заводским. Плюс то, о чём молчат: запись изнашивает память.
Почему 60 ампер-часов не значит 60 ампер в течение часа
Тот же аккумулятор, но нагрузка стартерная: две сотни ампер. Паспортная ёмкость измерена неспешным двадцатичасовым разрядом, и при…
Свет в комнате: автомат, выключатель, светильник
Самая частая схема в квартире, собранная правильно. Фаза идёт с автомата на выключатель, с выключателя — на светильник; ноль прихо…
TimeLib и часы: кто кого сверяет
setSyncProvider: библиотека сама раз в пять минут спрашивает время у микросхемы. Одна строка вместо ручной сверки.
Сеть как источник, часы как резерв
Сеть точнее, но её может не быть. Микросхема всегда на месте, но уходит. Правильная схема — сверять первым вторым.
Первый закон Кирхгофа: сколько втекло, столько и вытекло
В любом узле сумма втекающих токов равна сумме вытекающих: ΣI = 0. Здесь ток источника разветвляется на три: I = I₁ + I₂ + I₃. Вет…
Замер времени выполнения
micros() и разница до/после. Первый шаг к оптимизации — узнать, что именно медленное.
FreeRTOS: очередь между задачами
Правильный способ передать данные из задачи в задачу. Общая переменная без защиты рано или поздно подведёт.
Файл во внутренней памяти
SPIFFS даёт обычные файлы поверх флеша: открыть, дописать, прочитать.