Перейти к содержимому

Esp 01 сколько свободных gpio

  • автор:

Обзор модуля ESP-01 на чипе ESP8266

Обзор модуля ESP-01 на чипе ESP8266

Китайская компания Espressif в 2014 году, начала продавать Wi-Fi модули, на чипах ESP8266. который сразу завоевал большую популярность у радиолюбителей из-за своей дешевизны и большими возможностями. На сегодняшний день существует большое количество различных модулей основанных на чипе ESP8266, в этой статье расскажу о ESP-01.

Обзор модуля ESP-01 на чипе ESP8266

Технические параметры

► Напряжение питания: 3 В ~ 3.6 В
► Максимальный рабочий ток: 220 мА
► Поддержка беспроводного стандарта: 802.11 b / g / n
► Рабочая частота: 2.4 ГГц
► Режимы: P2P (клиент), soft-AP (точка доступа)
► Количество GPIO: 2.
► Flash память: 1024 кб.
► Выходная мощность в режиме 802.11b: +19.5dBm
► Поддержка беспроводного стандарта: 802.11 b / g / n
► Габариты: 24.8мм х 14.3мм х 8мм

Общие сведения о ESP-01

По сути, чип ESP8266 представляет собой миниатюрный микроконтроллер с Wi-Fi передатчиком, который может функционировать в условиях полной автономии, без дополнительной платы Arduino. С помощью модуля ESP-01 можно передавать данные о температуре, влажности, включать реле и так далее. Для удобства использования чипа ESP8266, производитель изготовил серию модулей от ESP-01 по ESP-14. Первый в этой серии, это модуль ESP-01 (существует еще ESP-01S, о нем чуть позже), являющийся одним из известным, из-за свой цены и небольшими размерами, всего 14,3 мм на 24,8 мм. Но в нем, есть два недостатка, это ограниченное количество программированных выводов GPIO и их неудобное расположение (неудобно макетировать).

Обзор модуля ESP-01 на чипе ESP8266

Модуль ESP-01 представляет собой небольшую плату, черного цвета, на которой расположены два основных чипа, это микроконтроллером ESP8266 и flash память на 1 Мб. Рядом расположен кварцитовый резонатор и напечатанная антенна. На плате установлены два светодиода, красный и голубой. Красный светодиод, светится когда на модуле есть питание, а синий мигает при выполнении команд (в NSP-01S удален красный светодиод, из-за постоянного потребления электроэнергии). Для подключения модуля ESP-01, предусмотрено восемь выводов (два ряда по четыре вывода, шагом 2.54 мм), два из готовых являются цифровым входами-выходом, поддерживающие широтно импульсную модуляцию. Хотя модуль имеет по умолчанию два вывода GPIO, можно использовать другие доступные контакты, если у вас есть необходимый инструмент для пайки.

Обзор модуля ESP-01 на чипе ESP8266

Назначение выводов
► GND: «-» питание модуля
► GPIO2: (Digital I / O программируемый)
► GPIO0: (Digital I / O программируемый, также используется для режимов загрузки)
► RX: UART прием
► TX: UART передача
► CH_PD: (включение / отключение питания, должны быть выведены на 3.3 В непосредственно или через резистор)
► RST: сброс, необходимо потянуть к 3.3В
► VCC: «3.3В» питание модуля

Подключение модуля
Для работы модуля ESP-01, необходим источник питания постоянного тока, который должен выдавать 3.3 В и током не менее 250 мА. К сожалению, штатный стабилизатор установленный на Arduino не способен выдать необходимой ток для работы ESP-01 (если решите все равно подключить ESP-01, ждите нестабильную работу и постоянную перезагрузку). Кроме того, логические сигнал, данного модуля, рассчитан на 3.3 В, то есть на вывод RX необходимо подавать напряжение 3.3В, а с вывода TX будет напряжение равное 3.3 В (так же и для других выводов). Если необходимо подключить модуль к Arduino или другим контроллерам, которые выдают на логический вывод 5 В, необходимо использовать резисторы или модуль логических уровней, если подключать напрямую, модуль выйдет из строя.

