Web Термометр на WIFI esp8266 c отсылкой на e-mail (от батарейки)

ВНИМАНИЕ!!! КАК И ГОВОРИЛ НА СЕРВЕРЕ УБРАЛ ОТРАБОТКУ PHP СКРИПТА, СТАЛО МНОГО ЗАПРОСОВ И ХОСТЕР РУГАЕТСЯ :) РАЗМЕЩАЙТЕ НА СВОИХ РЕСУРСАХ
Выкладываю проект web термометра на WIFI модуле ESP8266, кому интересно пробуйте.

что делает:
-измеряет температуру с датчика DS18b20
-отсылает ее на бесплатный hosting c php, на сервере выполняется php скрипт который
отсылает письмо хозяину на e-mail с температурой объекта и «прицепом» температуру в родном городе. По вкусу можно еще что то добавить.
-работает от 2 х батареек AAA
-потребление в режиме sleep около 10 мкА
-отсылка email примерно раз в 35 мин

По железу:
Модуль версии 01 прошивка с Lua от 08.01.2015
-GPIO0 подтянут к 3V и сюда же подключенDS18b20
-соединяем перемычкой СH_PD и 3V
-чтобы работал node.dsleep() соединяем перемычкой RST и XPD_DCDC (она с угла микросхемы так что при наличии желания и прямых рук можно припаять)
-для снижения потребления выпаиваем либо перерезаем красный светодиод
(говорят программно его отключить нельзя, не проверял)
По софту модуля:

--cюда введете свой url который создадите
host="shipov.url.ph"
--сюда введите свой е-mail на который будут приходить письма
MYMAIL="vasia_pupkin@gmail.com"
--это отсылка сообщений  35мин
COUNTSEND=3600000000
ipnr=0
pin = 3
pinroom=4
ow.setup(pin)
ow.setup(pin)
lasttemp=-999

function bxor(a,b)
local r = 0
for i = 0, 31 do
if ( a % 2 + b % 2 == 1 ) then
r = r + 2^i
end
a = a / 2 b = b / 2
end
return r
end
function bxor(a,b)
local r = 0
for i = 0, 31 do
if ( a % 2 + b % 2 == 1 ) then
r = r + 2^i
end
a = a / 2  b = b / 2
end
return r
end
function GetTemp()
addr = ow.reset_search(pin)
repeat
tmr.wdclr()
if (addr ~= nil) then
crc = ow.crc8(string.sub(addr,1,7))
if (crc == addr:byte(8)) then
if ((addr:byte(1) == 0x10) or (addr:byte(1) == 0x28)) then
ow.reset(pin) ow.select(pin, addr) ow.write(pin, 0x44, 1) tmr.delay(1000000)
present = ow.reset(pin) ow.select(pin, addr) ow.write(pin,0xBE, 1) data = nil
data = string.char(ow.read(pin))
for i = 1, 8 do
data = data .. string.char(ow.read(pin))
end
crc = ow.crc8(string.sub(data,1,8))
if (crc == data:byte(9)) then
t = (data:byte(1) + data:byte(2) * 256)
if (t > 32768) then
t = (bxor(t, 0xffff)) + 1  t = (-1) * t
end
t = t * 625 lasttemp = t
return lasttemp/10000
end
tmr.wdclr()
end end end
addr = ow.search(pin)
until(addr == nil)
end
---MAIN---
print("WEBTEMPMYSERVER V1.1")
tmr.alarm(0,5000,1, function()
sk=net.createConnection(net.TCP, 0)
sk:dns(host,function(conn,ip)
ipnr=ip end)
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload) print(payload)
--Тут можно принять команду с сервера
gpio.mode(pin, gpio.INPUT) node.dsleep(COUNTSEND)
--if string.find (pl,"!SetR0") then
--print("LOAD TEMPERATURE!!!!\r")
--end
end )
conn:on("disconnection", function(conn, payload) print("DISCONNECT")
gpio.mode(pin, gpio.INPUT) node.dsleep(COUNTSEND)
end )
conn:connect(80,ipnr)
conn:send("GET /php/sendtest.php?mymail="..MYMAIL.."&temp="..GetTemp().." HTTP/1.1\r\nHost: "..host.."\r\n"
.."Connection: keep-alive\r\nAccept: */*\r\n\r\n") end)


