如何使用Dino和Sinatra显示传感器输出?

tom*_*nek 7 javascript ruby asynchronous arduino sinatra

我想在我的页面输出显示我的一个传感器(湿气)连接到Arduino.

下面的脚本,每隔一秒给我一些值(数字).

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
Run Code Online (Sandbox Code Playgroud)

我想我可以Sinatra用作API和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
Run Code Online (Sandbox Code Playgroud)

你能给我一些提示或简单的好模式我应该如何处理?

我找到了样本sinatra app fo dino:https://github.com/austinbv/dino_cannon

Iur*_* G. 5

您将需要使用某种数据存储区备份异步数据:db,filestore或内存存储.最好将传感器读取代码抽象到一个单独的类中,并使用定义良好的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
Run Code Online (Sandbox Code Playgroud)