На этапе 1 ​​проекта мы внедрили устройство контроля влажности почвы, которое могло сообщать нам только об уровне влажности почвы с помощью OLED-дисплея и зуммера.

На этапе 2 мы будем реализовывать подключение WiFi для Arduino, чтобы он мог начать отправлять данные в центральное место. Затем мы можем построить информационную панель с данными и дать нам более четкое представление о состоянии почвы.

Для этого нам нужен модуль WiFi, который будет работать с Arduino. На рынке их несколько, но для этого домашнего проекта мы можем использовать WiFi-модуль ESP-01 8266.

Мы разделим тему «Добавление возможностей Wi-Fi» на несколько статей, чтобы упростить ее изучение. В этой статье мы обсудим процесс понимания и подготовки модуля WiFi к фактической реализации.

Настройка WiFi модуля ESP-01 8266

На этапе 1 мы использовали Arduino Uno для мониторинга влажности почвы, и мы оставим его в покое, поскольку он считается запущенным в «производстве». Вместо этого мы будем использовать другой Arduino Uno для разработки функции подключения к WiFi.

Мы загрузим эскиз BareMinimum в Arduino, чтобы избавиться от любой ранее существовавшей программы, работающей на Arduino, и проверить, работает ли модуль WiFi. Как только это будет завершено, мы можем приступить к подключению ESP-01 к Arduino.

Давайте сначала отключим Arduino от компьютера, чтобы предотвратить любые несчастные случаи, такие как короткое замыкание.

Подключение WiFi модуля

Затем мы получим макетную плату и несколько соединительных проводов «папа-папа» и «мама-папа». В моем случае у меня есть четыре перемычки типа «папа-папа» и пять «мама-папа». Вы также можете использовать цветовую маркировку проводов, чтобы знать, какой цвет используется для какой цели. Мы подключаем 3,3 В и землю от Arduino к шинам питания макетной платы с помощью перемычек. Причина для 3,3 В вместо 5 В заключается в том, что модуль предназначен для работы на прежнем уровне напряжения и имеет максимальный допуск 3,6 В. Запуск модуля на 5В уничтожит его.

Затем мы подключаем контакты Arduino TX/RX к вертикальным направляющим макетной платы с помощью другой пары перемычек. Затем подключите 3V3 и GND от модуля WiFi к шинам питания на макетной плате проводами типа «мама-папа». После этого EN (также известный как CH_PD) подключается к шине 3V3. Это штифт включения чипа, и его высокое нажатие активирует модуль Wi-Fi.

В следующей части все становится немного сложнее. Ошибка может оказаться фатальной для модуля WiFi.

Вот где цветовая маркировка проводов может оказаться очень полезной.

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

Следующая линия для подключения — это контакт RX модуля WiFi. Однако, прежде чем мы сможем подключить его к выводу RX Arduino, нам нужно сделать кое-что еще. Большинство цифровых выводов Arduino выдают 5 В вместо 3,3 В, когда они включены. Это проблема для модуля WiFi, так как это может привести к повреждению чипа. Чтобы обойти это, мы будем использовать делитель напряжения.

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

Выходное напряжение определяется по следующей формуле:

Vout= (Vin x R2) / (R1 + R2) =>
Where:
 R1 and R2 is the resistance value in Ohm
 Vin is the input voltage
 Vout is the output voltage

Я использовал этот сайт, чтобы помочь мне быстро определить нужные мне значения сопротивления.

Для R1 я использовал 1,2 кОм (цвет резистора: коричневый, красный, черный, коричневый, коричневый), а R2 — 1,8 кОм (цвет резистора: коричневый, серый, черный, коричневый, коричневый). Эта комбинация дает нам Vout 3 В, что более чем достаточно для нашей цели.

На макетной плате R1 соединяет контакт RX Arduino с пустой вертикальной шиной, а R2 соединяет R1 с землей. Затем мы подключаем контакт RX модуля WiFi к соединению между парой резисторов. Я использую оранжевые провода для контактов RX.

Окончательный результат выглядит так:

Как только модуль WiFi подключен, мы можем включить Arduino, подключив его к компьютеру через USB.

Тестирование WiFi-модуля

После включения Arduino откройте IDE Arduino (если вы еще этого не сделали), а затем откройте Serial Monitor.

По умолчанию модуль WiFi поставляется с прошивкой AT. Документацию по доступным командам можно найти здесь.

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

