0
0

Arduino + ESP8266. Передача показаний с двух датчиков температуры на WEB сервис http://open-monitoring.online

Arduino + ESP8266. Передача показаний с двух датчиков температуры на WEB сервис http://open-monitoring.online

О чем пойдет речь

Приветствую всех заглянувших на эту страницу, скорее всего это произошло не случайно, а потому в этой части буду краток.

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

В итоге получится некий (гибко настраиваемый) веб интерфейс с текущими показаниями температуры и графики, доступные с любого браузера
 
// Предвидя справедливые замечания, что эту задачу можно решить с помощью одной только ESP – я с Вами соглашусь, более того, в будущем мы это сделаем, что касается этого примера, то выбор железа сделан на перспективу, как более гибкий или «массовый»…//

Что для этого нужно

  1. Время. При наличии под руками всех компонентов, на реализацию Вы затратите от 30 минут до 1 часа своего драгоценного времени;
  2. Arduino, я в этом примере буду использовать Uno, но подойдет и Mega и Mini (я брал здесь);
  3. ESP8266, я использовал самую дешевую версию – 01 (я брал здесь), но подойдет любая с дефолтной прошивкой (поддержка AT-команд);
  4. Датчик температуры DS18B20 (я брал здесь), а лучше пару штук;
  5. Резистор 4,7кОм – 1 шт;
  6. Резистор 1кОм;
  7. Резистор 2кОм.
(Пункты 6 и 7 для тех, кто любит что бы все было по Фен-шую, у меня работало и без них, но как мне показалось – больше греется ESP)
Наличие зоны покрытия WiFi-маршрутизатора.

Цена

Если заказать детали в Китайском экспресс - это обойдется Вам порядка 500 руб., если пойти в ближайший магазин радиодеталей – то в зависимости от карманного коэффициента магазина: 800-1000 руб.


Приступим?

Предлагаю придерживаться следующего плана:
  1. Подготовка WiFi модуля ESP8266;
  2. Сборка схемы;
  3. Регистрация в сервисе и создание контроллера;
  4. Прошивка контроллера и отладка.

Подготовка 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 - все обновления сервиса в первую очередь будут выкладываться там: ПОДПИСАТЬСЯ!

Открыть код для Arduino

// ***************** 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. (Не редирект и не закрыта от индексации поисковиками)

open-monitoring.online

Комментарии