Добавляем wifi к arduino uno

Описание ESP8266

ESP8266 – микроконтроллер с интерфейсом WiFi, который имеет возможность исполнять программы из флеш-памяти. Устройство было выпущено в 2014 году китайской фирмой Espressif и практически сразу же стало популярным.

Контроллер недорогой, обладает небольшим количеством внешних элементов и имеет следующие технические параметры:

  • Поддерживает Wi-Fi протоколы 802.11 b/g/n с WEP, WPA, WPA2;
  • Обладает 14 портами ввода и вывода, SPI, I2C, UART, 10-бит АЦП;
  • Поддерживает внешнюю память до 16 МБ;
  • Необходимое питание от 2,2 до 3,6 В, потребляемый ток до 300 мА в зависимости от выбранного режима.

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

Доступ к внутренней периферии можно получить не из документации, а из API набора библиотек. Производителем указывается приблизительное количество ОЗУ – 50 кБ.

Особенности платы ESP8266:

  • Удобное подключение к компьютеру – через USB кабель, питание от него же;
  • Наличие встроенного преобразователя напряжения 3,3В;
  • Наличие 4 Мб флеш-памяти;
  • Встроенные кнопки для перезагрузки и перепрошивки;
  • Все порты выведены на плату на две гребенки с шагом 2,5 мм.

Сферы применения модуля ESP8266

  • Автоматизация;
  • Различные системы для умного дома: Беспроводное управление, беспроводные розетки, управление температурой, дополнение к сигнализационным системам;
  • Мобильная электроника;
  • >Распиновка esp8266

Существует огромное количество разновидностей модуля ESP8266. На рисунке представлены некоторые из них. Наиболее популярным вариантом является ESP 01.

Исполнение программы требуется задавать состоянием портов GPIO0, GPIO2 и GPIO15, когда заканчивается подача питания. Можно выделить 2 важных режима – когда код исполняется из UART (GPIO0 = 0, GPIO2 = 1 и GPIO15 = 0) для перепрошивки флеш-карты и когда исполняется из внешней ПЗУ (GPIO0 = 1, GPIO2 = 1 и GPIO15 = 0) в штатном режиме.

Распиновка для ESP01 изображена на картинке.

1 – земля, 8 – питание

По документации напряжение подается до 3,6 В – это важно учесть при работе с Ардуино, на которую обычно подают 5 В.
6 – RST, нужна для перезагрузки микроконтроллера при подаче на него низкого логического уровня.
4 – CP_PD, также используется для перевода устройства в энергосберегающий режим.
7 и 0 – RXD0 и TXD0, это аппаратный UART, необходимый для перепрошивки модуля.
2 – TXD0, к этому контакту подключается светодиод, который загорается при низком логическом уровне на GPIO1 и при передаче данных по UART.
5 – GPIO0, порт ввода и вывода, также позволяет перевести устройство в режим программирования (при подключении порта к низкому логическому уровню и подачи напряжения) .
3 – GPIO2, порт ввода и вывода.

Основные отличия Ардуино от ESP8266

  • ESP8266 имеет больший объем флеш-памяти, при этом у ESP8266 отсутствует энергонезависимая память;
  • Процессор ESP8266 быстрее, чем у Ардуино;
  • Наличие Wi-Fi у ESP8266;
  • ESP8266 потребляеn больше тока, чем для Ардуино;

Что такое Remoteme.org?

Мы познакомимся с сайтом remoteme.org. Сайт позволяет использовать несколько вариантов управления вашим Arduino (и не только) через Интернет.

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

В рунете очень много хостингов, которые можно посмотреть и выбрать на разных сайтах по обзору хостингов типа рейтинга HostingHUB.ru. Например, вы можете сделать робота Rasbperry Pi с FPV:

Но в этом уроке мы начнем с варианта попроще — моргания светодиода через Интернет.

Основная цель сервиса — соединить все ваши устройства (RPi, Arduino, веб-страницы) в одну служебную шину. Объяснить принцип работы можно на реальном примере с почтальоном.

Почтальон может доставлять два вида писем:

  1. Асинхронные сообщения — это своего рода сообщение, которое мы отправляем и не ждем ответа. Примером такого сообщения может быть «включите свет», «поверните направо». Эти сообщения в системе называются .
  2. Синхронные сообщения — это как вызов функций, возвращающих состояние. Вы отправляете сообщение и ждете ответа. Такое сообщение можно использовать, например, чтобы узнать температуру от какого-либо датчика или спросить, горит ли светодиод. Такие сообщения на remoteme.org называются .

