Arduino + Wifi-модуль ESP8266 и датчик температуры
В статье рассмотрен проект с использованием модуля ESP8266 и Arduino.
На выходе мы получим возможность обновлять данные на удаленном сервере с использованием цифрового датчика температуры.
В чем прелесть этого проекта? Он действительно идет в ногу со временем. Временем (р)эволюции интернет возможностей. Цены падают, а сообщество DIY-энтузиастов разрабатывают новые подходы для решения своих задач.
Приведенный ниже проект обойдется вам около 10 долларов с учетом всех необходимых компонентов, в том числе платы Arduino. Проект можно адаптировать и под другие микроконтроллеры.
Необходимые материалы
1 модуль ESP8266.

1 плата Arduino Pro Mini 328 - 3.3V/8MHz. В данном гайде использовалась плата от Sparkfun Electronics.

1 цифровой датчик температуры DS18B20.

1 резистор 4.7 кОм.
1 источник питания (от 3.3 В до 12 В. В данном примере использовалось напряжение 9В).
Ссылки для заказа оборудования, которое использовалось в проекте из Китая
Настройка ESP8266

В этой части возникают основные проблемы. Обратите внимание, что существует две версии модуля ESP8266. На первой версии встроенные сигнальный светодиоды, которые расположены рядом с пинами. На второй (более новой) модели светодиоды находятся рядом с антенной. В этом проекте мы будем использовать более новую версию модуля ESP8266.
Советую сразу загрузить Firmware V0.922, с помощью которого можно устанавливать скорость передачи данных на 9600.
Для проверки соединения можно использовать USB-TTL кабель и терминал CoolTerm. Команда для изменения скорости передачи данных: AT+CIOBAUD=9600
Ниже приведены пины, которые использовались на ESP8266 для подключения USB-TTL. Для питания ESP8266 использовался пин 3.3V VCC на Arduino. Обратите внимание, что максимальная сила тока на пине 3.3V VCC составляет 150 мА, максимальный ток на ESP8266 достигает 240 мА. Но, за неимением другого источника тока, можно использовать и этот вариант. Обычно модуль ESP8266 использует 70мА.
Не забудьте подключить GPIO0 к GND при загрузке нового firmware. После использования, отключите этот коннектор для нормальной работы.
---------------------------------------------------------------------------------------------------------
UTXD --> RX (USB-TTL)
CH_PD <--> VCC
RST
VCC --> VCC (источник питания)
---------------------------------------------------------------------------------------------------------
GND --> GND (источник питания)
GPIO2
GPIO0
URXD --> TX (USB-TTL)
---------------------------------------------------------------------------------------------------------
Настройка 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 <stdlib.h>
#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define SSID "[YOUR_SSID]"
#define PASS "[YOUR_PASSWORD]"
#define IP "184.106.153.149" // thingspeak.com
String GET = "GET /update?key=[THINGSPEAK_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[10];
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 "[YOUR_SSID]"
#define PASS "[YOUR_PASSWORD]"
#define IP "184.106.153.149" // thingspeak.com
String GET = "GET /update?key=[THINGSPEAK_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[10];
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;
}
}
Настройка ThingSpeak
ThinkSpeak - потрясающий! Правда, он очень облегчает жизнь. Для его настройки, достаточно реализовать несколько приведенных ниже шагов:

1. Зарегистрируйте FREE аккаунт здесь.
2. Перейдите в Channels --> Create New Channel (вы можете оставить все настройки по умолчанию)
3. Перейдите в API Keys и получите свой уникальный KEY
4. Проведите проверку, вставив в строку вашего браузера следующее:
http://api.thingspeak.com/update?key=[THINGSPEAK_KEY]&field1=0
5. Результаты будут здесь:
http://api.thingspeak.com/channels/[CHANNEL_ID]/feed.json?key=[THINGSPEAK_KEY]
Все! Вы можете отсылать данные температуры с помощью модуля ESP8266 в интернет.
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!