我想在我的页面输出显示我的一个连接到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
我想我可以使用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
你能给我一些提示或简单的好模式我该如何应对?
我找到了样本sinatra app fo dino:https://github.com/austinbv/dino_cannon
答案 0 :(得分: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