Внимание! ESP-01 очень капризные к питанию, необходимо использовать внешний стабилизатор напряжения на 3.3В, в качестве первого примера буду использовать адаптер USB

Обзор модуля ESP-01 на чипе ESP8266

С таблице выше, видно, что модуль ESP-01 может работать в нескольких режимах сна, с минимальным потреблением тока, вызываются они программном путем, кроме последнего «Power Off», чтобы задействовать данный режим, необходимо установить перемычку, между GPIO16 и RST, позже приведу пример.

Установка ESP8266 в IDE Arduino

► Скачиваем с сайта arduino.cc программу IDE Arduino
► Далее, необходимо установить ESP плату в IDE Arduino, для этого запускаем программу IDE Arduino, открываем: Файл -> Настройка.
► В новом открытом окне, в поле «Дополнительные ссылки для Менеджера плат:» добавляем ссылку:

кратковременный импульс на пинах esp8266 при включении

все верно,
но при том коде выше, на пинах нет «-«.

кстати, у Соноф, у 1М тоже ничего не щелкает

��

И у меня никогда не щелкает, если я предустанавливаю все пины реле в «1». Но как только уровень входного пина «падает» до «0» — реле щелкает. Правда здорово
В прошивке sonoff подобное решение. Также я поступал и на девайсах с ардуино.

CodeNameHawk
Moderator

Команда форума
И у меня никогда не щелкает,
Просто еще не на всех выводах попробовали.
если я предустанавливаю все пины реле в «1».
Это происходит еще до старта вашей программы.

Moseich
Member

Если не подключать реле на выводы, на которые есп выдает информацию при старте, не будет щелкать на любом модуле.

Нет реле — нет щелчка. Нет питания, но реле есть — тоже нет щелчка. Нет ничего -.

CodeNameHawk
Moderator

Команда форума
Нет реле — нет щелчка.
Кто знает, когда полнолуние начинается.

gavigor
New member

Если не подключать реле на выводы, на которые есп выдает информацию при старте, не будет щелкать на любом модуле

так я об этом выше уже написал:
НЕ юзать d0 d3 d4 rx tx (для 8266 (вемос мини) пины

gavigor
New member

входного пина «падает» до «0» —
а каким боком здесь ВХОДные пины?

Moseich
Member

а каким боком здесь ВХОДные пины?
это я ошибся

Moseich
Member

это я ошибся
ТОчнее описался — мне уже можно по возрасту имел ввиду

Moseich
Member

Это происходит еще до старта вашей программы.

Я исхожу из того, что предметом обсуждения у нас реле, которое не должно щелкать. и мы должны бороться с последствиями старта контроллера, которое зависит от многих факторов. DO,D5, D6 и D7 (на Wemos d1mini) я всегда пользую как выходные. других и не знаю.

CodeNameHawk
Moderator

Команда форума
что предметом обсуждения у нас реле, которое не должно щелкать.
Добавлю, не должно щелкать во время старта есп.
и мы должны бороться с последствиями старта контроллера,

Во время старта есп, на служебных ногах выводится информации, поменять программно не получится, т.е. бороться с нечем.

других и не знаю
Последнее редактирование: 16 Ноя 2022

nikolz
Well-known member

Всем привет! ESP8266 интересуюсь уже давно, но раньше в основном подключал к нему разные датчики температуры, влажности, дисплеи и т.д. Сейчас возникла необходимость подключить реле. Сделал. Но столкнулся с таким неприятным моментом как щелканье реле при включении модуля. Модуль WittyCloud. Раньше как-то не обращал внимания, а сейчас заметил что и встроенный RGB-светодиод на этом модуле тоже кратковременно моргает при включении. В сетапе ставил пины в 0 — не помогает. Взял NodeMCU, подпаял светодиод к неиспользуемому gpio14(D5) — такая же ситуация, при старте кратковременный импульс. Подскажите это нормально для esp8266 или нет? И можно ли с этим как-то бороться?

я решил эту проблему поставив расширитель ввода-вывода в результате подключил 8 реле и кучу датчиков без проблем
Цена вопроса копейки, подключение не требует никакой обвязки кроме чипа расширения.
давно писал об этом на этом форуме и выкладывал картинки

nikolz
Well-known member

применение расширителя дает еще некоторые плюсы при создании устройства с несколькими реле для управления мощной нагрузки.
об этом тоже писал.

gavigor
New member

Добавлю, не должно щелкать во время старта есп.
они и не щелкают ни при загрузке, ни при даже веб-прошивке. (те пины кгторые я указывал выше)

gavigor
New member

мне уже можно по возрасту

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

причем «старики» больше всех об этом на каждом углу орут, по моей практике)))

