三个带有2个RGB LED的传感器Arduino

时间:2019-05-13 07:41:08

标签: c arduino

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

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

然后当我按Sen1 1时,在按0的Sen0处,红色应点亮。当sen0按下sen0时,如果我按下sen2,则两个红色LED应当亮起。

在press1上的Sen0,如果我按sen1,它应点亮1个绿色LED;如果我按sen2,则应点亮两个绿色LED。

在press2上的Sen0,如果我按sen1,它应点亮1个蓝色LED;如果我按sen2,则应点亮2个蓝色led。

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

代码:



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

1 个答案:

答案 0 :(得分: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”的测试将每秒执行多次。

假定,您实际上通过在其中添加了一个来更改了sendouchCount1的值,这将快速循环遍历if语句的所有可能值,从而导致所有LED瞬间亮起。 / p>

但是,您不会更改sendouchCount1的值,因此只有第一个打开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...