Есть библиотеки, которые помогают общаться с нашим «почтальоном». Ниже приведен пример JavaScript:

В приведенном выше коде мы отправляем массив байтов на устройство с идентификатором .

Выше мы отправим число 6 в массиве, а в качестве возврата ожидаем получить температуру от какого-либо датчика. А как обрабатывать сообщения и отвечать на синхронные сообщения? На этот раз пример кода для Arduino:

В функции настройки мы устанавливаем, какие функции будут вызываться при поступлении сообщений в Arduino. Далее я покажу, как именно всё это использовать.

Представьте себе систему remoteme.org как почтальона. Наш почтальон знает все ваши устройства и распознает их по . DeviceId также является адресом устройства.

Если устройство A хочет отправить сообщение на устройство B оно помещает массив байт в конверт, а на конверте само записывает , так что почтальон знает, куда доставляется это сообщение.

Также на remoteme.org вы можете создавать свои собственные веб-страницы для общения со своими устройствами и бесплатно размещать их в облаке remoteme.org. Страницы можно открыть в любом браузере, конечно же, после входа в систему.

Дополнительно remoteme.org дает возможность сохранять данные в базе данных — я покажу, как это сделать в другом уроке.

Вы также можете запускать некоторые скрипты на самом сервере remoteme.org, например, через можно подключить скрипт прогноза погоды на ближайшие дни, отправлять некоторые простые данные, как температура или осадки прямо на Arduino, что потом будет отображаться на некоторых ЖК-дисплеях.

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

Аппаратная часть

В качестве контроллера было решено использовать дешевый и популярный ESP8266. Он отлично подходил для моих целей, кроме одного момента: согласования уровней сигналов 5-вольтовых датчиков с 3.3 вольтовой логикой контроллера. В принципе, датчики Dallas вроде бы работают и на 3 вольтах, но у меня от контроллера до датчиков достаточно длинная линия, около 7 метров. Поэтому лучше напряжение повыше.

Было определено, что необходимо иметь по «железу»:

  • Контроллер ESP8266 или его старший брат ESP32 (в виде модуля DevKit).
  • Согласование уровней сигналов для датчиков.
  • Регулятор питания 5-вольтовой частью схемы.
  • Модуль управления реле.
  • Часы RTC + флеш память для записи логов.
  • Простейший 2-строчный LCD дисплей для отображения текущих значений датчиков и состояния прибора и реле.
  • Несколько физических кнопок, для управления состоянием устройства без доступа через web.

Многие компоненты из списка продаются в виде модулей для Arduino и многие модули совместимы с логикой 3.3в. Однако «слепливать» все это на макетной плате пучками проводов не хотелось, ведь хочется иметь аккуратный красивый «девайс». Да и за деньги, отданные китайцам за модули можно вполне нарисовать и заказать свою индивидуальную печатную плату, а ожидание её приезда будет компенсировано сравнительно быстрым и надежным монтажом.

Еще раз замечу, что это мой первый опыт в схемотехнике и в конструировании аппаратной части подобных вещей. Пришлось много учиться. Ведь по специальности я немного в стороне от микроконтроллеров. Но делать все «на коленках» не позволил живущий во мне дух перфекционизма.

Программирование ESP8266 в Arduino IDE

Программный комплект разработчика esp8266 включает в себя:

  • Компилятор из пакета GNU Compiler Collection.
  • Библиотеки, стеки протоколов WiFi, TCP/IP.
  • Средство загрузки информации в программу контроллера.
  • Операционная IDE.

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

Можно программировать из среды Arduino IDE. При ее помощи можно легко писать скетчи и загружать их в ESP8266, прошивать ESP8266, при этом не требуется сама плата Ардуино. Arduino IDE поддерживает все виды модулей ESP8266.

