Образовательная галактика Intel®

Блог Участника

Запись блога

Iskra Neo + ESP8266 = Интернет вещей. Часть 6. Как сделать умный датчик температуры

Предыдущие посты:
Iskra Neo + ESP8266 = Интернет вещей. Часть 1
Iskra Neo + ESP8266 = Интернет вещей. Часть 2 (Модуль с чипом ESP8266 ESP-01 V090 с поддержкой WiFi)
Iskra Neo + ESP8266 = Интернет вещей. Часть 3. Как проверить модуль ESP8266
Iskra Neo + ESP8266 = Интернет вещей. Часть 4. Настройка Arduino IDE для ESP8266
Iskra Neo + ESP8266 = Интернет вещей. Часть 5. Как загрузить скетч в модуль ESP8266

Это заключительный пост (возможно пока?) про возможность создания умного термометра по технологии "Интернет вещей" на основе Iskra Neo и ESP8266. Фирма Амперка включила в итоговый вариант книги главу про настройку ESP8266 с помощью AT-инструкций без программирования. Однако, вариант с программированием ESP8266 с помощью USB2Serial конвертера мне больше понравился. Рад, что Амперка не возражала о публикации данных постов на Галактике.

Как сделать умный датчик температуры

В качестве первого умного устройства мы соберем «умный датчик температуры». С помощью термистора, у которого при изменении температуры меняется сопротивление, контроллер Iskra Neo будет получать данные и вычислять температуру в градусах по шкале Цельсия. Данные о температуре будут каждую секунду передаваться по UART на модуль ESP8266, а потом с помощью ESP8266 будут передаваться telnet-клиентам, подключившимся через WiFi. Давайте также введем возможность получения команд от telnet-клиента и их выполнение контроллером Iskra Neo. Пусть это будут трехбуквенные команды:
max - показать максимальную температуру за все время измерений,
min - показать минимальную температуру,
rst - сбросить сохраненные значения минимальной и максимальной температур,
hlp - показать краткую подсказку telnet-клиенту.

Для схему подключения термистора нам потребуется сам термистор и резистор номиналом 10 кОм.

Теперь подробнее разберемся с безопасным подключением модуля ESP8266 к плате Iskra Neo. Родное напряжение модуля ESP8266 — 3,3 вольта. Его пины не толерантны к напряжению 5 вольт, с которым работает контроллер Iskra Neo. Если подать напряжение выше, чем 3,3 вольта на пины питания, коммуникации или ввода-вывода, то модуль ESP8266 выйдет из строя.

Поэтому для передачи данных на модуль ESP8266 с 5-вольтовых пинов платы Iskra Neo потребуется использовать делитель напряжения, чтобы перевести напряжение из 5 вольт в допустимый диапазон 3,3 вольта. Мы применим делитель из трех резисторов одинакового номинала в 1 кОм (два резистора номиналом 1 кОм, соединенные последовательно, имеют общее сопротивление 2 кОм) между пином TX (передача данных) контроллера Iskra Neo и пином RX (прием данных) модуля ESP8266, таким образом сделаем соединение безопасным для последнего.

А вот для передачи данных от ESP8266 в контроллер Iskra Neo никаких «посредников» не нужно. Дело в том, что от пина TX (передача данных) модуля ESP8266 сигнал напряжением 3,3 вольта как есть будет воспринят платой Iskra Neo на пине RX (прием данных), как логическая единица.

Соберите схему умного датчика температуры на макетной плате:



В качестве программы telnet-клиента можно использовать на персональных компьютерах и ноутбуках утилиту putty, которая доступна для скачивания по ссылке http://putty.org.ru/download.html, а на планшетах и смартфонах под управлением Android можно использовать, например, приложение Telnet https://goo.gl/aGvpBZ.

Загрузите в плату Iskra Neo следующий скетч:
Код
/*
Данный скетч загружается в Iskra Neo.
Работает совместно с модулем
ESP8266 ESP-01 для реализации проекта
Smart termometr - умный датчик температуры
по технологии "Интернет вещей"
1. Измеряет температуру термистором
2. Передает данные температуры по UART
3. Получает команды с UART и выполняет их
4. Передает все сообщения с UART на USB
*/

int termPin = A5;  //Аналоговый пин с термистором
int termMax = -100;   //для максимума температуры
int termMin = 200; //для минимума температуры

//Команды, выполняемые умным датчиком температуры
char cmdHlp[] = "hlp";
char cmdMin[] = "min";
char cmdMax[] = "max";
char cmdRst[] = "rst";

//Функция для сравнивнения 3х символов
//команды и буфера данных, полученных по UART
boolean compare3(char *s, uint8_t *c){
  byte c1,c2;
  boolean result = true;
  for(int i = 0;i < 3;i++) {
    c1 = s[i];
    c2 = c[i];
    if (c1 != c2) result = false;
  }
  return result;
}

