目前,我正在使用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/