Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Arduino上的反应式编程_Javascript_Functional Programming_Arduino_Reactive Programming_Immutable.js - Fatal编程技术网

Javascript Arduino上的反应式编程

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

我目前正在开发非常复杂的基于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)
})
我的第二个想法几乎是一样的,但我是使用它的,输出,因此相同的示例如下所示(如果代码不正确,我很抱歉,我还没有太多使用游标的经验):

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

你有什么改进或更好的主意吗?

我最近发现。请看一个例子:

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"
                    ]