nikolz
Well-known member

Here’s a summary of how all the ESP8266 GPIOs behave. Pictures of the analyzer/scope traces are shown below.

NodeMCU
GPIO
ESP8266
GPIO
Behaviour
Flash Mode
Behaviour
Dummy Arduino App
Behaviour
Arduino Set GPIOs Low
D0 16 High High during boot, falls after ~110ms (to ~1V?) High during boot, falls after ~110ms (to ~1V)
D1 5 Low Low Low
D2 4 Low Low Low
D3 0 Low then oscillates Varies, stabilizes high after ~100ms Varies, stabilizes low after ~110ms
D4 2 Varies, stabilizes high after ~60ms Varies, stabilizes high after ~70ms Varies, stabilizes low after ~110ms
D5 14 High High, then low after ~110ms High, then low after ~110ms
D6 12 High High, then low after ~110ms High, then low after ~110ms
D7 13 High High, then low after ~110ms High, then low after ~110ms
D8 15 Low Low, with glitch ~110ms Low, with glitch ~110ms
D9 3 Low Low until ~50ms then high Low until ~50ms then high until ~110ms then low
D10 1 Low Low until ~50ms then high Low until ~50ms then high until ~110ms then low

Вот краткое описание того, как ведут себя все GPIO ESP8266. Изображения трассировок анализатора/прицела показаны ниже.

NodeMCU
GPIO ESP8266
Поведение GPIO
Поведение в режиме вспышки
Фиктивное поведение приложения Arduino
Arduino установил низкий уровень GPIOs
D0 16 Высокий Высокий во время загрузки, падает через ~ 110 мс (до ~ 1 В?) Высокий во время загрузки, падает через ~110 мс (до ~ 1 В)
D1 5 Низкий Низкий Низкий
D2 4 Низкий Низкий Низкий
D3 0 Низкий, затем колеблется Меняется, стабилизируется высокий после ~ 100 мс Меняется, стабилизируется низкий после ~ 110 мс
D4 2 Меняется, стабилизирует высокий уровень после ~ 60 мс Меняется, стабилизирует высокий уровень после ~ 70 мс Меняется, стабилизирует низкий уровень после ~ 110 мс
D5 14 Высокий, затем низкий после ~ 110 мс Высокий, затем низкий после ~ 110 мс
D6 12 Высокий, затем низкий после ~ 110 мс Высокий, затем низкий после ~ 110 мс
D7 13 Высокий, затем низкий после ~ 110 мс Высокий, затем низкий после ~ 110 мс
D8 15 Низкий Низкий, с задержкой ~110 мс Низкий, с задержкой ~110 мс
D9 3 Низкий Низкий до ~ 50 мс, затем высокий Низкий до ~ 50 мс, затем высокий до ~ 110 мс, затем низкий
D10 1 Низкий Низкий до ~ 50 мс, затем высокий Низкий до ~ 50 мс, затем высокий до ~ 110 мс, затем низкий

nikolz
Well-known member

Как использовать
контакты GPIO0, GPIO2 и
GPIO15 в качестве выходов и входов на модулях ESP8266

Обновлено 24 декабря 2021 года – добавлено примечание о предотвращении мерцания реле GOIO0 при запуске
Обновлено 2 апреля 2018 года для отображения светодиодов ESP8266-01

Введение
ESP8266 — это недорогой чип с поддержкой Wi-Fi. Он поставляется в различных типах модулей и может быть запрограммирован различными способами. Также используются контакты и светодиоды ESP-01 и ESP-01S

Все модули обеспечивают доступность GPIO0 и GPIO2. Большинство модулей, кроме ESP8266-01, также обеспечивают доступ к GPIO15. Эти GPIO управляют запуском модуля и поэтому требуют особого обращения, если они вообще будут использоваться. GPIO6-GPIO11 также требуют специальной обработки, как описано ниже