В настоящий момент для ESP8266 можно реализовать следующие функции:

  • Основные функции языка Wiring. Управлять портами GPIO можно точно так же, как и пинами на плате Ардуино: pinMode, digitalRead, digitalWrite, analogWrite. Команда analogRead(А0) позволяет считать значения АЦП. При помощи команды analogWrite (pin, value) можно подключить ШИМ на нужном выходе GPIO. При value=0 ШИМ отключается, максимальное значение достигает константы, равной 1023.С помощью функций attachInterrupt, detachInterrupt можно выполнять прерывание на любом порте GPIO, кроме 16.
  • Тайминг и delay. Используя команды millis и micros можно вернуть мс и мкс, которые прошли с момента старта. Delay позволяет приостановить исполнение программы на нужное время. Также функция delay(…) позволяет поддерживать нормальную работу Wi-Fi, если в скетче присутствуют большие элементы, которые выполняются более 50 мс. Yield() – аналог функции delay(0).
  • Serial и Serial1 (UART0 и UART1). Работа Serial на ESP8266 аналогична работе на ардуино. Запись и чтение данных блокируют исполнение кода, если FIFO на 128 байт и программный буфер на 256 байт заполнены. Объект Serial пользуется аппаратным UART0, для него можно задать пины GPIO15 (TX) и GPIO13 (RX) вместо GPIO1(TX) и GPIO3(RX). Для этого после функции Serial.begin(); нужно вызвать Serial.swap();. Аналогично Serial1 использует UART1, который работает на передачу. Необходимый пин для этого GPIO2.
  • Макрос PROGMEM. Его работа аналогична работе в Ардуино. Позволяет перемещать данные read only и строковые постоянные во flash-память. При этом в ESP8266 не сохраняются одинаковые константы, что приводит к дополнительной трате флеш-памяти.
  • I2C. Перед началом работы с шиной I2C выбираются шины с помощью функции Wire.pins(int sda, int scl).
  • SPI, OneWire – поддерживаются полностью.

Ардуино код для Мастера

Код для нашего ведущего Ардуино (т.е. мастера):

Разбираем код Мастера

QNH — авиационный термин. Это один из факторов коррекции, который при применении к альтиметру позволит ему точно считывать высоту над уровнем моря в текущем местоположении.

Варьируется ото дня ко дню и даже от часа к часу. Пилоты должны устанавливать этот коэффициент каждый раз при полете для калибровки своих альтиметров. Если пилоты не могут этого добиться, например, во время полета над океаном, они все используют 1013, то все их высотомеры считывают используя один и тот же эталон. Это позволяет им летать на разных высотах, чтобы избежать столкновения. Его можно получить на погодных сайтах.

Например, вот для Кейптауна — см. ссылку.

Вам не обязательно это делать. Но без скорректированного значения высоты в вашем местоположении, оно будет неверным (так как вы должны учитывать местные изменения атмосферного давления) и может даже отображаться отрицательным. Фактическое давление и температура все равно будут верны.

Запускает один из 125 каналов. Передатчик и приемник должны иметь один и тот же адрес.

Устанавливает уровень мощности передатчика. Высокий уровень может вызвать проблемы с нестабильностью, если питание 3,3 В осуществляется по длинным проводам. Лучше всего вставить через него конденсатор 100 мкФ, но для более долгого срока службы батареи лучше использовать низкочастотный конденсатор.

Говорит модулю вести себя как передатчик и наоборот:

говорит ему вести себя как приемник.

Передаваемые данные выводятся локально на последовательный монитор (если он подключен), а также передаются на приемник.

Строки:

посылают символ степени на последовательный монитор (для некоторых ПК это может отличаться).

Если вы используете ЖК-дисплей, вы можете сделать это с помощью:

Наконец, передает содержимое массива данных

Обратите внимание, что ему необходимо знать, сколько байт отправить и получит это

Как это работает?

Нам нужно создать объект remoteMe, который мы будем использовать для связи с нашей веб-страницей.

Константа TOKEN — это токен из вкладки Tokens, DEVICE_ID — это нашего Arduino, в нашем случае это 203, используя этот адрес, мы будем отправлять сообщения с веб-страницы в Arduino.

Кроме того мы используем:

1001 — это нашей будущей веб-страницы.

Функция :

Подключаемся к Wifi и ждем, пока установится соединение.

Мы устанавливаем, какая функция будет вызываться при приходе сообщения в Arduino.

Это означает, что нам нужна двусторонняя связь.

И регистрирует наше устройство на app.remoteme.org. После вызова этой функции устройство будет отображаться на вкладке устройства с заданным именем.

Как это устроено. Веб-страница отправит сообщение на устройство, и эта функция в Arduino будет запущена:

Как видите, мы не читаем то, что было отправлено в сообщении. Функция вызывается всегда после получения любого сообщения.

Вышеупомянутая функция также вызывается при нажатии кнопки на Arduino. Эта функция, помимо изменения состояния диода, отправляет новое состояние на веб-страницу:

В единственный байт сообщения мы помещаем 1 или 0 в зависимости от текущего состояния диода.

