0

我正在使用WiringPi gem。此代码块按预期工作:

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进行调用时,我在尝试刷新时收到以下错误:

接线PiSetup*:每次程序运行时,您只能调用一次。这是一个致命错误。请修复您的代码。

为什么必须只运行一次,最好的解决方案是什么?每次我导航到根 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 
4

2 回答 2

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
于 2017-01-11T17:44:15.773 回答
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

当您的应用程序启动时(在 getState() 方法之外)初始化一次 API。您正在多次初始化 API,因此出现错误。

于 2017-01-10T21:49:33.247 回答