目前,我正在使用3个触摸电容式传感器,2个共阳极RGB LED和Arduino。 Sen0将具有三个条件:
然后当我按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
答案 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...