ESP-8266/ESP32 NodeMCU Lua: азы программирования.

Тема в разделе "ESP8266, ESP32", создана пользователем ИгорьК, 25 июл 2017.

  1. ИгорьК

    ИгорьК Гуру

    Если необходимо подключаться к нескольким разным точкам доступа в разных местах, то:
    Код (Lua):
    do
        local aptb = {
            { 'AP_01', 'passwd_01' },
            { 'AP_02', 'passwd_02' },
            { 'AP_03', 'passwd_03' }
        }

        local cfg = {}
        cfg.ssid = ""
        cfg.pwd = ""
        cfg.save = true
        cfg.auto = true

        local function listap(t)
            wifi.setmode(wifi.STATION)
            for bssid, v in pairs(t) do
                local ssid = string.match(v, "([^,]+)")
                print(ssid)
                for k, v in pairs(aptb) do
                    if v[1] == ssid then
                        cfg.ssid = ssid
                        cfg.pwd = v[2]
                    end
                end
            end
            print('\n\nSet SSID as ' .. cfg.ssid)
            wifi.sta.config(cfg)
            wifi.sta.connect()
        end
        wifi.sta.getap({}, 1, listap)
    end
    -- Ответ на вопрос в личку.
     
    Последнее редактирование: 19 мар 2024
    obuhanoe нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Если необходимо подключаться к нескольким разным точкам доступа в разных местах, и к тому же там есть одинаковые SSID с разным с разным уровнем сигнала, то:
    Код (Lua):
    do
        print ('Clear config is', wifi.sta.clearconfig())
        local aptb = {
            { 'AP_01', 'passwd_01' },
            { 'AP_02', 'passwd_02' },
            { 'AP_03', 'passwd_03' }
        }

        wifi.setmode(wifi.STATION)
        local cfg = {}
        cfg.ssid = ""
        cfg.pwd = ""
        cfg.save = true
        cfg.auto = true

        local myssidtb = {}
        local power = -100

        local function listap(t)
            for bssid, v in pairs(t) do
                local ssid, rssi = string.match(v, "([^,]+),([^,]+)")
                rssi = tonumber(rssi)
                print(ssid, bssid, rssi)
           
                for k, v in pairs(aptb) do
                    if v[1] == ssid then
                        if rssi > power then
                            myssidtb = {v[1], bssid, k}
                            power = rssi
                        end
                    end
                end
            end
            cfg.ssid = myssidtb[1]
            local nbssid = ""
            for k = 1, #myssidtb[2] do
                nbssid = nbssid .. string.upper(string.sub(myssidtb[2], k, k) )
            end
            cfg.bssid = nbssid
            cfg.pwd = aptb[myssidtb[3]][2]
            print('\n\nSet SSID as ' .. cfg.ssid.. ' and BSSID is '.. cfg.bssid.. 'and passwd is '..cfg.pwd )
            wifi.sta.config(cfg)
            wifi.sta.connect()
        end
        wifi.sta.getap({}, 1, listap)
    end
     
    Последнее редактирование: 19 мар 2024
  3. ИгорьК

    ИгорьК Гуру

    56. ESP32. Читаем SDS011 PM2.5:

    Код (Lua):

    uart.setup(2, 9600, 8, uart.PARITY_NONE, uart.STOPBITS_1, {tx = 17, rx = 16})
    uart.start(2)
    local d25 = 0
    local d10 = 0

    local gotRAW = {}
    local startUART = false

    local function ptrANSW()
        local crc = 0
        for i = 3, 8 do crc = crc  + gotRAW[i] end
        crc = bit.band(crc, 0xFF)
        -- print(string.format('\t\tcrc = %02X',crc))
        if crc ~= gotRAW[9] then print('Bad CRC'); gotRAW = {}; startUART = false return end

        d25 = ((gotRAW[4]*256 ) + gotRAW[3])/10
        d10 = ((gotRAW[6]*256 ) + gotRAW[5])/10
        print('\n\t\t\tPM2.5 = '..d25..' μg/m3,  PM10 = '.. d10..' μg/m3')

        gotRAW = {}
        startUART = false
        -- dofile('analizeMTRF.lua')
    end

    uart.on(2,"data",1,
        function(data)
            local bt = string.byte(data, 1)
            -- print(string.format("bt = %02X", bt))
            if startUART == false and bt ~= 0xAA then return
            elseif startUART == false then startUART = true end
            gotRAW[#gotRAW+1] = bt
            if gotRAW[2] and gotRAW[2] ~= 0xC0 then gotRAW = {}; startUART = false end
            if #gotRAW == 10 then ptrANSW() end
    end, 0)
     
     
    Последнее редактирование: 21 апр 2024
    serg3295 нравится это.
  4. obuhanoe

    obuhanoe Гик

    У Вас реализация для ESP8266, ниже для ESP32
    Код (Lua):
    do
        local l_wifi = {
             { 'AP_01', 'passwd_01' },
             { 'AP_02', 'passwd_02' }
        }
         -- стартуем Wifi: при дисконекте (callback произойдет)
        wifi.start()

         local scfg = {}  
         scfg.auto = true
         scfg.save = true
         scfg.ssid = ""
         scfg.pwd = ""

         local function connect_wifi(err, arr)
            if err then
              print(err)
            else
              wifi.mode(wifi.STATION, true)
              for i, ap in ipairs(arr) do
                print(i, ap.ssid, ap.channel,ap.bssid,ap.rssi,ap.auth,ap.bandwidth)
                for k, v in pairs(l_wifi) do
                    if v[1] == ap.ssid then
                        scfg.ssid = ap.ssid
                        scfg.pwd = v[2]
                    end
                end
              end
              print('\n\nSet SSID as ' .. scfg.ssid)
              wifi.sta.config(scfg, true)
              wifi.sta.connect()
            end
        end
       
         wifi.sta.scan({}, connect_wifi)

        wifi.sta.on("got_ip", function(ev, info)
            print("IP now:", info.ip)
        end)
     
        wifi.sta.on("disconnected", function(ev, info)    
               print("WIFI DISCONNECTED!!!")
        end)

        wifi.sta.on("connected", function(ev, info)
               print("WIFI "..info.ssid)
        end)
    end
     
    ИгорьК нравится это.
  5. ИгорьК

    ИгорьК Гуру

    57. ESP32. Читаем SPS30 PM2.5, PM10, etc.

    ... и здесь помог AI, ибо о применении функции string.unpack(...) для преобразования четырех байт во float никогда не слышал . Гуглопоиски ничего не давали, а вот Aria от Оперы помогла.

    Работаем через UART.

    Код (Lua):
    TX = 17
    RX = 16

    uart.setup(2, 115200, 8, uart.PARITY_NONE, uart.STOPBITS_1, {tx = TX, rx = RX})
    uart.start(2)

    TX, RX = nil, nil

    if not wth then wth = {} end

    local gotRAW = {}
    local startUART = false
    local uartdata = {}
    local btf, makedata, checksum, byte_stuffing
    btf = function(e)
        if type(e) ~= "table" or #e ~= 4 then return end
        local dtu = (string.unpack("f", string.char(e[4], e[3], e[2], e[1])))
        print( 'Bytes To Float:', string.format("%0.1f", dtu))
        return string.format("%0.1f", dtu)
    end

    checksum = function(tb)
        --[[
            The checksum is built before byte-stuffing
            and checked after removing stuffed bytes from
            the frame.
        --]]

        -- for k,v in pairs(tb) do print(k, string.format("0x%02X", string.byte(v))) end
        local sum = 0
        for k = 1, #tb - 1 do
            sum = sum + tb[k]
        end

        print('Sum = '.. string.format("bt = 0x%02X", sum))
        print('Comtrol byte = ', string.format("0x%02X", tb[#tb]))
        sum = bit.bxor(0xFF, bit.band(0xFF, sum))

        print('Sum bxor(0xFF, LSB sum) = '..string.format("0x%02X",sum))
        if sum == tb[#tb] then
            print('Sum is OK!' )
            return true
        else
            print('Wrong Sum!')
            return false
        end
    end

    byte_stuffing = function (tb)
        local ntb = {}
        local insert = 0
        local patt = {}
        patt[0x5E] = 0x7E
        patt[0x5D] = 0x7D
        patt[0x31] = 0x11
        patt[0x33] = 0x13

        for k = 1, #tb do
            if tb[k] == 0x7D then
                insert = patt[tb[k+1]]
            end
            if tb[k] ~= 0x7D then
                if insert ~= 0 then
                    ntb[#ntb+1] = insert
                    insert = 0
                else
                    ntb[#ntb+1] = tb[k]
                end
            end
        end
        return ntb
    end

    makedata = function (tb)
        local dtb = {}
        local pointer = 1
        local pat = {}
        pat[1] = 'pm1';    pat[2] = 'pm2_5';  pat[3] = 'pm4'
        pat[4] = 'pm10';   pat[5] = 'npm0_5'; pat[6] = 'npm1'
        pat[7] = 'npm2_5'; pat[8] = 'npm4';   pat[9] = 'npm10'
        pat[10] = 'tpz'

        for k = 5, 44 do
            dtb[#dtb+1] = tb[k]
            if #dtb == 4 then
                local ddig = btf(dtb)
                wth[pat[pointer]] = ddig
                dtb = {}
                pointer = pointer + 1
            end
        end
        uartdata = {}
        print('Now Got PM Data From SPS30')
    end

    uart.on(2,"data",1,
        function(data)
            local ok = false
            local bt = string.byte(data, 1)
            -- print(string.format("bt = 0x%02X", bt))
            if startUART == false and bt ~= 0x7E then
                return
            elseif startUART == false then
                startUART = true
                gotRAW = {}
                return
            end
            if bt == 0x7E then
                uartdata = byte_stuffing(gotRAW)
                ok = checksum(uartdata)
                print("Got ", ok , " Data from SPS30" )
                startUART = false
                if #uartdata > 40 then
                    makedata(uartdata)
                else
                    ok = uartdata[3]
                    if ok == 0 then
                        print('Command is Ok! No error.')
                    else
                        local errr = string.format("bt = 0x%02X", ok)
                        print('Command Error:', string.format("0x%02X", ok))
                        if ok == 0x43 then print('Command not allowed in current state') end
                        if ok == 0x03 then print('No access right for command') end
                    end
                end
                return
            end
            gotRAW[#gotRAW+1] = bt
            print(string.format("0x%02X,", bt))
        end, 0)

    function sstart() -- Начало Измерерия
        uart.write(2, table.unpack({0x7E, 0x00, 0x00, 0x02, 0x01, 0x03, 0xF9, 0x7E})) -- start
    end
    function sstop() -- Остановка SPS30
        uart.write(2, table.unpack({0x7E, 0x00, 0x01, 0x00, 0xFE, 0x7E})) -- stop
    end
    function sread() -- Чтение Данных
        uart.write(2, table.unpack({0x7E, 0x00, 0x03, 0x00, 0xFC, 0x7E})) -- read
    end
    function sclean() -- Немедленная Очистка Датчика
        uart.write(2, table.unpack({0x7E, 0x00, 0x56, 0x00, 0xA9, 0x7E})) -- clean fan
    end
    function sraci() -- Чтение данных об интервале очистки
        uart.write(2, table.unpack({0x7E, 0x00, 0x80, 0x01, 0x00, 0x7D, 0x5E, 0x7E}))  -- RACI
    end

    Отличный датчик загрязненности воздуха. Правда есть там небольшой косячок. Маленький, но очень опасный! Цвет проводов не соответствует действительному положению дел! Можно пожечь датчик, если довериться красному и черному проводу: держите в уме документацию.
    upload_2024-5-15_12-8-11.png

    В работе:

    upload_2024-5-15_12-2-28.png
     
    Последнее редактирование: 15 май 2024 в 13:09
    parovoZZ нравится это.