При этом коде раз в 35 мин модуль будет отсылать на почту через мой тестовый скрипт
sendtest.php температуру на почту указанную в скрипте и писать лог в файл. Это только для проверки!!!! Лучше заведите свой сервер на бесплатном хостинге и поместите туда скрипт на PHP.
В скрипте можно выкинуть все ненужное, оставив только температуру.
Для проверки работы можно из броузера набрать:
shipov.url.ph/php/sendtest.php?mymail=vasia_pupkin@gmail.com&temp=23
введя вместоvasi pupkina свой еmail, должно прийти письмо. Могут быть задержки.
УБРАЛ!!! НЕ РАБОТАЕТ
Скрипт у меня для теста, скоро уберу, делайте свое.

Порядок работы:
1.Сделайте доработки по железу
2.Настраиваем модуль на свою точку доступа с выходом в интернет

wifi.setmode(wifi.STATIONAP)
wifi.sta.config("beeline15","0891111111") -- введите ваши !!!!
wifi.ap.config({ssid="WEBTEMPMYSERVER V1.1",pwd="180160180160"})

3.Прошейте модуль кодом обозвав Init.lua
4.Подключите 2 батарейки типа AAA
Потребление:
Отсылка происходит примерно за 7 сек — потребление в импульсе до 200 мА
Далее на 35 мин уходим в режим sleep -потребление около 10 мкА
Должны жить долго по идее :)

Вот что приходит на emai:
Температура в комнате = 23C В Клину 0..-2C В Aлании(ТУРЦИЯ) =13..15C 16.01.15 16:15:18

PS. про narodmon.ru, pushingbox и другие сервисы для IoT конечно слышал и пробывал, но со своим скриптом по моему можно сделать гибче.Но, не настаиваю.Немного подрихтовав код можно работать через них.Дело вкуса :) Датчик работает непрерывно с Нового Года, специально пишу в файл лог чтобы проверить.Могут быть нюансы, делал быстро.В нормальном положении датчик должен моргать только раз в 30 мин. ВНИМАНИЕ!!! Когда датчик в режиме sleep он не реагирует на команды по UART. Чтобы удалить файл, нужно включить и в течении 5 сек дать команду file.remove(«Init.lua») Можно еще снизить потребление если писать например только если например температура снизилась до порога.Так же в момент передачи данных на сервер, можно сделать передачу параметров на модуль(например если это термостат)
Отступы в коде не делал намеренно так плотнее ложится во Flash. Делал под свою задачу, так что вопросы а нахрена? и т.д «идут лесом» Все просто.Не нужно, не делаем :) Вроде ничего не забыл.
  • +6
  • 16 января 2015, 18:27
  • alexhi
  • 2
Файлы в топике: sendtest.zip, Init.zip

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

RSS свернуть / развернуть
А какая там стоит флеш память? Она сможет работать на всем протяжении разряда батареек или отвалится на 2.7В (когда в каждой батарее будет еще по 1.35В)?
0
Вообще вот технические хар. модуля:
Технические характеристики:
Поддерживаемые стандарты WI-FI: 802.11 b / g / n.
Поддерживаемы типы шифрования:WEP, WPA, WPA2.
Поддерживаемые режимы работы: Клиент(STA), Точка доступа(AP), Клиент+Точка доступа(STA+AP).
Напряжение питания 1.7..3.6 В.
Потребляемый ток: до 215мА в зависимости от режима работы.
Количество GPIO: 16 (фактически до 10). Доступно на модулях: ESP-01 — 4, ESP-03 — 7+1, влючая UART. Существуют и другие варианты модулей.
Внешняя Flash память размером 512кб.
RAM данных 80 кб, RAM инструкций — 32 кб.

1.7..3.6 В.
Должна по идее работать, хотя китайцы могут и наврать. :)
0
Я тоже очень обрадовался, подумав, что появился вайфай модуль который может напрямую работать от пары батареек, и пошел гуглить.

