2017-09-18 5 views
-3

J'ai un projet de volets roulants motorisés. Je suis cet instructable: https://www.instructables.com/id/Motorized-WiFi-IKEA-Roller-Blind/.Erreur dans le code. Lua on NodeMCU

J'utilise le code dans le instructable, mais je soupçonne que tha faute est dans l'un de ces codes:

config.lua

-- file : config.lua 
local module = {} 
module.SSID = {} 
module.SSID["ssid"] = "password" 

-- example for local MQTT 
--module.MQHOST = "ohab.local" 
--module.MQPORT = 1883 
--module.MQID = node.chipid() 
--module.MQUSR = "" 
--module.MQPW = "" 

-- example for cloud MQTT 
module.MQHOST = "192.***.*.*" 
module.MQPORT = 1883 
module.MQID = node.chipid() 
module.MQUSR = "username" 
module.MQPW = "password" 
module.MQTLS = 1 -- 0 = unsecured, 1 = TLS/SSL 
module.ENDPOINT = "/house/masterbedroom/rollerblind/" 
module.ID = "0" 

--module.SUB = "set" 
module.SUB = {[module.ENDPOINT .. module.ID .. "/set"]=0,[module.ENDPOINT .. "all"]=0} 
module.POST = module.ENDPOINT .. module.ID .. "/status" 
return module 

wifi_setup

-- file: setup.lua 
local module = {} 
local function wifi_wait_ip() 
    if wifi.sta.getip()== nil then 
     print("IP unavailable, Waiting...") 
    else 
     tmr.stop(1) 
     gpio.write(pin_led,1) --off 
     print("\n================== ==================") 
     print("ESP8266 mode is: " .. wifi.getmode()) 
     print("MAC address is: " .. wifi.ap.getmac()) 
     print("IP is "..wifi.sta.getip()) 
     print("====================================") 
     mq.start() 
    end 
end 

local function wifi_start(list_aps) 
    if list_aps then 
     gpio.write(pin_led,0) --on 
     for key,value in pairs(list_aps) do 
      if config.SSID and config.SSID[key] then 
       wifi.setmode(wifi.STATION); 
       wifi.sta.config(key,config.SSID[key]) 
       wifi.sta.connect() 
       print("Connecting to " .. key .. " ...") 
       --config.SSID = nil -- can save memory 
       tmr.alarm(1, 2500, 1, wifi_wait_ip) 
      end 
     end 
    else 
     print("Error getting AP list") 
    end 
end 

function module.start() 
    print("Configuring Wifi ...") 
    wifi.setmode(wifi.STATION); 
    wifi.sta.getap(wifi_start) 
end 
return module 

Malheureusement je n'arrive pas à aller au-delà de l'étape 4. Après avoir essayé de télécharger le code sur l'ESP8266 je sur ly obtenir cette erreur:

