Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Uno + ESP8266 WiFi

Несколько лет назад я купил отдельный модуль ESP8266 WiFi, но так и не воспользовался им. За прошедшее время ситуация изменилась. Появились новые платы с встроенным WiFi и Bluetooth как из семейства Arduino, так и платформе ESP32. Но я решил спустя столько времени всё-таки завести этот модуль и посмотреть, как он работает.

Платы на ESP8266 – это не просто модули для связи по Wi-Fi. Чип является микроконтроллером со своими интерфейсами SPI, UART, а также портами GPIO, а это значит, что модуль можно использовать без Arduino. Существует около 11 официальных модификаций платы. Самая простая плата – ESP01, с которой и будем знакомиться.

Для начала его надо правильно соединить с Uno. Главная особенность - модуль работает на 3.3В, поэтому будьте аккуратны.

Начнём с платы Arduino Uno.

1. Соединяем вывод 3.3V с красной дорожкой на макетной плате (питание). Если вы будете подключать другие датчики, которые потребляют 5 Вольт, то соединяйте их с красной дорожкой питания на другой стороне макетной платы.

2. Соединяем GND с синей дорожкой макетной платы (заземление).

3. Соединяем вывод RESET с синей дорожкой макетной платы. В этом случае Arduino работает последовательно как USB и мы можем общаться с ESP8266.

4. Соединяем вывод RX с аналогичным выводом RX на ESP8266 (жёлтый провод на рисунке).

5. Соединяем вывод TX с аналогичным выводом TX на ESP8266 (зелёный провод на рисунке).

Обычно для общения двух устройств мы должны соединять вывод TX первого устройства с выводом RX второго устройства. Но в нашем случае общается компьютер.

Осталось соединить провода у ESP8266 WiFi.

6. Соединяем вывод GND с синей дорожкой и VCC с красной дорожкой.

7. Соединяем CH_PD с красной дорожкой.

Uno ESP8266

При соединении на ESP8266 загорится светодиод. Скетч загружать не нужно. Достаточно открыть Serial Monitor, выбрать скорость 115200 и выбрать режим Both NL & CR. Далее вводим AT-команду.


AT

Должен появиться ответ OK. При отправке команд загорается маленький синий светодиод. Если всё получилось, то самое сложное позади.

В примере мы использовали вывод CH_PD. Если нам нужно перепрошить ESP8266, то соедините вывод GPIO0 с синей дорожкой (заземление), тем самым мы включим режим FLASH.

Схема модуля ниже.

Uno ESP8266

В текстовом формате.


Esp8266 | Arduino 
-----------------
     RX | RX 
     TX | TX 
    GND | GND
    VCC | 5v 
  CH_PD | 5v 
 GPIO 0 | None 
 GPIO 2 | None
  Reset | None
  
Arduino | Arduino
-----------------
  Reset | GND

AT-команды

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

Uno ESP8266

AT+GMR - версия команд

AT+RST - рестарт модуля

AT+CWJAP="WiFi","pass" - указываем доступ к своей WiFi-точке (укажите свой логин и пароль к точке). В успешном случае появится ответ: WIFI CONNECTED, WIFI GOT IP.

AT+CWLAP - список доступных WiFi-сетей.

AT+CIFSR - получает локальный IP-адрес.

AT+CWMODE=3 - включает режим, когда виден в сети. У меня появился под именем AI-THINKER-XXX, но могут быть и другие варианты.

ESP8266 AT команды v0.22 – esp8266

При настройке параметры запоминаются. Например, не нужно заново вводить свой пароль к WiFi-сети. Естественно, вы можете сбросить свои настройки.

После того, как мне удалось поработать с AT-командами, я даже сумел отправить данные в интернет на сервер ThingSpeak. Вкратце это выглядит следующим образом: бесплатная регистрация, заводим новый канал (channel) с одним полем (field), получаем ключ API, запоминаем адрес Update a Channel Feed, посылаем команду на сервер таким образом.


AT+CIPMUX=0
AT+CIPSTART="TCP","api.thingspeak.com",80
AT+CIPSEND=47
GET /update?api_key=KL8PZR4EHMQWL5YL&field1=5

Последняя команда содержит 45 символов, нужно послать на два символа больше, т.е. 47.

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

Скетчи для связки Uno+ESP8266

До этого мы использовали плату Uno как посредника для передачи данных по последовательному порту между компьютером и ESP8266. Чтобы использовать плату и модуль как одно целое и общаться уже между ними без участия компьютера, нужно изменить соединение. Небольшая сложность заключается в том, что при работе с Arduino IDE мы не можем использовать на плате выводы RX и TX, так как через них загружается скетч. Но мы можем использовать виртуальные выводы через библиотеку SoftwareSerial. Переключаем два провода на плате с RX и TX на выводы 11 и 10. А также убираем провод с вывода RESET.


Esp8266 | Arduino 
 — — — — — — — — -
     RX | 11 
     TX | 10 
    GND | GND (без изменений)
    VCC | 5v (без изменений) 
  CH_PD | 5v (без изменений) 
 GPIO 0 | None (без изменений) 
 GPIO 2 | None (без изменений)
 
Arduino | Arduino
-----------------
Удалить провод между Reset и GND

Скетч для загрузки данных на сайт ThingSpeak. Установите свои ключи, пароли.


#include <SoftwareSerial.h>
#define RX 10
#define TX 11

String AP = "WIFI_NAME";       // CHANGE ME
String PASS = "WIFI_PASSWORD"; // CHANGE ME
String API = "YOUR_API_KEY";   // CHANGE ME
String HOST = "api.thingspeak.com";
String PORT = "80";
String field = "field1";
int countTrueCommand;
int countTimeCommand;
boolean found = false;
int valSensor = 1;

SoftwareSerial esp8266(RX, TX);


void setup() {
  Serial.begin(9600);
  esp8266.begin(115200);
  sendCommand("AT", 5, "OK");
  sendCommand("AT+CWMODE=1", 5, "OK");
  sendCommand("AT+CWJAP=\"" + AP + "\",\"" + PASS + "\"", 20, "OK");
}
void loop() {
  valSensor = getSensorData();
  String getData = "GET /update?api_key=" + API + "&" + field + "=" + String(valSensor);
  sendCommand("AT+CIPMUX=1", 5, "OK");
  sendCommand("AT+CIPSTART=0,\"TCP\",\"" + HOST + "\"," + PORT, 15, "OK");
  sendCommand("AT+CIPSEND=0," + String(getData.length() + 4), 4, ">");
  sendCommand(getData, 5, "OK");
  //esp8266.println(getData); 
  delay(1500); 
  countTrueCommand++;
  sendCommand("AT+CIPCLOSE=0", 5, "OK");
}
int getSensorData() {
  return random(1000); // Replace with
}
void sendCommand(String command, int maxTime, char readReplay[]) {
  Serial.print(countTrueCommand);
  Serial.print(". at command => ");
  Serial.print(command);
  Serial.print(" ");
  while (countTimeCommand < (maxTime * 1))
  {
    esp8266.println(command);//at+cipsend
    if (esp8266.find(readReplay)) //ok
    {
      found = true;
      break;
    }

    countTimeCommand++;
  }

  if (found == true)
  {
    Serial.println("OYI");
    countTrueCommand++;
    countTimeCommand = 0;
  }

  if (found == false)
  {
    Serial.println("Fail");
    countTrueCommand = 0;
    countTimeCommand = 0;
  }

  found = false;
}

Дополнительные материалы

ydonnelly/ESP8266_fritzing: Fritzing part for an ESP8266-based WiFi module

Реклама