Я пытаюсь закодировать программу, которая считывает 5 микропереключателей при открытой двери (doorstatus = 0
).Он также должен иметь возможность подсчитать, сколько мест занял пользователь (rfidTakenCheck
), подсчитав количество микропереключателей, установленных при закрытой ячейке, и количество при его открытии.Мой CloudGate (компьютерный блок) застревает при развертывании программы, что заставляет меня думать, что происходит бесконечный цикл.
Я пытался заменить другой CloudGate, но это не помогло, так чтоне было аппаратной проблемы.Я также попытался добавить команду break
в циклы while, но это не помогло.
Функция checkMicroswitches()
получает свою информацию из 5 выводов gpio.
if not msg then
-- called on startup
return
end
function checkMicroswitches() --checks microswitches + calculates numberFree & placesFree
if msg.topic == "Microswitch1" then
global.microswitch1 = msg.payload
end
if msg.topic == "Microswitch2" then
global.microswitch2 = msg.payload*10
end
if msg.topic == "Microswitch3" then
global.microswitch3 = msg.payload*100
end
if msg.topic == "Microswitch4" then
global.microswitch4 = msg.payload*1000
end
if msg.topic == "Microswitch5" then
global.microswitch5 = msg.payload*10000
end
global.placesFree = global.microswitch1 + global.microswitch2 + global.microswitch3 + global.microswitch4 + global.microswitch5
function sumdigits(str)
local total = 0
for digit in string.gmatch(str, "%d") do
total = total + digit
end
return total
end
global.numberFree = sumdigits(tostring(global.placesFree))
end -- ends function checkMicroswitches
-- initialising
checkMicroswitches()
msg.payload = {}
msg.payload = global.numberFree
msg.topic = "numberFree"
sendTo(1, msg)
msg.payload = {}
msg.payload = global.placesFree
msg.topic = "placesFree"
sendTo(2, msg)
global.numberFreeStart = 0
global.numberFreeEnd = 0
while (global.doorstatus == 1) do -- door closed
checkMicroswitches()
global.numberFreeStart = global.numberFree
global.rfidTakenCheck = 0
end
while (global.doorstatus == 0) do -- door open
global.numberFreeEnd = global.numberFree
global.rfidTakenCheck = global.numberFreeStart - global.numberFreeEnd
end
msg.payload = {}
msg.payload = global.rfidTakenCheck
msg.topic = "rfidTakenCheck"
sendTo(3, msg)
global.numberFreeEnd = 0
global.numberFreeStart = 0
global.rfidTakenCheck = 0
Если я удаляю циклы while, переменные numberFree
и placesFree
подсчитываются и отправляются,так что я предполагаю, что именно циклы while вызывают проблемы.Я ожидаю, что они подсчитают количество мест, занятых пользователем, пока дверь открыта, путем сравнения значений микропереключателя.