На этом мы закончим главу про Arduino и в третьей части рассмотрим модули ESP более подробно. Четвертая часть будет посвящена Linux и Raspberry Pi.
Часть 3. Выходим в Web: платы ESP32
3.1 Общее знакомство
Платы Arduino в свое время стали настоящей находкой для радиолюбителей - просто и без особых сложностей можно использовать различные компоненты, датчики, писать логику программы. Но увы, во-первых, 8-битный процессор, работающий на частоте 16МГц, не позволяет запускать более-менее сложные алгоритмы. Во-вторых, современный мир - это мир Интернета. Практически для любого устройства возможность обмена данными становится критически важной.
Итак, настала пора предоставить героя нашей следующей главы - плату ESP32.
Всего за 6$ мы получаем 32-разрядный процессор, работающий на частоте 240МГц, 520Кб памяти, 4Мб флеш-памяти и поддержку Bluetooth и WiFi.
Писать программы для ESP32 можно также с помощью Arduino IDE, необходимо лишь доустановить компилятор для этого типа процессоров.
Для этого нужно:
- Скачать по адресу https://git-scm.com/download/win и установить программу контроля версий Git.
- В папке Документы\Arduino создать папку hardware\espressif\.
- Скачать библиотеки и компилятор для ESP32. Для этого нужно открыть консоль (Win+R - cmd), перейти в папку (cd C:\Users\Имя пользователя\Documents\Arduino\hardware\espressif\) и выполнить команду
git clone --recurse-submodules -j8 https://github.com/espressif/arduino-esp32.git (вместо консоли можно также воспользоваться Git GUI). Библиотеки будут устанавливаться довольно долго, около 10 минут.
- По окончании установки, нужно зайти в папку hardware\espressif\arduino-esp32\tools и запустить файл get.exe, который скачает недостающие файлы. Процесс также может занять несколько минут.
После этого заново запустим Arduino IDE - мы увидим, что количество доступных типов плат увеличилось, выберем ESP32 Dev Module.
Теперь можно подключить плату, и испытать какие-нибудь примеры. Поскольку, возможность работы с WiFi и Bluetooth является одним из основных преимуществ платы, это мы и проверим. Выберем в меню File-Examples-WiFi scan. Запускаем компиляцию… и получаем сообщение об ошибке. Оказывается, библиотека WiFi.h, идущая в комплекте с ESP32 SDK, конфликтует с уже имеющейся в папке "C:\Program Files (x86)\Arduino\libraries" библиотекой с тем же названием. Удаляем папку WiFi оттуда, перезапускаем Arduino IDE, после этого компиляция происходит нормально.
Код сканирования WiFi-сетей приведен ниже, как можно видеть, он весьма прост, и по стилю практически ничем не отличается от рассматриваемых ранее примеров для Arduino.
#include "WiFi.h"
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
}
void loop() {
Serial.println("scan start");
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0) {
Serial.println("no networks found");
} else {
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; ++i) {
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(")");
Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
delay(10);
}
}
Serial.println("");
delay(5000);
}
Запускаем программу, и получаем список доступных WiFi-сетей:
Ура - мы проверили возможность новой платы работать с сетевым окружением, то, что не было доступно для Arduino.
3.2 Порты ввода-вывода
Перед использованием любой платы нужно разобраться, где и какие выводы расположены. Самый простой способ в нашем случае - набрать в поиске гугла фразу “ESP32 dev board pinout”. Для используемой в опытах платы ESP32 расположение пинов показано на картинке, впрочем для разных модификаций оно может отличаться.
Протестируем возможности ввода вывода на этой плате. Код программы практически ничем не отличается от Arduino, хотя и есть некоторые отличия. Для вывода результатов будем использовать serial port.
// Встроенный светодиод на плате
int ledPin = 2;
// Кнопка
int inputPin = 23;
// Тач-панель
int touchPin = 4;
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
pinMode(inputPin, INPUT_PULLUP);
}
void loop() {
// Читаем значение touchPin
int touch_value = touchRead(touchPin);
Serial.println(touch_value);
// Читаем значение inputPin
int buttonState = digitalRead(inputPin);
Serial.println(buttonState);
// Мигаем светодиодом
digitalWrite(ledPin, HIGH);