Нагуглил я вот что:
В модуле стоит память W25Q40BVNIG (https://github.com/esp8266/esp8266-wiki/wiki)
Эта память, если верить документации, работает от 2.7-3.6В
+1
Ну вот я в реале и проверю за сколько он посадит батарейки с 3V до 2.7V Пока с 29.12.2014 работает отсылая через каждые полчаса. Или поискать акк. c напряжением повыше.Например 3.6V.
0
Лежит один такой модуль, не поленился, глянул, что за память. Да, память именно эта и стоит, то есть, когда на каждой батарейке будет меньше 1.35В, то перестанет работать.
+1
Отступы в коде не делал намеренно так плотнее ложится во Flash.
Для публикаци стоило отформатировать, as is получается малочитабельно. А для экономии флеша (неужели его настолько мало?) лучше использовать обфускатор, он куда лучше сократит размер.
a = a / 2 b = b / 2
Надо же. Не знал, что в луа так можно.

А зачем городить свой скрипт? Протокол SMTP вроде несложен, можно реализовать отправку письма непосредственно средствами модуля. Тогда свой хост со скриптом не потребуются.
+1
  • avatar
  • Vga
  • 17 января 2015, 02:15
Протокол SMTP вроде несложен
мало где теперь чистый смтп, у меня везде перешли на шифрование
а со своего динамического ип почту вообще не отослать как 10 лет назад

так что скрипт в виде прокси
0
а со своего динамического ип почту вообще не отослать как 10 лет назад
Лолвут? А опера как-то отсылает и с динамического IP, и из под NAT'а.

SSL — да, это проблема, если почтовый сервер не поддерживает доступа не через SSL, а модуль не имеет встроенной поддержки SSL. Но не обязательно использовать именно gmail, свет на нем клином не сошелся.
0
Ну да у меня как раз gmail, а так как на сервере в инет можно еще и хранить, да и отображать в виде графиков. Поэтому вариант с облаком думаю не совмем плохо.Тем более хостинги с php «халявные» Так что под себя можно заточить типа IoT.
0
Можно завести аккаунт и на более подходящем email-сервере, а то и поднять свой. Вариант с скриптом по моему лучше для тех случаев, когда данные не просто форвардятся в email, а используются самим сервером.
Ну и примеров работы с HTTP — завались, а вот SMTP куда реже, так что это было бы банально интереснее.
0
А опера как-то отсылает и с динамического IP, и из под NAT'а.
отсылает на твой почтовый сервер с mx записью и статическим ип
а раньше я запускал простой смтп без авторизации и любая херня отправляла почту

Но не обязательно использовать именно gmail, свет на нем клином не сошелся.
я его и не использую, но все мои ящики используют ссл
а ссл не влазит в эту прошивку уже или влазит только в виде хттп клиента
лень смотреть сейчас
вот автор и сделал простой вариант через скрипт
не в этом вообще суть поста
0
отсылает на твой почтовый сервер с mx записью и статическим ип
Да на те же mail.ru, gmail.com и yandex.ru и отправляет. Причем два из трех позволяют работать без SSL.
0
В полном варианте я еще сохраняю температуру в файле(FLASH), а так как сейчас загрузчик программы работает в «тупую» не удаляя даже лидирующие пробелы то так получается несколько ее экономить. C Flash там более менее нормально, а вот с ОЗУ плохо.Вся куча примерно 20 КБ, не забываем что LUA интерпритатор и выполняется в OЗУ, то со всякими SMTP и др.не все так просто.Мой код например занимает примерно 10К, а еще надо оставить на систему и TCP/IP. Если что-то серьезное надо писать на C. LUA только для таких простых задач.
+1
Чет как-то фигово. Я думал, что луа довольно экономичная, и написать на ней можно и что-то посерьезней. Хотя SMTP, ЕМНИП, не сильно ложнее HTTP будет.

Кстати, луа ж компилируемая в байткод, причем если парсер выкинуть можно, то ВМ байткода — необходимая часть движка. Разве модуль не поддерживает исполнение байткода луа? Тогда и форматирование нормальное сохранить можно, и обфускатор не нужен. Неплохо было бы вообще выкинуть из модуля парсер и освободить за счет этого ресурсы.
0
Что то посерьезнее по моему надо писать на C.Не заморачиваясь на всякие Lua. Lua удобнее когда есть какая то локальная простая задачка как у меня или «прокладка» в виде например транспарентного UDP<-->UART сервера.Модуль при этом занимается только связью по сети, а вся логика и много ног во внешнем процессоре ( напр. STM32F0) сидящем на UART.Заодно при необходимости автоматом решаются «шкурные» вопросы в виде LOCK бит процессора.:) Но это мое мнение.
0
Ну, луа несравненно приятнее, чем С)
Так что там с поддержкой скомпилированных модулей луа? Если там более-менее нормальный движок луа, то он должен столь же охотно сожрать init.lua, в котором вместо текста байткод. Попробуй.
0
А никакого компилятора для модуля типа luac я не видел или не нашел.
0
Стандартный luac.exe и используй, это же байткод, он везде одинаковый.
0
Попробывал компильнуть. Компиляция проходит, но при попытке запуска на модуле пишет:
luac.lua: bad header in precompiled chunk. Похоже в версии Lua для модуля что то не то в заголовках или еще что то хз.
0
Выясни версию луа в модуле (выведи тем или иным образом значение переменной _VERSION), скомпилируй компилятором этой версии.
0
Тот что в модуле и тот чем компилил 5.1.4
0
Гм. Странно. Тогда попробуй вывести из модуля скомпилированную версию кода (ЕМНИП в луа есть функция, позволяющая из скрипта получить скомпилированный код) и сравни заголовки (ну или мне дай поковырять).
0
Не странно. там ещё много инфы в заголовке. Можно попробовать через string.dump(myfunc), но это только для функции. И скомпилированный таким образом байткод занимает в памяти больше, чем исходник. Другой разговоро, что уже исходник хранить не надо.
0
Байткод всегда в оперативке, как ни крути.
loadfile и возвращает функцию. тот же компилятор это out:write(loadfile(file.lua))
0
Ага, я походил по этим граблям. Lua хоть и называется интерпретатором, но это «компилятор чанков», скорей. Например, для запуска другого, не чувствительного ко времени, вешал функцию на таймер для однократного исполнения, которая вызывала файл. Иначе эти файлы заполняли стек.
А сам язык — да, удобен, прост, гибок. Но 20кБ маловато для вменяемых приложений.
0
Вот и интересно, что именно не устраивает VM.
0
Надо же. Не знал, что в луа так можно.
Луа тоже не знает, что так можно :)
0
знает
a = 3 b = 2 a = a + 1 b = a + b print(a,b)
www.lua.org/cgi-bin/demo
+1
Блин, а ведь БНФ не врет :( Даже до разрешения ;; было
chunk ::= {stat [';']} [laststat [';']]
Вообщем я расстроен.
0
Вы не первый и не послений, кого lua расстраивает. Бытует даже мнение, что lua придумали и пользуют те, кто не знает о BrainFuck, потому что если моск ипать не надо, то есть другие языки. А если надо поипать — то есть специально предназначенные.
-1
кто-то заставляет писать таким образом? хотите поговорить об этом?
или вместо lua в МК с сотней КБ памяти надо было питона засунуть?
0
На каком языке написан этот «софт модуля»?
0
  • avatar
  • Aneg
  • 17 января 2015, 02:24
lua
0
С чего начать, если есть желание научится программировать на Lua?
0
Поставьте Lua для Windows и попишите.Примеров и описаний в сети навалом. Различия будут только при работе с «железом», но они описаны.
0
Прошу прощения, alexhi! Я не разобрался — кто автор статьи «Web Термометр на WIFI esp8266 c отсылкой на e-mail (от батарейки)» и ошибочно адресовал свои пожелания dcoder'у. Извините! Очень сильная идея — отправлять информацию с датчиков по е-мейлу. Респект автору!
Особенно такой подход актуален для отправки разовых сообщений типа: «Температура в помещении ниже ___С. Включи отопление!» В этом случае, на мой взгляд, модуль в автономном режиме будет работать вечность.
Попытался повторить опыт. С php-скриптом — проблем нет: на е-мейл приходят тестовые сообщения, а с init.lua — проблемы.
Сообщения с ESPlorera:
> PANIC: unprotected error in call to Lua API (Init.lua:81: attempt to concatenate a nil value)
и далее:
lua: cannot open init.lua

Команды
wifi.setmode(wifi.STATIONAP)
wifi.sta.config(«VB»,«EG4P5BMHTQ») — введите ваши!!!
wifi.ap.config({ssid=«WEBTEMPMYSERVER V1.1»,pwd=«180160180160»})
загружал через SEND ESPlorera и включал вначале init. Результат такой же.

Помогите найти исправить ошибки!
0
С приложенного к lua мануала. Потом загляни за различными best practices в Programming in Lua, лежит на офсайте луа.
0
С чего начать, если есть желание научится программировать на Lua?
Зарегистрироваться в Steam и купить Garry's Mod

P.S. Аналогично, для обучения кодированию на Java есть Minecraft
-1
раскрыть комментарий
-5
столько уже порваных жоп набралось
хоть в каллекцию добавляй

а не могли бы вы писать причину, а то как-то уныло будет смотреться
+2
Настоящие Программисты не учат язык по роликам!
Ну и ролик по твоей ссылке не стоит своих пяти минут.
0
Да ладно… изучить язык программирования сейчас (тем более такой, как Lua) — это не заявка на некогда элитарный профессионализм — это как права на машину получить или научиться пользоваться дома наворочанной мультиваркой.

Кричать: Настоящие Программисты, бла-бла-бла! — это по крайней мере не скромно. Хотя и вполне ожидаемо при капитализме в погоне за более жирным куском жратвы или более удобным местом у корыта, а особенно в конкурирующих артельно-цеховых кругах или в террариумах офисов (классическое «А ты кто такой, я тебя спрашиваю ?»). Но в данном случае причиной является банальное ЧСВ: «Я самый умный !» — вот отличительная черта типичного киндервуда, коих, я смотрю, среди електроньщиков до 90-95% :DDDD

Но видимо все же есть где-то эти самые Настоящие Программисты, есть Линус, есть Нотч, есть еще очень многие, но это же капля в миллиардном океане говнокодеров, ПЖ, хабраменов или просто непишущих «гуру».
0
Настоящие Программисты — классическая шутка.

Что до луа — она весьма проста в базовом изучении (помнится, кто-то из крупных геймдевелоперов радовался, что теперь скрипты могут и дизайнеры писать — С они ниасиливали), но все же намного глубже, чем кажется на первый взгляд. И подобные ролики не дадут этого понять, за такими вещами нужно заглядывать в PiL.
+1
начать: tylerneylon.com/a/learn-lua/
потом официальный мануал,
ну и отличная книга от автора языка: programming in lua, на рутрекере есть 3rd edition.
+3
кому интересно, китаезы делают хорошие модули со всеми выводами
www.ebay.com/itm/2x-ESP8266-Serial-Port-Transceiver-Module-Send-Receive-IO-Lead-Out-WIFI-Wireless-/301445049284?ssPageName=ADME:X:RTQ:US:1123
0
Да, только в Россию они не шлют!
0
А здесь цена доставки дурная!!!
0
Там есть по цене аналогичные Ebay! Просто в поисковике задайте, причем один в один как у автора статьи! И не сильно дорого…
0
Она «дурная», т. к. с 10 января в Россию запрещают доставку без трек-номера.
0
Почему цена доставки дурная — там же free shipping есть?
-1
китаезы делают хорошие модули со всеми выводами

Даже «pinboard», т.е. «доска развития» (Ali-термин) (видимо для начинающих «дубов в прыжке» :) с этой платкой есть
-2
как люди болезненно реагируют на слово «pinboard»…
+1
Не-е, это так реагируют на «дубов в прыжке» :D

P/S А словосочетание «доска развития» мне и самому очень понравилось.
0
Хм, флеш действительно работает от 2.7в
Есть предположение, что когда напряжение питания упадет ниже 2.7 модуль не сможет загрузится, возможно он при старте загружает прошивку из flash в instruction RAM, но вероятнее всего это не так. Так как нафига 512кб, при RAM 32кб?
0
На аналогичном модуле собрал полную метеостанцию использовал прошивку и инфу отсюда. В дальнейщем планирую написать свою с энергосбережением и прочими плюшками. Устройство выглядит так:

Паялось на коленке :)
Потребление у него сейчас без «спячки» ~30mA. Сами модули заказывал за 6уе за пару на «алике». Работает так же с НГ, нареканий нет.
0
Хорошая прошивка. Вот только если пароль забудете — придётся придётся прошивать чистую область настроек (обычно это файл blank.bin)
0
Вместо «экономии места на форматировании» убрали бы лучше дублировании функции bxor. Да и вообще извращенский метод делать отрицательное значение, чем не устроило t-= 65536?
+1
Взял либу из примеров, посмотрел работает.Ну и оставил :) Надо было сделать быстро.Для новой версии с термостатом и телнетом я сейчас многое «подрихтовал» Кому надо сделают под себя. Надо отметить народ активно долбит в скрипт vasia_pupkin — ным. Пробуют :)
0
а время слипа указывается в чем? 3600000000 микросекунд это же час
0
Размерность времени в данном случае — миллисекунды (ms). Т.е. 3600000000 ms соответствует примерно 42 суткам. Автор, по-моему, преднамеренно допускает такие описки — чтобы народ изучал матчасть и вдумчиво подходил к выложенным скриптам.
0
Очень сильная идея — отправлять информацию с датчиков по е-мейлу. Респект dcoder'у! Особенно такой подход актуален для отправки разовых критических сообщений такого плана: «Температура в помещении ниже ___С. Включи отопление!» В этом случае, на мой взгляд, модуль в автономном режиме будет работать вечность.
Попытался повторить опыт. С php-скриптом — проблем нет: на е-мейл приходят тестовые сообщения, а с init.lua — проблемы.
Сообщения с ESPlolera:
> PANIC: unprotected error in call to Lua API (Init.lua:81: attempt to concatenate a nil value)
и далее:
lua: cannot open init.lua

Команды
wifi.setmode(wifi.STATIONAP)
wifi.sta.config(«VB»,«EG4P5BMHTQ») — введите ваши!!!
wifi.ap.config({ssid=«WEBTEMPMYSERVER V1.1»,pwd=«180160180160»})

загружал через SEND ESPlolera и включал вначале init. Результат такой же.

Помогите найти ошибки!
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.