7

Arduinoに接続されたセンサー(水分)の1つからの出力をページに表示したいと思います。

次のスクリプトでは、1 秒ごとに値 (数値) が返されます。

require 'dino'

board = Dino::Board.new(Dino::TxRx.new)
sensor = Dino::Components::Sensor.new(pin: 'A0', board: board)

on_data = Proc.new do |data|
  puts data
  sleep 1
end

sensor.when_data_received(on_data)

sleep

非同期出力を表示するためのSinatraAPIやスクリプトとして使えると思います。Javascript

だから、これはそのようなものでなければなりません

%w(sinatra dino haml).each do |lib|
  require lib
end

board = Dino::Board.new(Dino::TxRx.new)
sensor = Dino::Components::Sensor.new(pin: 'A0', board: board)
sleep 1

get '/' do
  haml :index
end

get '/moisture' do
  on_data = Proc.new do |data|
    { moisture_value: data }
    sleep 1
  end

  sensor.when_data_received(on_data)
end

それをどのように処理すればよいか、ヒントや簡単な良いパターンを教えてください。

恐竜用のサンプル シナトラ アプリを見つけました: https://github.com/austinbv/dino_cannon

4

1 に答える 1

5

ある種のデータストア (db、filestore、または memory store) で読み取った非同期データをバックアップする必要があります。センサー読み取りコードを別のクラスに抽象化し、そのデータを読み取るための適切に定義された API を用意するのが最善です。MoistureSensor クラスを別のファイルに入れ、サーバー ファイルで必須にすることをお勧めします。また、メモリ ストア内のデータ ポイントの数を 1000 に制限しています。以下を試してください。

%w(json sinatra dino haml).each do |lib|
  require lib
end

class MoistureSensor
  require 'dino'
  board = Dino::Board.new(Dino::TxRx.new)
  sensor = Dino::Components::Sensor.new(pin: 'A0', board: board)
  @@data = []
  on_data = Proc.new do |data|
    @@data.shift if @@data.length > 1000
    @@data << data
    sleep 1
  end
  sensor.when_data_received(on_data)

  def self.data
    @@data
  end

  def self.last_entry
    @@data.last
  end
end

get '/' do
  haml :index
end

get '/moisture.json' do
  content_type :json
  { moisture_value: MoistureSensor.last_entry }.to_json
end
于 2012-12-26T19:50:59.483 に答える