Для последовательного монитора убедитесь, что скорость передачи установлена ​​на 1152000, а в раскрывающемся списке выбран вариант Both NL & CR, поскольку прошивка WiFi AT зависит от новой строки и возврата каретки, чтобы определить, готово ли сообщение.

В текстовом поле введите «AT» и нажмите Enter. Это отправит AT-команду модулю WiFi. Он должен вернуть ответ «ОК».

Примечание. Все AT-команды должны быть в верхнем регистре.

Далее давайте проверим версию прошивки модуля WiFi, введя команду: AT+GMR?

Из ответа следует, что модуль WiFi имеет действительно старую версию прошивки. Нам нужно будет обновить его, чтобы использовать новые команды.

Если мы перейдем в раздел скачать для модуля на веб-сайте ExpressIf, мы можем найти последнюю версию прошивки AT. Однако это может быть не лучшая версия прошивки для нас, по крайней мере, согласно информации, найденной в этой теме форума. Другой пользователь попытался прошить прошивку (ESP8266 IDF AT Bin V2.0) до последней версии на момент сообщения в теме, но модуль WiFi перестал отвечать на AT-команды. Вместо этого лучше использовать версию v1.74.

Поскольку я использую Mac, я не могу запустить средство загрузки Flash по умолчанию с веб-сайта ExpressIf. Это только для Windows. Что мы можем сделать, так это использовать приложение для перепрошивки прошивки на основе Python, вызываемое esptool. Первоначально он был создан Фредиком Альбергом как неофициальный проект сообщества, и с тех пор ExpressIf поддерживает его.

Мы можем установить esptool с помощью команды pip в соответствии с README, найденным здесь. После этого скачаем прошивку AT v1.74 отсюда.

Разархивируйте его в папку по вашему выбору и откройте Терминал на Mac. Перейдите в папку, содержащую распакованную прошивку, и убедитесь, что вы находитесь в папке «bin». Для себя я поместил его в папку «Загрузки».

Теперь мы готовы приступить к прошивке.

Перепрошивка прошивки ESP-01 8266

Перед процессом прошивки нам нужно сделать две вещи:

  1. Определите порт модуля WiFi.
  2. Переведите модуль в программируемое состояние.

Чтобы определить порт, мы можем использовать Arduino IDE. Перейдите в меню «Инструменты» и в разделе «Порты» мы должны увидеть порт, к которому подключен Arduino.

Обратите внимание на порт, а затем мы можем перейти к переводу модуля WiFi в программируемое состояние.

Шаги следующие:

  1. Соедините контакт RESET на Arduino с землей с помощью перемычки.
  2. Подключите контакт GPIO_0 модуля Wi-Fi к земле на макетной плате. Держите этот контакт подключенным на протяжении всего процесса прошивки.
  3. Подключите контакт RESET модуля Wi-Fi к земле на макетной плате ровно на одну секунду и отключите его.

Теперь модуль WiFi должен быть готов к программированию.

В Терминале введите следующую команду. Значением параметра — port должен быть тот же порт, который вы определили ранее. Затем нажмите Enter, чтобы начать процесс перепрошивки.

esptool.py --port /dev/cu.usbmodem1432101 write_flash --flash_mode dout --flash_size 1MB 0x0 boot_v1.7.bin 0x01000 at/512+512/user1.1024.new.2.bin 0xfb000 blank.bin 0xfc000 esp_init_data_default_v08.bin 0xfe000 blank.bin 0x7e000 blank.bin

В процессе перепрошивки вы должны увидеть следующее.

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

Мы отправим команду «AT» и должны получить ответ «ОК». После этого мы отправляем AT+GMR? команда. Мы должны получить следующий ответ:

Кроме того, скорость передачи по умолчанию составляет 115200, а это слишком быстро. Нам нужно будет замедлить его до 9600. Для этого нам нужно будет использовать команду AT+UART_DEF. Информацию о команде можно найти здесь.

Чтобы установить скорость передачи данных, введите команду AT+UART_DEF=9600,8,1,0,0 и нажмите клавишу ввода.

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

Затем запустите AT+UART_DEF? команда.

Выше выглядит хорошо. Теперь модуль WiFi обновлен, и установлена ​​скорость передачи данных. Мы готовы перейти к следующему этапу.

Сканирование WiFi