Советы по программированию ESP8266 (сбой espcomm)
При программировании ESP8266 с использованием Arduino IDE (см. ESP8266-01 Wifi Shield) вы иногда (часто) получаете сообщения об ошибках в Arduino IDE, такие как
ошибка esp_com open failed
ошибка: не удалось открыть COM33
ошибка: ошибка
espcomm_open ошибка: ошибка espcomm_upload_mem сбой

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

  1. Убедитесь, что в меню Arduino Tools выбрана плата ESP8266
  2. Убедитесь, что вы выбрали COM-порт в меню инструментов Arduino
  3. Включите питание ESP8266 с заземлением GPIO0 (чистая подача питания, см. Ниже)
  4. Если 3) не устраняет проблему, отсоедините USB-кабель от компьютера, подождите несколько секунд и снова подключите его
  5. Если 4) не устраняет проблему, отсоедините USB-кабель от ПК, закройте Arduino IDE, откройте Arduino IDE, снова подключите USB-кабель.

Флэш–контакты GPIO — от GPIO6 до GPIO11
Большинство плат ESP8266 имеют флэш-чип, подключенный к некоторым или всем GPIO6-GPIO11. Большинство программ используют флэш-память, а также оперативную память, поэтому, если вы специально не убедитесь, что ваш код выполняется только из оперативной памяти, вы не можете использовать эти выводы для других целей.

Точное количество контактов, используемых в диапазоне от GPIO6 до GPIO11, зависит от типа флэш-памяти, используемой в вашем модуле. Quad IO использует 4 линии для передачи данных (всего 6 контактов) со скоростью, в 4 раза превышающей стандартную. Двойной ввод-вывод использует 2 линии для передачи данных (всего 4 контакта) Стандартный ввод-вывод использует одну линию для передачи данных (всего 3 контакта).

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

Контакты GPIO0, GPIO2 и GPIO15
Эти выводы определяют, в каком режиме запускается чип.

Для нормального выполнения программы GPIO0 и GPIO2 необходимо подключить к Vcc (3,3 В), а GPIO15 необходимо подключить к GND, каждый с резистором в диапазоне от 2 Ком до 10 Ком. Резистор 2 Ком обеспечивает лучшую помехозащищенность. OLIMEX использует резисторы 2K, SparkFun использует резисторы 10K. Я использую резисторы 3K3.

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

Использование GPIO0, GPIO2 и GPIO15 в качестве выходов
Как отмечалось выше, на этих выводах уже будет резистор, подключенный либо к VCC (GPIO0 и GPIO2), либо к GND для GPIO15. Это определяет, как должно быть подключено любое внешнее устройство, например реле или светодиод + резистор. Для GPIO0 и GPIO2 между VCC и выводом должно быть подключено внешнее реле, чтобы оно не мешало работе подтягивающего резистора. И наоборот, между GND и выводом должно быть подключено внешнее реле, подключенное к GPIO15, чтобы оно не мешало действию понижающего резистора.

Для активации внешнего устройства GPIO0 или GPIO2 должны быть установлены на низкий уровень (активный НИЗКИЙ), а GPIO15 — на высокий (активный высокий).

На схеме ниже показано, как использовать GPIO0 и GPIO2 и GPIO15 в качестве выходов. Эта схема также включает в себя необходимые резисторы для снятия / снятия. Обратите внимание, что релейный модуль 5 В, управляемый GPIO0, имеет оптическую изоляцию и имеет отдельное общее соединение для входа. Важно, чтобы напряжение VCCA 5 В не подавалось на вывод ESP8266.

Как избежать мерцания реле при запуске
Обновление 24 декабря 2021 года – Когда ESP8266 включается / сбрасывается в обычном режиме, GPIO0 становится низким примерно на 100 мс. Это ненадолго включит реле, подключенное к GPIO0, как показано ниже. Чтобы избежать этого мерцания реле при запуске, припаяйте конденсатор емкостью от 470 мкФ до 1000 мкФ напряжением 6,3 В или выше к входным контактам оптоизолятора (после встроенного резистора) на самой плате реле. Проверьте с помощью мультиметра правильную полярность конденсатора. Этот конденсатор задержит реле примерно на 0,5-1 сек. Вы могли бы попробовать конденсатор до 220 мкФ. 1000 мкФ был протестирован и работает. Существует примерная схема использования выводов и светодиодов ESP-01 и ESP-01S

