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

Выкладываю проект 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="[email protected]"
--это отсылка сообщений 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
А какая там стоит флеш память? Она сможет работать на всем протяжении разряда батареек или отвалится на 2.7В (когда в каждой батарее будет еще по 1.35В)?
Вообще вот технические хар. модуля:
Технические характеристики:
Поддерживаемые стандарты 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 В.
Должна по идее работать, хотя китайцы могут и наврать. :)
Технические характеристики:
Поддерживаемые стандарты 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 В.
Должна по идее работать, хотя китайцы могут и наврать. :)
Я тоже очень обрадовался, подумав, что появился вайфай модуль который может напрямую работать от пары батареек, и пошел гуглить.
Нагуглил я вот что:
В модуле стоит память W25Q40BVNIG (https://github.com/esp8266/esp8266-wiki/wiki)
Эта память, если верить документации, работает от 2.7-3.6В
Нагуглил я вот что:
В модуле стоит память W25Q40BVNIG (https://github.com/esp8266/esp8266-wiki/wiki)
Эта память, если верить документации, работает от 2.7-3.6В
Отступы в коде не делал намеренно так плотнее ложится во Flash.Для публикаци стоило отформатировать, as is получается малочитабельно. А для экономии флеша (неужели его настолько мало?) лучше использовать обфускатор, он куда лучше сократит размер.
a = a / 2 b = b / 2Надо же. Не знал, что в луа так можно.
А зачем городить свой скрипт? Протокол SMTP вроде несложен, можно реализовать отправку письма непосредственно средствами модуля. Тогда свой хост со скриптом не потребуются.
Протокол SMTP вроде несложенмало где теперь чистый смтп, у меня везде перешли на шифрование
а со своего динамического ип почту вообще не отослать как 10 лет назад
так что скрипт в виде прокси
- kalobyte-ya
- 17 января 2015, 02:32
- ↑
- ↓
а со своего динамического ип почту вообще не отослать как 10 лет назадЛолвут? А опера как-то отсылает и с динамического IP, и из под NAT'а.
SSL — да, это проблема, если почтовый сервер не поддерживает доступа не через SSL, а модуль не имеет встроенной поддержки SSL. Но не обязательно использовать именно gmail, свет на нем клином не сошелся.
Ну да у меня как раз gmail, а так как на сервере в инет можно еще и хранить, да и отображать в виде графиков. Поэтому вариант с облаком думаю не совмем плохо.Тем более хостинги с php «халявные» Так что под себя можно заточить типа IoT.
Можно завести аккаунт и на более подходящем email-сервере, а то и поднять свой. Вариант с скриптом по моему лучше для тех случаев, когда данные не просто форвардятся в email, а используются самим сервером.
Ну и примеров работы с HTTP — завались, а вот SMTP куда реже, так что это было бы банально интереснее.
Ну и примеров работы с HTTP — завались, а вот SMTP куда реже, так что это было бы банально интереснее.
А опера как-то отсылает и с динамического IP, и из под NAT'а.отсылает на твой почтовый сервер с mx записью и статическим ип
а раньше я запускал простой смтп без авторизации и любая херня отправляла почту
Но не обязательно использовать именно gmail, свет на нем клином не сошелся.я его и не использую, но все мои ящики используют ссл
а ссл не влазит в эту прошивку уже или влазит только в виде хттп клиента
лень смотреть сейчас
вот автор и сделал простой вариант через скрипт
не в этом вообще суть поста
- kalobyte-ya
- 17 января 2015, 13:19
- ↑
- ↓
В полном варианте я еще сохраняю температуру в файле(FLASH), а так как сейчас загрузчик программы работает в «тупую» не удаляя даже лидирующие пробелы то так получается несколько ее экономить. C Flash там более менее нормально, а вот с ОЗУ плохо.Вся куча примерно 20 КБ, не забываем что LUA интерпритатор и выполняется в OЗУ, то со всякими SMTP и др.не все так просто.Мой код например занимает примерно 10К, а еще надо оставить на систему и TCP/IP. Если что-то серьезное надо писать на C. LUA только для таких простых задач.
Чет как-то фигово. Я думал, что луа довольно экономичная, и написать на ней можно и что-то посерьезней. Хотя SMTP, ЕМНИП, не сильно ложнее HTTP будет.
Кстати, луа ж компилируемая в байткод, причем если парсер выкинуть можно, то ВМ байткода — необходимая часть движка. Разве модуль не поддерживает исполнение байткода луа? Тогда и форматирование нормальное сохранить можно, и обфускатор не нужен. Неплохо было бы вообще выкинуть из модуля парсер и освободить за счет этого ресурсы.
Кстати, луа ж компилируемая в байткод, причем если парсер выкинуть можно, то ВМ байткода — необходимая часть движка. Разве модуль не поддерживает исполнение байткода луа? Тогда и форматирование нормальное сохранить можно, и обфускатор не нужен. Неплохо было бы вообще выкинуть из модуля парсер и освободить за счет этого ресурсы.
Что то посерьезнее по моему надо писать на C.Не заморачиваясь на всякие Lua. Lua удобнее когда есть какая то локальная простая задачка как у меня или «прокладка» в виде например транспарентного UDP<-->UART сервера.Модуль при этом занимается только связью по сети, а вся логика и много ног во внешнем процессоре ( напр. STM32F0) сидящем на UART.Заодно при необходимости автоматом решаются «шкурные» вопросы в виде LOCK бит процессора.:) Но это мое мнение.
Ну, луа несравненно приятнее, чем С)
Так что там с поддержкой скомпилированных модулей луа? Если там более-менее нормальный движок луа, то он должен столь же охотно сожрать init.lua, в котором вместо текста байткод. Попробуй.
Так что там с поддержкой скомпилированных модулей луа? Если там более-менее нормальный движок луа, то он должен столь же охотно сожрать init.lua, в котором вместо текста байткод. Попробуй.
Ага, я походил по этим граблям. Lua хоть и называется интерпретатором, но это «компилятор чанков», скорей. Например, для запуска другого, не чувствительного ко времени, вешал функцию на таймер для однократного исполнения, которая вызывала файл. Иначе эти файлы заполняли стек.
А сам язык — да, удобен, прост, гибок. Но 20кБ маловато для вменяемых приложений.
А сам язык — да, удобен, прост, гибок. Но 20кБ маловато для вменяемых приложений.
Блин, а ведь БНФ не врет :( Даже до разрешения ;; было
chunk ::= {stat [';']} [laststat [';']]
Вообщем я расстроен.
Поставьте Lua для Windows и попишите.Примеров и описаний в сети навалом. Различия будут только при работе с «железом», но они описаны.
Прошу прощения, 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. Результат такой же.
Помогите найти исправить ошибки!
Особенно такой подход актуален для отправки разовых сообщений типа: «Температура в помещении ниже ___С. Включи отопление!» В этом случае, на мой взгляд, модуль в автономном режиме будет работать вечность.
Попытался повторить опыт. С 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. Результат такой же.
Помогите найти исправить ошибки!
С чего начать, если есть желание научится программировать на Lua?Зарегистрироваться в Steam и купить Garry's Mod
P.S. Аналогично, для обучения кодированию на Java есть Minecraft
- well-man2000
- 18 января 2015, 00:36
- ↑
- ↓
столько уже порваных жоп набралось
хоть в каллекцию добавляй
а не могли бы вы писать причину, а то как-то уныло будет смотреться
хоть в каллекцию добавляй
а не могли бы вы писать причину, а то как-то уныло будет смотреться
- kalobyte-ya
- 24 января 2015, 08:23
- ↑
- ↓
Настоящие Программисты не учат язык по роликам!
Ну и ролик по твоей ссылке не стоит своих пяти минут.
Ну и ролик по твоей ссылке не стоит своих пяти минут.
Да ладно… изучить язык программирования сейчас (тем более такой, как Lua) — это не заявка на некогда элитарный профессионализм — это как права на машину получить или научиться пользоваться дома наворочанной мультиваркой.
Кричать: Настоящие Программисты, бла-бла-бла! — это по крайней мере не скромно. Хотя и вполне ожидаемо при капитализме в погоне за более жирным куском жратвы или более удобным местом у корыта, а особенно в конкурирующих артельно-цеховых кругах или в террариумах офисов (классическое «А ты кто такой, я тебя спрашиваю ?»). Но в данном случае причиной является банальное ЧСВ: «Я самый умный !» — вот отличительная черта типичного киндервуда, коих, я смотрю, среди електроньщиков до 90-95% :DDDD
Но видимо все же есть где-то эти самые Настоящие Программисты, есть Линус, есть Нотч, есть еще очень многие, но это же капля в миллиардном океане говнокодеров, ПЖ, хабраменов или просто непишущих «гуру».
Кричать: Настоящие Программисты, бла-бла-бла! — это по крайней мере не скромно. Хотя и вполне ожидаемо при капитализме в погоне за более жирным куском жратвы или более удобным местом у корыта, а особенно в конкурирующих артельно-цеховых кругах или в террариумах офисов (классическое «А ты кто такой, я тебя спрашиваю ?»). Но в данном случае причиной является банальное ЧСВ: «Я самый умный !» — вот отличительная черта типичного киндервуда, коих, я смотрю, среди електроньщиков до 90-95% :DDDD
Но видимо все же есть где-то эти самые Настоящие Программисты, есть Линус, есть Нотч, есть еще очень многие, но это же капля в миллиардном океане говнокодеров, ПЖ, хабраменов или просто непишущих «гуру».
- well-man2000
- 24 января 2015, 23:32
- ↑
- ↓
Настоящие Программисты — классическая шутка.
Что до луа — она весьма проста в базовом изучении (помнится, кто-то из крупных геймдевелоперов радовался, что теперь скрипты могут и дизайнеры писать — С они ниасиливали), но все же намного глубже, чем кажется на первый взгляд. И подобные ролики не дадут этого понять, за такими вещами нужно заглядывать в PiL.
Что до луа — она весьма проста в базовом изучении (помнится, кто-то из крупных геймдевелоперов радовался, что теперь скрипты могут и дизайнеры писать — С они ниасиливали), но все же намного глубже, чем кажется на первый взгляд. И подобные ролики не дадут этого понять, за такими вещами нужно заглядывать в PiL.
начать: tylerneylon.com/a/learn-lua/
потом официальный мануал,
ну и отличная книга от автора языка: programming in lua, на рутрекере есть 3rd edition.
потом официальный мануал,
ну и отличная книга от автора языка: programming in lua, на рутрекере есть 3rd edition.
кому интересно, китаезы делают хорошие модули со всеми выводами
www.ebay.com/itm/2x-ESP8266-Serial-Port-Transceiver-Module-Send-Receive-IO-Lead-Out-WIFI-Wireless-/301445049284?ssPageName=ADME:X:RTQ:US:1123
www.ebay.com/itm/2x-ESP8266-Serial-Port-Transceiver-Module-Send-Receive-IO-Lead-Out-WIFI-Wireless-/301445049284?ssPageName=ADME:X:RTQ:US:1123
- kalobyte-ya
- 17 января 2015, 02:34
- ↓
китаезы делают хорошие модули со всеми выводами
Даже «pinboard», т.е. «доска развития» (Ali-термин) (видимо для начинающих «дубов в прыжке» :) с этой платкой есть
- well-man2000
- 18 января 2015, 03:19
- ↑
- ↓
На аналогичном модуле собрал полную метеостанцию использовал прошивку и инфу отсюда. В дальнейщем планирую написать свою с энергосбережением и прочими плюшками. Устройство выглядит так:

Паялось на коленке :)
Потребление у него сейчас без «спячки» ~30mA. Сами модули заказывал за 6уе за пару на «алике». Работает так же с НГ, нареканий нет.

Паялось на коленке :)
Потребление у него сейчас без «спячки» ~30mA. Сами модули заказывал за 6уе за пару на «алике». Работает так же с НГ, нареканий нет.
Очень сильная идея — отправлять информацию с датчиков по е-мейлу. Респект 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. Результат такой же.
Помогите найти ошибки!
Попытался повторить опыт. С 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. Результат такой же.
Помогите найти ошибки!
Комментарии (62)
RSS свернуть / развернуть