Функция имеет параметры:

  • массив, в который мы будем сохранять наши данные, которые будут отправлены
  • позиция, в которую данные (в данном случае ) будут помещены в массив. Параметр указан как ссылка, поэтому после записи числа он увеличивается на размер памяти числа. В этом случае он увеличился на 1, но у нас есть несколько похожих функций, таких как put float, double, string
  • и последний параметр 0, если диод не горит и 1, если он горит

Укороченный вариант сохранения параметра в массив будет выглядеть так:

И в конце мы отправляем сообщение на веб-страницу

Ниже приведена функция, которая запускается, когда веб-страница запрашивает текущее состояние диода.

Данные, которые мы хотим вернуть, мы помещаем в , а в мы помещаем размер данных, которые мы хотим отправить обратно.

Подобно функции отправки состояния, здесь мы помещаем единственный байт, который представляет состояние диода.

И последняя функция — .

проверяет, есть ли какие-либо сообщения, ожидающие обработки, проверяет состояние устройства и делает еще кое-что — все, что делает эта функция, вы можете проверить в исходном коде библиотек.

Если вы еще не запрограммировали свой Arduino, вы можете сделать это сейчас.

Шаг 3. Схема соединения

Мы можем соединить Ардуино и WiFi модуль двумя способами — первый с резисторами и второй вариант без резисторов. Остановимся на обеих схемах.

Вариант 1

Соединяем контакты, как описано на прилагаемой таблице контактов ниже:

Следуйте этим шагам:

  • подключите красный провод к VIN (3,3 В) к питанию + 3,3 В от микроконтроллера;
  • подключите черный провод к земле;
  • подключите зеленый провод к TX модуля Wifi и микроконтроллера;
  • подключите желтый провод к RX модуля Wi-Fi и микроконтроллера.

Важно! ESP8266 строго питается только до 3,3 В, при больших значениях можно испортить модуль. Не используйте напряжения более 3,3 В!. Подключите VIN к 3,3 В для включения питания, а также контакт ENABLE для включения модуля

Подключите VIN к 3,3 В для включения питания, а также контакт ENABLE для включения модуля.

TX подключен к RX, что означает, что все, что мы хотим передать в ESP8266, получит Arduino UNO. И наоборот для RX в TX. Создав эту схему, мы теперь готовы запустить WiFi с Arduino UNO.

Вариант 2

Соедините контакты, соответственно этой таблице контактов ниже:

Следуй этим шагам:

  • подключите оба контакта ECC VCC / 3.3V / Power Pin и Enable (красные провода) к резистору 10 кОм, а затем к выводу питания Uno + 3.3V;
  • соедините контакт заземления / заземления ESP (черный провод) с выводом заземления / заземления Arduino Uno;
  • подключите TX ESP (зеленый провод) к контакту 3 Uno;
  • подключите RSP (синий провод) ESP к резистору 1 кОм, затем к контакту 2 Uno;
  • подключите RX (синий провод) ESP к резистору 1 кОм, затем к выводу GND заземления Uno.

О схеме

Вывод питания ESP на ESP11 имеет маркировку VIN, однако для некоторых версий это может быть 3,3 В или Power или VCC. Вам также нужно будет включить вывод ESP CH_EN или Enable, чтобы он работал.

Как мы уже обсуждали, — не используйте напряжение на ESP больше чем 3.3 В. ESP8266 строго использует 3,3 В. Более того, это разрушит модуль. Так как Arduino имеет 5 В, нам пришлось поставить делитель напряжения — это резисторы.

TX ESP подключен к RX Arduino Uno, что означает, что все, что мы хотим передать (TX) в ESP, получит (RX) от Uno, и наоборот. Создав эту схему, мы теперь готовы запустить WIFI с Arduino UNO.

Внимание! Если вы подключите последовательный отладчик через USB-кабель или откроете COM-порт, связь между ESP и Arduino будет нарушена и не сможет работать. Поэтому, прежде чем прошивать Uno, сначала удалите Rx / Tx из ESP.

Элементы платы

Микроконтроллер ATmega16U2

Микроконтроллер ATmega16U2 обеспечивает связь микроконтроллера ATmega328P с USB-портом компьютера. При подключении к ПК Arduino Uno WiFi определяется как виртуальный COM-порт. Прошивка микросхемы 16U2 использует стандартные драйвера USB-COM, поэтому установка внешних драйверов не требуется.