Как перепрограммировать при использовании GPIO0 в качестве вывода
Примечание: GPIO0 is должен быть заземлен, чтобы перейти в режим программирования. Если ваш sketch перегоняет его слишком высоко, заземление может повредить ваш чип ESP8266.
Безопасный способ перепрограммировать ESP8266, когда ваш код управляет выходом GPIO0, состоит в том, чтобы: —
а) Выключить плату
; б) замкнуть GPIO0 на gnd
; в) включить плату, которая переходит в программный режим из-за короткого замыкания на GPIO0;
г) удалить короткое замыкание из GPIO0, чтобы не замкнуть вывод при запуске программы
e) перепрограммируйте плату
f) при необходимости включите питание платы.

Используя GPIO0, GPIO2 и GPIO15 в качестве входных данных.
Использование этих выводов в качестве входных данных немного сложно. Как отмечалось выше, при включении питания и во время сброса эти выводы необходимо поднимать или опускать по мере необходимости, чтобы модуль ESP8266 запустился в нормальном рабочем режиме. Это означает, что, как правило, вы не можете просто подключить внешний переключатель к этим выводам, потому что при включении питания вы обычно не можете гарантировать, что коммутатор не будет заземлять вход и, следовательно, не позволит модулю правильно запуститься.

Хитрость заключается в том, чтобы не подключать внешний коммутатор напрямую от GPIO0 или GPIO2 к GND, а вместо этого подключать его к другому выводу GPIO, который заземляется (как выход) только после запуска ESP8266. Помните, что при использовании в качестве выходов выводы GPIO обеспечивают подключение с очень низким сопротивлением либо к VCC, либо к GND в зависимости от того, являются ли они ВЫСОКИМИ или НИЗКИМИ.

Здесь будут учитываться только GPIO0 и GPIO2. Используя этот метод, вы можете получить один (1) дополнительный ввод, используя эти два (2) GPIO.

Аналогичный метод можно использовать для GPIO15, используя другой вывод GPIO для подключения его коммутатора к + VCC, но это не дает дополнительного входа, вы можете просто использовать другой вывод GPIO непосредственно в качестве входа.

В приведенной ниже схеме в качестве примера используется модуль ESP8266-01. Без использования этого трюка ESP8266-01 не имеет свободных контактов для использования в качестве входа, если вы уже используете контакты RX / TX для подключения UART.

Поскольку метод setup() sketch запускается только после запуска модуля ESP8266, безопасно сделать вывод GPIO0 НИЗКИМ и таким образом обеспечить заземление для S1, подключенного к GPIO2. Затем вы можете использовать digitalRead (2) в другом месте вашего эскиза, чтобы прочитать настройки переключателя.

Заключение
В этой короткой заметке показано, как использовать GPIO0, GPIO2 и GPIO15 в качестве выходных данных и как использовать дополнительный ввод, используя GPIO0 и GPIO2 вместе.

ESP8266. Начало работы, особенности

В этом уроке поговорим о микроконтроллере ESP8266 и платах на его основе. Как с ними работать и чем они отличаются от Arduino на базе МК AVR. ESP8266 – китайский микроконтроллер за 2 доллара с большим объемом памяти и WiFi связью на борту. Официальная документация:

  • https://github.com/esp8266/Arduino/blob/master/doc/reference.rst
  • https://arduino-esp8266.readthedocs.io/en/latest/

Купить на Aliexpress

Дёшево купить Wemos Mini можно тут: ссылка, ссылка, ссылка. Рекомендуется брать версию как слева на картинке выше, на базе полного чипа ESP-12.

Уроки по работе с esp8266

Конкретные уроки по работе с платой и WiFi библиотеками публикуются на сайте набора GyverKIT, так как уроки на этом сайте являются общими по программированию Arduino, без углубления в сторонние библиотеки.

