0р.
Оформить заказArduino + ESP8266. Передача показаний с двух датчиков температуры на WEB сервис http://open-monitoring.online
О чем пойдет речь
Приветствую всех заглянувших на эту страницу, скорее всего это произошло не случайно, а потому в этой части буду краток.С этой статьи я начну знакомить Вас с сервисом Open Monitoring (ОМ) или просто мониторинга или системой логирования – кому как нравится. Двигаться мы будем от простого к сложному и поэтому на первом этапе предлагаю собрать простейшую метеостанцию, но сделать это на очень перспективной связке: Arduino + ESP8266 – которая в дальнейшем, я надеюсь, нам еще понадобится и мы сможем более широко раскрыть потенциал этого железа.
В итоге получится некий (гибко настраиваемый) веб интерфейс с текущими показаниями температуры и графики, доступные с любого браузера

// Предвидя справедливые замечания, что эту задачу можно решить с помощью одной только ESP – я с Вами соглашусь, более того, в будущем мы это сделаем, что касается этого примера, то выбор железа сделан на перспективу, как более гибкий или «массовый»…//
Что для этого нужно
- Время. При наличии под руками всех компонентов, на реализацию Вы затратите от 30 минут до 1 часа своего драгоценного времени;
- Arduino, я в этом примере буду использовать Uno, но подойдет и Mega и Mini (я брал здесь);
- ESP8266, я использовал самую дешевую версию – 01 (я брал здесь), но подойдет любая с дефолтной прошивкой (поддержка AT-команд);
- Датчик температуры DS18B20 (я брал здесь), а лучше пару штук;
- Резистор 4,7кОм – 1 шт;
- Резистор 1кОм;
- Резистор 2кОм.
Наличие зоны покрытия WiFi-маршрутизатора.
Цена
Если заказать детали в Китайском экспресс - это обойдется Вам порядка 500 руб., если пойти в ближайший магазин радиодеталей – то в зависимости от карманного коэффициента магазина: 800-1000 руб.
Приступим?
Предлагаю придерживаться следующего плана:- Подготовка WiFi модуля ESP8266;
- Сборка схемы;
- Регистрация в сервисе и создание контроллера;
- Прошивка контроллера и отладка.
Подготовка WiFi модуля ESP8266
Обмен между Arduino и ESP происходит через последовательный порт (serial port) он же UART. Наша задача состоит в том, что бы скорость портов наших двух плат совпадала.Бытует мнение, что при использовании в Arduino различных библиотек с прерываниями, работа порта на скоростях выше 19 200 бод может быть нестабильной. Предлагаю обойти стороной возможные грабли и настроить обмен на скорости 9600.
Мне известно два пути подключения ESP8266 к компьютеру:
- Использование USB-TTL конвертора (сейчас я пользуюсь таким, потому что как-то он попался на Aliexpress и был куплен за 50 руб. ссылка: Aliexpress);

