ESP8266: отправка температуры на Народный мониторинг. Бюджетный вариант.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 3 мар 2015.

  1. ИгорьК

    ИгорьК Гуру

    Я имею в виду, какие команды для этого подаются ESP для исполнения.
     
  2. modex

    modex Нерд

    Модем этот тот же домашний роутер, только на батарейке и с симкой. Работает все точно так же.
    используется ваш скрипт и все, никаких изменений.
     
  3. ИгорьК

    ИгорьК Гуру

    Ок. Ещё раз. Напишите здесь какие точно инструкции получил модуль для входа в сеть.
     
  4. modex

    modex Нерд

    Все равно вопрос не понял :)
    Подключение есп к вифи?
     
  5. ИгорьК

    ИгорьК Гуру

  6. modex

    modex Нерд

    Вот так
     
  7. ИгорьК

    ИгорьК Гуру

    Что, по-вашему, значит последняя строка?
     
  8. modex

    modex Нерд

    автосоединение включено
     
  9. ИгорьК

    ИгорьК Гуру

    Не помогает? Обычно всем помогает.
    Соединитесь с модулем. Выключите wifi и смотрите по serial что происходит.
    Включите wifi. Модуль обязан вновь соединиться с сеткой.
     
    Последнее редактирование: 17 апр 2016
  10. alp69

    alp69 Форумчанин

    Как модулю указываете SSID и пароль?
     
  11. Dmiyriy

    Dmiyriy Нерд

    Господа, замучался я. Вроде как всё прошилось, вроде как все залилось, но выдает ошибки:
    Код (C++):
    NarodMonFinal.lua:3: loop or previous error loading module 'ds18b20'
    stack traceback:
        [C]: in function 'require'
        NarodMonFinal.lua:3: in main chunk
        [C]: in function 'dofile'
        stdin:1: in main chunk
    >
    Не знаю правильно или нет, но в ds18b20.lua я внёс:
    Код (C++):
    local modname = "zzzz"
    Что-то еще надо там править?
    Что не так со строкой 3 в NarodMonFinal.lua?

    Второй час бьюсь... устал... надеюсь на помощь

    П.С, Доигрался... теперь ошибка такая (хотя вроде как вернул всё как раньше)
    Код (C++):
    > dofile("NarodMonFinal.lua");
    NarodMonFinal.lua:6: attempt to index global 'ds18b20' (a nil value)
    stack traceback:
        NarodMonFinal.lua:6: in main chunk
        [C]: in function 'dofile'
        stdin:1: in main chunk
    >
    П.П.С. Ура!!!! Накопал. В NarodMonFinal.lua в строке 3 записал ds18b20 = require('ds18b20') вместо require('ds18b20')
    И как это у остальных работало....
     
    Последнее редактирование: 30 апр 2016
    ИгорьК нравится это.
  12. ИгорьК

    ИгорьК Гуру

    Вообще то Вы правы. Ваш вариант верен.
    Но, смотрю, у меня и в первой и во второй версии вызов осуществляется именно так. Значитит работает.
    Скорее всего дело в каких-то системных изменениях прошивки.
    См. первую же строку: https://github.com/nodemcu/nodemcu-firmware/blob/master/lua_modules/ds18b20/ds18b20-web.lua
     
  13. az3749

    az3749 Нерд

    Провозившись с narodmon.ru 2 недели обнаружил следующие проблемы, препятствующие коммерческому использованию: https://goo.gl/swiv3K
    Для личного использования профессиональными программерами сервис очень хорош.
     
  14. Dmiyriy

    Dmiyriy Нерд

    Так кто спорит :) Лично мне удобно "заоконную" температуру посмотреть не слезая с кровати в виджете на смартфоне, а не топать к градуснику.
     
  15. az3749

    az3749 Нерд

    Если у вас серый IP может прийти вот такой мейл:

    Доброго времени суток, az1234.

    Необходимо устранить ошибки в протоколе передаче показаний на narodmon.ru от устройства мониторинга "355910040812654".

    Время: 2016-05-08 07:47:38, IP-адрес: 213.87.144.211

    Полученные данные:

    #ЩяЩ–п o{n¬т·Чyk
    #Зo~ыQыэ^#20.0
    #ЬГtнХ Sі#47.3
    #Пц.нэПќф#755.3
    # kbЭџ«Эя#11.8
    # пЇfbJяћ#77.5
    ##Ошибки: Device MAC ??ٖ? O{N????YK is invalid
    //===================================
    Ну и так далее.

    Причина этого чуда состоит в том что сервис абсолютно не учитывает серые (динамические) IP адреса и считает все адреса белыми. В процессе сеансов Ваш ID (MAC) привязывается на какое-то время к IP и в случае невозможности получить MAC во время сеанса сервис посылает ругательное письмо ... правильно тому кому может.
    Кстати и на странице с последними полученными данными Вы можете обнаружить чужие - по той же причине.
     
  16. ИгорьК

    ИгорьК Гуру

    Есть такое. Полагаю, через какое-то время они будут выдавать ключ и проблема решится.
     
  17. az3749

    az3749 Нерд

    Я тоже так думал - и пытался их вдохновить. Получил на голову ушат помоев:

    От: Народный Мониторинг [admin@narodmon.ru]
    Отправлено: Tuesday, May 10, 2016 15:04
    Кому: Алексей Зайцев
    Тема: Re: Device MAC ??ٖ?:не мое-сегодня я вообще все выключил: Этот глюк сильно препятствует коммерциализации

    Это не глюк, а особенность. Зачем - уже объясняли вам ранее.

    Вынуждены напомнить золотое правило большинства проектов как платных как и бесплатных - сервис предоставляется "как есть" (as is).
    Легкий шантаж коммерциализацией на нас более недействует ибо как показала практика, если бы вы хотели нас поддержать - уже давно сделали бы это, а пока лишь злоупотребляете вниманием к себе, хотя пользователей много тысяч и не только у вас есть вопросы.
     
  18. ИгорьК

    ИгорьК Гуру

    Ну... есть какие-то объективные процессы. Пользователи голосуют ногами.
    Когда-то этот сервис был важен для меня. Теперь, это, скорее, рудимент в этом проекте.
    Через OpenHab я принимаю гораздо больше информации:
    emper001.JPG emper002.JPG emper003.JPG
     
  19. az3749

    az3749 Нерд

    Я тоже перешел на MQTT - EasyIot. Использую брокер test.mosquitto.org. Спасибо за информацию - сейчас попробую openhub. EasyIot под виндой за несколько часов теряет соединения.
     
  20. ИгорьК

    ИгорьК Гуру

    Звучало здесь предложение сделать отправку данных от батарейки. Делаем.
    1. Вооружившись паяльником, соединяем пин Reset с пином XPD_DCDC он же GPIO16. Как это делается - зависит от вашей модели ESP - Гугл в помощь.

    Snap2.jpg

    2. Код, который зальем, будет работать только с одним датчиком DS18b20. Он для этого и предназначен.

    До всех манипуляций с заливками, в левом окне, руками, набираем такой код:
    Код (Lua):
    do
    wifi.setmode(wifi.STATION)
    wifi.sta.config("ВашаТочкаДоступа","Ваш_Пароль")
    wifi.sta.autoconnect(1)
    local mytimer = tmr.create()
    mytimer:register(15000, tmr.ALARM_SINGLE, function (t) print(wifi.sta.getip()); t:unregister() end)
    mytimer:start()
    end
    Выделяем его весь и жмем на кнопочку "Block". Модулю передаются данные о вашей сети, в окне терминала (правое окно) через 15 сеекунд увидим информацию об IP вашего модуля.

    3. Код проверяет датчик каждые 10 минут. Если температура изменилась не более чем на 0.5 градусов - данные не передаются. Логика такова, что ошибка по даташиту DS18b20 - как раз эти полградуса. Значит, нет смысла что-то передавать в этих пределах.
    В данном случае, мы работаем, условно, с сырыми данными из датчика. Они запоминаются в ячейку ноль памяти часов модуля. 0.5 градусов, для этого случая, есть число 8. Относительно него и идет проверка изменения температуры.
    Если температура меняется больше чем на полградуса - данные передаются каждый раз.
    4. Производится подсчет количества измерений. Ели их 12, то есть прошло 2 часа, то данные все равно передаются - чтобы было видно что датчик работает. Счетчик измерений пишет значение в ячейку 1 памяти часов модуля.
    5. Вход в Интернет осуществляется только после всех вычислений температуры и только для передачи данных. Это должно еще больше экономить батарейку.
    У меня в настоящий момент, от батарейки (2хАА) в обычном режиме с передачей измерений через 10 минут датчик работает 1 месяц. Надеюсь, в этом режиме срок работы будет еще больше.
    Код для заливки:
    Код (Lua):
    ap = "ВАШ_ТОЧКА_ДОСТУПА"
    appass = "ВАШ_ПАРОЛЬ"
    pin = 4 -- сюда вешаем датчики
    sleepdelay = 600 -- десять минут между проверками = 600 секунд.
    killdelay = 35 -- через 35 секунд после пробуждения - спать принудительно.
    -- killdelay зависит от скорости вашего соединения. Отрегулируйте! Чем меньше - тем лучше,
    -- но если слишком мало - модуль не успеет передать данные и принудительно уйдет в сон.
    countsleep = 12  -- двенадцать циклов проверки до принудительной передачи = 2 часа
    -- устанавливайте  сами сколько считаете правильным. Чем меньше - тем больше расход батареи.

    function sendNarod(temperature)
        wifi.setmode(wifi.STATION)
        wifi.sta.config(ap , appass)
        wifi.sta.autoconnect(0)

        tmr.alarm(0, 1000, 1, function()
            if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then
                print("Got wi-fi!")
                tmr.stop(0)
                local dataN = "#ХХ-ХХ-ХХ-ХХ-ХХ-ХХ\n" -- ваш ключ!!!
                print("T = "..temperature)
                dataN =dataN.."#T01#"..temperature.."\n"
                dataN = dataN.."##\n"
                print(dataN)
                conn=net.createConnection(net.TCP, 0)
                conn:on("connection",function(conn, payload)
                    conn:send(dataN)
                    end)
                 conn:on("receive", function(conn, payload)
                   print('\nRetrieved in '..((tmr.now()-t)/1000)..' milliseconds.')
                   print('Narodmon says '..payload)
                   conn:close()
                   disconnect()
                   end)
                 t = tmr.now()
                 conn:connect(8283,'narodmon.ru')
            end
        end)
    end


    function publish_data()
        print("work now!")
        local t = 85
        t = getTemp()
        print("Got "..t)
        if t ~= 85 then
            local oldt = rtcmem.read32(0)
            local count = rtcmem.read32(1)
            if (count + 1) < 1 then
                rtcmem.write32(1, 0)
            else
                rtcmem.write32(1, (count+1))
            end
            rtcmem.write32(1, (count+1))
            print("oldt "..oldt)
            local delta = t - oldt
            if delta < 0 then
                delta = delta * -1
            end
            print("Delta "..delta)
            print("count = "..count)
            if (delta > 8) or (count > countsleep) then
                rtcmem.write32(0, t)
                print("countsleep = "..count)
                rtcmem.write32(1, 0)
                if bit.isset(t, 15) then t = 1 - bit.bxor(t, 0xffff) end
                t = t * 625 / 10000
                print("t = "..t)
                print("Pubish Data!")
                sendNarod(t)
            else
                print("Not changes. Go...")
                disconnect()
            end
        end
    end

    function getTemp()
        print("get t")
        local t = 85
        local ds18b20 = require('ds18b20')
        ds18b20.setup(pin)
        local addres={}
        addres=ds18b20.addrs()
        if addres[1] ~= nil then
            t = ds18b20.read(addres[1])
        end
        print("Got "..t)
        return t
    end

    function disconnect()
        tmr.alarm(3, 500, 0, function()
            print("Sleep Now!")
            node.dsleep(1000000*sleepdelay, 4)
        end)
    end
    tmr.alarm(5, 1000*killdelay, 0, function()
        print("Get Sleep By Timer")
        disconnect()
    end)

    publish_data()
    Прилагается также файл ds18b20.lua - он специфический для этого проекта.

    Как это сработало. В данном случае установлено срабатывание после трех проверок при неизменной температуре:
    narodmon1.jpg

    Внимание, после проверки работоспособности удалить все строчки с функцией print() для экономии энергии.
    Или я это сделал за вас:
    Код (Lua):
    ap = "ВАША_АР"
    appass = "ПАРОЛЬ"
    pin = 4
    sleepdelay = 600
    killdelay = 35
    countsleep = 12

    function sendNarod(temperature)
        wifi.setmode(wifi.STATION)
        wifi.sta.config(ap , appass)
        wifi.sta.autoconnect(0)
       
        tmr.alarm(0, 1000, 1, function()
            if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then
                tmr.stop(0)
                local dataN = "#ХХ-ХХ-ХХ-ХХ-ХХ-ХХ\n"
                dataN =dataN.."#T01#"..temperature.."\n"
                dataN = dataN.."##\n"
                conn=net.createConnection(net.TCP, 0)
                conn:on("connection",function(conn, payload)
                    conn:send(dataN)
                    end)
                 conn:on("receive", function(conn, payload)
                   conn:close()
                   disconnect()
                   end)
                 conn:connect(8283,'narodmon.ru')
            end
        end)
    end


    function publish_data()
        local t = 85
        t = getTemp()
        if t ~= 85 then
            local oldt = rtcmem.read32(0)
            local count = rtcmem.read32(1)
            if (count + 1) < 1 then
                rtcmem.write32(1, 0)
            else
                rtcmem.write32(1, (count+1))
            end
            rtcmem.write32(1, (count+1))
            local delta = t - oldt
            if delta < 0 then
                delta = delta * -1
            end

            if (delta > 8) or (count > countsleep) then
                rtcmem.write32(0, t)
                rtcmem.write32(1, 0)
                if bit.isset(t, 15) then t = 1 - bit.bxor(t, 0xffff) end
                t = t * 625 / 10000
                sendNarod(t)
            else
                disconnect()
            end
        end
    end

    function getTemp()
        local t = 85
        local ds18b20 = require('ds18b20')
        ds18b20.setup(pin)
        local addres={}
        addres=ds18b20.addrs()
        if addres[1] ~= nil then
            t = ds18b20.read(addres[1])
        end
        return t
    end

    function disconnect()
        tmr.alarm(3, 500, 0, function()
            node.dsleep(1000000*sleepdelay, 4)
        end)
    end
    tmr.alarm(5, 1000*killdelay, 0, function()
        disconnect()
    end)

    publish_data()
    Прошивку NodeMCU берем отсюда.
    Так работает этот модуль:

    esp82661.jpg
     

    Вложения:

    • ds18b20.zip
      Размер файла:
      765 байт
      Просмотров:
      735
    • nodemcu.zip
      Размер файла:
      311 КБ
      Просмотров:
      713
    Последнее редактирование: 3 апр 2017
    Pitruxa, Tomasina, Павел А. и 3 другим нравится это.