void setup() {
  //Инициализация UART для USB
  Serial.begin(115200);

  //Инициализация UART для связи с
  //ESP8266, подключенного к пинам TX/RX
  Serial1.begin(115200);
}

void loop() {
  //Считать показания термистора
  int termData = analogRead(termPin);

  //Перевод единиц с термистора в градусы
  //по шкале Цельсия
  int term = (700 - termData) / 8;

  //Сохранить минимум и максимум
  //температур
  if (term < termMin) termMin = term;
  if (term > termMax) termMax = term;

  //Сообщить температуру по UART для USB
  Serial.println(term);

  //Сообщить температуру по UART для ESP8266
  Serial1.println(term);
  delay(1000);

  //Проверить команды от пользователя
  if(Serial1.available()){
    size_t len = Serial1.available();
    uint8_t sbuf[len];
    Serial1.readBytes(sbuf, len);
    //отправить данные из UART на USB
    for(int i = 0; i < len; i++)
      Serial.write(sbuf[i]);

    //Если была введена команда hlp
    if (compare3(cmdHlp,sbuf)) {
      Serial1.println("Command:");
      Serial1.println("hlp - help");
      Serial1.println("rst - Reset of min/max");
      Serial1.println("max - Show max temperature");
      Serial1.println("min - Show min temperature");
      Serial1.println();    
    }

    //Если была введена команда min
    if (compare3(cmdMin,sbuf)) {
      Serial1.print("Minimum temperature: ");
      Serial1.println(termMin);
      }

    //Если была введена команда min
    if (compare3(cmdMax,sbuf)) {
      Serial1.print("Maximum temperature: ");
      Serial1.println(termMax);
      }

    //Если была введена команда rst
    if (compare3(cmdRst,sbuf)) {
      termMax = term;
      termMin = term;
      Serial1.print("Reset minimum maximum - Ok ");
      }
  }
}


После подключения питания к схеме умного датчика температуры в окне Монитор порта, подключенного к Iskra Neo вы увидите сообщение о статусе подключения модуля ESP8266 к сети WiFi, его ip-адрес и 23 порт. По этому адресу и порту подключитесь к умному датчику температуры по протоколу telnet с помощью ПК, ноутбука, планшета или смартфона. Вы увидите приглашение и сообщения о текущей температуре, которые будут появляться каждую секунду. Попробуйте нагреть пальцами термистор, наблюдая за изменениями показаний в telnet-программе.

Поскольку мы создали интерактивный датчик, который различает и выполняет некоторые команды, то вы можете в telnet-программе ввести одну из команд и получить ответ. Например, команда max покажет максимальную температуру с момента включения датчика, а команда min - минимальную. Командой rst можно сбросить сохраненные ранее значения max и min температур, а команда hlp выведет краткую подсказку по командам умного датчика температуры.

Поздравляем! Вами создана первая умная интернет-вещь!

Как это работает

В процедуре setup() инициализируется два интерфейса UART. Один (Serial) для передачи сообщений на USB компьютера, к которому подключена плата Iskra Neo. Благодаря этому, в окне «Монитор порта» мы увидим сообщения, пересылаемые модулем ESP8266 на Iskra Neo, в том числе сообщения о статусе подключения к сети WiFi и ip-адресе. Второй (Serial1) для передачи данных на модуль ESP8266 через пины TX/RX. В обоих случаях мы устанавливаем скорость 115200 бод.

Код
void setup() {
  //Инициализация UART для USB
  Serial.begin(115200);

  //Инициализация UART для связи с
  //ESP8266, подключенного к пинам TX/RX
  Serial1.begin(115200);
}


Чтобы перевести показания термистора в градусы по шкале Цельсия и откалибровать их, нам потребуется рассчитать, сколько единиц показаний термистора соответствуют одному градусу Цельсия. Для упрощения будем считать, что зависимость показаний термистора от температуры линейная, тогда для расчетов нам достаточно узнать два разных показания термистора и соответствующие им температуры в градусах по Цельсию. Мы провели свои измерения, но для своего термистора вам потребуется провести свои замеры, чтобы точно его откалибровать.

Итак. Температура в нашем помещении, согласно показанию комнатного термометра на момент измерения, составляла 22 градуса Цельсия, при этом с термистора мы получили показания 411. Нормальная температура тела человека 36,6 градусов Цельсия, поэтому мы стали нагревать пальцами термистор, подождали, пока показания перестали меняться, и записали показания термистора - 524.

Используя полученные сведения, посчитаем, сколько единиц в показаниях термистора приходится на 1 градус Цельсия:

(524 - 411)/(36 - 22)≈8


