Три датчика с 2-мя RGB светодиодами Arduino - PullRequest
0 голосов
/ 13 мая 2019

В настоящее время я использую 3 сенсорных емкостных датчика, 2 обычных анодных RGB-светодиода и Arduino.Sen0 будет иметь три условия:

  1. press0 загорает все красные светодиоды,
  2. press1 загорает все зеленые светодиоды,
  3. press2 загорает все синие светодиоды.

Тогда, когда Sen0 при нажатии 0, если я нажимаю Sen1 1, должен загореться красный цвет.когда sen0 при нажатии 0, если я нажимаю sen2, должны загореться два красных светодиода.

Sen0 при нажатии1, если я нажму sen1, должен загореться один зеленый светодиод, а если я нажму sen2, то должны загореться два зеленых светодиода.

Sen0 при нажатии2, если я нажимаю sen1, он должен загореться 1 синим светодиодом, а если я нажимаю sen2, то должен загореться 2 синих светодиода.

Спасибо за вашу помощь!Я добавил эскиз для кода.

код:



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

1 Ответ

1 голос
/ 13 мая 2019

Вот пара наблюдений, основанных на том, что мы знаем до сих пор.

Я считаю, что емкостные сенсорные датчики не дают результатов 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...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...