Характеристики

  • Напряжение питания: 3.3V (2.5-3.6V)
  • Ток потребления: 300 мА при запуске и передаче данных, 35 мА во время работы, 80 мА в режиме точки доступа
  • Максимальный ток пина – 12 мА.
  • Flash память (память программы): 1 МБ
  • Flash память (файловое хранилище): 1-16 МБ в зависимости от модификации
  • EEPROM память: до 4 кБ
  • SRAM память: 82 кБ
  • Частота ядра: 80/160 МГц
  • GPIO: 11 пинов
  • ШИМ: 10 пинов
  • Прерывания: 10 пинов
  • АЦП: 1 пин
  • I2C: 1 штука (программный, пины можно назначить любые)
  • I2S: 1 штука
  • SPI: 1 штука
  • UART: 1.5 штуки
  • WiFi связь

Начало работы

Для работы с платами на основе esp8266 нужно установить ядро и драйвер.

  • Идём в Файл/Настройки/Дополнительные ссылки для менеджера плат. Вставляем ссылку https://arduino.esp8266.com/stable/package_esp8266com_index.json.
  • Инструменты/Плата/Менеджер плат…, ищем в поиске esp8266 и устанавливаем. В списке плат появится семейство плат на базе esp8266.
  • На большинстве плат стоит USB конвертер CH340, как на всех китайских Ардуинах. Если вы ещё не устанавливали драйвер – читать здесь.

Настройки платы

