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
Комментарии: 38
Просмотры: 15350
Комментарии