【问题标题】:Reactive programming on ArduinoArduino 上的反应式编程
【发布时间】:2015-07-25 03:03:40
【问题描述】:

我目前正在开发相当复杂的基于 Arduino 的产品(有很多传感器和设备控制)。在对响应式编程进行了简短的体验后,我认为它是正确的选择。从你那里,我想知道你对我的想法的看法。

我的第一个想法是将流分为两种类型 - 输入输出

输入流通常是一些传感器(温度、压力),它只返回一个值(°C、Pa)。

输出流是返回引脚状态(数字为 0 或 1,模拟为 0 到 1023)的设备(风扇、热交换器)。

如果我只想在温度高于 100 °C 时打开风扇,代码可能如下所示:

const FAN_PIN = 10

let temperatureInput = ds18b20(...)

let fanOutput = (sensor) => {
  return sensor.map((value) => {
    return value > 100
  })
}

fanOutput(temperatureInput).onValue((digital) => {
  digitalWrite(FAN_PIN, digital)
})

我的第二个想法几乎是一样的,但我使用Immutable.js 和它的Cursors 作为输出,所以同样的例子看起来像这样(我很抱歉如果代码不正确,我对游标还没有太多经验):

const FAN_PIN = 10

let state = Immutable.fromJS({
  fan: {
    active: false
  }
})

let fanCursor = Cursor.from(state.get('fan'), nextData => {
  state = state.set('fan', nextData)
  digitalWrite(FAN_PIN, nextData.get('active'))
})

ds18b20(...).onValue((value) => {
  fanCursor.set('active', value > 100)
})

我更喜欢第二种解决方案,因为它在一个地方有状态,但是我在组合流和游标时遇到了问题。在第一个解决方案中,我不知道将 Output 表示为流是否明智(可能很难做一些复杂的工作)。

您有什么改进或更好的想法

【问题讨论】:

  • 我建议您查看bacon.jsrx.js。它们用于将变化的值建模为流。您仍然可以将 Immutable.js 用于数据。
  • 我目前正在使用Kefir 进行直播。
  • 没关系,Kefir 的 API 和培根基本一样。
  • 我并没有真正看到为此使用 immutable.js 游标的好处 - 你的第一个例子比第二个例子更清楚。您有需要帮助的问题吗?

标签: javascript functional-programming arduino reactive-programming immutable.js


【解决方案1】:

我最近发现了frp-arduino。看例子:

import Arduino.Uno

main = compileProgram $ do

    digitalOutput pin13 =: clock ~> toggle

    uart =: timerDelta ~> mapSMany formatDelta ~> flattenS

formatDelta :: Expression Word -> [Expression [Byte]]
formatDelta delta = [ formatString "delta: "
                    , formatNumber delta
                    , formatString "\r\n"
                    ]

如果你愿意,请在这里写一篇文章并评论一个链接,我是一个 frp 粉丝,想知道对此的任何评论,尤其是对于真正复杂的项目。

【讨论】:

  • 如果有任何帮助,我正在尝试使用 Stack 中的 frp-arduino,我终于设法做到了(即,从 ghci 运行 main 实际上会创建一个 .c 文件,而我'我能够把它送到我的 Arduino 上),这个过程可以改进,这是“艺术”的状态:github.com/miladhub/myarduino
猜你喜欢
  • 2019-03-16
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多