ESP8266: графический термометр и графики данных для странички.

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

Метки:
  1. ИгорьК

    ИгорьК Гуру

    Прошу прощения, но я обучением работе с модулем не занимаюсь. Проект сейчас проверил - все рабочее.
    Модуль ds18b20.lua - в первом посте приложен. Что творится на Гите - мне не ведомо и, к сожалению, нет времени разбираться.
     
  2. ИгорьК

    ИгорьК Гуру

    А где у Вас тело функции sendData() - она в моем коде есть.
     
  3. Ser8191

    Ser8191 Нерд


    Посмотрите пожалуйста, видео с экрана ESPlorer
     
  4. Ser8191

    Ser8191 Нерд

    А вот всё полностью как у Вас:

     
  5. ИгорьК

    ИгорьК Гуру

    Я выше Вам скриншот привел. Там на левом поле отлично видно что загружено а на правом - результат.
    Модуль датчика - из этой темы. Все рабочее.
    В чем Ваши проблемы разобраться не могу - со смартфона не разглядеть.
    Замечу, что приведенное здесь не есть законченный проект, а лишь шаблон. Вижу, что Вы загружает даже init.lua, его содержание а также что там в целом происходит мне не видно.
    Повторюсь, код у меня здесь чрезвычайно бестолковый но железно рабочий.
     
  6. Ser8191

    Ser8191 Нерд

    Код (C++):
    Warning, deprecated API! Argument style station configuration is replaced by table style station configuration. It will be removed in the next version. See documentation for details.
    lua: ds18b20.lua:97: attempt to index upvalue '?' (a nil value)
    stack traceback:
        ds18b20.lua:97: in function 'readNumber'
        ds18b20.lua:119: in function 'read'
        mythermo.lua:7: in function 'sendData'
        mythermo.lua:29: in main chunk
        [C]: in function 'dofile'
        init.lua:13: in main chunk
        [C]: ?
     
     
  7. Ser8191

    Ser8191 Нерд

    Датчик проверил на ардуино, рабочий.
     
  8. ИгорьК

    ИгорьК Гуру

    Проверил все на своем компе - работает...
    Давайте не будем перекидываться скриншотами. Пока у меня нет компьютера я ничем не помогу.
    Что касается вашего отчета из предыдущего поста то первая строка говорит о том что изменился порядок вызова модуля подключения Wi-Fi.
    Остальное говорит что отсутствует некоторая переменная.
    Отсоедините свои датчики и выполните код - будет то же самое?
     
  9. Ser8191

    Ser8191 Нерд

    Спасибо Вам что не отказываете в помощи.
    Отключил датчик, отформатировал память.
    Открыл порт на скорости 115200
    Open ds18b20.lua → Save to ESP
    Получаю в правом окне:
    Код (C++):
    > file.close();
    > dofile("ds18b20.lua");
    ds18b20.lua:11: table index is nil
    stack traceback:
        ds18b20.lua:11: in main chunk
        [C]: in function 'dofile'
        stdin:1: in main chunk
    >
    →Send to ESP
    В правом окне получаю:
    Код (C++):
    > -- Return module table
    > return M
    nil
    >
    Open mythermo.lua → Save to ESP
    В правом окне получаю:
    Код (C++):
    > dofile("mythermo.lua");
    mythermo.lua:8: attempt to concatenate global 't' (a nil value)
    stack traceback:
        mythermo.lua:8: in function 'sendData'
        mythermo.lua:28: in main chunk
        [C]: in function 'dofile'
        stdin:1: in main chunk
    >
    →Send to ESP
    В правом окне получаю:
    Код (C++):
    > sendData()
    stdin:5: attempt to concatenate global 't' (a nil value)
    stack traceback:
        stdin:5: in function 'sendData'
        stdin:1: in main chunk
    > tmr.alarm(0, 600000, 1, function() sendData() end )
    >
    require('ds18b20')
    ds18b20.setup(4)
    addres=ds18b20.addrs()
    function sendData()
    local addres = addres
    t=ds18b20.read(addres[1])
    --t1=ds18b20.read(addres[2])
    print("Temp0:"..t.." C\n")
    --print("Temp1:"..t1.." C\n")

    conn=net.createConnection(net.TCP, 0)
    conn:eek:n("receive", function(conn, payload) print(payload) end)
    conn:connect(80,'your.domane.ru')
    conn:eek:n("connection", function(sck) sck:send("GET /termometer.php?t="..t.."&t1="..t1.." HTTP/1.1\r\nHost: www.nodemcu.com\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n") end )
    conn:eek:n("sent",function(conn)
    print("Closing connection")
    conn:close()
    end)
    conn:eek:n("disconnection", function(conn)
    print("Got disconnection...")
    end)
    end
    sendData()
    tmr.alarm(0, 600000, 1, function() sendData() end )
    Open init.lua → Save to ESP→Send to ESP
    -- init.lua --
    ssid = "Halava"
    pass = "99998888"
    wifi.setmode(wifi.STATION)
    print('set mode=STATION (mode='..wifi.getmode()..')\n')
    print('MAC Address: ',wifi.sta.getmac())
    print('Chip ID: ',node.chipid())
    print('Heap Size: ',node.heap(),'\n')
    cfg={ip = "192.168.0.33",netmask = "255.255.255.0",gateway = "192.168.0.1"}
    wifi.sta.setip(cfg)
    wifi.sta.config(ssid,pass)
    dofile('mythermo.lua')
     
  10. Ser8191

    Ser8191 Нерд

    Перезагружаю модуль:
    Код (C++):
    NodeMCU custom build by frightanic.com
        branch: master
        commit: c8ac5cfb912ff206b03dd7c60ffbb2dafb83fe5e
        SSL: false
        modules: adc,dht,file,gpio,http,net,node,ow,tmr,uart,wifi
    build     built on: 2017-06-27 20:09
    powered by Lua 5.1.4 on SDK 2.1.0(116b762)
    set mode=STATION (mode=1)

    MAC Address:     a0:20:a6:21:9b:7a
    Chip ID:     2202490
    Heap Size:     40128  

    Warning, deprecated API! Argument style station configuration is replaced by table style station configuration. It will be removed in the next version. See documentation for details.
    lua: mythermo.lua:8: attempt to concatenate global 't' (a nil value)
    stack traceback:
        mythermo.lua:8: in function 'sendData'
        mythermo.lua:28: in main chunk
        [C]: in function 'dofile'
        init.lua:13: in main chunk
        [C]: ?
    >
     
  11. ИгорьК

    ИгорьК Гуру

    До компьютера доберусь только завтра вечером.
     
    Ser8191 нравится это.
  12. Ser8191

    Ser8191 Нерд

    Добавил в прошивку библиотеку encoder
    https://github.com/nodemcu/nodemcu-firmware/blob/master/lua_modules/ds18b20/ds18b20.lua

    Проверил этот код, заработало.

    Код (C++):
    t = require("ds18b20")
    pin = 3 -- gpio0 = 3, gpio2 = 4
    function readout(temp)
      for addr, temp in pairs(temp) do
        -- print(string.format("Sensor %s: %s 'C", addr, temp))
        print(string.format("Sensor %s: %s В°C", encoder.toHex(addr), temp)) -- readable address with base64 encoding is preferred when encoder module is available
      end
      -- Module can be released when it is no longer needed
      t = nil
      package.loaded["ds18b20"]=nil
    end
    -- t:readTemp(readout) -- default pin value is 3
    t:readTemp(readout, pin)
    if t.sens then
      print("Total number of DS18B20 sensors: "..table.getn(t.sens))
      for i, s in ipairs(t.sens) do
        -- print(string.format("  sensor #%d address: %s%s", i, s.addr, s.parasite == 1 and " (parasite)" or ""))
        print(string.format("  sensor #%d address: %s%s",  i, encoder.toHex(s.addr), s.parasite == 1 and " (parasite)" or "")) -- readable address with base64 encoding is preferred when encoder module is available
      end
    end
    Получаю:
    Код (C++):
    Total number of DS18B20 sensors: 2
      sensor #1 address: 281398d70200005d
      sensor #2 address: 28ff57a3811603c0
    > Sensor 281398d70200005d: 26 В°C
    Sensor 28ff57a3811603c0: 26 В°C

    Или три датчика

    Total number of DS18B20 sensors: 3
      sensor #1 address: 281398d70200005d
      sensor #2 address: 28ff59a38416058a
      sensor #3 address: 28ff57a3811603c0
    > Sensor 281398d70200005d: 26 В°C
    Sensor 28ff59a38416058a: 27 В°C
    Sensor 28ff57a3811603c0: 26 В°C

     
    Почему не работает Ваш код, у Вас удобно, можно считывать каждый датчик по отдельности.
     
  13. ИгорьК

    ИгорьК Гуру

    Мой код не работает потому что Вы что-то не так делаете.
    Он гораздо старше чем этот, что Вы привели сейчас с гита.
    За это время и авторы и я научились писать код гораздо качественнее.
    Тот что у вас сейчас приведен точно также позволяет считывать каждый датчик.
     
  14. Ser8191

    Ser8191 Нерд

    Знать бы что не так делаю, всё же элементарно, скачал-залил
     
  15. ИгорьК

    ИгорьК Гуру

    Вот Вам кино - проверяйте, те ли файлы (специально показал что загружается, сверяйте), повторяйте. Все взято из этой темы. Больше мне добавить не чего.
    Ваши скриншоты и фильмы больше к просмотру не принимаются.



    Модули в прошивке у меня такие:
    Код (C++):
    modules: adc,bit,bme280,bmp085,cjson,file,gpio,http,mqtt,net,node,ow,rtcfifo,rtcmem,rtctime,sntp,tmr,uart,websocket,wifi,tls
     
     
    Последнее редактирование: 29 июн 2017
  16. Securbond

    Securbond Гуру

    Подарок от военных. Механический барометр с логированием на бумажный носитель. Часы тикают, барабан крутится, игла наносит краску на шкалу.
    IMG_2077.JPG
     
    Ser8191 и ИгорьК нравится это.
  17. sirota

    sirota Нерд

    Добрый день. Спасибо, Игорь. очень помогли Ваши начинания. Но именно как начинания. Вы не упминаете ни где как одновременно слать и в график и в термомтр. Провозился часа 2 пока понял суть. Сделал так что отправляет и в график и в термометр данные. Плюс нет первичной инициализации датчиков. Первый раз всегда прилетае 85 градусов. У меня пока отладочно подключен только один, по этому у второго нет ни инициализации, ни задержки. Вообще библиотека кривовата... Ну да не суть. Что-то было еще по отображению... а нет по получению данных в график, дописал под второй датчик. Ну вроде бы и все. Если у кого вопросы, спрашивайте. В аттаче мой вариант. Кста время везде я докидываю 3 часа, ибо не пойму в чем фишка, но мой сервер прекрасно показывает везде вермя текущее, а тут с температурами UTC+0 хоть ты тресни...
    И только заметил... я внутри функции 2 раза вызываю запрос температуры... по идее надо вынести вне функции цикла, а перед ней и там же посавить одну секундную задержку. Исправлено
     

    Вложения:

    • thermometer.zip
      Размер файла:
      414,5 КБ
      Просмотров:
      415
    Последнее редактирование: 3 окт 2017
  18. ИгорьК

    ИгорьК Гуру

    Дык... if t ~= 85 then...
    Это же все тренировка была :)
     
  19. sirota

    sirota Нерд

    А если будет 85 градусов? А у меня столько и будет.
     
  20. ИгорьК

    ИгорьК Гуру

    Ну если точно-точно столько будет - то не отправит температуру. А если 85.1 - отправит.

    85 градусов - столько записано в ячейку температуры датчика при старте.
    В определенных случаях ответ надо ждать до 750 мс.

    Старая библиотека от Nodemcu не делала паузу между опросом датчика и получением ответа.
    По факту, мы здесь каждый раз принимаем температуру прошлого запроса.
    Кстати, это надо учитывать, если там что-то критическое, а не температура на улице.

    Сейчас я пользуюсь собственной библиотекой и еще одной и еще, которая(которые) лишена этого недостатка, но в этом проекте она не годится.