Проблемы при создании последовательности световых сигналов с помощью кнопки паузы ARDUINO - PullRequest
0 голосов
/ 08 ноября 2019

Итак, я пытаюсь создать программу, которая запускает различные последовательности света, используя плату Arduino. Я не очень хорошо знаком с C ++, поэтому чувствую, что отсутствие знания синтаксиса мешает мне достичь своей цели.

Моя идея состоит в том, чтобы воспроизводить различные последовательности световых сигналов в зависимости от того, какая кнопка нажимается на инфракрасном портале. удаленный. Количество времени, в течение которого источник света включается или выключается, может или не может быть таким же, как у другого источника света. К сожалению, последовательности, похоже, не работают, что указывает на то, что проблема, скорее всего, связана с функцией toggleLight.

Я также хотел, чтобы была кнопка, позволяющая пользователю приостановить последовательность (независимо от того, гдевдоль последовательности это). И после повторного нажатия кнопки последовательность продолжается с того места, где она остановилась. Я читал кое-что о прерывателе и спящем режиме с использованием C ++, но я незнаком с этим, поэтому он не включен в мой код.

Остальные цели я включил в свой код. Я создал объект «light», потому что я пытался создать последовательность, не используя функцию задержки, поскольку прерывание плохо работает с функцией задержки (насколько я знаю). Затем я могу вызвать функцию toggleLight для конкретного объекта освещения. Однако, как я уже говорил, последовательности не работают.

Я более знаком с языками ООП, поэтому, возможно, создание объекта не является лучшим для Arduino. Если у кого-то есть какие-либо идеи относительно того, как я могу достичь своей цели, это будет высоко оценено.

unsigned long previousMillis = 0;
unsigned long currentMillis = millis();

//sets up the Infrared receiver for the remote controller
const int RECV_PIN = 1;
IRrecv irrecv(RECV_PIN);
decode_results results;

//Sets up the LED's pin number and light status
class light{
   private:
   int _pinNumber;
   byte _Lstatus;

  public:
 //function that creates the objects with the parameters
  light(int pinNum, byte Lstat){
  _pinNumber = pinNum;
  _Lstatus = Lstat;}

  void toggleLight(long interval){
    //ensures that the "interval" amount of time has passed between the last LED blink
    if ((currentMillis - previousMillis) >= interval) {

    // if the LED is off turn it on and vice-versa:
    if (_Lstatus == LOW) {
      _Lstatus = HIGH;
    } else if (_Lstatus == HIGH) {
      _Lstatus = LOW;
    }
    // set the LED with the ledState of the variable:
    digitalWrite(_pinNumber, _Lstatus);
    // save the last time you blinked the LED
    previousMillis = currentMillis;
  }
  }
};
//creating four light objects with the pins and initial status of off.
light J1(13, LOW);
light J2(11, LOW);
light P1(12, LOW);
light P2(10, LOW);


void setup()
{
    pinMode(13, OUTPUT);
    pinMode(12, OUTPUT);
    pinMode(11, OUTPUT);
    pinMode(10, OUTPUT);

}
//Sequence 1 is a mock sequence. It will probably be longer and the intervals would not all be 1000
void seq1(){
  currentMillis = millis();
  J1.toggleLight(1000);
  P1.toggleLight(1000);
  J1.toggleLight(1000);
  P1.toggleLight(1000);
  J2.toggleLight(1000);
  P2.toggleLight(1000);
}

void seq2(){
  currentMillis = millis(); //I found that placing currentMillis = millis() here allows the lights to at least turn on
  J1.toggleLight(2000);
  J1.toggleLight(10);
  P1.toggleLight(1000);
  P1.toggleLight(0);
  J2.toggleLight(1500);
  J2.toggleLight(1);
  P2.toggleLight(2000);
  P2.toggleLight(1);
}

void loop()
{
      /* So once i get the sequences working, my idea is to have different sequences play
    depending on what button on the remote is pressed. However, first I want to get the sequences and
    interrupter
For now I have just tried running sequence #2 but it does not work.. Neither does Sequence #1. */
      seq2();



      //I MADE THESE LINES OF CODE COMMENTS FOR NOW. UNTIL I GET THE REST OF THE PROGRAM WORKING
      /*if (irrecv.decode(&results))
      {
        switch (results.value) {
          case : 0xf00000 // When button #1 sequence one plays
            seq1();
            break;
          case : 0xf00000 // when button #2 is pressed, sequence two plays
            seq2();
            break;
    */

    }

1 Ответ

0 голосов
/ 08 ноября 2019

Я вижу, что вы еще не дошли до понимания потока кода внутри Arduino. Вот краткое учебное пособие , которое поможет вам начать работу.

По сути, ваш код не обрабатывается последовательно. Поэтому, когда процессор перемещается через seq () и получает первый оператор if в 'J1.toggleLight (2000);'и обнаруживает, что условие не выполнено (то есть 2000 миллисекунд еще не прошло), он сразу переходит ко второй строке в seq (). Проблема с этим заключается в том, что когда он удовлетворяет условию во второй строке, он сбрасывает значение «предыдущий миллис», от которого зависят все источники света.

Таким образом, вы должны посвятить часы для каждого источника света, переместившись в 'previousMillis' в класс в качестве члена.

   class light{
       private:
       int _pinNumber;
       byte _Lstatus;
       unsigned long previousMillis = 0;

Таким образом, каждый источник света сможет отслеживать свои собственныевремя не конфликтуя с другими огнями. Это приведет к тому, что ваши источники света будут мигать с частотой 1 / интервал, и я сомневаюсь, что это то, что вам нужно. (Это даже не будет происходить при каждом переключении каждого источника света дважды в функциях seq (). ) Это подводит меня ко второй проблеме.

Вторая проблема связана с тем, как вы настраиваете свои последовательности. Поскольку вы хотите, чтобы источники света работали последовательно, вам нужно найти накопленное время, которое перечеркивает шансы на использование класса, если только вы не хотите реализовать механизм планирования, который учитывает интервал и расположение каждого экземпляра. Кажется, это немного непрактично.

Я думаю, что вы должны отказаться от класса и использовать простую функцию, которая принимает восемь значений, которые требуются каждой последовательности. Тогда вы могли бы использовать операторы if для манипулирования состояниями огней.

Я надеюсь, что ответ имел какой-то смысл. Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...