Чтобы программа на Arduino могла взаимодействовать с модулем WiFi, нам понадобится другой набор контактов. По умолчанию контакты TX и RX на Arduino используются для последовательной связи (например, USB). Это контакты, которые позволяют нам загружать Sketch на устройство, а также используются для последовательного монитора. Когда другие устройства подключены к Arduino через контакты TX и RX, мы используем Arduino в качестве последовательного адаптера USB-TTL, что в нашем случае может помешать связи с модулем WiFi.

Чтобы использовать другие цифровые контакты на Arduino для последовательной связи, мы можем использовать библиотеку SoftwareSerial, которая будет эмулировать оставшиеся цифровые контакты.

Во-первых, давайте отключим контакты WiFi TX и RX от Arduino. Затем создайте новый эскиз и определите следующее.

#include "SoftwareSerial.h"

const byte rxPin = 2;
const byte txPin = 3;

SoftwareSerial wifiSerial(2,3); //PIN 2 to receive data from WiFi, PIN 3 to transmit data to WiFi module

Приведенный выше код устанавливает контакт 2 в качестве контакта RX и контакт 3 в качестве контакта TX с точки зрения Arduino. Это означает, что контакт 2 будет использоваться для получения данных от модуля WiFi, тогда как контакт 3 будет использоваться для отправки данных в модуль WiFi для передачи во внешний мир.

Затем в функции настройки Sketch мы установим последовательное USB-соединение со скоростью 115 200 бод. После этого установите pinMode для rxPin и txPin. на INPUT и OUTPUT соответственно. Затем мы также инициализируем библиотеку SoftwareSerial для работы на скорости 9600 бод.

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  
  wifiSerial.begin(9600);
}

Теперь мы готовы подключить модуль WiFi к Arduino. В отличие от предыдущего подключения, которое мы сделали, контакты TX и RX поменялись местами. Мы подключим вывод RX модуля WiFi к выводу 3, а вывод TX — к выводу 2. Как упоминалось ранее, мы должны быть осторожны, чтобы не вставить вывод WiFi TX в вывод 3 Arduino, поскольку этот вывод теперь будет вывод 5V после того, как вышеупомянутый Sketch будет развернут на Arduino.

Чтобы убедиться, что модуль WiFi хорошо работает с SoftwareSerial, мы будем использовать его для запроса доступных точек доступа.

Для этого я попытался отправить команду AT+CWLAP через функцию println. Затем я прочитаю ввод. После нескольких попыток я понял, что на самом деле очень утомительно и подвержено ошибкам работать с последовательной связью.

Мне нужно лучшее решение.

В ходе своего исследования я обнаружил, что самой простой в использовании библиотекой является WiFiEsp. Эту библиотеку можно найти через менеджер библиотек Arduino IDE. После установки последней версии мы приступим к реализации возможности сканирования точки доступа WiFi.

Во-первых, давайте изменим начало скетча, чтобы использовать библиотеку WiFiEsp.

#include "WiFiEsp.h"

const byte rxPin = 2;
const byte txPin = 3;

#ifndef HAVE_HWSERIAL1
    #include "SoftwareSerial.h"
    SoftwareSerial wifiSerial(rxPin, txPin); //PIN 2 to receive data from WiFi, PIN 3 to transmit data to WiFi module
#endif

Затем измените функцию настройки следующим образом:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);

  wifiSerial.begin(9600);
  WiFi.init(&wifiSerial);

}

Далее в функции цикла делаем следующее:

Serial.println();
  Serial.println("Scanning available networks ... ");

  printNetworkScanResult();
  delay(10000);

Для функции printNetworkScanResult мы делаем следующее:

void printNetworkScanResult()
{
  int numSsid = WiFi.scanNetworks();
  while (numSsid == -1)
  {
    Serial.println("Couldn't get a WiFi connection");
    delay(3000);
    numSsid = WiFi.scanNetworks();
  }


  Serial.print("Number of available networks: ");
  Serial.println(numSsid);

  for (int i = 0; i < numSsid; i++)
  {
    Serial.print(i + 1);
    Serial.print(")");
    Serial.print(WiFi.SSID(i));
    Serial.println();
  }
}

Как только скетч будет развернут на Arduino и начнет работать, посмотрите на ответ, возвращенный в мониторе Serial. Мы должны увидеть список точек доступа WiFi.

Наконец, теперь мы знаем, что WiFi-модуль работает.

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

Эта статья изначально была опубликована здесь.