- Использование Arduino который у нас уже имеется.
Ориентируясь, как мне кажется на более широкую аудиторию, давайте изменим базовую скорость ESP с помощью имеющейся у нас Arduino. Идея такова: нам нужно воспользоваться штатным USB-TTL (UART) преобразователем который распаян на плате arduino, а для того, что бы сам контроллер ATmega нам не мешал – мы переводим его в режим сброса одной единственной перемычкой, в общем собираем схему:
Если уже установлена, открываем Arduino IDE, если нет, скачиваем с https://www.arduino.cc и устанавливаем. Подключаем собранную схему, ждем пока Windows установит драйвера для COM-порта и запускаем программу.
Указываем к какому порту подключена Arduino (у меня она определилась как COM18)
Далее открываем монитор порта и выставляем скорость 115200 (как правило, ESP в базовой прошивке настроена именно на эту скорость, если в ответ на команду Вы увидите абракадабру или вообще ничего можно попробовать 57600) и отправляем команду: AT
В ответ ESP должна отправить OK.
Если Вы получили заветное сообщение “OK”, можно изменить скорость на 9600, делается это командой: AT+UART_DEF=9600,8,1,0,0
На этом настройка ESP8266 закончена, можно изменить скорость монитора порта на 9600 и снова отправить команду: AT, если все сделано правильно, ESP снова ответит, что все OK.
Сборка схемы
Добавить особо нечего, схема приведена ниже. Обратите внимание, что когда мы настраивали ESP – то ТХ соединяли с ТХ, а RX с RX. В этой схеме связи крестятся.
На макетной плате это может выглядеть например так
Регистрация в сервисе http://open-monitoring.online и создание контроллера
Специально для этого пункта сделал подробную видео инструкцию. Поскольку сервис постоянно развивается и дополняется новыми возможностями, не исключено, что на момент просмотра Вами видео, интерфейс системы может изменитсяПрошивка контроллера и отладка
Заключение
На этом разбор примера закончен. Освоив этот материал, не составит большого труда добавить дополнительные параметры: температуру, ток, напряжение, мощность и т.д. Для этого придется немного разобраться в коде программы. Надеюсь кому-то данный сервис поможет решить его задачу, проблему или мечту (как это было в моем случае). Делитесь своими проектами, задавайте вопросы, помогайте новичкам и подписывайтесь на мой канал в YouTube - все обновления сервиса в первую очередь будут выкладываться там: ПОДПИСАТЬСЯ!
// ***************** nsk-electro.ru ***** Семерков Николай **** 2018
// Пример кода осуществляющий чтение температуры датчиков DS18B20, измерение напряжения АКБ
// и передачу для визуализации и логгирования на сервис open-monitoring.online
// Строки требующие редактирования в комментариях отмечены (!)
//*-- Подключение библиотек
#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>
long nextTime = 100000; // Служебная переменная
//*-- Настройки контроллера
#define SSID "********" // Название точки доступа (!)
#define PASS "********" // Пароль (!)
String IP = "open-monitoring.online"; // Адрес сервера (не менять)
#define esp_bitrate 9600 // Скорость передачи данных между arduino и ESP8266
#define rxpin 10 //RX
#define txpin 11 //TX
#define one_wire_pin 2 // Вход для подключения датчиков тем-ры
//#define AnalogIn1 A0 // Аналоговый вход 1 (Напряжение АКБ)
//*-- Параметры полученные при регистрации на http://open-monitoring.online
String ID = "***"; // ID (!)
String KEY = "******"; // Код доступа (!)
long interval = 120000; // Периодичность отправки пакетов на сервер (120 секунд)
//*-- Работа с несколькими датчиками по одной шине
OneWire oneWire(one_wire_pin);
DallasTemperature sensors(&oneWire);
//*-- Software Serial
SoftwareSerial espSerial( rxpin, txpin ); // RX, TX
//*-- GET Information
String GET = "GET /get?cid=" + ID + "&key=" + KEY; // GET request
String HOST = "Host: " + IP + "\r\n\r\n";
void setup() {
Serial.begin(esp_bitrate);
espSerial.begin(esp_bitrate);
sensors.begin(); //Инициализация опроса датчиков температуры DS18B20 (если используются)
sendespSerial("AT");
delay(2000);
if (espSerial.find("OK"))
{
Serial.println("RECEIVED ESP: OK\nData ready to sent!");
connectWiFi();
}
}
void loop() {
//*-- Измерение температуры
sensors.requestTemperatures();
int t1 = round(sensors.getTempCByIndex(0));
delay(2000);
int t2 = round(sensors.getTempCByIndex(1));
delay(2000);
// int t3 = round(sensors.getTempCByIndex(2));
String T1 = String(t1); // turn integer to string
String T2 = String(t2); // turn integer to string
// String T3 = String(t3); // turn integer to string
//*-- Измерение напряжения делителем (делается 100 замеров и усредняется)
// float Volt = 0;
// for (int i = 0; i < 100; i++) {
// Volt = Volt + (0.0304 * analogRead(AnalogIn1)) / 100; // Пропорция 25,22/3,9В
// delay(1);
// }
// String Uakb = String(Volt);
Serial.println(millis());
Serial.print("Температура датчика 1: ");
Serial.println(T1);
Serial.print("Температура датчика 2: ");
Serial.println(T2);
if ( millis() - nextTime > (interval - 4215) ) {
update_param(T1, T2); // Отправляем пакет на сервер, если добавляются еще параметры - дописать через запятую
nextTime = millis();
}
}
//*-- Функции --*//
//*--Функция отправки в порт ESP и терминал
void sendespSerial(String cmd) {
Serial.print("SEND: ");
Serial.println(cmd);
espSerial.println(cmd);
}
//*-- Соединение с точкой доступа
boolean connectWiFi() {
espSerial.println("AT+CWMODE=1"); // Режим работы "клиент"
delay(2000);
String cmd = "AT+CWJAP=\""; // Подключение к точке доступа
cmd += SSID;
cmd += "\",\"";
cmd += PASS;
cmd += "\"";
sendespSerial(cmd);
delay(5000);
if (espSerial.find("OK"))
{
Serial.println("Connect: OK");
return true;
}
else
{
Serial.println("Connect: Error");
return false;
}
cmd = "AT+CIPMUX=0"; // Режим одиночного соединения
sendespSerial( cmd );
if ( espSerial.find( "Error") )
{
Serial.print( "RECEIVED: Error" );
return false;
}
}
//*--- Отправка данных на сервер, если есть параметры, так же дописать через запятую с указанием типа, например: String T3
void update_param( String T1, String T2) {
String cmd = "AT+CIPSTART=\"TCP\",\"";// Setup TCP connection
cmd += IP;
cmd += "\",80";
sendespSerial(cmd);
delay(1000);
if ( espSerial.find( "Error" ) )
{
Serial.print( "RECEIVED: Error\nExit1" );
return;
}
// Отправка строки на сервер
cmd = GET + "&p1=" + T1 + "&p2=" + T2 ; //
// cmd += "&p3=" + T3 ; // Раскомментировать для 3-го датчика
cmd += " HTTP/1.1\r\n" + HOST;
espSerial.print( "AT+CIPSEND=" );
espSerial.println( cmd.length() );
if (espSerial.find( ">" ) )
{
Serial.print(">");
Serial.print(cmd);
espSerial.print(cmd);
delay(30);
}
else
{
sendespSerial( "AT+CIPCLOSE" );//close TCP connection
}
if ( espSerial.find("OK") )
{
Serial.println( "RECEIVED: OK" );
}
else
{
Serial.println( "RECEIVED: Error\nExit2" );
}
serialread(); // Закомментировать после отладки
}
//*-- Отладочная функция (закомментировать после наладки)
String s = "";
void serialread() {
while (espSerial.available()) {
delay(20);
if (espSerial.available() > 0) {
char c = espSerial.read();
s += c;
}
}
Serial.println(s);
Serial.println("\r\n");
s = "";
}
Полное или частичное копирование материалов данной статьи разрешено только при обязательном указании прямой гиперссылки на сайт вида: https://nsk-electro.ru. (Не редирект и не закрыта от индексации поисковиками)
01.09.2018 00:00:00
Комментарии: 41
Просмотры: 20305
Комментарии