Javascript Arduino上的反应式编程
我目前正在开发非常复杂的基于Arduino的产品(有很多传感器和控制设备)。在经历了简单的反应式编程之后,我认为这是一个正确的选择。从你那里,我想知道你对我的想法的看法 我的第一个想法是将流分为两种类型-输入和输出 输入流通常是一些只返回一个值(°C,Pa)的传感器(温度、压力) 输出流是返回引脚状态的设备(风扇、热交换器)(数字为0或1,模拟为0到1023) 当我只想在温度高于100°C时打开风扇时,代码可能如下所示:Javascript Arduino上的反应式编程,javascript,functional-programming,arduino,reactive-programming,immutable.js,Javascript,Functional Programming,Arduino,Reactive Programming,Immutable.js,我目前正在开发非常复杂的基于Arduino的产品(有很多传感器和控制设备)。在经历了简单的反应式编程之后,我认为这是一个正确的选择。从你那里,我想知道你对我的想法的看法 我的第一个想法是将流分为两种类型-输入和输出 输入流通常是一些只返回一个值(°C,Pa)的传感器(温度、压力) 输出流是返回引脚状态的设备(风扇、热交换器)(数字为0或1,模拟为0到1023) 当我只想在温度高于100°C时打开风扇时,代码可能如下所示: const FAN_PIN = 10 let temperatureIn
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)
})
我的第二个想法几乎是一样的,但我是使用它的,输出,因此相同的示例如下所示(如果代码不正确,我很抱歉,我还没有太多使用游标的经验):
我更喜欢第二个解决方案,因为它在一个地方有状态,但我在组合流和游标时遇到了问题。在第一个解决方案中,我不知道将输出表示为流是否明智(可能很难做一些复杂的工作)
你有什么改进或更好的主意吗?我最近发现。请看一个例子:
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迷,想知道对此的任何评论,特别是对于真正复杂的项目。我建议你研究一下或。它们用于将不断变化的值建模为流。您仍然可以对数据使用Immutable.js。我目前正在对流使用Immutable.js。这很好,Kefir的API基本上与bacon相同。我并不认为在这方面使用Immutable.js游标有什么好处-您的第一个示例比第二个示例更清楚。您是否有需要帮助的问题。如果有任何帮助,我正在尝试使用Stack中的frp arduino,我最终成功地做到了(即,从ghci运行main实际上创建了一个.c文件,我可以将其发送到我的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"
]