Для работы с любой платой (даже самодельной) можно выбрать пункт Generic esp8266, будет доступен полный набор настроек. Для работы с Wemos Mini выбираем LOLIN Wemos D1 R2 mini. Настроек станет меньше, а к пинам платы можно будет обращаться в программе по их подписям на плате (Dn). Основные настройки:

  • Upload speed: скорость загрузки прошивки. Можно смело поднимать до 921600.
  • CPU Frequency: частота тактирования процессора. Для большинства задач хватит стандартных 80 МГц. На 160 МГц будет работать шустрее, но могут быть сбои.
  • Flash Size: распределение памяти, настройка имеет вид xMB (FS:xMB OTA:~xKB). Размер памяти под программу не меняется – это всегда 1 МБ.
    • Первое число: полный объём микросхемы памяти (в основном 4MB, на Wemos и NodeMCU стоят такие).
    • Второе число: объём под файловое хранилище.
    • Третье число: объём под OTA (обновление по воздуху) – всегда меньше 1 МБ.
    • Что выбрать? У Wemos самый ходовой – первый вариант: 4MB (FS:2MB OTA:~1019KB).
    • DOUT: медленный, но совместим со всеми модификациями esp8266.
    • QIO: более быстрый, но будет работать не на всех чипах.
    • Only Sketch: стереть только программу.
    • Sketch + WiFi Settings: стереть программу и настройки WiFi (логин-пароль последнего подключения и т.д.).
    • All Flash Contents: полностью очистить память.

    Нумерация пинов

    У самого чипа esp8266 все выводы пронумерованы цифрами. На распиновке они подписаны как GPIOn, где n – номер. На плате (NodeMCU, Wemos Mini) пины подписаны как Dn и эти номера не совпадают с номерами GPIO! При работе например с Wemos можно использовать как нумерацию выводов GPIO ( digitalWrite(5, LOW) ), так и D-нумерацию пинов на плате ( digitalWrite(D1, LOW) ) – если выбрана плата Wemos. Новички очень часто в этом путаются, будьте внимательны. Также GPIO1 и GPIO3 подписаны на плате как TX и RX, по этим названиям к ним тоже можно обращаться ( digitalWrite(TX, LOW) ).

    Особенности пинов

    У esp8266 много системных пинов, с которыми нужно быть очень внимательным.

    • К целому ряду пинов подключена внешняя Flash память, в общем случае их использовать нельзя (если очень нужно – ищите информацию). На плате NodeMCU визуально гораздо больше пинов, чем на Wemos Mini, но по факту “безопасных” для использования пинов там ровно столько же.
    • С оставшимися пинами тоже не всё гладко: некоторые из них требуют наличия определенного логического уровня на момент включения микроконтроллера (подача питания, перезагрузка). Если к этим пинам подключить что-то, дающее противоположный сигнал – esp не запустится. Вот распиновка с нужным уровнем сигнала при запуске:
    • На плате (NodeMCU, Wemos и других) эти пины уже подтянуты резисторами к нужному напряжению, поэтому нужно несколько раз подумать, что вы к ним подключаете и как оно повлияет на напряжение на пине. Например, можно подключить энкодер, он прижмёт системный пин к GND и esp не запустится.
    • На GPIO16/D0 нельзя подключать прерывания ( attachInterrupt() ) и включать ШИМ сигнал ( analogWrite() ).
    • Максимальный ток с GPIO – 12 мА.
    • Светодиод LED_BUILTIN находится на пине GPIO2 и его поведение инвертировано: при подаче LOW он включается и наоборот.
    • При старте контроллера почти все пины делают скачок до высокого уровня, подробнее – в этой статье. Единственными “спокойными” пинами являются D1 (GPIO5) и D2 (GPIO4). Если контроллер управляет напрямую какими-то железками (реле, транзистор, или является “кнопкой” для другого устройства), то лучше использовать именно эти пины!
      • На этих же пинах сидит I2C, но шину можно переназначить на любые другие пины через Wire.begin(sda, scl) .

    Особенности работы WiFi

    WiFi реализован синхронно, его обработчик должен постоянно вызываться во время работы программы не реже, чем каждые 20 мс (если WiFi используется в программе). Обработка WiFi происходит в следующих местах:

    • Автоматически в конце каждой итерации loop()
    • Внутри любого delay()
    • Внутри функции yield()

    Если у вас есть участки программы, которые долго выполняются, то нужно разместить вызовы yield() до и после тяжёлых блоков кода. Также в чужих скетчах можно встретить delay(0) , по сути это и есть yield() .

    По тем же причинам не рекомендуется использовать задержку delayMicroseconds() более чем на 20’000 мкс.

    Отличия от AVR Arduino

    Деление на 0

    В отличие от AVR, деление на 0 приводит к критической ошибке и перезагрузке микроконтроллера. Стараемся этого избегать.

    min() и max()

    В ядре esp8266 функции min() и max() реализованы как функции, а не как макросы, поэтому должны использоваться с данными одного типа. Использование переменных разного типа приведёт к ошибке компиляции.

    map()

    В функции map(val, min, max, to min, to max) нет защиты от деления на 0, поэтому если min равен max – микроконтроллер зависнет и перезагрузится. Если min и max задаются какими-то внешними условиями – проверяйте их равенство вручную и исключайте вызов map() с такими аргументами.

    Типы данных

    • Тип int является синонимом long ( int32_t ) и занимает 4 байта. В AVR int это int16_t , то есть 2 байта.
    • Тип char является синонимом byte – принимает значения 0.. 255 в отличие от -128.. 127 в AVR.
    • Тип double имеет полную двойную точность – 8 байт. В AVR это 4 байта.
    • Указатель занимает 4 байта, так как область памяти тут 32-битная. В AVR – 2 байта.

    Функция analogRead()

    ESP8266 имеет крайне убогий одноканальный АЦП.

    • Сам АЦП в esp8266 может измерять напряжение в диапазоне 0.. 1.0V. На платах (NodeMCU, Wemos Mini) стоит делитель напряжения, который расширяет диапазон до более удобных 3.3V.
    • Разрешение – 10 бит, т. е. значения 0.. 1023 как на Arduino
    • Частый вызов analogRead() замедляет работу WiFi. При вызовах чаще нескольких миллисекунд WiFi полностью перестаёт работать.
    • Результат analogRead() имеет кеширование до 5 мс, то есть полученные данные могут запаздывать на это время.
    • АЦП может использоваться для измерения напряжения питания МК: для этого нужно вызвать ADC_MODE(ADC_VCC); до void setup() , а само напряжение питания можно получить из ESP.getVcc() .

    Функция analogWrite()

    • Работает на всех пинах, кроме GPIO16.
    • Разрядность ШИМ по умолчанию 8 бит (0.. 255) на версиях ядра 3.x. На ранних версиях – 10 бит (0.. 1023). Скажем спасибо индусам за совместимость.
      • Разрядность можно настроить в analogWriteResolution(4. 16 бит) .
      • Частоту можно настроить в analogWriteFreq(100.. 40000 Гц) .

      Аппаратные прерывания

      • Настраиваются точно так же, через attachInterrupt() .
      • Работают на всех пинах, кроме GPIO16.
      • Функция-обработчик должна быть объявлена с атрибутом IRAM_ATTR :

      void setup() < attachInterrupt(1, myIsr, RISING); >IRAM_ATTR void myIsr()
      Либо с ICACHE_RAM_ATTR (на старых версиях ядра), вот так:
      void ICACHE_RAM_ATTR myIsr() < >void setup()

      Функция yield()

      В реализации esp8266 функция yield() выполняет другую задачу и использовать её как на AVR не получится. Скажем спасибо индусам за совместимость

      EEPROM

      EEPROM в esp8266 является эмуляцией из Flash памяти, поэтому мы можем выбрать нужный размер.

      • Перед началом работы нужно вызвать EEPROM.begin(4.. 4096) с указанием размера области памяти в байтах.
      • Для применения изменений в памяти нужно вызвать EEPROM.commit() .
      • В некоторых версиях SDK отсутствует EEPROM.update() и EEPROM.length() .
      • У Flash памяти небольшой ресурс – всего около 10’000 перезаписей. У фирменной памяти Winbond (можно найти на некоторых моделях ESP-12 и прочих) – около 50’000 перезаписей.

      В остальном работа с библиотекой EEPROM.h ничем не отличается.

      Важно: EEPROM реализован следующим образом: после запуска EEPROM.begin(4.. 4096) содержимое EEPROM указанного размера дублируется в оперативной памяти. После любого изменения и вызова EEPROM.commit() стирается весь блок Flash памяти (4 кБ) и записывается заново. Таким образом ресурс “EEPROM” памяти у ESP вырабатывается довольно быстро и весь сразу, а не по ячейкам.

      Serial (UART)

      • В отличие от реализации для AVR, можно изменить размер буфера на приём: Serial.setRxBufferSize(размер) в байтах. Вызывать перед Serial.begin() , по умолчанию 256 байт.
      • Можно настроить работу только на приём или только на отправку для освобождения пина: Serial.begin(скорость, SERIAL_8N1, режим) , где режим:
        • SERIAL_TX_ONLY – только отправка
        • SERIAL_RX_ONLY – только приём
        • SERIAL_FULL – приём и отправка (по умолчанию)

        Полезные страницы

        • Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
        • Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
        • Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
        • Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
        • Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
        • Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
        • Поддержать автора за работу над уроками
        • Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])

        Расширитель GPIO PCA9535 c QIIC

        GPIO — это набор входов/выходов общего назначения, с помощью которых микроконтроллер может управлять внешними устройствами и принимать от них сигналы. В одном из первых уроков мы подключали к Ардуино светодиод, и делали это как раз при помощи GPIO.

        Ардуино Уно и её более мелкие собратья имеют 20 штук GPIO контактов, которых хватает для большинства DIY проектов. У версии Mega и того больше — 54. А вот у популярной WiFi платы ESP8266, особенно у версии 01S — свободных контактов крайне мало — их вообще всего 4. Как же быть, если нам не хватает контактов для подключения нужной периферии?

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

        А ещё для увеличения GPIO существуют специальные микросхемы. На этом уроке мы будет работать с модулем расширения GPIO от RobotClass как раз на одной из таких микросхем — PCA9535.

        GPIO расширитель PCA9535 RobotClass ROC

        Модуль умеет работать как с напряжением 3,3 Вольт, так и 5 Вольт. Так что его можно использовать в связке с разного рода платами Ардуино, а также с stm32, esp8266, esp32 и другими микроконтроллерами.

        В качестве примера, увеличим число GPIO контактов у самой обычной платы Ардуино Уно. Попробуем применить модуль PCA9535 и для передачи сигнала (OUTPUT), и для чтения (INPUT).

        Список необходимых компонентов

        Все необходимые для урока компоненты можно приобрести у нас в магазине:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *