Пользователь
0,0
рейтинг
8 марта 2015 в 20:01

Wi-Fi термометр на ESP8266 + DS18B20 всего за 4$ из песочницы



В последнее время всё большую популярность набирают Wi-Fi модули на основе ESP8266. Я тоже решил приобщиться к прекрасному, задумав реализовать термометр, отдающий данные по HTTP. Итак, поехали.

Hardware


ESP8266
Для проекта пойдет любой из модулей от ESP-01 до ESP-11, у меня были ESP-03 (стоимость ~ $3):



Особенно приглянулись:
ESP-01 — удобен для прототипирования (есть разъем под макетку), но выведен всего 1 GPIO;
ESP-03 — много выводов, плюс керамическая антенна;
ESP-07 — то же самое что и ESP-03 + экран и разъем под внешнюю антенну.

DS18B20


Как вариант, можно купить уже с проводом и в герметичном корпусе.

Питание 3.3В
Необходим источник питания как минимум на 200мА.

USB-UART
Для прошивки и отладки. Я использовал преобразователь на основе CP2102

Подключение


Подключаем питание на ESP8266. На ногу CH_PD так же подаем плюс.
Внимание! У кого модули не ESP-01, необходимо подать GPIO15 — GND; GPIO2 -3.3V. У ESP-01 это уже сделано. RX и TX подключаем к USB-UART преобразователю для прошивки и отладки кода:



Подключаем DS18B20 к ESP8266. Если смотреть на маркировку: левая — земля, средняя — сигнал (GPIO12 на ESP-03), если у вас ESP-01, подключайте к GPIO0, правая — питание(3.3V). Между питанием и сигнальной линией желательно подключить резистор 4.7 кОм (у меня работает и с 10 кОм):



thingspeak.com


Регистрируемся на thingspeak.com, создаем канал, копируем оттуда 16-символьный ключ. Он нам пригодится для отправки данных о температуре в облако.

Прошивка NodeMCU


NodeMCU — это прошивка, позволяющая запускать Lua скрипты на ESP8266. Качаем последний NodeMCU Flasher и запускаем его.
Подключаем GPIO0 на землю. Выбираем нужный COM порт и скорость 74880 или 115200 (как я понимаю, у некоторых версий ESP8266 бутлоадер работает на 74880). Нажимаем Flash и передергиваем питание на ESP8266. Если прошивка не запускается, проверяем корректность подключения RX,TX, запустив PuTTY на скорости 74880. В момент подачи питания в консоль должна валится строка вроде "ets Jan 8 2013,rst cause:1, boot mode:(1,0)". После корректной прошивки отключаем GPIO0 от земли:



Заливка Lua скриптов и запуск


Скачиваем и запускаем LuaLoader. Выбираем COM-порт и скорость 9600, если нет соединения — пробуем передернуть питание у модуля ESP8266. Проверяем соединение, нажав на кнопку ChipID. В консоль должен вывестись идентификатор чипа.

= node.chipid()
10371968

Заливаем нужные файлы (кнопка UploadFile):

1. ds18b20.lua — библиотека для взаимодействия с DS18B20;
2. httpsender.lua — наш скрипт, читающий данные температуры и отправляющий их на thingspeak.com. Не забываем заменить YOURAPIKEY на свой ключ.
gpio=6 — в случае подключения датчика к GPIO12, в случае GPIO0 — gpio=3 (таблица):

gpio = 6
require('ds18b20')
ds18b20.setup(gpio)

function sendData()
t=ds18b20.read()
print("Temp:"..t.." C\n")
-- conection to thingspeak.com
print("Sending data to thingspeak.com")
conn=net.createConnection(net.TCP, 0) 
conn:on("receive", function(conn, payload) print(payload) end)
-- api.thingspeak.com 184.106.153.149
conn:connect(80,'184.106.153.149') 
conn:send("GET /update?key=YOURAPIKEY&field1="..t.." HTTP/1.1\r\n") 
conn:send("Host: api.thingspeak.com\r\n") 
conn:send("Accept: */*\r\n") 
conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
conn:send("\r\n")
conn:on("sent",function(conn)
                      print("Closing connection")
                      conn:close()
                  end)
conn:on("disconnection", function(conn)
                                print("Got disconnection...")
  end)
end

-- send data every 60000 ms to thing speak
tmr.alarm(0, 60000, 1, function() sendData() end )


3. init.lua — скрипт инициализирующий WiFi и запускающий httpsender.lua. Не забываем прописать свои SSID и пароль для WiFi:

print("Setting up WIFI...")
wifi.setmode(wifi.STATION)
--modify according your wireless router settings
wifi.sta.config("SSID","SSIDPASSWD")
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function() 
if wifi.sta.getip()== nil then 
print("IP unavaiable, Waiting...") 
else 
tmr.stop(1)
print("Config done, IP is "..wifi.sta.getip())
dofile("httpsender.lua")
end 

Итог:



Планы


Это первый опыт работы с ESP8266. В планах попробовать следующее:

1. Найти альтернативу thingspeak. Графики хочется двигать и масштабировать. Может, кто-то знает аналоги?
2. Датчик влажности (возможно, DHT22). Вроде уже есть в стандартных библиотеках.
3. Датчик CO2 на основе датчика K-30.
4. Управляемый рассвет без дополнительного контроллера, управление с ESP8266. Вдохновила публикация «Искусственный рассвет».

Используемые материалы


За основу взят текст «Low cost WIFI temperature (DS18B20) data logger based on ESP8266 with connectivity to thingspeak.com». Код для DS18B20 почему-то отказался работать, пришлось перейти на стандартную библиотеку ds18b20.lua.
@ssh1
карма
–1,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (74)

  • +1
    Мне показалось, или NodeMCU действительно занимает почти всю память контроллера? Уже на записи второго модуля в память я получил ошибку сообщающую о нехватке памяти, компилирование в бинарный код уже имеющегося в памяти модуля завершилось с той же ошибкой. Возможно я что-то сделал не так, но больше к этой прошивке возвращаться желания не возникло.
    • 0
      Не изучал вопрос потребления памяти. Пока игрался — загружал много скриптов проблем вроде не возникало.
    • 0
      При загрузке NodeMCU Вы получаете 21K heap. Есть Micropython который дает 24K (но не умеет пока WiFi и другие важные штуки)
      Тем не менее, это немало если компилировать Lua в байткод и разумно пользоваться памятью, а также разделять модули для более гибкой компиляции. Конечно, это совсем не много если сравнивать Lua с C++ и другими статическими языками. С другой стороны, никто не мешает взять и написать необходимый функционал на C, открыть его для доступа через метод Lua, сделать пул реквест и наблюдать как этим пользуются другие люди.
      В любом случае, давайте задумаемся, это ведь начало прихода микроконтроллеров в жизнь бОльшего круга людей. Естественно, это позволяет развивать все это еще сильнее и быстрее. MicroPython, NodeMCU — это первые шаг в этом направлении… Мы ведь хотим интернет вещей?

      • 0
        Подойдёт ли Forth для IoT?

        + Из положительных моментов — компактный по затратам памяти, работает на стеке, скрипт блочейна очень близок этому языку.
        — Из отрицательных — широко не распространён, сложен в использовании, не удобен для строк, файлов, сокетов.

        github.com/jdinuncio/forthos

      • +2
        Странно, нашёл тот модуль, который я загружал, он для поддержки bmp180, весит всего лишь 4кб, после этого загрузка дополнительных 800 байт завершилась с ошибкой. Кстати обратил внимание, что разные билды nodemcu весят по-разному (сами бинарные файлы для заливки). Заливал последний из доступных на тот момент, версия 0.9.5 билд от 20150212.

        Но если думать о других людях, то я бы предложил не тратить время на nodemcu и micropython и писать на Си. Лично я знаю Си и Lua примерно на одинаковом уровне, но первый мне кажется более простым и понятным. Взяв за основу прошивку frankenstein, написал к ней модули для работы с i2c железками BH1750, BMP180, HD44780, HMC5883, PCF8591, SHT21, TCS3414, в результате потребление памяти увеличилось с 40 до 41% и соответственно осталась возможность обновлять прошивку по воздуху через tftp.

        Если посмотреть на тот же ардуино, то они ведь крутую штуку сделали. Они не стали уходить от Си, а лишь добавили несколько библиотек, отдаляющих пользователя от работы с регистрами, заменив это дело макросами и функциями с красивыми именами. И пользователи, совершенно не знающие Си и микроконтроллеры изучают Си и пишут на нём. Причём насколько бы ущербной не была Arduino IDE, она позволяет отказаться от Wire и использовать AVR библиотеки, писать самому в регистры, в общем не ограничивает функционал, как например nodemcu.
        • 0
          Есть в Вашей мысли здравое, в особенности аналогия с arduino.
          Пойду смотреть frankenstein. Можно ли где-то взглянуть на Ваши дополнения?
          • 0
            Пока что нет, планирую выложить в открытый доступ сразу после того, как допишу ещё несколько модулей, для: HMC5883L, ADXL345, MPR121, DS3231, DS1337, L3G4200D, SSD1306.
          • 0
            Как обычно, неожиданно, напали более важные дела, поэтому решил не откладывать и выложить как есть. Github использую первый раз, надеюсь что всё сделал правильно: github.com/darkbyte-ru/esp8266-frankenstein
  • +3
    А зачем Lua? Не логичнее было бы на плюсах написать и скомпилировать под этот контроллер?
    • +2
      Однозначно, если что-то делать более-менее серьёзное надо делать НЕ на Lua, вот варианты:

      Или готовое — homes-smart. Или самому покопаться можно — frankenstein

      Первый проект из коробки поддерживает кучу всяких интересных сервисов, в т.ч. MQTT, Narodmon, MajorDoMo, ThingSpeak, FlyMon, Wunderground. Я вот то-же на него подсел и пытаюсь по мере возможности свой вклад внести.

      А если поиграться и достаточно только температуры — да, Lua самое то.
      За стиль изложения в статье автору респект. Спасибо.
      • 0
        homes-smart — смотрел, но некоторые функции, например DeepSleep, только в платной версии PRO.
        А что за система FlyMon? Ни описания ни регистрации не нашел.
        • 0
          Ну, я для нескольких спящих железок лицензии прикупил, оно того стоит, автор пилит прошивку ежедневно.
          Остальные модули у меня в Free режиме стоят, и кушать не просят, самое то, что нужно.
          FlyMon DMS (device management system) системка такая, на Ruby пишется, для управления устройствами разными, в основном роутерами, а сейчас уже и ESP поддержка будет.
          Прошивка от homes-smart даже в Free версии умеет данные на FlyMon отправлять, ну а дальше графики строятся автоматом.
          Я вот для себя еще потихоньку пишу мануалы по ESP, может пригодятся.
        • 0
          www.esp8266.ru вам в помощь, там много людей с esp8266 копаются, так же там есть и автор Unofficial DevKit для ESP.
          • 0
            То есть Вы.
            Лучше бы добавили документации побольше, чем donation просить на главной README.md :)
    • 0
      Честно говоря, видел примеры работы с датчиком DS18B20 (да и вообще с 1-wire) только Lua, поэтому и остановил выбор на NodeMCU.
      • 0
        Ясно. В принципе, если ресурсов контроллера хватило, времени потрачено немного, вещь работает — почему бы и нет, верно?
        • 0
          В том-то все и дело. При выборе вариантов я руководствовался количеством мануалов и простотой реализации.
          • 0
            Именно! Как раз об этом я и говорю чуть выше. Сообщество + простота конфигурации играет огромную роль в появлени рабочих прототипов.
            С и C++ с точки зрения производительности несомненно хороши, здесь вообще никаких споров быть не может. Но получается замкнутый круг: те кто пишут на C++ не хотят писать документацию, а сообщество, которое хочет писать документацию — не достаточно хорошо знает C++. Интерпретируемые языки для микроконтроллеров, (ИМХО конечно), позволяют выйти из этого круга и двигаться вперед.
      • 0
        Есть уже готовый код для работы с DS18B20. Я использую в своём проекте (с некоторыми модификациями), который был взят из этого примера:
        github.com/CHERTS/esp8266-devkit/tree/master/Espressif/examples/1wire_ds18b20

  • +1
    А как долго он живет на батарейках?
    • 0
      Не измерял. Допустим среднее потребление ~20мА. Соответственно двух батареек емкостью 1Ач хватит примерно на 50 часов.
      В планах добавить уход в DeepSleep на время паузы, тогда расход сократится в разы.
      • 0
        В ожидании, да, примерно 20 мА, а вот при передача данных 120-140 мА
        • 0
          У меня около 16 в ожидании и около 100 в передаче. Поэтому и усреднил ~20
    • 0
      От 18650 аккума примерно 6 дней в режиме сна и отправки данных на сервер каждые 5 мин.
      • 0
        От погодной станции датчик выносной на радио 433мгц живёт на паре обычных батареек пол года-год.
        Если он уличный или просто достаточно света то можно поставить акк + солнечную батарею и он будет жить пару лет автономно или больше, зависит от реализации и условий.
  • 0
    > 1. Найти альтернативу thingspeak. Графики хочется двигать и масштабировать. Может, кто-то знает аналоги?

    Там можно масштабировать. Для этого надо нажать на иконку карандаша в верхнем правом углу графика.
    Так же можно данные забирать (json/xml) себе для обработки.
    • 0
      Да, но хочется что-то вроде www.highcharts.com/stock/demo/basic-line
      Обрабатывать у себя — тоже вариант. Но я все же надеюсь что есть аналог thingspeak с графиками типа highcharts.
      • +1
        Дык поднимите у себя БД и рисуйте при помощи Highcharts. Делов там на пару часов с курением мануалов.
        Ну а если есть желание — айда к нам в группу homes-smart, графиками укомплектуем ;)
        • 0
          Поднять БД и рисовать самому — вообще не проблема. Но есть ощущение что в эпоху развития IoT это уже сделано и работает.
          • +1
            Все, кто представляет из себя уже что-то более-менее, начинают после раскрутки просить деньгу
            Посмотрите тогда еще в сторону Librato, у них были бесплатные пакеты для разработчиков, выглядят солидно.

            Ну надежность еще и приватность для некоторых имеет значение. Есть люди, которым важно не визуальная составляющая, а «секюрно ли это работает ?» (датчик температуры в сортире на приусадебном участке).
          • 0
            можно graphite поднять в него данные собирать. Масштабируемость есть.
    • 0
      До thingspeak, юзал xively(cosm)
      • 0
        Как я понял, у них сейчас закрыта регистрация. Оставил контакты месяца 2 назад — тишина.
        • 0
          Странно, не знал. Теперь ясно чё все на thingspeak перешли
          • 0
            Да и вообще неудивительно, с такой-то странной политикой. Сначала они были pachube.com. Потом стали cosm.com. Теперь стали xively.com. При этом они еще и переделали все API, сделав старые фиды legacy. Руки отрывать маркетологам, которые все это придумали, и технарям, которым чешется менять то, что и так работает.
        • 0
          Формально Xively и сейчас работает, так или иначе девайс для замера потребляемой энергии CurrentCost к ним по дефолту сливает, но саппорт и правда или не реагирует вообще или говорит мол мы тут непричем, хотя данные идут на их IP и триггеры их работают.
    • 0
      Народный мониторинг. Графики с масштабированием, геолокация на карте и т.п.
  • +1
    Угу. Достаточно гибко работает.
    Я себе ThingSpeak даже в блог встроил — контроль солнечной панели.
  • 0
    Есть ли такие готовые устройства по $5-10 с двухзначным экраном? Можно было бы повестить в каждой комнате и при этом централизированно собирать данные.
    • 0
      по комплектующим — в 10$ уложитесь. А вот готовые вряд-ли пока.
  • 0
    Заказал такой девайс поиграться, на днях подойдет. Почитал даташит. Есть там интересный пункт на 6 странице, что в нем есть встроенный температурный датчик. Если он есть зачем городить DS18B20, не проще научиться им пользоваться?
    • +3
      Чип греется и будет показывать температуру чипа, а не окружающей среды… Да и точность у его может быть никакая…
      DS18B20 не так уж дорого стоит.
      • +1
        Самое странное, что у меня два модуля из 15 при подключении питания разогреваются градусов до 60, при этом не сказать, чтобы сильно больше потребляют тока, да и работают так же, как и нормальные.
        • +1
          Если речь про модули ESP8266, то там при сборке встречается баг один. Он заключается в том, что для светодиода (индикатор питания) стоит резистор на очень маленькое сопротивление и происходит большой нагрев.
          • 0
            Да, модуль ESP8266, если быть точнее, то ESP-05 как на фото из статьи, только выводов 5, выведен reset. Но у этого модуля нет светодиодов и греется сам контроллер. И такого бага нет у других экземпляров той же модификации, и прошивка залита одинаковая (мод на базе франкинштейна).
            • 0
              Вопрос. А как вы этот модуль в режим прошивки смогли перевести?
              • +3
                Я не смог. Если вкратце, то после того как я превратил в кирпичи все модули этой модификации с использованием AT+CIUPDATE, мне не оставалось ничего, кроме как выпаять флеш память и залить прошивку в неё с использованием внешнего программатора. При наличии прокачанных рук, микроскопа, скальпеля и хорошего паяльника вполне можно отсоединить GPIO0 от VCC и замкнуть его на GND на время программирования, но у меня ничего из этого списка не оказалось.
                • 0
                  Ок. Спасибо за оперативный ответ. Кармы не хватает плюсануть.
                  Скорее всего поступлю так-же — залью ПО через программатор.
  • 0
    Хм… не знал что есть столько вариантов этих модулей. На ибее ищется только первый вариант, как самый популярный. Но странно что при сортировке по цене другие модули не попадают в поиск.
    Кстати, насколько лучше керамическая антенна в ESP-03 по сравнению с печатной на ESP-01?
  • 0
    есть еще интересный вариант, так и называется — nodemcu wifi
  • 0
    h5.m.taobao.com/awp/core/detail.htm?spm=a230r.1.14.1.ofHF5e&id=43189493943&ns=1&abbucket=13#detail — вот ссылка, так же на чипе esp866, только пинов больше, питание от 5 вольт
    • 0
      Ссылка битая или ведет не туда.
      • 0
        Ссылка работает. Но если что, можно на ebay или ali ввести в поиске «nodemcu wifi», будет тоже самое.
        • 0
          Ценник негуманный. Чистый модуль стоит 4$ от силы, а эти впаривают по 15$.
          • 0
            Цена отличается, бесспорно. но не забывайте, еще на нем стоит TTL конвертер, две кнопочки, одна включает режим прошивки, другая пользовательская. Также на нем распаяны все выводы, в том числе аналоговый пин. Это как минимум удобнее, если прошиваете его несколько раз за день. Я покупал вот такой.
            Тем не менее, существуют экземпляры без TTL но с полной разводкой контактов — тоже неплохой вариант, но это дело вкуса.
            • 0
              но… TTL-конвертор это пара резисторов… 2К/3K
              • 0
                он наверно про usb имел в виду
  • 0
    О, посмотрел интернет уже есть ESP-12 модуль, такой же как ESP-08 только с печатной антенной как у ESP-01
  • 0
    Есть вот такой русскоязычный проект: narodmon.ru/
    Там и каталог решений для сбора/отправки данных есть.
  • 0
    Спасибо за статью. Пытаюсь повторить, Init.lua ругается на строку 14:
    lua: init.lua:14: 'end' expected (to close 'function' at line 6) near ''
    Я в lua полный 0, но вроде как не функция не закрыта? Добавил ниже end), вроде запустился, но стал падать на print («Temp»):
    (httpsender.lua:7: attempt to concatenate global 't' (a nil value))
    Я так понял, что ds18b20.read() возвращает nil, т.к. DS18b20 у меня неправильно была подключена, а print не умеет работать с nil. Добавил проверку на Nil:
    if t~=nil then
    print(«Temp:»..t.." C\n")
    blablabla
    end

    И еще вопрос по подключению DS-ки: текстом в статье написано правильно: левая — земля, средняя — сигнал, правая-питание. Но на картинке то всё наоборот, левая-питание, правая-земля? Ошибка, или я как-то не так читаю такие схемы?
    • 0
      Картинка не правильная
      левая — земля
      средняя — сигнал
      правая — +питание
      эт я про DS18B20
    • 0
      Да, нужно быть на стороже и перепроверять. Всегда остается место нелепым ошибкам.
  • 0
    Повторил термометр и натолкнулся на то, что при выполнении init.lua не успевает получить IP на момент проверки условия. И отображается IP unavaiable, Waiting.... Как задержать скрипт перед проверкой условия?
    if wifi.sta.getip()== nil then
    print(«IP unavaiable, Waiting...»)
    else
    tmr.stop(1)
    print(«Config done, IP is »..wifi.sta.getip())
    dofile(«httpsender.lua»)


    Вручную запускаю httpsender.lua — всё работает.
    Единственное изменение в коде, а то падает через пару часов.
    if(t == nil) then t=0
    end

    print(«Temperature:»..t.." C\n")
    • 0
      P.S. и давайте модулю хорошее питание, хотя бы по питанию конденсатор повесить в 100-300 мкФ.
      Просаживает питание — видно в темноте легкое проседание/помаргивание яркости красного светодиода и может в консоль сыпать мусор.
  • 0
    На рисунке перепутана полярность подключения DS18B20 (в тексте написано правильно: земля слева)
    В остальном спасибо, с учетом небольших нюансов конструкцию удалось повторить.
    • 0
      У меня не работал, не читал с DS18B20, пока не убрал резистор. Датчик запитал от 5 вольт — на 3.3 работал нестабильно.
      • 0
        Там еще от напряжения питания зависит результат измерения… питать его желательно от стабилизированных 5В, при отклонении до 4.5В уже может врать на градус…
        • 0
          Power Supply
          Range is 3.0V to 5.5V

          Почему вы считаете, что он правильную температуру показывает именно при 5В, а не при 4.5?
          • +2
            Методом сравнения с ртутным термометром в емкости с водой. Показания зависят от напряжения питания, это установлено экспериментально.
            • 0
              Сейчас проверил, мои разницы между 3,2 и 5,3 вольт не показывают.
              • 0
                В режиме паразитного питания?
                • 0
                  нет
                  • +1
                    Чип кстати не то что бы дорогой, но и не копеечный — может подделывают?
                    • 0
                      Такая же мысль появилась. Два датчика купленных у разных продавцов немного по разному себя ведут. Как я написал выше — один не запустился с паразитным питанием.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.