Пины питания

  • VIN: Напряжение от внешнего источника питания (не связано с 5 В от USB или другим стабилизированным напряжением). Через этот вывод можно как подавать внешнее питание, так и потреблять ток, если к устройству подключён внешний адаптер.
  • 5V: На вывод поступает напряжение 5 В от стабилизатора платы. Данный стабилизатор обеспечивает питание микроконтроллера ATmega328. Запитывать устройство через вывод не рекомендуется — в этом случае не используется стабилизатор напряжения, что может привести к выходу платы из строя.
  • 3.3V: 3,3 В от стабилизатора платы. Максимальный ток вывода — 1 А.
  • GND: Выводы земли.
  • IOREF: Вывод предоставляет платам расширения информацию о рабочем напряжении микроконтроллера. В зависимости от напряжения, плата расширения может переключиться на соответствующий источник питания либо задействовать преобразователи уровней, что позволит ей работать как с 5 В, так и с 3,3 В устройствами.

Порты ввода/вывода

  • Цифровые входы/выходы: пины –
    Логический уровень единицы — 5 В, нуля — 0 В. Максимальный ток выхода — 40 мА. К контактам подключены подтягивающие резисторы, которые по умолчанию выключены, но могут быть включены программно.
  • ШИМ: пины ,,,, и
    Позволяют выводить 8-битные аналоговые значения в виде ШИМ-сигнала.
  • АЦП: пины –
    6 аналоговых входов, каждый из которых может представить аналоговое напряжение в виде 10-битного числа (1024 значений). Разрядность АЦП — 10 бит.
  • TWI/I²C: пины и
    Для общения с периферией по синхронному протоколу, через 2 провода. Для работы — используйте библиотеку .
  • SPI: пины , , , .
    Через эти пины осуществляется связь по интерфейсу SPI. Для работы — используйте библиотеку .
  • UART: пины и
    Эти выводы соединены с соответствующими выводами микроконтроллера ATmega16U2, выполняющей роль преобразователя USB-UART. Используется для коммуникации платы Arduino с компьютером или другими устройствами через класс .

Светодиодная индикация

Имя светодиода Назначение
ON Индикатор питания на плате.
L Светодиод вывода . При отправке значения HIGH светодиод включается, при отправке LOW – выключается.
WIFI Мигает при поиске и обмена данными с WiFi сетями
RX и TX Мигают при обмене данными между Arduino Uno WiFi и ПК.

Регулятор напряжения 5 В

Когда плата подключена к внешнему источнику питания, напряжение проходит через стабилизатор . Выход стабилизатора соединён с пином . Максимальный выходной ток составляет 1 А.

Регулятор напряжения 3,3 В

Стабилизатор с выходом 3,3 вольта. Обеспечивает питание модуля WiFi и выведен на пин . Максимальный выходной ток составляет 1 А.

ICSP-разъём для ATmega328P

ICSP-разъём предназначен для внутрисхемного программирования микроконтроллера ATmega328P.
С использованием библиотеки данные выводы могут осуществлять связь с платами расширения по интерфейсу SPI. Линии SPI выведены на 6-контактный разъём, а также продублированы на цифровых пинах , , и .

Сборка макетной платы ESP8266

ESP8266 – недорогой SoC-чип со встроенным микроконтроллером и полным стеком протоколов TCP/IP, что означает, что он может напрямую обращаться к вашей Wi-Fi сети.

Поскольку у этого чипа есть свой микроконтроллер, вы можете поместить в него код своего приложения или можете использовать модуль просто как Wi-Fi приемопередатчик, что мы и собираемся сделать в данном проекте. Более эффективно было бы использовать этот модуль и как приемопередатчик, и как контроллер, но в целях обучения мы будем взаимодействовать с модулем, используя Arduino.

Чип ESP8266 поставляется в разных модулях. Мы будем использовать модуль ESP-01. Конечно, вы можете использовать любой другой модуль.

Во-первых, вы должны знать, что модуль работает с напряжением 3,3 В, и напряжение высокого логического уровня от Arduino должно быть таким же, чтобы не повредить наш модуль. Для этого требуется преобразователь уровня напряжения между платой Arduino (которая работает на 5 В) и модулем. Хорошей новостью является то, что в преобразователе будет нуждаться только вывод для передачи на Arduino, поскольку приемный вывод обычно распознает логические сигналы с напряжением 3,3 В от ESP8266.

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

Преобразователь уровня 5В → 3,3В

На рисунке ниже показана распиновка нашего модуля на ESP8266:

Распиновка Wi-Fi модуля ESP8266 (вид сверху, не в масштабе)

