Переключение между циклами 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);
}
}
@YaBo11, 👍0
2 ответа
delay(0)
очевидно[*] действует как delay(2^32)
или около 10^10 миллисекунд. Возможно, вы не это имели в виду... :)
Попробуйте уменьшить задержку до 1 или используйте delayMicroseconds()
, чтобы получить что-то короче. По крайней мере, это должно дать вам воспроизводимые результаты.
(10^10 мс – это примерно 16,5 недель, для тех, у кого нет под рукой калькулятора).
[*] Я не читал код и не ждал окончания срока действия вызова. Я попробовал и увидел, что Uno завис. Я предполагаю, что нулевой аргумент для delay() не отклоняется, а просто уменьшается, как обычно, пока не достигнет нуля.
Мне нужна переменная, в которой будет храниться текущее значение ИК-пульт.
Он у вас уже есть. Он называется results и имеет тип decode_results.
decode_results results;
Вы считываете результаты IR в эту переменную. Затем вы очищаете его, чтобы искать другой. Что вам нужно, так это способ сохранить последний хороший код, который вы получили. Лучше всего просто использовать int и сохранять определенное число для каждого кода, сохранять 1, когда вы получаете 0xFFA25D, и 2, когда вы получаете 0xFFE21D или что-то в этом роде. Затем используйте этот int вместо переменной results, чтобы решить, что делать в остальной части кода.
- Выход из цикла while с помощью ИК-пульта для neopixel
- Использование VS1838B с Arduino
- Tone() конфликтует с библиотекой IRremote (множественное определение `__vector_7')
- Как остановить вращение сервопривода?
- Arduino IRremote перестает работать
- Использование кольца NeoPixel без Arduino
- Использование ИК-пульта с Arduino
- ИК приемник принимает только 0
Привет, спасибо за ответ. Я не уверен, что вы поняли, чего я хочу достичь. Я хочу, чтобы каждый эффект непрерывно повторялся до тех пор, пока не будет нажата другая кнопка, активирующая другой эффект. Я загрузил код, который вставил в свой uno, у меня он работает нормально. Я изменил задержку, как вы сказали, похоже, это просто меняет скорость возникновения моего эффекта, изменение ее на 1 приводит к тому, что эффект превращается в вспышку. Спасибо., @YaBo11