Web server на модуле ESP8266-01 созданный в среде Arduino IDE

Автор: Мясіщев Олександр Анатолійович

Дата публікації: 9 листопада 2015 р. 08:38:58 GMT / Категорія: Сучасні розробки

Web server на модуле ESP8266-01 созданный в среде Arduino IDE

Программирование миниатюрного WiFi модуля на базе новейшей микросхемы ESP8266 возможно с использованием среды разработки Arduino IDE, если загрузить туда программу ESP8266. Это позволит писать программы (sketch) с помощью известных для контроллера Arduino функций и библиотек, и запускать их прямо на ESP8266, без внешней платы Arduino. Таким образом, с программой ESP8266 и ее библиотеками модуль ESP8266 становиться платой Arduino. Программа ESP8266 поставляется с библиотеками, которые позволяют через интерфейс WiFi с помощью протоколов IP, TCP, UDP обмениваться данными с WEB, SSDP, mDNS и DNS серверами, использовать flash память для создания файловой системы, обеспечить работу с SD картами, сервоприводами, работать с периферийными устройствами по шинам SPI и I2C. Как и плата Arduino, модуль ESP8266 имеет свои программируемые выводы GPIO. Их можно использовать для управления внешними устройствами, получения данных с различных датчиков.

Рассмотрим установку программы ESP8266. Начиная с версии 1.6.4 Arduino IDE, появилась возможность установки сторонних пакетов с помощью Boards Manager.
Последовательность установки следующая:
1. Загружаем последний Arduino IDE с сайта https://www.arduino.cc и устанавливаем его на компьютер.
2. Запускаем Arduino IDE, переходим в папку Файл -> Настройки

3. Вводим http://arduino.esp8266.com/stable/package_esp8266com_index.json  в Additional Board Manager URLs field. 

4.Перейти к меню Инструменты -> Плата -> Boards Manager …->

5.Находим esp8266 и нажимаем install

6. После установки переходим в меню Инструменты Плата Generic ESP8266 Module:

7.Компиляция программы, которую можно набрать во встроенном редакторе Arduino IDE:

Ниже представлена программа для модуля ESP8266-01, которая представляет собой WiFi web server, управляющий двумя светодиодами(LED W - белый, LED R - красный) и снимающий показания температуры с датчика DS18B20. Управление выполняется через браузер клиента. Допустимые команды:
http://192.168.1.111:8080/whion, /whioff, /redon, /redoff, /temp, /status

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <OneWire.h>
#include <stdio.h>
const char* ssid = "OpenWrt"; //Подключается к точке доступа OpenWrt
char strok[30];
char buf[30];
long sec;
int ss;
IPAddress ip(192,168,1,111);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
ESP8266WebServer server(8080);
OneWire ds(0); // Датчик температуры DS18B20 на GPIO - 0
const int led1 = 1; // GPIO - 1 LED R
const int led2 = 2; // GPIO - 2 LED W
void temper() {
byte i;
byte present = 0;
byte data[12];
byte addr[8];
float celsius;
if ( !ds.search(addr)) {
ds.reset_search();
delay(250);
return;
}
OneWire::crc8(addr, 7);
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(800); // maybe 750ms is enough, maybe not
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
celsius = (float)raw / 16.0;
dtostrf(celsius,5,2,buf);
sprintf(strok,"<h1>Temperatura = %s Celsius</h1>",buf);
}
void tem(){
server.send(200, "text/html",strok);
}
void whi_on() {
digitalWrite(led2, 1);
server.send(200, "text/html","<h1>whi on</h1>");
}
void whi_off() {
digitalWrite(led2, 0);
server.send(200, "text/html","<h1>whi of</h1>");
}
void red_on() {
digitalWrite(led1, 0);
server.send(200, "text/html","<h1>red on</h1>");
}
void red_off() {
digitalWrite(led1, 1);
server.send(200, "text/html","<h1>red of</h1>");
}
void whi_sta(){
if (digitalRead(led1)==0 && digitalRead(led2)==1) server.send(200, "text/html","<h1>Status: RedOn WhiOn</h1>");
if (digitalRead(led1)==1 && digitalRead(led2)==1) server.send(200, "text/html","<h1>Status: RedOf WhiOn</h1>");
if (digitalRead(led1)==0 && digitalRead(led2)==0) server.send(200, "text/html","<h1>Status: RedOn WhiOf</h1>");
if (digitalRead(led1)==1 && digitalRead(led2)==0) server.send(200, "text/html","<h1>Status: RedOf WhiOf</h1>");
}
void root(){
server.send(200, "text/html","<h1>This is web-server on Wifi-esp-01.<br>He controls two led and temperature.<br>Command:/whion /whioff /redon /redoff /temp /status</h1>");
}
void setup(void){
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
digitalWrite(led1, 1);
digitalWrite(led2, 0);
WiFi.config(ip,gateway,subnet);
WiFi.begin(ssid);
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
temper();
server.on("/temp", tem);
server.on("/whion", whi_on);
server.on("/whioff", whi_off);
server.on("/redon", red_on);
server.on("/redoff", red_off);
server.on("/status", whi_sta);
server.on("/", root);
server.begin();
// Serial.println("HTTP server started");
}
void loop(void){
sec=millis()/1000;
ss=sec%60; // second
if(ss==0 || ss==30 ) {temper();
}
server.handleClient();
}

Схема подключений устройств, кнопок управления и TTL выход UART на компьютер для прошивки представлена на рисунке 1.

Рис.1. Схема подключения 

Вместо USB - TTL преобразователя для подключения к компьютеру для прошивки ESP8266-01 можно использовать плату Arduino UNO. На рисунке 2 показана схема подключения Arduino и модуля ESP8266-01.

Рис.2. Схема использования Arduino UNO в качестве USB - TTL преобразователя

Reset подключен к GND для предотвращения запуска микроконтроллера. Перед прошивкой необходимо нажать на кнопу Flash Button и удерживая ее нажать Reset Button. После этого отпустить обе кнопки. Таким образом эти две кнопки нужны только для программирования.