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 байт
      Просмотров:
      530
    • nodemcu.zip
      Размер файла:
      311 КБ
      Просмотров:
      514
    Последнее редактирование: 3 апр 2017
    Pitruxa, Tomasina, Павел А. и 3 другим нравится это.