Следовательно, теперь мы сможем посчитать, какие показания термистора будут соответствовать температуре 0 градусов Цельсия. Заметив, что показания термистора увеличиваются при уменьшении температуры, прибавим к показаниям термистора при температуре 22 градусов Цельсия (524) произведение 22 и 8. Именно на столько единиц увеличатся показания термистора, если температура опустится от 22 до 0 градусов Цельсия:

524 + 8 * 22 = 700


Теперь мы знаем, что для перевода единиц показаний термистора в градусы по Цельсию нужно от 700 отнять текущие показания термистора и результат поделить на 8:
(700 - Показания_термистора)/8 = Температура (◦ C)


Именно так мы переводим показания термистора в градусы по шкале Цельсия:

Код
  //Считать показания термистора
  int termData = analogRead(termPin);

  //Перевод единиц с термистора в градусы
  //по шкале Цельсия
  int term = (700 - termData) / 8;


Для распознавания трехсимвольных команд от telnet-клиентов в скетче используется функция compare3(), которая возвращает либо «Истину» (команда получена), либо «Ложь» (команда не получена):

Код
//Функция для сравнивания 3х символов
//команды и буфера данных, полученных по UART
boolean compare3(char *s, uint8_t *c){
  byte c1,c2;
  boolean result = true;
  for(int i = 0;i < 3;i++) {
    c1 = s[i];
    c2 = c[i];
    if (c1 != c2) result = false;
  }
  return result;
}


Для возможности контроля получаемых контроллером Iskra Neo сообщений в окне «Монитор порта», на компьютере программируем передачу на интерфейс USB (Serial) данных, полученных от модуля ESP8266 по интерфейсу UART через пины RX/TX (Serial1). Здесь же определяем, вводил ли telnet-клиент команду, например, «hlp», и если команда была введена, то отрабатываем ее:

Код
  //Проверить команды от пользователя
  if(Serial1.available()){
    size_t len = Serial1.available();
    uint8_t sbuf[len];
    Serial1.readBytes(sbuf, len);
    //отправить данные из UART на USB
    for(int i = 0; i < len; i++)
      Serial.write(sbuf[i]);

    //Если была введена команда hlp
    if (compare3(cmdHlp,sbuf)) {
      Serial1.println("Command:");
      Serial1.println("hlp - help");
      Serial1.println("rst - Reset of min/max");
      Serial1.println("max - Show max temperature");
      Serial1.println("min - Show min temperature");
      Serial1.println();    
    }
    ...
  }


С модулем ESP8266 вы можете использовать не только telnet-сервер. В примерах скетчей для этого модуля приводится множество интересных вариантов программирования этого модуля, которые вы можете добавить в свои разработки. Модуль ESP8266 может использоваться и без Iskra Neo, т.к. у него есть два цифровых порта, к которым можно подключить цифровые датчики или исполнительные устройства. Однако в связке с Arduio потенциал этого модуля гораздо шире.

Желаем вам интересных открытий и проектов в мире "Интернет вещей"!

P.S.: В наш лицей мы заказали несколько модулей ESP8266, чтобы дополнить ими наборы "ТеФТеЛька", которые используем на занятиях по микроэлектронике и робототехнике, чтобы знакомить наших лицеистов с технологией "Интернет вещей". В планах расширить занятия кейсами с использованием стороннего (бесплатного) интернет-сервера для IoT, например, ThingSpeak, а в идеале включение в программу проектов по "поднятию" школьниками собственных серверов для IoT, например, на базе Raspberry Pi.

Комментарии

Новичок

  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 22.9.2016
  • Номер участника: 195100
Предупреждение

wi-fi не самое технически подходящее решение для умного дома.
Все таки к нему можно подключить небольшое количество устройств. Бытовые wifi роутеры норм держать 10-20 подключений. По сути его хватает только на телефоны, компьютеры домохозяйства.

Есть ли бюджетные решения для подключения более 100 устройств? С дальностью до 100м? С возможностью работы устройства IoT работать как репитер/хаб (по мимо своих функций)?

Активный пользователь

  • Группа: Пользователи
  • Сообщений: 115
  • Регистрация: 20.4.2011
  • Из: г.Томск
  • Номер участника: 97119
Предупреждение

Цитата(dkmol @ 18.1.2017, 13:20)
Есть ли бюджетные решения для подключения более 100 устройств? С дальностью до 100м? С возможностью работы устройства IoT работать как репитер/хаб (по мимо своих функций)?

Возможно, такая модель точки доступа вам подойдет http://www.ubnt.su/ubiquiti/unifi-lr.htm ?


--------------------
Мир, Дружба, Open Source!

Статьи по этой теме

« Май 2017 »
ВПВСЧПС
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

Последние записи

Мои ссылки в блоге

Последние комментарии

Мое изображение

6 пользователей просматривает
6 гостей
0 участников
0 анонимных участников

Категории

Поиск в блоге


Наверх