Галерея проектов
Любой проект можно открыть, запустить и сделать своей копией. У каждого примера есть разбор: что на схеме, какие библиотеки нужны и что делает код.
FreeRTOS: задачи по ядрам
У ESP32 два ядра. xTaskCreatePinnedToCore прибивает задачу к одному из них — и это видно по xPortGetCoreID().
FreeRTOS: запас стека задачи
Переполнение стека задачи — частая и трудноуловимая авария. Запас лучше померить заранее.
FreeRTOS: мьютекс
Две задачи пишут в один Serial. Без мьютекса строки перемешиваются посреди слова.
FreeRTOS: очередь между задачами
Правильный способ передать данные из задачи в задачу. Общая переменная без защиты рано или поздно подведёт.
FreeRTOS: сигнал из прерывания
Обработчик должен быть коротким. Он лишь отдаёт семафор, а работу делает задача.
HTTP-запрос
Клиент, код ответа и тело. Ответ читается целиком в строку — для больших страниц так делать не надо.
HX711: сырые отсчёты
Двадцать четыре разряда тактами и признак готовности на линии данных. С этого начинается всё остальное.
LCD 16x2: первый текст
Дисплей на I2C: два провода данных вместо шести. Адрес обычно 0x27, реже 0x3F — проверяется сканером шины.
LCD: бегущая строка
Текст длиннее шестнадцати символов показывается окном, которое ползёт по строке.
LCD: меню на двух кнопках
Список пунктов, курсор и выбор. Минимальный интерфейс, из которого вырастает любой прибор.
LCD: счётчик секунд
Обновление одной строки без очистки всего экрана: мигания не будет.
LCD: термометр
Датчик и дисплей вместе. Собственный символ градуса — потому что в наборе LCD его нет.
Блок питания целиком: от розетки до стабильных пяти вольт
Здесь собрано всё, что до этого разбиралось по частям. Переменное напряжение выпрямляется мостом, сглаживается электролитом до пул…
Верхний ключ: почему нельзя повторить нижний
Нижний ключ ставят между нагрузкой и землёй, и управлять им просто: затвор относительно истока, а исток на земле. Верхний ключ сто…
Внутреннее сопротивление: почему батарейка проседает
У любого источника есть внутреннее сопротивление r, и оно включено последовательно с нагрузкой. Напряжение на клеммах равно U = E…
Вольт-амперная характеристика: снимаем кривую сами
Прибор в режиме XY рисует зависимость тока от напряжения: по горизонтали напряжение на детали, по вертикали — напряжение на токово…
Вход АЦП: делитель под три с половиной вольта
Вход контроллера считает напряжение от нуля до 3,3 В и возвращает код от 0 до 4095: код = U·4095/3,3. Измерять им двенадцативольто…
Датчик движения и контактор
Датчик движения рассчитан на несколько ампер и не тянет освещение подъезда напрямую. Он включает катушку контактора, а силовые кон…
Датчик освещённости: фоторезистор и АЦП
Фоторезистор включают в делитель с постоянным резистором: U = 3,3·R/(R+R_ф). На свету сопротивление фоторезистора падает до килоом…
Два канала: сдвиг фазы и фигура Лиссажу
RC-цепь не только уменьшает амплитуду, но и задерживает сигнал по фазе: φ = −arctg(2π·f·R·C). Ровно на частоте среза сдвиг равен 4…
Двухклавишный выключатель на две группы света
Одна фаза приходит на выключатель, две уходят на разные светильники. Так делают люстру с раздельным включением рожков — и так же э…
Двухтактный каскад: откуда берётся «ступенька»
Пара n-p-n и p-n-p работает по очереди: верхний транзистор тянет нагрузку вверх, нижний — вниз. Ток покоя почти нулевой, поэтому К…
Делитель для входа контроллера: 5 В в 3,3 В
Вход микроконтроллера не терпит напряжения выше своего питания, а датчики часто пятивольтовые. Делитель решает это одним расчётом…
Делитель под нагрузкой: почему он «проседает»
Делитель держит расчётное напряжение только пока ток нагрузки мал против тока самого делителя. Без нагрузки U = E·R₂/(R₁+R₂) = 12·…