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
您将需要使用某种数据存储区备份异步数据: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)