Найти тему
Электроника, ESP32, Arduino

Можно ли научиться программированию в Интернет ?

Сейчас на форумах на вопрос где ты научился писать код? отвечают, Интернет читаю, видосики смотрю. Ну что-же, разберем чему нас действительно может научить мировая паутина.

Внимание! разбор очередной копипаста обучающей статьи для новичков "как подключить кнопку"
Схему подключения автор материала предлагает стандартную - с подтяжкой пина с кнопкой к +5V резистором 10ком

Копипастовая схема подключения кнопки
Копипастовая схема подключения кнопки

А к статье прилагается вот такой говнокод

Пример как не нужно писать код
Пример как не нужно писать код

Соберем на макетной плате и проверяем:

Кнопка отпущена - светодиод не горит
Кнопка отпущена - светодиод не горит
Кнопка нажата - светодиод горит
Кнопка нажата - светодиод горит

Все работает, а теперь почему лучше так не писать программы?

-5

Номера выводов к которым подключены кнопки объявлены как переменные. Хороший стиль программирования заключается в том, что все что в программе не должно изменяться - лучше объявлять как константы. Если программа будет большой и блочной любая опечатка программиста, которая может изменить переменную LedPin13 или ButtonPin2 приведет к тому, программа начнет глючить в самых неожиданных местах и найти её будет сложно.

Плохой стиль программирования
Плохой стиль программирования

Если добавить ключевое слово const перед названием имен переменных, мы объявим их как константы и собрать программу с опечаткой не разрешит компилятор.

Хороший стиль программирования
Хороший стиль программирования

Кнопка имеет всего 2 состояния, светодиод тоже. Фактически вся суть работы программы сводится к тому, что мы переписываем состояние кнопки, в порт к которому подключен светодиод.
Давайте еще раз скомпилируем программу из обучающего примера (crtl+R)

-8

Перепишем программу используя директиву препроцессора define

-9

Размер скетча уменьшился на 8 байт.
Что делает данная директива? При сборке проекта её функционал аналогичен команде найти/заменить. То есть она ищет везде слово LedPin13 и заменяет его на цифру 13. Читаемость осталась на том же уровне, а размер уменьшился.

Хранить состояние кнопки в отдельной переменной это чисто дело вкуса, но с железной точки зрения оно хранится в отдельном регистре и в принципе если не планируется сохранять состояние кнопки, (например для сравнения с текущим или предыдущим значением) от нее тоже можно смело избавиться.

-10

Для встроенного светодиода на Ардуино подобных платах в среде Arduino IDE существует встроенная константа LED_BUILTIN. Если PIN к которому подключен встроенный светодиод объявить через эту константу - зажигать встроенный светодиод можно будет на любой Ардуино-подобной платформе и даже на платах ESP.

Код стал еще компактнее но по прежнему работает:

-11

Ну и вишенка на торт. Поскольку по условиям первоначальной задачи светодиод должен гореть когда кнопка нажата и гаснуть когда отпущена
(и то и то это один бит информации) - можно просто переписать состояние кнопки в состояние светодиода. По скольку на входе 2 у нас логическая 1 когда кнопка отпущена и логический ноль когда нажата. Инвертируем состояние пина командой "!"

-12

Вот все что осталось от первоначальной портянки 99% примеров авторов которые выпускают обучающие материалы. Делает этот код все ровно тоже самое, а в программировании как известно чем короче код - тем быстрее он работает.

Теперь переходим к схемотехнике. Обычно в Ардуино-подобных платформах, вывод на который подключается светодиод, уже имеет токо ограничивающий резистор.

-13

Выкидываем резистор 220 Om (ВНИМАНИЕ - С ДРУГИМИ ВЫВОДАМИ ТАКОЙ ФОКУС ПОВТОРЯТЬ НЕ СЛЕДУЕТ!!!)

Для пина на 13-м пине токоограничиващий резистор не нужен!!!
Для пина на 13-м пине токоограничиващий резистор не нужен!!!

Эта безобидная мелочь может вылиться в проблему если с вывода 13 мы попробуем по управлять каким-нибудь модулем. Из-за того что там есть токо-ограничивающий резистор можно поиметь проблему из ничего (логическая единица там будет не 5V, а чуть меньше) Поэтому не подключайте к этому выводу никакой периферии, если только речь не идет об устройствах с интерфейсом SPI)

Микронтроллеры AVR на которых строятся платы Arduino да и многие другие имеют внутренний подтягивающий резистор - который в среде Arduino IDE можно подключить константой INPUT_PULLUP.

Выкидываем и подтягивающий резистор из схемы:

Вот и все что осталось - но делает по прежнему тоже самое
Вот и все что осталось - но делает по прежнему тоже самое

Код:

Вот и все что осталось - но делает тоже самое.
Вот и все что осталось - но делает тоже самое.

Краткое резюме по добыче информации из сети Интернет на примере статеек для новичков типа "подключаем кнопку"

Вы научитесь:

  • подключать кнопку к Arduino (типа работает же)
  • писать код который может перестать работать в любой момент из-за
    банальной опечатки
  • бездумно разбазаривать ресурсы Arduino
  • писать много много лишних операторов
  • паять кучу ненужных электронных компонентов

А какие вы любите использовать источники информации? - пишите в комментариях....

Также вы можете ознакомиться с полным списком статей на моем канале.
Всем удачи!