【问题标题】:Three Sensors with 2 rgb leds Arduino三个带有 2 个 RGB LED 的传感器 Arduino
【发布时间】:2019-05-13 07:41:08
【问题描述】:

目前,我使用 3 个触摸电容传感器、2 个共阳极 RGB LED 和 Arduino。 Sen0 将具有三个条件:

  1. press0 点亮所有红色 LED,
  2. 按 1 点亮所有绿色 LED,
  3. press2 点亮所有蓝色 LED。

然后当 Sen0 at press0 如果我按下 Sen1 1 红色应该亮起。当 sen0 在 press0 时,如果我按下 sen2,两个红色 LED 应该会亮起。

Sen0 at press1 如果我按下 sen1,它应该点亮 1 个绿色 LED,如果我按下 sen2,它应该点亮两个绿色 LED。

Sen0 at press2 如果我按下 sen1 它应该会亮起 1 个蓝色 LED,如果我按下 sen2 它应该会亮起 2 个蓝色 LED。

感谢您的帮助!我也为代码添加了草图。

代码:



  [1]: https://i.stack.imgur.com/wjKW7.png

【问题讨论】:

  • 请编辑您的帖子并修复代码格式。不知道你是怎么弄得这么奇怪的——只需从代码编辑器中复制/粘贴,然后按代码格式化图标{}。另外,问题到底是什么?代码的哪一部分不起作用,会发生什么以及您期望什么?
  • 你声明了这么多变量,而不是定义常量。
  • 嗨 Kiran,请解释一下你的意思,谢谢
  • 你有什么问题?你想让别人为你写一个不同的草图吗?顺便说一句:senState0 = digitalRead(sen0); 你不能在函数之外拥有可执行代码。
  • 感谢 datafiddler。问题是如果我按 sen0 三次,这意味着 press2 和绿色 LED 亮起,我按 sen1 和 sen2 一次打开 LED,这应该是绿色的。

标签: c arduino


【解决方案1】:

以下是根据我们目前所知的一些观察结果。

我相信电容式触摸传感器不会返回高/低结果,除非它们是“数字电容式触摸传感器”。非数字的可能会返回模拟值,因此您可能需要使用 AnalogRead 函数。

在这种情况下,您的代码可能如下所示:

  senVal1 = analogRead(sen1);
  if (senVal1 > 800) {
    // Do sensor is touched stuff
  }

另外,假设您的 LED 通过其阴极连接到 Arduino(即 LOW = ON),那么您似乎永远不会关闭任何 LED。那就是没有这样的代码:

  digitalWrite(LEDX, HIGH);

所以结果可能是所有 LED 都会亮起并保持亮起。

最后,您可能想要引入一些去抖动和/或尚未放手。考虑以下几点:

void loop() {
  // read the state of the sensor0 value:
  senState0 = digitalRead(sen0);        // This appears to be in the wrong place!!!!
  // check if the sensortouch is pressed.
  // if it is, the sensorState is HIGH:
  if ( senState0 == HIGH ) {
    if (sentouchCount1 % numberOfLED1 == 0 ){ 
      digitalWrite(LEDR,LOW);
      digitalWrite(LEDR1,LOW);
      }

循环函数每秒将被调用多次(例如每秒数千次)。您的逻辑实际上是“是否按下 Sensor0?”。该测试每秒执行很多次。因此,涉及“sentouchCount1”的测试将每秒执行很多次。

假设您实际上通过向其添加一个来更改某处的 senttouchCount1 值,这将快速循环遍历 if 语句的所有可能值,导致所有 LED 看起来都立即打开。

但是,您不会更改 senttouchCount1 的值,因此只有第一个打开 LEDR 并且 LEDR1 可能被激活。

哦,关于“还没有放手”位,请考虑以下代码:

boolean isPressed = false;

loop() {
  if (senState0 == HIGH && !isPressed) {
     // do stuff when we detect that the switch is pressed
     isPressed = true;      // Make sure we don't keep doing this for the entire
                            // duration the user is touching the switch!
  } else if (senState0 == LOW && isPressed) {
    isPressed = false;      // User has let go of the button, so enable the
                            // previous if block that takes action when the user
                            // presses the button.
  }        // You might need to search "debouncing a switch", but I do not think this is required for capacative touch sensors (especially digital ones).

根据我在下面的评论,您可能需要执行以下操作:

boolean isSensor1Touched = false;

void loop() {
  // read the state of the sensor0 value:
  senState0 = digitalRead(sen0);        // This appears to be in the wrong place!!!!
  // check if the sensortouch is pressed.
  // if it is, the sensorState is HIGH:
  if ( senState0 == HIGH && ! isSensor1Touched) {
    sentouchCount1++;
    isSensor1Touched = true;
    if (sentouchCount1 % numberOfLED1 == 0 ){ 
      digitalWrite(LEDR,LOW);
      digitalWrite(LEDR1,LOW);
      }
    if (sentouchCount1 % numberOfLED1 == 1 ){ 
      digitalWrite(LEDG,LOW);
      digitalWrite(LEDG1,LOW);
    }
    if (sentouchCount1 % numberOfLED1 == 2){ 
      digitalWrite(LEDB,LOW);
      digitalWrite(LEDB1,LOW);
    }
  } else if (senState0 == LOW && isSensor1Touched) {
    isSensor1Touched = false;
  }

  // Then repeat for other sensors...

【讨论】:

  • 它们是数字电容式触摸传感器和共阳极 rgb LED
  • 好的,所以关于模拟传感器的部分不适用,其余部分适用。此外,此评论仍然适用:您能否指出它正在做的事情与您希望它做的事情不同。换句话说,请描述您遇到的问题。 这也会有所帮助。您能否查看我的答案,看看我是否猜到了您的任何问题,如果是,我的建议是否对您有帮助。如果他们这样做,请您接受这个答案。
  • 谢谢GMc。问题是,Sen1 和 sen2 不读取 sen0 的状态。这应该如何工作:如果我按 3 次 sen0 则 3 个绿色 LED 将亮起,如果我按一次 sen1 它应该点亮 1 个绿色 LED,如果按一次 sen2 它应该点亮两个绿色 LED。
  • 我仍然认为问题出在我的回答中 1)您永远不会增加“sentouchCountX”变量和 2)您没有任何检测“触摸”和“释放”的逻辑。我将用一种可能的解决方案更新我的答案。但是你的问题还是不是很清楚。
  • 好吧,附上代码的逻辑图,我想这会给你一个清晰的信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多