Вот пара наблюдений, основанных на том, что мы знаем до сих пор.
Я считаю, что емкостные сенсорные датчики не дают результатов HIGH / LOW, если они не являются «цифровым емкостным сенсорным датчиком». Нецифровые, скорее всего, будут возвращать аналоговые значения, поэтому вам может потребоваться использовать функцию AnalogRead.
В этом случае ваш код может выглядеть примерно так:
senVal1 = analogRead(sen1);
if (senVal1 > 800) {
// Do sensor is touched stuff
}
Кроме того, при условии, что ваши светодиоды подключены к Arduino через их катоды (т. Е. НИЗКИЙ = ВКЛ), вы никогда не выключаете светодиоды. То есть такого кода нет:
digitalWrite(LEDX, HIGH);
Таким образом, возможно, все светодиоды загорятся и останутся включенными.
Наконец, вы, возможно, захотите ввести некоторую отладку и / или еще не отпустили. Учтите следующее:
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);
}
Функция цикла будет вызываться много раз в секунду (например, тысячи раз в секунду). Ваша логика эффективно «Сенсор0 нажата?». Этот тест выполняется много, много раз в секунду. Итак, ваши тесты с участием «sentouchCount1» будут выполняться много раз в секунду.
Если предположить, что вы на самом деле где-то измените значение sentouchCount1, добавив к нему единицу, это будет быстро переключаться между всеми возможными значениями операторов if, в результате чего все светодиоды будут мгновенно включаться.
Однако вы не меняете значение sentouchCount1, поэтому, вероятно, активируется только первое, если это включает 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...