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*: これは、プログラムの実行ごとに 1 回だけ呼び出す必要があります。これは致命的なエラーです。コードを修正してください。

これを 1 回だけ実行する必要があるのはなぜですか? また、最適な解決策は何ですか? 最終的pin_stateには、ルート URL に移動するたびに取得する必要があります。

完全なコードは次のとおりです。

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 に答える