В этом материале мы покажем, как на основе набора «Цифровая лаборатория» NR05 собрать устройство, собирающее данные с датчика температуры и отправляющее их на специализированный сайт для хранения и обработки таких данных.
Как мы неоднократно отмечали, набор «Цифровая лаборатория» из серии «Азбука электронщика» предназначен не только для обучения началам программирования микроконтроллеров и проектирования электронных устройств на их основе, но и для создания вполне законченных и полезных устройств. В нашем проекте мы будем использовать ThingSpeak — открытую платформу для проектов, построенных на концепции «Интернет вещей». Платформа предназначена для сбора и обработки данных с различных датчиков. Основными возможностями ThingSpeak являются:
— сбор данных в режиме реального времени;
— математическая и статистическая обработка данных;
— визуализация данных.
Платформа ThingSpeak имеет развитый API (Application Programming Interface ) — интерфейс между сайтом и вашими приложениями, который позволяет не только отправлять, хранить и получать доступ к данным, но и предоставляет различные статистические методы их обработки. Мы рассмотрим для примера один канал для сбора данных, всего же платформа предоставляет до 8 каналов каждому пользователю. С данными каждого канала можно производить отдельные действия и использовать полученные результаты по своему усмотрению.
Для выхода в интернет воспользуемся Wi-Fi модулем на основе чипа ESP8266 с AT-прошивкой версии 0.21. Этот популярный чип служит основой для построения большого числа модулей, физически отличающихся числом выводов, типом антенны, наличием USB-интерфейса и дополнительных возможностей. В принципе, любое устройство, собранное на основе ESP8266 является самодостаточным прибором, к которому можно подключать внешние датчики, но это предмет отдельного рассмотрения. В данном случае, мы используем модуль только как устройство беспроводного доступа в интернет, и будем с помощью него подключаться к какой-либо точке доступа и передавать данные в ThingSpeak. Список всех AT-команд прошивки для сопоставления их с программой для Ардуино можно посмотреть здесь.
Несколько слов надо сказать о том, как проверить версию прошивки и как перепрошить модуль, если версия не подходящая. Для этого необходимо подключить модуль к переходнику USB-UART, например BM8051, и подать команду AT+GMR. Если версия прошивки отображается как 0021, то все в порядке. Если нет, то есть два пути: изменить программу для Ардуино в соответствии с возможными несовпадениями форматов команд, или перепрошить модуль. Вопросы перепрошивки ESP8266 претендуют на отдельную статью, поэтому здесь мы их рассматривать не будем, а посоветуем обратиться к материалам, опубликованным на сайтах и специализированных форумах, посвященных этому модулю. В качестве датчика температуры воспользуемся входящим в набор NR05 датчиком DS18B20. В обучающем пособии набора есть глава о подключении и использовании этого датчика, а также примеры программирования в части считывания и отображения измерений температуры. Датчик подключается к соответственно промаркированным контактам на плате расширения набора NR05.
В качестве модуля на основе ESP8266 можно использовать несколько устройств из ассортимента компании Мастер Кит: MP8266-01, MP8266-03, MP8266-07, MP8266-12E, а также MP3508. Последнее устройство является платой разработчика и «нафарширована» по максимуму. Для него не требуется дополнительный стабилизатор на 3,3В и адаптер USB-UART для программирования – все это уже имеется на плате.
Для остальных модулей адаптер USB-UART может потребоваться для перепрошивки, если это необходимо, а вот стабилизатор на 3,3В (например AMS1117) понадобится точно, поскольку источник этого напряжения в плате Arduino Nano, входящей в набор NR05, не обеспечивает ток, необходимый для питания ESP8266.
В любом случае, в готовом проекте мы используем только четыре вывода ESP: питание, земля и RX и TX для общения с Ардуино.
Общий алгоритм работы программы для Ардуино заключается в следующем:
— проверяем готовность ESP;
— если готов, соединяемся с точкой доступа;
(дальнейшие действия повторяются один раз в минуту):
— считываем данные с датчика температуры;
— выводим текущую температуру на индикатор платы расширения;
— устанавливаем соединение с сайтом thingspeak.com;
— передаем текущую температуру в соответствующий канал сайта.
О теории, пожалуй, достаточно. Перейдем к практике.
Для начала бесплатно регистрируемся на сайте thingspeak.com и получаем в результате регистрации API ключ, который необходимо использовать при передаче данных в канал. Интерфейс сайта меняется, поэтому наше описание может немного не соответствовать в части того, что видно в браузере. Но в целом интерфейс интуитивно понятен, так серьезных проблем при регистрации и создании нового канала возникнуть не должно.
Итак, после регистрации создаем новый канал: Channels-My Channels-New Channel. Каналу надо дать имя и ввести небольшое описание, также канал может быть Private и Public, выберите сами. После создания канала можно увидеть искомый ключ API, нам нужен Write API Key для записи данных в канал.
Можно протестировать запись данных, введя в строке браузера следующую строку: api.thingspeak.com/update?key=вашAPIключ&field1=0
Последний знак в строке (0) может быть любым значением, оно и будет записано в канал. После нажатия Enter сайт ответит цифрой, соответствующей числу значений, записанных в канал. Имейте в виду, что минимальный интервал между записями составляет 15 сек. Теперь можно передавать данные, формирую аналогичные строки в Ардуино и передавая их с помощью ESP8266 в наш канал.
Схема подключения элементов представлена на следующем рисунке:
Мы использовали модуль MP8266-07, поэтому понадобился стабилизатор и конденсатор. Также для правильной работы модуля необходимо соединить вывод GPIO15 с землей, а вывод CH_PD (выбор чипа) с питанием 3,3В. Модуль уверенно коннектится даже встроенной антенной к точке доступа, находящейся в соседнем помещении на расстоянии около 20 метров.
Листинг скетча для Ардуино с подробными комментариями:
// подключаем необходимые библиотеки
#include <DallasTemperature.h>
#include <OneWire.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
// пауза между посылками данных, мс
unsigned long pauseTime = 60000;
// переменные для организации паузы
unsigned long currentTime;
unsigned long previousTime = 0;
// назначаем вывод D10 для подключения датчика температуры D18B20
// и создаем экземпляры объектов шины ONE WIRE и датчика
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// задаем параметры для подключения к WiFi
#define SSID «ИмяВашейТочкиДоступа»
#define PASS «ПарольВашейТочкиДоступа»
// задаем IP адрес сайта thingspeak.com
#define IP «184.106.153.149»
// задаем строку команды GET согласно API thingspeak.com
String GET = «GET /update?key=вашAPIключ&field1=»;
// задаем выводы для подключения модуля ESP8266 по которым будем
// отсылать AT-команды в модуль;
// (используется система AT-команд прошивки v0.21 SDK 0.9.5
// esp8266.ru/esp8266-sdk-0-9-5-v0-21 )
SoftwareSerial esp(11, 12); // RX, TX
// задаем выводы для подключения LCD-индикатора
LiquidCrystal lcd(A1, A2, A3, 2, 4, 7);
void setup()
{
// инициализируем:
esp.begin(9600); // передачу-прием в ESP8266 на скорости 9600 бод
Serial.begin(9600); // передачу-прием в виртуальный COM-порт компьютера (для контроля)
sensors.begin(); // датчик температуры
lcd.begin(16, 2); // LCD-индикатор
lcd.clear();
// посылаем в ESP8266 команду AT
Send(«AT»);
delay(1000);
// если модуль ответил OK, соединяемся с беспроводной сетью
if(esp.find(«OK»)){
Serial.println(«ESP8266 Ready: OK»);
connectWiFi();
previousTime = millis() + 2*pauseTime;
}
}
void loop(){
currentTime = millis();
if(currentTime — previousTime > pauseTime) {
// запрашиваем температуру с датчика
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
// преобразовываем температуру в символьную строку
char buffer[10];
String temp = dtostrf(tempC, 4, 1, buffer);
// отсылаем эту строку на канал сайта thingspeak.com
updateData(temp);
lcd.setCursor(0,0);
lcd.print(temp);
lcd.print("\xDF"«C»); // \xDF — значок градуса
previousTime = currentTime;
}
}
// функция отсылки данных из ESP8266 на сайт thingspeak.com
void updateData(String data){
// формируем и отсылаем команду соединения с thingspeak.com
String cmd = «AT+CIPSTART=\»TCP\",\"";
cmd += IP;
cmd += "\",80";
Send(cmd);
delay(3000);
if(esp.find(«OK»))
Serial.println(«CONNECT TO IP: OK»);
else
Serial.println(«CONNECT TO IP: Error»);
// формируем и отсылаем команду отправки данных
cmd = GET;
cmd += data;
cmd += "\r\n";
esp.print(«AT+CIPSEND=»);
esp.println(cmd.length());
// если модуль ESP8266 готов к приему и пересылке данных
if(esp.find(">")){
Serial.print(">");
// отсылаем данные
esp.print(cmd);
Serial.print(cmd);
if(esp.find(«OK»)) Serial.println(«DATA SEND: OK»);
else Serial.println(«DATA SEND: Error»);
}
else{
Send(«AT+CIPCLOSE»);
if(esp.find(«OK»)) Serial.println(«CONNECTION FOR IP CLOSE: OK»);
else Serial.println(«CONNECTION FOR IP CLOSE: Error»);
}
Serial.println();
}
// функция отправки данных в модуль ESP8266
void Send(String cmd){
Serial.print(«SEND TO ESP8266: „);
esp.println(cmd);
Serial.println(cmd);
}
// функция соединения с сетью WiFi
boolean connectWiFi(){
esp.println(“AT+CWMODE=1»);
delay(2000);
String cmd=«AT+CWJAP=\»";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASS;
cmd+="\"";
Send(cmd);
delay(5000);
if(esp.find(«OK»)){
Serial.println(«CONNECT TO WIFI: OK»);
return true;
}
else{
Serial.println(«CONNECT TO WIFI: Error»);
return false;
}
}
#include <DallasTemperature.h>
#include <OneWire.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
// пауза между посылками данных, мс
unsigned long pauseTime = 60000;
// переменные для организации паузы
unsigned long currentTime;
unsigned long previousTime = 0;
// назначаем вывод D10 для подключения датчика температуры D18B20
// и создаем экземпляры объектов шины ONE WIRE и датчика
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// задаем параметры для подключения к WiFi
#define SSID «ИмяВашейТочкиДоступа»
#define PASS «ПарольВашейТочкиДоступа»
// задаем IP адрес сайта thingspeak.com
#define IP «184.106.153.149»
// задаем строку команды GET согласно API thingspeak.com
String GET = «GET /update?key=вашAPIключ&field1=»;
// задаем выводы для подключения модуля ESP8266 по которым будем
// отсылать AT-команды в модуль;
// (используется система AT-команд прошивки v0.21 SDK 0.9.5
// esp8266.ru/esp8266-sdk-0-9-5-v0-21 )
SoftwareSerial esp(11, 12); // RX, TX
// задаем выводы для подключения LCD-индикатора
LiquidCrystal lcd(A1, A2, A3, 2, 4, 7);
void setup()
{
// инициализируем:
esp.begin(9600); // передачу-прием в ESP8266 на скорости 9600 бод
Serial.begin(9600); // передачу-прием в виртуальный COM-порт компьютера (для контроля)
sensors.begin(); // датчик температуры
lcd.begin(16, 2); // LCD-индикатор
lcd.clear();
// посылаем в ESP8266 команду AT
Send(«AT»);
delay(1000);
// если модуль ответил OK, соединяемся с беспроводной сетью
if(esp.find(«OK»)){
Serial.println(«ESP8266 Ready: OK»);
connectWiFi();
previousTime = millis() + 2*pauseTime;
}
}
void loop(){
currentTime = millis();
if(currentTime — previousTime > pauseTime) {
// запрашиваем температуру с датчика
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
// преобразовываем температуру в символьную строку
char buffer[10];
String temp = dtostrf(tempC, 4, 1, buffer);
// отсылаем эту строку на канал сайта thingspeak.com
updateData(temp);
lcd.setCursor(0,0);
lcd.print(temp);
lcd.print("\xDF"«C»); // \xDF — значок градуса
previousTime = currentTime;
}
}
// функция отсылки данных из ESP8266 на сайт thingspeak.com
void updateData(String data){
// формируем и отсылаем команду соединения с thingspeak.com
String cmd = «AT+CIPSTART=\»TCP\",\"";
cmd += IP;
cmd += "\",80";
Send(cmd);
delay(3000);
if(esp.find(«OK»))
Serial.println(«CONNECT TO IP: OK»);
else
Serial.println(«CONNECT TO IP: Error»);
// формируем и отсылаем команду отправки данных
cmd = GET;
cmd += data;
cmd += "\r\n";
esp.print(«AT+CIPSEND=»);
esp.println(cmd.length());
// если модуль ESP8266 готов к приему и пересылке данных
if(esp.find(">")){
Serial.print(">");
// отсылаем данные
esp.print(cmd);
Serial.print(cmd);
if(esp.find(«OK»)) Serial.println(«DATA SEND: OK»);
else Serial.println(«DATA SEND: Error»);
}
else{
Send(«AT+CIPCLOSE»);
if(esp.find(«OK»)) Serial.println(«CONNECTION FOR IP CLOSE: OK»);
else Serial.println(«CONNECTION FOR IP CLOSE: Error»);
}
Serial.println();
}
// функция отправки данных в модуль ESP8266
void Send(String cmd){
Serial.print(«SEND TO ESP8266: „);
esp.println(cmd);
Serial.println(cmd);
}
// функция соединения с сетью WiFi
boolean connectWiFi(){
esp.println(“AT+CWMODE=1»);
delay(2000);
String cmd=«AT+CWJAP=\»";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASS;
cmd+="\"";
Send(cmd);
delay(5000);
if(esp.find(«OK»)){
Serial.println(«CONNECT TO WIFI: OK»);
return true;
}
else{
Serial.println(«CONNECT TO WIFI: Error»);
return false;
}
}
Все элементы в сборе, программа запущена:
А вот как выглядят результаты измерений на сайте:
Первый график отображает изменение температуры во времени, а второй – это гистограмма, созданная встроенными в ThingSpeak средствами визуализации на основе MatLab, отображающая, сколько раз за последние 24 часа было измерено каждое значение температуры. На сайте такая гистограмма называется «temperature variation», наиболее близкий русский термин – колебания температуры.
Таким образом, с помощью набора «Цифровая лаборатория» в сочетании с сервисом, предоставляемым платформой ThingSpeak можно собирать и обрабатывать данные с различных датчиков в максимум восьми каналах. Например, используя схему четырехканального вольтметра, описанную в предыдущей статье, можно мониторить состояние аккумуляторов или солнечных батарей, одновременно получая метеоинформацию в месте их установки.