Переключение между циклами Arduino ИК-пульт дистанционного управления

Я работаю над проектом светодиодной ленты. Тем не менее, я остановился на данный момент. В программе я хочу назначить различные световые эффекты для каждой кнопки на моем ИК-пульте. Я хочу, чтобы программа работала на основе того, что каждый световой эффект будет работать до тех пор, пока не будет нажата другая кнопка, чтобы запустить другой эффект.

В настоящее время с помощью моего кода я сделал так, чтобы каждый эффект запускался один раз при нажатии соответствующей кнопки на ИК-пульте.

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

Заранее спасибо.

#include "IRremote.h"
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6

Adafruit_NeoPixel strip = Adafruit_NeoPixel(20, PIN, NEO_GRB + NEO_KHZ800);

int receiver = 11; // Сигнальный контакт ИК-приемника на цифровой контакт Arduino 11

/*-----( Declare objects )-----*/
IRrecv irrecv(receiver);     // создать экземпляр 'irrecv'
decode_results results;      // создать экземпляр 'decode_results'
int Remote = 0;

/*-----( Function )-----*/
void translateIR() // выполняет действие на основе полученного IR-кода

// описание удаленных ИК-кодов

{
  switch(results.value)
  {
  case 0xFFA25D: Serial.println("POWER"); 
  ArrowRight(strip.Color(25, 0, 0), 100); //Красный
  ArrowRight(strip.Color(0, 0, 25), 100); //Синий
  break;

  case 0xFFE21D: Serial.println("FUNC/STOP"); 
  ArrowLeft(strip.Color(25, 0, 0), 100); // Красный
  ArrowLeft(strip.Color(0, 0, 25), 100); // Синий
  break;


  default: 
  Serial.println(" other button   ");

  }// Конец регистра

  delay(0); // Не получать немедленный повтор


} // КОНЕЦ перевода IR
void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);
  Serial.println("IR Receiver Button Decode"); 
  irrecv.enableIRIn(); // Запускаем приемник
  strip.begin();
  strip.show();
  Remote = 0;

}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  if (irrecv.decode(&results)) // получили ли мы ИК-сигнал?

  {
    translateIR(); 
    irrecv.resume(); // получаем следующее значение
  }  
}/* --(end main loop )-- */

void ArrowRight(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 1; j++) { // j<# определяет, сколько циклов
    for (uint16_t i = strip.numPixels()/2; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(50);
    }
    for (uint16_t i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(50);
  }
}

void ArrowLeft(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 1; j++) { // j<# определяет, сколько циклов
    for (uint16_t i = strip.numPixels()/2-1; i + 1 > 0 ; i--) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(50);
    }
    for (uint16_t i = strip.numPixels(); i + 1 > 0 ; i--) {
      strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(50);
  }
}

, 👍0


2 ответа


3

delay(0) очевидно[*] действует как delay(2^32) или около 10^10 миллисекунд. Возможно, вы не это имели в виду... :)

Попробуйте уменьшить задержку до 1 или используйте delayMicroseconds(), чтобы получить что-то короче. По крайней мере, это должно дать вам воспроизводимые результаты.

(10^10 мс – это примерно 16,5 недель, для тех, у кого нет под рукой калькулятора).

[*] Я не читал код и не ждал окончания срока действия вызова. Я попробовал и увидел, что Uno завис. Я предполагаю, что нулевой аргумент для delay() не отклоняется, а просто уменьшается, как обычно, пока не достигнет нуля.

,

Привет, спасибо за ответ. Я не уверен, что вы поняли, чего я хочу достичь. Я хочу, чтобы каждый эффект непрерывно повторялся до тех пор, пока не будет нажата другая кнопка, активирующая другой эффект. Я загрузил код, который вставил в свой uno, у меня он работает нормально. Я изменил задержку, как вы сказали, похоже, это просто меняет скорость возникновения моего эффекта, изменение ее на 1 приводит к тому, что эффект превращается в вспышку. Спасибо., @YaBo11


0

Мне нужна переменная, в которой будет храниться текущее значение ИК-пульт.

Он у вас уже есть. Он называется results и имеет тип decode_results.

decode_results results; 

Вы считываете результаты IR в эту переменную. Затем вы очищаете его, чтобы искать другой. Что вам нужно, так это способ сохранить последний хороший код, который вы получили. Лучше всего просто использовать int и сохранять определенное число для каждого кода, сохранять 1, когда вы получаете 0xFFA25D, и 2, когда вы получаете 0xFFE21D или что-то в этом роде. Затем используйте этот int вместо переменной results, чтобы решить, что делать в остальной части кода.

,