Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Lua скрипты и модули

Тема в разделе "NodeMCU", создана пользователем Victor, 9 дек 2014.

  1. skylocker

    skylocker Новичок

    Сообщения:
    49
    Симпатии:
    0
    Чем хвастаться, лучше поделитесь своей виртуозностью со страждущими :)
     
  2. Игорь

    Игорь Новичок

    Сообщения:
    42
    Симпатии:
    3
    boka17,
    Уменьшить размер можно удалив все строки комментарии и убрав куски, связанные с расчетом температуры в фаренгейтах и кельвинах (надеюсь вам не надо). Еще можно убрать пробелы, табуляции и переводы строк. Это никак не повлияет на функциональность.
    nikolz,
    И это при ПОЛНОМ сохранении функционала и ВСЕХ проверок, как в оригинале? Если съежить функционал и убрать все проверки которые есть в оригинале - то оно конечно...
    ВСЕМ, кто может ответить.
    Задавал этот вопрос, но ответа нет. Размер .lc файла может быть больше размера .lua файла. Это как???
     
  3. nikolz

    nikolz Гуру

    Сообщения:
    5.050
    Симпатии:
    462
    вот пример из примеров разработчиков web сервера :
    ----------------------
    collectgarbage()
    srv=net.createServer(net.TCP) srv:listen(80,function(conn)
    conn:eek:n("receive",function(conn,payload)
    --print(payload) -- for debugging only
    --generates HTML web site
    conn:send('HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n\
    <!DOCTYPE HTML>\
    <html><head><meta content="text/html;charset=utf-8"><title>ESP8266</title></head>\
    <body bgcolor="[HASHTAG]#ffe4c4[/HASHTAG]"><h2>Hygrometer with<br>DHT22 sensor</h2>\
    <h3><font color="green">\
    <IMG SRC="http://esp8266.fancon.cz/common/hyg.gif"WIDTH="64"HEIGHT="64"><br>\
    <input style="text-align: center"type="text"size=4 name="j"value="'..TEMP[2]..'"> Temperature grade<br><br>\
    <IMG SRC="http://esp8266.fancon.cz/common/tmp.gif"WIDTH="64"HEIGHT="64"><br>\
    <input style="text-align: center"type="text"size=4 name="p"value="'..TEMP[1]..'"> Temperature grade C<br>\
    <input style="text-align: center"type="text"size=4 name="p"value="'..TT..'"> время</font></h3>\
    <IMG SRC="http://esp8266.fancon.cz/common/dht22.gif"WIDTH="200"HEIGHT="230"BORDER="2"></body></html>')
    conn:eek:n("sent",function(conn) conn:close() end)
    end)
    end)
    ------------------
    я его тестил под именем "srv_1.lua" вот в такой программе:
    ----------------------------
    dofile("nk_start.lc")
    print("1="..collectgarbage("count")..">"..node.heap());
    collectgarbage()
    function cb()
    collectgarbage()
    if ip==nil then dofile("wifi_1.lua") end
    print("2="..collectgarbage("count")..">"..node.heap());
    if ip~=nil and is==nil then
    dofile("srv_1.lua");
    is=1;
    end
    print("3="..collectgarbage("count")..">"..node.heap());
    dofile("cbAM2302.lc");
    print("4="..collectgarbage("count")..">"..node.heap());
    dofile("cb18b20.lua");
    print("5="..collectgarbage("count")..">"..node.heap());
    dofile("get_tp.lc"); dofile("norm.lc");
    print("6="..collectgarbage("count")..">"..node.heap());
    end
    tmr.alarm(3,5000,1,cb)
     
    SergNF нравится это.
  4. CatFromSummer

    CatFromSummer Новичок

    Сообщения:
    1
    Симпатии:
    0
    Доброго времени суток!
    Имеется ESP-01 + AM2302(DHT22) подключенные на мекетной плате с модулем питания YwRobot. С компьютером их связывает USB2TTL CH340G.
    ESP-01 прошито NodeMCU 0.9.6 build 20150704 Lua 5.1.4.
    Для опроса сенсора использую библиотеку из репозитория NodeMCU:
    Код (Lua):
    1. -- ***************************************************************************
    2. -- DHTxx(11,21,22) module for ESP8266 with nodeMCU
    3. --
    4. -- Written by Javier Yanez mod by Martin
    5. -- but based on a script of Pigs Fly from ESP8266.com forum
    6. --
    7. -- MIT license, http://opensource.org/licenses/MIT
    8. -- ***************************************************************************
    9.  
    10. --Support list:
    11.  
    12. --DHT11 Tested
    13. --DHT21 Not Test yet
    14. --DHT22(AM2302) Tested
    15. --AM2320 Not Test yet
    16.  
    17. --Output format-> Real temperature times 10(or DHT22 will miss it float part in Int Version)
    18. --==========================Module Part======================
    19. local moduleName = ...
    20. local M = {}
    21. _G[moduleName] = M
    22. --==========================Local the UMI and TEMP===========
    23. local humidity
    24. local temperature
    25. --==========================Local the bitStream==============
    26. local bitStream = {}
    27.  
    28. ---------------------------Read bitStream from DHTXX--------------------------
    29. local function read(pin)
    30.  
    31.   local bitlength = 0
    32.   humidity = 0
    33.   temperature = 0
    34.  
    35.   -- Use Markus Gritsch trick to speed up read/write on GPIO
    36.   local gpio_read = gpio.read
    37.  
    38.  
    39.   for j = 1, 40, 1 do
    40.     bitStream[j] = 0
    41.   end
    42.  
    43.   -- Step 1:  send out start signal to DHT22
    44.   gpio.mode(pin, gpio.OUTPUT)
    45.   gpio.write(pin, gpio.HIGH)
    46.   tmr.delay(100)
    47.   gpio.write(pin, gpio.LOW)
    48.   tmr.delay(20000)
    49.   gpio.write(pin, gpio.HIGH)
    50.   gpio.mode(pin, gpio.INPUT)
    51.  
    52.   -- Step 2:  Receive bitStream from DHT11/22
    53.   -- bus will always let up eventually, don't bother with timeout
    54.   while (gpio_read(pin) == 0 ) do end
    55.   local c=0
    56.   while (gpio_read(pin) == 1 and c < 500) do c = c + 1 end
    57.   -- bus will always let up eventually, don't bother with timeout
    58.   while (gpio_read(pin) == 0 ) do end
    59.   c=0
    60.   while (gpio_read(pin) == 1 and c < 500) do c = c + 1 end
    61.  
    62.   -- Step 3: DHT22 send data
    63.   for j = 1, 40, 1 do
    64.     while (gpio_read(pin) == 1 and bitlength < 10 ) do
    65.       bitlength = bitlength + 1
    66.     end
    67.     bitStream[j] = bitlength
    68.     bitlength = 0
    69.     -- bus will always let up eventually, don't bother with timeout
    70.     while (gpio_read(pin) == 0) do end
    71.   end
    72. end
    73.  
    74. ---------------------------Check out the data--------------------------
    75. ----Auto Select the DHT11/DHT22 By check the byte[1] && byte[3] -------
    76. ---------------Which is empty when using DHT11-------------------------
    77. function M.read(pin)
    78.   read(pin)
    79.  
    80.   local byte_0 = 0
    81.   local byte_1 = 0
    82.   local byte_2 = 0
    83.   local byte_3 = 0
    84.   local byte_4 = 0
    85.  
    86.   for i = 1, 8, 1 do -- Byte[0]
    87.     if (bitStream[i] > 3) then
    88.       byte_0 = byte_0 + 2 ^ (8 - i)
    89.     end
    90.   end
    91.  
    92.   for i = 1, 8, 1 do -- Byte[1]
    93.     if (bitStream[i+8] > 3) then
    94.       byte_1 = byte_1 + 2 ^ (8 - i)
    95.     end
    96.   end
    97.  
    98.   for i = 1, 8, 1 do -- Byte[2]
    99.     if (bitStream[i+16] > 3) then
    100.       byte_2 = byte_2 + 2 ^ (8 - i)
    101.     end
    102.   end
    103.  
    104.   for i = 1, 8, 1 do -- Byte[3]
    105.     if (bitStream[i+24] > 3) then
    106.       byte_2 = byte_2 + 2 ^ (8 - i)
    107.     end
    108.   end
    109.  
    110.   for i = 1, 8, 1 do -- Byte[4]
    111.     if (bitStream[i+32] > 3) then
    112.       byte_4 = byte_4 + 2 ^ (8 - i)
    113.     end
    114.   end
    115.  
    116.  
    117.   if byte_1==0 and byte_3 == 0 then
    118.   ---------------------------Convert the bitStream into Number through DHT11's Way--------------------------
    119.   --As for DHT11 40Bit is consisit of 5Bytes
    120.   --First byte->Humidity Data's Int part
    121.   --Sencond byte->Humidity Data's Float Part(Which should be empty)
    122.   --Third byte->Temp Data;s Intpart
    123.   --Forth byte->Temp Data's Float Part(Which should be empty)
    124.   --Fifth byte->SUM Byte, Humi+Temp
    125.  
    126.     if(byte_4 ~= byte_0+byte_2) then
    127.      humidity = nil
    128.      temperature = nil
    129.     else
    130.      humidity = byte_0 *10 -- In order to universe with the DHT22
    131.      temperature = byte_2 *10
    132.     end
    133.  
    134.   else ---------------------------Convert the bitStream into Number through DHT22's Way--------------------------
    135.   --As for DHT22 40Bit is consisit of 5Bytes
    136.   --First byte->Humidity Data's High Bit
    137.   --Sencond byte->Humidity Data's Low Bit(And if over 0x8000, use complement)
    138.   --Third byte->Temp Data's High Bit
    139.   --Forth byte->Temp Data's Low Bit
    140.   --Fifth byte->SUM Byte
    141.  
    142.   humidity = byte_0 * 256 + byte_1
    143.   temperature = byte_2 * 256 + byte_3
    144.   checksum = byte_4
    145.  
    146.   checksumTest = (bit.band(humidity, 0xFF) + bit.rshift(humidity, 8) + bit.band(temperature, 0xFF) + bit.rshift(temperature, 8))
    147.   checksumTest = bit.band(checksumTest, 0xFF)
    148.  
    149.   if temperature > 0x8000 then
    150.     -- convert to negative format
    151.     temperature = -(temperature - 0x8000)
    152.   end
    153.  
    154.   -- conditions compatible con float point and integer
    155.   if (checksumTest - checksum >= 1) or (checksum - checksumTest >= 1) then
    156.     humidity = nil
    157.   end
    158.  
    159.   end
    160.  
    161.    byte_0 = nil
    162.    byte_1 = nil
    163.    byte_2 = nil
    164.    byte_3 = nil
    165.    byte_4 = nil
    166.  
    167. end
    168. --------------API for geting the data out------------------
    169.  
    170. function M.getTemperature()
    171.   return temperature
    172. end
    173.  
    174. function M.getHumidity()
    175.   return humidity
    176. end
    177. -------------Return Index------------------------------------
    178. return M
    179.  
    Там же взят и тестовый код:
    Код (Lua):
    1. PIN = 4 --  data pin, GPIO2
    2.  
    3. DHT= require("dht_lib")
    4.  
    5. DHT.read(PIN)
    6.  
    7. t = DHT.getTemperature()
    8. h = DHT.getHumidity()
    9.  
    10. if h == nil then
    11.   print("Error reading from DHT11/22")
    12. else
    13.   -- temperature in degrees Celsius  and Farenheit
    14.   -- floating point and integer version:
    15.  
    16.   print("Temperature: "..(t/10).." deg C")
    17.   print("Temperature: "..(9 * t / 50 + 32).." deg F")
    18.  
    19.   -- humidity
    20.   print("Humidity: "..(h/10).."%")
    21. end
    22.  
    23. -- release module
    24. DHT = nil
    25. package.loaded["dht_lib"]=nil
    Проблема - либо выдается ошибка что неверное чтение с сенсора, либо очень редко нереальные данные. :eek:
    Датчик проверял в том же положении на том же питании с Arduino - ошиок нет и показания вполне в пределах нормы. Порт ESP так же проверял - читает и пишет нормально.
    Где может быть косяк в коде, железе или там и там? Есть у кого 100% рабочий код для AM2302?
     
  5. nikolz

    nikolz Гуру

    Сообщения:
    5.050
    Симпатии:
    462
    Могу предложить один из своих вариантов программы для работы с этим датчиком (байт код)
    помещаете файл на ESP
    -------------------------------------------
    вот так выглядит главная программа main:
    выкидываете то,что вам не надо
    --------------------------
    pds=1;pam=2; scl=4; oss=0;T0=0;TM=0; adT={}
    gpio.mode(pam, gpio_OUTPUT); gpio.write(pam, gpio.HIGH)
    --DS18B20--AM2302--BMP180(SCL,SDA=SCL+1)
    local ae={{96,209,111,6,0,0,149},{199,186,111,6,0,0,45}} -- это таблица адресов DS
    ------1--2--3--4-5--6-7--8-9-10-11-12-13-14-
    TD={3,0,0,0,2,0,0,4,0,0, 0,0,1, 0};
    --------------------
    function cb()
    m=1
    dofile('nkDS.lc');
    m=6 -- номер позиции в таблице TD результатов для данного датчика
    dofile('cb2302.lc'); - в результате TD[7] -t TD[8] -h
    m=9 -- номер позиции в таблице TD результатов для данного датчика
    dofile('get_tp.lc');
    m=14 -- номер позиции в таблице TD результатов для данного датчика
    TD[m]=adc.read(0);
    print(table.concat(TD,";"));
    end
    tmr.alarm(1,2000,1,cb)
    ----------------------------------
    делал давно, как есть.
     

    Вложения:

    • cb2302.7z
      Размер файла:
      716 байт
      Просмотров:
      36
  6. VelAndr

    VelAndr Новичок

    Сообщения:
    25
    Симпатии:
    0
    Здравствуйте!
    А как правильно использовать в nodemcu дату и время?
    В свежей сборке появился модуль sntp.sync(), который возвращает timestamp. А что потом с ним делать? Ведь в njdemcu отсутствуют модули os.date и os.time...
     
  7. nikolz

    nikolz Гуру

    Сообщения:
    5.050
    Симпатии:
    462
    ----------------------
    Посмотрите это :
    http://www.esp8266.com/viewtopic.php?f=19&t=938
    https://github.com/annejan/nodemcu-lua-watch
    http://richard.burtons.org/2015/04/23/real-time-clock-ds1307ds3231-for-the-esp8266/
    http://geektimes.ru/post/267718/
     
    Последнее редактирование: 5 янв 2016
    VelAndr нравится это.
  8. Drakosha_N

    Drakosha_N Новичок

    Сообщения:
    1
    Симпатии:
    0
    Кто может скинуть примеры работы с файлам?
     
  9. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Здравствуйте!
    Собрал термометр на DS18B20+ESP8266. Залитые в ESP8266 скрипты Lua читают и отправляют информацию с термодатчика на удаленный сайт. Хотелось бы исключить из этой цепочки удаленный сервер и выводить температуру на локальный веб сервер.
    Пытаюсь это сделать по такому скрипту:
    Код (Lua):
    1. -- чтение температуры
    2. gpio = 4
    3. require('ds18b20')
    4. ds18b20.setup(gpio)
    5. function sendData()
    6. t=ds18b20.read()
    7. print("Temp:"..t.." C\n")
    8. -- connection to SERVER
    9. wifi.setmode(wifi.STATION)
    10. wifi.sta.config("VB","EG4P5BMHTQ")
    11. print(wifi.sta.getip())
    12. srv=net.createServer(net.TCP)
    13. srv:listen(80,function(conn)
    14.     conn:on("receive",function(conn,payload)
    15.     print(payload)
    16.   --  conn:send("<h1> test_2 </h1>")
    17.    conn:send("<h1> "..t.." </h1>")
    18.     conn:close()
    19.     end)
    20. end)
    21. -- send data every 60000 ms to thing speak
    22. tmr.alarm(0, 6000, 1, function() sendData() end )
    Код сервера сам по себе компилируется, а с добавлением кода чтения температуры ESPlorer выдает ошибку -
    init.lua:24: 'end' expected (to close 'function' at line 5) near '<eof>'

    Помогите найти ошибки в скрипте. Заранее благодарю за помощь.
     
  10. nikolz

    nikolz Гуру

    Сообщения:
    5.050
    Симпатии:
    462
    gpio = 4
    require('ds18b20')
    ds18b20.setup(gpio)
    function sendData()
    t=ds18b20.read()
    print("Temp:"..t.." C\n")
    -- connection to SERVER
    wifi.setmode(wifi.STATION)
    wifi.sta.config("VB","EG4P5BMHTQ")
    print(wifi.sta.getip())
    srv=net.createServer(net.TCP)
    srv:listen(80,function(conn)
    conn:eek:n("receive",function(conn,payload)
    print(payload)
    -- conn:send("<h1> test_2 </h1>")
    conn:send("<h1> "..t.." </h1>")
    conn:close()
    end)
    end)
    end
    -- send data every 60000 ms to thing speak
    tmr.alarm(0, 6000, 1, function() sendData() end )
     
    Cadil нравится это.
  11. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Вы даже не представляете, как я благодарен за оказанную помощь. Не могу подобрать слов. Код успешно компилируется - IP-адрес, температура отображаются в окне ESPlorer'a.
    А вот с веб браузером - проблемы. При подключении к IP-адресу - "Попытка соединения не удалась" или - "Время ожидания истекло". Ели нажимать кнопку браузера ОБНОВИТЬ, то температура иногда выводится.
    Как программно решить эту проблему?
     
  12. nikolz

    nikolz Гуру

    Сообщения:
    5.050
    Симпатии:
    462
    Добрый день,
    я давно делал сбор данных с датчиков на ESP.
    При сборе по TCP возникала утечка памяти.
    Все реализовал на UDP.
    ----------------------
    Могу лишь дать совет посмотреть в сторону UDP.
    Это более простой и более быстрый способ сбора данных при хороших каналах.
     
  13. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Спасибо за совет.
    Но не хочется бросать начатое на полпути. В скрипте, составленном чайником, вы без труда нашли ошибки (я о [HASHTAG]#211[/HASHTAG]). Поэтому, думаю, подправить скрипт, чтобы сервер работал корректно, вам не составит большого труда.
    Подскажите, хотя бы - где копать?
     
  14. nikolz

    nikolz Гуру

    Сообщения:
    5.050
    Симпатии:
    462
  15. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Не могу найти скрипты на LUA для схем с ADC (АЦП). Кому такие встречались - сбросьте линк!
     
    Последнее редактирование: 3 апр 2016
  16. Lioplay

    Lioplay Новичок

    Сообщения:
    1
    Симпатии:
    0
    Добрый день.
    Пытаюсь подключить датчик BH1750 (GY-302) к WeMos D1 R2. Прошит прошивкой nodemcu_integer_0.9.6-dev_20150704.bin
    Для получения данных использую стандартный код с github - nodemcu-firmware/lua_modules/bh1750 at master · nodemcu/nodemcu-firmware · GitHub
    При запуске скрипта выдает "PANIC: unprotected error in call to Lua API (bad argument #2 to 'write' (string expected, got nil))" и перезагружается. При сохранении модуля dh1750 выдает такое сообщение "bh1750.lua:11: table index is nil" (11 строка это _G[moduleName] = M)
    Подскажите что может быть и как это исправить, так как никаких других скриптов для съема показаний с этого датчика так и не нашел.
    P.S. кто нибудь пробовал подключать к esp8266 с прошивкой NodeMCU такой экранчик 2.4 " 240 x 320 SPI TFT LCD серийный порта модуля 3.3 В кпб адаптер SD ILI9341 купить на AliExpress
     
    Последнее редактирование: 3 апр 2016
  17. Vid152

    Vid152 Новичок

    Сообщения:
    3
    Симпатии:
    0
    Добры вечер,
    Прошу прощения, если задам не корректный вопрос. Нужна помощь асов Lua. Бьюсь который день со стандартной библиотекой ds18b20 с примеров. Прочитал форумы и похожие примеры, но ответа не нашел.
    Проблема:
    1. Нужно мерять порядка 5 термометров и по определенной логике переключать gpo.
    2. Паралельно хотел выдавать на thinkspeak данные для мониторинга.
    3. При выводе одгоно значения на сайт проблем нет, как только в программе появляеться несколько измеряемых подряд значений температуры значения не выдаються.
    4. Пробовал советы знатоков с уменьшением программы, обнуление переменных без результатно.
    При этом в сети масса примеров с несколькими значениями Т и вроде работает. TCP сервер работает нормально. Не понимаю в чем дело.
    Поможет кто?
     
  18. nikolz

    nikolz Гуру

    Сообщения:
    5.050
    Симпатии:
    462
    Что конкретно ?
    Если ошибка в проге, то выкладывайте текст, если не знаете, как написать алгоритм, то напишите задачу.
    год назад на LUA подключал 3 датчика температуры и выдавал по UDP на свой серевер.
     
  19. Vid152

    Vid152 Новичок

    Сообщения:
    3
    Симпатии:
    0
    nikolz Спасибо за ответ. Похоже сам разобрался с этим удивительным ресурсом thingspeak! Там особенность в передаче данных, нужна задержка в 20 секунд. Все работает.
     
  20. Vid152

    Vid152 Новичок

    Сообщения:
    3
    Симпатии:
    0
    nikolz
    Нужна помощь.
    Написал простой сервер TCP srv=net.createServer(net.TCP) srv:listen(80, function(conn) и далее как обычно. Сервер должен работать постоянно под tmr.alarm c опросом раз в 5 сек. Но возникла проблема с heap. С каждым обращением к listen память уменьшается на 152 байта, доходит до 6000 и перезагрузка. Что с этим можно сделать? Вроде в постах встречал, что это кривая прошивка, но не ужели никто не сталкивался с этой проблемой и не решал?
     

Поделиться этой страницей