我正在使用WiringPi宝石。这段代码按预期工作:
pinNumber = 7
io = WiringPi::GPIO.new do |gpio|
gpio.pin_mode(pinNumber, WiringPi::INPUT)
end
pin_state = io.digital_read(pinNumber)
return pin_state
但是,当我将其包含在方法中以便我可以使用Sinatra进行调用时,我在尝试刷新时会收到以下错误:
wiringPiSetup *:每个程序运行只能调用一次。这是 一个致命的错误。请修改您的代码。
为什么必须只运行一次,最佳解决方案是什么?每次导航到根URL时,最终都需要检索pin_state
。
这是完整的代码:
require 'wiringpi'
require 'sinatra'
def getstate()
pinNumber = 7
io = WiringPi::GPIO.new do |gpio|
gpio.pin_mode(pinNumber, WiringPi::INPUT)
end
pin_state = io.digital_read(pinNumber)
return pin_state
end
get '/' do
getstate()
end
答案 0 :(得分:2)
创建GPIO实例后,您可以重复调用以从中读取引脚。但是,您的代码正在为每次调用创建一个新实例。
require 'wiringpi'
require 'sinatra/base'
class MyApp < Sinatra::Base
InputPin = 7
IO = WiringPi::GPIO.new do |gpio|
gpio.pin_mode(InputPin, WiringPi::INPUT)
end
def get_state(pin_number = MyApp::InputPin)
MyApp::IO.digital_read(pin_number)
end
get '/' do
get_state
end
end
答案 1 :(得分:1)
pinNumber = 7
def io
@io ||= begin
WiringPi::GPIO.new do |gpio|
gpio.pin_mode(pinNumber, WiringPi::INPUT)
end
end
end
def getstate()
pin_state = io.digital_read(pinNumber)
return pin_state
end
get '/' do
getstate() end
在应用程序启动时初始化API(在getState()方法之外)。您多次初始化API,因此错误。