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


press0点亮所有红色LED,
press1点亮所有绿色LED,
press2点亮所有蓝色LED。


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

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

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

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

代码:



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

最佳答案

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

我相信电容式触摸传感器除非是“数字电容式触摸传感器”,否则不会返回“高/低”结果。非数字的可能会返回模拟值,因此您可能需要使用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似乎都立即打开。

但是,您不会更改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...

关于c - 三个带有2个RGB LED的传感器Arduino,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56107735/

10-13 05:09