【问题标题】:How to show sensor output using Dino and Sinatra?如何使用 Dino 和 Sinatra 显示传感器输出?
【发布时间】:2013-02-06 18:34:12
【问题描述】:

我想在我的页面上显示连接到 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

【问题讨论】:

    标签: javascript ruby asynchronous sinatra arduino


    【解决方案1】:

    您需要使用某种数据存储来支持异步数据读取:数据库、文件存储或内存存储。最好将您的传感器读取代码抽象为一个单独的类,并具有定义良好的 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
    

    【讨论】:

    • 谢谢,看起来真的很好。剩下的一件事是如何在页面上流式传输该 json 的最佳方式。我应该每秒钟通过ajax获取json并渲染它吗?
    • 是和不是。取决于你的要求。如果您不关心显示设备读取的所有数据点(假设它每秒读取几个数据点),那么您应该继续您的计划并每秒左右获取最后一个数据点并使用 ajax 更新您的页面。如果您想显示所有数据点而不是您需要为数据点和 ajax 查询设置时间戳,以便您可以跟踪上次获取时间并返回上次获取和 Time.now 之间的所有数据点。
    • @regedarek 我根据您的编辑/审查添加了 json content_type 的修复程序。如果对您有用,请接受答案。
    • 这里对我来说缺少的一件事是如何使用 JS 每隔 1 秒渲染和刷新 json 的好方法
    • 您需要在客户端 javascript 上处理它。创建一个函数,每 1 秒调用一次 ajax(使用 jquery 最简单)并刷新页面上的数据。您可以使用 setTimeout javascript 函数让它每隔一段时间自动调用一次。
    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多