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

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

  1. Спасибо за отличный труд!
    Но есть вопросы:
    1. Не указан пин подключения термодатчика, из скрипта (насколько я понял) он должен сам определить?
    2. Когда осуществляется первая посылка температуры? Проблема ,в том, что у меня в консоль сыпется только 85 градусов, датчик менял.
    3. У меня ключ от народмона без тире, это критично?
     
  2. alp69

    alp69 Форумчанин

    Добавьте первой строкой
    Код (Javascript):
    pin = X
    Где "X" - номер пина.
    Переменная "pin" вызывается в
    Код (Javascript):
    ds18b20.setup(pin)
     
  3. ИгорьК

    ИгорьК Гуру

    Где-то мои глазки?
    Не добавляйте. Все и так в наличии.
     
  4. ИгорьК

    ИгорьК Гуру

    Значит датчик присоединен не к той ноге.
    Ключ? Если Вы говорите о МАК адресе что нужно писать самостоятельно в этом скрипте, то делать это нужно именно с тире. Если речь об API ключе, что выдаёт народный мониторинг, то он должен быть именно таким каким выдан. Но АРI ключ не для этого скрипта предназначен а для других вещей.
     
  5. alp69

    alp69 Форумчанин

    Здесь нету. Или ..."где-то моИ глазки?" (C) ;)
     
    Павел А. и ИгорьК нравится это.
  6. ИгорьК

    ИгорьК Гуру

    Похоже. Проверю/исправлю.
     
    alp69 нравится это.
  7. ИгорьК

    ИгорьК Гуру

    Еще один вариант от батарейки. Несколько изменен способ наблюдения за соединением с Интернет и назначается постоянный IP. Иногда работает стабильнее в аспекте скорости подключения и экономии энергии.

    Код (Lua):
    pin = 4
    cfg = {
      ip = "192.168.1.12", -- назначаем постоянный ip
      netmask = "255.255.255.0",
      gateway = "192.168.1.1"
    }

    ap = "ВАША_ТОЧКА_ДОСТУПА"
    appass = "ВАШ_ПАРОЛЬ_НА_ТОЧКУ"

    sleepdelay = 600
    killdelay = 25
    countsleep = 12

    function sendNarod(temperature)
        wifi.sta.setip(cfg)
        wifi.setmode(wifi.STATION)
        wifi.sta.config(ap, appass)
        wifi.sta.autoconnect(0)
        wifi.sta.eventMonReg(wifi.STA_GOTIP,
            function()
                print("Got wi-fi!")
                tmr.stop(0)
                local dataN = "#XX-XX-XX-XX-XX-XX\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)
        wifi.sta.eventMonStart()
    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()
     
    Последнее редактирование: 14 июн 2016
  8. MaxVM

    MaxVM Нуб

    Здравствуйте!
    С наступающим!
    Можно короткий вопрос.
    Скачал счетч final.zip все вроде работает, а вроде нет
    Автоматически не стартует раз в 5 минут, хотя вроде как должен
    и выдает
    > dofile('')
    cannot open
    stack traceback:
    [C]: in function 'dofile'
    stdin:1: in main chunk

    Подскажите как быть?
     
  9. alp69

    alp69 Форумчанин

    Покажите свои скрипты с именами файлов.
     
  10. OlegRnD

    OlegRnD Нуб

    Уважаемые, в данной модели можно использовать резистор в 4.3 или 5.1 кОм для подключения датчика?
     
  11. ИгорьК

    ИгорьК Гуру

    Обычно 4.7, но и эти должны работать.
     
  12. clawham

    clawham Нерд

    Здравствуйте! Нужен датчик температуры на народмон но с одной особенностью.
    Температуру надо мерять часто. раз в 5-10 минут. а передавать все скопом раз в час при отсутствии питания и с каждым замером при наличии питания. Понятное дело - есть ацп - меряем через делитель вход стабилизатора, если там 6 вольт(бп нокии) то это сеть, если там 4 вольта - это литиевая резервная банка.
    Собственно вопрос - куда можно складывать данные с термодатчика за то время пока нет света/интернета? Вроде как можно писать в файловую систему но это ж пипец флешке быстро настанет....

    Второй вопрос - часы полноценные дата-время ктото реализовывал для этого чипа?секунды со старта конечно интересно и полезно но полноценный штамп времени намного полезнее. Проверял - на народмон можно кидать данные скопом хоть за весь день - главное чтоб временнЫе метки были. Вот и вопрос - куда можно складывать данные с этого датчика пока нет инета?
     
  13. Tomasina

    Tomasina Сушитель лампочек Модератор

    в память (не флеш).
    Один датчик температуры раз в 5 минут, это 5*12=60 байт в час, если нужна точность без десятых, или 120 байт, если нужна точность до сотых. За сутки это 1440 или 2880 байт.
    Штамп времени "чч:мм" с дискретностью 1 минута - это еще 2880 байт за сутки.
    Т.е. если отправлять раз в сутки, то для накопления данных нужно 6 кб свободной памяти.
    Если отправлять каждые 6 часов, то нужно 1,5 кб свободной памяти. Но если связь не удалась, самые старые данные теряются (заменяются более свежими).

    Думаю, столько свободной памяти найдется в ESP8266.
     
    Последнее редактирование: 14 мар 2017
  14. clawham

    clawham Нерд

    а она после сброса не улетает?
    режим энергосбережения же насколько я понял имеет только вход. выход - это сброс чипа? или я чтото не так понимаю?
     
  15. ИгорьК

    ИгорьК Гуру

    Есть такие места в модуле, которые после сброса не теряют информацию.
     
  16. clawham

    clawham Нерд

    вы о 128-ми ячейках 32-хбитных чисел в области RTC? ну дак это же малавата...

    Где вообще почитать о dsleep? после него проц совсем вешается или просыпаться на померять температуру и занести в оперативку у него силы есть?
     
  17. ИгорьК

    ИгорьК Гуру

    Да, 128 ячеек - Вам нужно сколько? За час даже с пятиминутным интервалом вполне хватит.

    О deepsleep почитать http://nodemcu.readthedocs.io/en/master/en/modules/node/#nodedsleep

    Шутите?

    Происходит полный сброс модуля, но при этом в 128 ячейках сохраняется информация.
     
  18. clawham

    clawham Нерд

    ясно спасибо большое :)
    будем думать как и что дальше делать.
    Проблема же в том что 128 ячеек это не все что доступно.
    как минимум первые 11 прийдётся отдать на rtc чтоб по просыпании понимать сколько сейчас времени и когда были сделаны прошлые замеры. пока вижу все это дело так:
    1) Храним полноценный штамп юниксового времени на момент запуска в ячейке 12 rtc.
    2) в ячейке 13 пишем сколько измерений подряд было без питания от сети(грубо говоря индекс записи).
    3) читаем температуру и напряжение на аналог пине.
    4) если нормальное питание - включаем радио, конектимся к точке, синхронизируем время, передаем данные из rtc и сваливаемся в слип на 5 минут.
    5) если питание батарейное - читаем температуру и ложим его с штампом времени в следующую ячейку ртц.

    Теперо вопросы - режимы спячки - они отвечают за включение радиомодуля по просыпании или во время спячки? если я засну командой node.dsleep(60000000, 4) - по просыпании я получу просто проц с неработающей радиочастью. а как потом включить радио?
     
  19. ИгорьК

    ИгорьК Гуру

    Snap_2017.03.14_13h16m17s_002.jpg

    Snap_2017.03.14_13h20m02s_003.jpg
     
  20. Developer-RU

    Developer-RU Гик

    Вопрос - а зачем 3 датчика, тем более одинаковых?
    Может лучше подвесить даллас, dht, ну и до кучи атмосферное давление. (а если совсем скучно можно и маленький вентилятор компьютерный для измерения скорости ветра + всё это на поворотный механизм).

    В поселке где живу смотрю ни одного кто шлет данные на нармониторинг - времени не хватает, хотя железки уже есть, буду первым.