Вывод Назначение
UTXD Передача данных через UART
URXD Прием данных через UART. Выход, к которому он подключается, должен быть 3,3 В.
CH_PD Выключение: низкий уровень на входе выключает чип, высокий уровень на входе включает его; для нормальной работы модуля необходимо подтянуть его к линии питания.
GPIO0 При загрузке: должен быть высокий уровень, чтобы входить в нормальный режим загрузки; низкий уровень вводит в специальные режимы загрузки.
GPIO2 При загрузке: низкий уровень заставляет загрузчик войти в режим загрузки флеш-памяти; высокий уровень вызывает нормальный режим загрузки.
RST Сброс; активный уровень – низкий.
GND Земля.
VCC Питание/3,3В.

Я использовал LM317, настраиваемый линейный регулятор напряжения с выходным током до 1,5 А, для обеспечения модуля подходящим источником питания 3,3 В.

Примечание: Не используйте вывод 3,3 В от Arduino, так как стабилизатор напряжения 3,3 В на плате Arduino не может обеспечить необходимую для модуля величину тока, особенно при пиковом потреблении энергии во время передачи.

Принципиальная схема макетной платы ESP8266

Я использовал BS170 (вместо BSS138) для преобразователя логических уровней; оба работают хорошо.

Макетная плата ESP8266

Теперь вы можете подключить свой модуль к компьютеру, используя USB-TTL преобразователь, и испытать его.

Элементы платы

Микроконтроллер ATmega4809

Сердцем платформы является 8-битный микроконтроллер семейства megaAVR — ATmega4809 с тактовой частотой до 20 МГц. Контроллер предоставляет 48 КБ Flash-памяти для хранения прошивки, 6 КБ оперативной памяти SRAM и 256 байт энергонезависимой памяти EEPROM для хранения данных.

На плате Arduino Uno Wi-Fi частота контроллера установлена на 16 МГц.

Микроконтроллер ATmega32U4

Микроконтроллер ATmega32U4, с прошивкой USB-UART преобразователя, обеспечивает связь контроллера ATmega4809 с USB-портом компьютера. При подключении к ПК Arduino Uno Wi-Fi определяется как виртуальный COM-порт.

Беспроводной модуль NINA-W102

За беспроводную связь отвечает модуль U-blox NINA-W102 со встроенным чипом ESP32 для обмена данными по воздуху в диапазоне 2,4 ГГц по Wi-Fi и Bluetooth. Регулировка выходной мощности обеспечивает оптимальное соотношение между дальностью связи, скоростью передачи данных и энергопотреблением.

IMU-сенсор

IMU-сенсор на 6 степеней свободы включает в себя акселерометр и компас. Сборка выполнена на чипе LSM6DS3 по технологии (англ. System-in-Package — система в корпусе), где акселерометр и гироскоп лежат методом бутерброда в пластиковом корпусе.

Светодиодная индикация

Имя светодиода Назначение
ON Информационный индикатор питания
RX и TX Мигают при обмене данными между Arduino и ПК
L Пользовательский светодиод на пине микроконтроллера, в отличии от пина на других платформах Arduino. Используйте определение для работы со светодиодом. При задании значения высокого уровня светодиод включается, при низком – выключается.

Регулятор напряжения на 5 вольт

Импульсный понижающий регулятор напряжения MPM3610 обеспечивает питание микроконтроллера ATmega4809 и другой логики платформы при подключении платформы через внешний разъём питания или пин . Диапазон входного напряжения от 7 до 12 вольт. Выходное напряжение 5 вольт с максимальным выходным током 1,2 ампера.

Регулятор напряжения на 3,3 вольта

Линейный понижающий регулятор напряжения NX1117CE33Z обеспечивает питание беспроводного модуля NINA-W102 и IMU-сенсора LSM6DS3. На регулятор поступает напряжение с линии . Выходное напряжение 3,3 вольта с максимальным выходным током 1 ампер.

Программирование модуля

При соответствующей подготовке можно писать собственные функции для отправки в ESP запросов TCP. Это позволит создавать свои клиентские части веб-приложений, веб-служб, мобильных приложений с возможностью удаленного управления устройствами. Полный текст примеров кода расположен по адресу https ://arduinoplus.ru /wp-content/uploads/ 2019/03/arduino-wifi.ino.

Выводы по ESP8266

Платы на базе ESP8266 позволяют строить проекты с полным использованием возможностей интернета. В таких проектах доступны дистанционное управление, анализ информации на сервере, сбор данных, обработка звука, изображений. При этом устройство не привязано проводом к сети и остается мобильным в зоне Wi-Fi.

Использование ESP8266 для радиосвязи Ардуино по WiFi

