Галерея проектов
Любой проект можно открыть, запустить и сделать своей копией. У каждого примера есть разбор: что на схеме, какие библиотеки нужны и что делает код.
Фильтр второго порядка: крутизна вдвое больше
Два RC-звена подряд дают спад не двадцать децибел на декаду, а сорок: за срезом амплитуда падает уже не в десять раз на декаду, а…
Эмиттерный повторитель: усиление по току, а не по напряжению
Напряжение на эмиттере повторяет базу с отставанием на падение перехода: U_э = U_б − 0,7 В, то есть коэффициент передачи по напряж…
Arduino Uno: RGB-светодиод и три канала ШИМ
Цвет собирается из трёх яркостей. На Uno под это уходит три из шести выводов с ШИМ — половина запаса платы на один светодиод.
Arduino Uno: давление, влажность и температура
Три величины с одного датчика по двум проводам. Показания уходят в монитор порта в формате плоттера — вкладка График строит по ним…
Arduino Uno: клавиатура 4x4 без библиотеки
Шестнадцать кнопок на восьми выводах. Сканирование по строкам занимает двадцать строк кода и объясняет, почему у клавиатуры именно…
Arduino Uno: ночник с гистерезисом
Фоторезистор включает свет в темноте. Порогов два, а не один — иначе на границе освещённости лампа щёлкает по десять раз в секунду…
Arduino Uno: прерывание на любом выводе
Обход правила про выводы 2 и 3. У ATmega328P есть второй механизм прерываний, доступный на каждом выводе — ценой одного обработчик…
Arduino Uno: часы реального времени
millis считает от включения и обнуляется при сбросе. Часам нужна микросхема со своей батарейкой — и она же объясняет, зачем в схем…
ArduinoJson: разбор и сборка
Шестая версия и седьмая различаются в первой же строке. Разбор чужого ответа, проверка ошибок и сборка своего.
BME280: три величины сразу
Датчик отдаёт не градусы, а сырые числа и заводские поправки — считает библиотека. Пример показывает, что из этого получается.
FreeRTOS: две задачи
Каждая задача со своим циклом и своей задержкой. loop() при этом остаётся третьей задачей.
FreeRTOS: задачи по ядрам
У ESP32 два ядра. xTaskCreatePinnedToCore прибивает задачу к одному из них — и это видно по xPortGetCoreID().
FreeRTOS: запас стека задачи
Переполнение стека задачи — частая и трудноуловимая авария. Запас лучше померить заранее.
LCD: бегущая строка
Текст длиннее шестнадцати символов показывается окном, которое ползёт по строке.
LCD: меню на двух кнопках
Список пунктов, курсор и выбор. Минимальный интерфейс, из которого вырастает любой прибор.
LCD: термометр
Датчик и дисплей вместе. Собственный символ градуса — потому что в наборе LCD его нет.
Serial: меню одной клавишей
Один символ — одно действие. Быстрый способ дать прибору отладочный интерфейс.
Serial: чтение по строкам
Байты копятся до перевода строки. Без этого команда приходит по кускам.
WiFi: подключение с переподключением
Соединение может пропасть в любой момент. Проверка состояния в loop() — не роскошь.
Автомат освещения: датчик, триггер Шмитта и силовой ключ
Три узла подряд, каждый из которых уже разбирался. Фоторезистор в делителе превращает свет в напряжение; триггер Шмитта сравнивает…
Бегущая строка по цепочке
Четыре модуля — это 32 столбца одного полотна. Строка едет по буферу, а на модули раскладывается по восемь столбцов.
Внутренний термодатчик
Показывает температуру кристалла, а не воздуха: под нагрузкой она заметно выше комнатной.
Датчик влажности почвы
Аналоговый вход и обратная шкала: чем влажнее, тем меньше сопротивление и ниже показание.
Замер времени выполнения
micros() и разница до/после. Первый шаг к оптимизации — узнать, что именно медленное.