PANIC: unprotected error in call to Lua API (wifi_setup.lua:25: bad argument #1 to 'config' (config table not found!))

screenshot of error from the ESPlorer program

Je n'ai changé les choses du instructable m'a dit de changer, et je l'ai essayé de chercher des fautes moi-même mais je ne peux pas trouver tout ... Il est le premier Quand j'utilise Lua, c'est totalement nouveau pour moi.

J'espère que quelqu'un ici pourra vous aider. Été bloqué sur cela pendant des jours ...

CETTE PARTIE DU PROBLÈME EST RÉSOLU. VÉRIFIER COMMENTAIRES DE SOLUTION


Malheureusement quand on problème est résolu, un nouveau monte ...

La puce est maintenant appareil connecté à un service wifi et mqtt, mais lorsque je tente de faire sécher exécuté en mettant dans la commande 'step_move (1000, FWD, 2) rien ne se passe. Le moteur doit tourner ...

Aussi, quand j'appuie sur le bouton-je obtenir une nouvelle erreur de panique comme suit:

PANIC: unprotected error in call to Lua API (button.lua:23: attempt to perform arithmetic on upvalue '?' (a nil value))

button.lua

--file button4.lua 

do 
    -- use pin 1 as the input pulse width counter 
    local pin=5 
    local debounce = 150 --ms 
    local longpress = 2000 --ms 
    local pulse1, pulse2, du, now, trig = 1, 0, 0, tmr.now, gpio.trig 
    local prev_int_time, int_time, up_time = 0 
    local cal_steps = 100000 
    local cal_steps_dn = 0 
    local cal_steps_up = 0 
    local cal_state = 0 -- 0 = not calibration, 1 = calibrating down, 2 = calibrating up 
    state = 0 -- state: 0 = up, 1 = transition, 2 = down 
    gpio.mode(pin,gpio.INT) 

    local function pin4cb(level) 
    int_time = now()/1000 
    if ((int_time - prev_int_time) > debounce) then 
     if (level == 0) then 
     up_time = int_time 
     else 
     if((int_time - up_time) > longpress) then 
      print("calibrating") 
      cal_state = 1 
      --cur_step = 100000 
      step_move(cal_steps,FWD,2) 
     else -- short press 
      print("short", cal_state) 
      if (cal_state == 2) then -- calibrated up (done) 
      print("calibration done") 
      state = 0 -- up 
      cur_step = 0 
      tot_steps = cal_steps - step_stepsleft 
      print("cal_steps: " .. cal_steps) 
      print("step_stepsleft: " .. step_stepsleft) 
      print("tot_steps: " .. tot_steps) 
      step_stop() 
      pins_disable() 
      cal_state = 0 
      if file.open("cfg_tot_steps.lua", "w+") then 
       file.write("tot_steps=" .. tot_steps .. '\n') 
       file.close() 
      end 
      elseif (cal_state == 1) then -- calibrated dn (switch direction) 
      print("calibration low point") 
      print(cal_steps - step_stepsleft) 
      step_stop() 
      step_move(cal_steps,REV,2) 
      cal_state = 2 
      elseif (cal_state == 0) then 
      if (state == 0 and step_stepsleft == 0) then -- i am up, go dowm 
       rollerblind.down() 
--    state = 2 
      elseif (state == 1) then -- i am moving, do nothing 
       -- do nothing 
      elseif (state == 2 and step_stepsleft == 0) then -- i am down, go up 
       rollerblind.up() 
--    state = 0 
      end 
     end 
     end 
     end 
     --print (level) 
     prev_int_time = int_time 
    end 
    end 
     gpio.trig(pin, "both", pin4cb) 
end 

Voici le code le stepper.lua:

-- stepper.lua 
-- code from: http://www.esp8266.com/viewtopic.php?f=19&t=2326 
-- simple stepper driver for controlling a stepper motor with a 
-- l293d driver 
-- nodemcu pins: 0 5 6 7 
stepper_pins = {1,3,2,4} -- (A-)blue, (A+)pink, (B-)yellow, (B+)orange 
--stepper_pins = {1,2,3,4} 
-- half or full stepping 
step_states4 = { 
{1,0,0,1}, 
{1,1,0,0}, 
{0,1,1,0}, 
{0,0,1,1} 
} 
step_states8 = { 
{1,0,0,0}, 
{1,1,0,0}, 
{0,1,0,0}, 
{0,1,1,0}, 
{0,0,1,0}, 
{0,0,1,1}, 
{0,0,0,1}, 
{1,0,0,1}, 
} 
step_states = step_states4 -- choose stepping mode 
step_numstates = 4 -- change to match number of rows in step_states 
step_delay = 10 -- choose speed 
step_state = 0 -- updated by step_take-function 
step_direction = 1 -- choose step direction -1, 1 
step_stepsleft = 0 -- number of steps to move, will de decremented 
step_timerid = 4 -- which timer to use for the steps 
status_timerid = 2 -- timer id for posing of status messages 
-- setup pins 
function pins_enable() 
    for i = 1, 4, 1 do 
    gpio.mode(stepper_pins[i],gpio.OUTPUT) 
    end 
end 

function pins_disable() 
-- for i = 1, 4, 1 do -- no power, all pins 
    for i = 2, 4, 1 do -- no power, all pins except one (to keep it in place) 
    gpio.mode(stepper_pins[i],gpio.INPUT) 
    end 
end 
-- turn off all pins to let motor rest 
function step_stopstate() 
    for i = 1, 4, 1 do 
    gpio.write(stepper_pins[i], 0) 
    end 
end 

-- make stepper take one step 
function step_take() 
    -- jump to the next state in the direction, wrap 
    step_state = step_state + step_direction 
    cur_step = cur_step + step_direction * FWD 
     if step_state > step_numstates then 
    step_state = 1; 
    elseif step_state < 1 then 
    step_state = step_numstates 
    end 
    -- write the current state to the pins 
    pins_enable() 
    for i = 1, 4, 1 do 
    gpio.write(stepper_pins[i], step_states[step_state][i]) 
    end 
    -- might take another step after step_delay 
    step_stepsleft = step_stepsleft-1 
    if step_stepsleft > 0 then 
-- if cur_step > 0 and cur_step < tot_steps and step_stepsleft > 0 then 
    tmr.alarm(step_timerid, 10, 0, step_take) 
    --tmr.alarm(step_timerid, 10, 0, step_take) 
    else 
    step_stopstate() 
    step_stop() 
    pins_disable() 
    mq.post_status() 
    if file.open("cfg_cur_step.lua", "w+") then 
     file.write("cur_step=" .. cur_step .. '\n') 
     file.close() 
    end 
    end 
end 

-- public method to start moving number of 'int steps' in 'int direction'  
function step_move(steps, direction, delay) 
    tmr.stop(step_timerid) 
    step_stepsleft = steps 
    step_direction = direction 
    step_delay = delay 
    step_take() 
end 

function step_go_to(step, delay) 
    if step >= cur_step then 
    steps = step - cur_step 
    step_move(steps, FWD, delay) 
    end 
    if step <= cur_step then 
    steps = cur_step - step 
    step_move(steps, REV, delay) 
    end 
end 

function percent_go_to(percent, delay) 
    if(percent >= 0 and percent <= 100) then 
    step_stop() 
    tmr.register(status_timerid, 1000, tmr.ALARM_AUTO, function() mq.post_status() end) 
    tmr.start(status_timerid) 
    step = percent * tot_steps/100 
    step_go_to(step, delay) 
    end 
end 

-- public method to cancel moving 
function step_stop() 
    tmr.stop(step_timerid) 
    tmr.stop(status_timerid) 
    step_stepsleft = 0 
    step_stopstate() 
end 
+2

Ajouter le code et la description détaillée de votre erreur. Sinon, votre question sera downvoted et fermée. – svgrafov

Répondre

0

ComicSansMS fourni une excellente réponse dont l'essence est que vous devez remplacer

wifi.sta.config(key,config.SSID[key]) 

avec

wifi.sta.config{ssid=key,pwd=config.SSID[key]} 

Ainsi, un exemple autonome pourrait ressembler à ceci:

--wifi.setmode(wifi.NULLMODE) 

config = {} 
config.SSID = {} 
config.SSID["ssid"] = "password" 

function wifi_wait_ip() 
    if wifi.sta.getip() == nil then 
    print("IP unavailable, Waiting...") 
    else 
    tmr.stop(1) 
    print("\n====================================") 
    print("ESP8266 mode is: " .. wifi.getmode()) 
    print("MAC address is: " .. wifi.ap.getmac()) 
    print("IP is " .. wifi.sta.getip()) 
    print("====================================") 
    end 
end 

function wifi_start(list_aps) 
    if list_aps then 
    for key, value in pairs(list_aps) do 
     if config.SSID and config.SSID[key] then 
     wifi.setmode(wifi.STATION); 
     wifi.sta.config{ssid=key, pwd=config.SSID[key]} 
     -- wifi.sta.connect() not needed as config() uses auto-connect=true by default 
     print("Connecting to " .. key .. " ...") 
     tmr.alarm(1, 2500, 1, wifi_wait_ip) 
     end 
    end 
    else 
    print("Error getting AP list") 
    end 
end 

function start() 
    print("Configuring Wifi ...") 
    wifi.setmode(wifi.STATION) 
    wifi.sta.getap(wifi_start) 
end 

start() 
+0

Après avoir essayé cela, rien ne se passe après le message "Configuration wifi". Heureusement, je ne reçois pas l'erreur PANIC, donc je suppose que c'est un progrès heh. D'autres idées pourquoi cela se passe-t-il? –

+0

Désolé, mon mauvais, foiré la syntaxe. J'ai maintenant ajouté un exemple complet autonome. –

+0

Btw si vous voulez éviter les configurations WiFi en dur, je vous suggère de donner https://nodemcu.readthedocs.io/en/latest/fr/modules/enduser-setup/ un essai. –

1

Analysons le message d'erreur un par sur e:

unprotected error in call to Lua API (wifi_setup.lua:25: bad argument #1 to 'config' (config table not found!)) 

erreur Unprotected signifie que vous avez fait un appel de fonction normale, par opposition à un appel protégé (alias pcall), qui est un appel de fonction où vous vous attendez à des erreurs de se produire et que vous voulez fournir des moyens pour les traiter . Puisque vous n'avez pas fait d'appel protégé, Lua ne sait pas comment gérer l'erreur et se termine tout de suite (ce qui n'est pas une mauvaise chose).

wifi_setup.lua:25 indique le fichier et la ligne sur lesquels l'erreur s'est produite.

bad argument #1 to 'config' signifie que le problème est dû au premier argument passé à une fonction nommée config.

config table not found! est le message d'erreur fourni par l'implémenteur de cette fonction. Donc, en résumé, il y a un problème avec l'appel de la fonction wifi.sta.config(key,config.SSID[key]) car il attend une table comme premier argument, alors que vous avez fourni quelque chose de différent (c'est-à-dire une chaîne avec le BSSID). En effet, la vérification des NodeMCU docs montre que vous avez besoin pour passer une table à cette fonction:

wifi.sta.config()

Sets the WiFi station configuration. [...]

Syntax

wifi.sta.config(station_config)

Parameters

station_config table containing configuration data for station

La structure attendue de la table est documenté en détail sur cette page ainsi.

+0

Merci pour votre réponse extrêmement utile! Vraiment apprécier à quel point vous étiez. Je comprends un peu plus maintenant. J'ai essayé de changer le code comme indiqué dans l'exemple dans la documentation, comme ceci: 'station_cfg = {}' 'station_cfg.ssid = "node-AABBCC"' 'station_cfg.pwd = "mot de passe"' 'wifi.sta.config (station_cfg)' Mais cela ne m'a pas beaucoup plus loin .... –