С помощью ESP можно устроить подключение Arduino или реле к Wifi. Важный момент связи состоит в том, что напряжение, подаваемое для этих микроконтроллеров, разное, и их соединение должно происходить через резистивные делители. Общая схема подключения выглядит так: пин на 3.3 Вольта от Ардуино подключается к CH_PD на ESP, а заземление с Ардуино подключается к заземлению на ЕSP. 0 на ТХ, а 1 на RХ.

Дальнейшее подключение выполняется по инструкции:

  1. Подключение USB-TTL к USB порту и ESP;
  2. Запуск среды разработки Arduino;
  3. Выбор в настройках необходимых параметров для памяти, порта и платы;
  4. Переход в Файл — Примеры — ESP — WifiServer;
  5. Запись SSID и защитного кода беспроводной сети;
  6. Запуск компиляции и загрузки;
  7. Ожидание завершения прошивки и отсоединение контакта GPI0 от заземления;
  8. Установка скорости в районе 115 200;
  9. Подключение и получение нового IP-адреса;
  10. Далее нужно открыть интернет-браузер и ввести в поиске строку Номер IP/gpio/1;
  11. Промониторить порт и проверить, загорелся ли светодиод, если он подключен.

Настройка Arduino и скетч

Подключение ESP8266 к Arduino

———————————————————————————————————

UTXD —> RX на Arduino

CH_PD VCC

RST

VCC —> VCC на Arduino

———————————————————————————————————

GND —> GND на Arduino

GPIO2

GPIO0

URXD —> TX на Arduino

———————————————————————————————————

Подключение цифрового датчика температуры к Arduino

———————————————————————————————————

Arduino GND — > DS18B20 GND(1) — > DS18B20 VDD(3)

DS18B20 DQ(2) — > 4.7кОм R —> VCC на Arduino 3.3В

———————————————————————————————————

#include &ltstdlib.h&gt

#include &ltSoftwareSerial.h&gt

#include &ltOneWire.h&gt

#include &ltDallasTemperature.h&gt

#define ONE_WIRE_BUS 8

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

#define SSID «»

#define PASS «»

#define IP «184.106.153.149» // thingspeak.com

String GET = «GET /update?key=&field1=»;

SoftwareSerial monitor(10, 11); // RX, TX

void setup()

{

monitor.begin(9600);

Serial.begin(9600);

sensors.begin();

sendDebug(«AT»);

delay(5000);

if(Serial.find(«OK»)){

monitor.println(«RECEIVED: OK»);

connectWiFi();

}

}

void loop(){

sensors.requestTemperatures();

float tempC = sensors.getTempCByIndex(0);

tempC = DallasTemperature::toFahrenheit(tempC);

char buffer;

String tempF = dtostrf(tempC, 4, 1, buffer);

updateTemp(tempF);

delay(60000);

}

void updateTemp(String tenmpF){

String cmd = «AT+CIPSTART=\»TCP\»,\»»;

cmd += IP;

cmd += «\»,80″;

sendDebug(cmd);

delay(2000);

if(Serial.find(«Error»)){

monitor.print(«RECEIVED: Error»);

return;

}

cmd = GET;

cmd += tenmpF;

cmd += «\r\n»;

Serial.print(«AT+CIPSEND=»);

Serial.println(cmd.length());

if(Serial.find(«>»)){

monitor.print(«>»);

monitor.print(cmd);

Serial.print(cmd);

}else{

sendDebug(«AT+CIPCLOSE»);

}

if(Serial.find(«OK»)){

monitor.println(«RECEIVED: OK»);

}else{

monitor.println(«RECEIVED: Error»);

}

}

void sendDebug(String cmd){

monitor.print(«SEND: «);

monitor.println(cmd);

Serial.println(cmd);

}

boolean connectWiFi(){

Serial.println(«AT+CWMODE=1»);

delay(2000);

String cmd=»AT+CWJAP=\»»;

cmd+=SSID;

cmd+=»\»,\»»;

cmd+=PASS;

cmd+=»\»»;

sendDebug(cmd);

delay(5000);

if(Serial.find(«OK»)){

monitor.println(«RECEIVED: OK»);

return true;

}else{

monitor.println(«RECEIVED: Error»);

return false;

}

}

Совет. После того как вы провели testing/monitoring, загрузите тот же скетч без серийного монитора. Отрабатывает лучше.

#include

#include

#include

#define ONE_WIRE_BUS 8

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

#define SSID «»

#define PASS «»

#define IP «184.106.153.149» // thingspeak.com

String GET = «GET /update?key=&field1=»;

void setup()

{

Serial.begin(9600);

sensors.begin();

Serial.println(«AT»);

delay(5000);

if(Serial.find(«OK»)){

connectWiFi();

}

}

void loop(){

sensors.requestTemperatures();

float tempC = sensors.getTempCByIndex(0);

tempC = DallasTemperature::toFahrenheit(tempC);

char buffer;

String tempF = dtostrf(tempC, 4, 1, buffer);

updateTemp(tempF);

delay(60000);

}

void updateTemp(String tenmpF){

String cmd = «AT+CIPSTART=\»TCP\»,\»»;

cmd += IP;

cmd += «\»,80″;

Serial.println(cmd);

delay(2000);

if(Serial.find(«Error»)){

return;

}

cmd = GET;

cmd += tenmpF;

cmd += «\r\n»;

Serial.print(«AT+CIPSEND=»);

Serial.println(cmd.length());

if(Serial.find(«>»)){

Serial.print(cmd);

}else{

Serial.println(«AT+CIPCLOSE»);

}

}

boolean connectWiFi(){

Serial.println(«AT+CWMODE=1»);

delay(2000);

String cmd=»AT+CWJAP=\»»;

cmd+=SSID;

cmd+=»\»,\»»;

cmd+=PASS;

cmd+=»\»»;

Serial.println(cmd);

delay(5000);

if(Serial.find(«OK»)){

return true;

}else{

return false;

}

}

Заключение

Итак, у меня получилось два устройства, одно из них принимает сигналы по bluetooth и активирует розетки, а также разблокирует Windows на присоединенном компьютере, а другое — эти сигналы отправляет после успешной валидации по RFID-метке. Однако, как я уже говорил, было странным делать и запись, и чтение в одном устройстве, без какой-либо защиты. Я сделал так лишь потому, что хотел пойти дальше считывания ID RFID-карты и сравнения его с захардкоженым значением, а попробовать поработать с ее памятью, для чего она собственно предназначена. Таким образом, теперь я знаю как записать любую информацию на RFID-карту, как ее считать, как сделать карту Read Only и т.п. Получилась система для домашнего использования. Так и получается, я использую свой девайс дома, умная розетка подключена к компьютеру, в нее подсоединены колонки и зарядное для телефона. Деблокиратор стоит на входе комнаты. Не скажу, что это девайс, без которого я не могу жить, но идеи реального практического применения у него есть. Одна из них вполне осуществима и будет реализована.

Планируется сделать систему контроля доступа к рабочему месту студента в аудитории с компьютерами. Забегая вперед, скажу, что в качестве студенческого билета в нашем университете используется RFID-карта MIFARE 1K. Предположим, что у нас есть небольшая аудитория на 6 компьютеров, другими словами на 6 рабочих мест.

Сперва мы «клонируем» умную розетку — делаем еще 5 таких устройств, чтобы помимо использования компьютера, студент мог подключить свой ноутбук/паяльник/телефон к розетке. Тут нам и пригодится динамическое соединение Master-устройства bluetooth со Slave-устройством, о котором я говорил, рассказывая про bluetooth-модуль. Больше каким-либо образом модифицировать умную розетку не придется. Единственное, придется поискать решение, чтобы нельзя было перепрограммировать микроконтроллер Arduino, присоединенный к компьютеру через USB-кабель.

Теперь стоит сказать об изменениях в деблокираторе. Его мы лишаем функции записи, оставляя возможность только считывать RFID-карты. Если бы мы использовали самодельные RFID-карты, то понадобилось еще сделать устройство для записи RFID-карт. Так как планируется использовать уже готовые студенческие билеты с готовой записанной информацией, данное устройство в рамках будущего проекта не требуется, но в случае использования своих, «кастомных» карт его создание было бы очень простым с учетом проделанной работы над этим проектом. Также, деблокиратор необходимо будет оснастить Ethernet- или WiFi-модулем, для возможности осуществлять запросы на management-сервер. Какой и зачем, спросите вы? Чтобы сделать систему более гибкой и удобной, перед тем как придти поработать в аудиторию, студенту необходимо «забронировать» себе место с помощью данного веб-сайта. Деблокиратор при проверке RFID-карты студента будет обращаться на данный сервер для проверки бронирования (и еще чего-нибудь, если хочется). Остается подумать, как реализовать перепроверку присутствия студента (ушел и не приложил карту) и удобный способ информирования об окончании «рабочего» времени.

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий