我正在进行一个Arduino照明项目,使用rbg LED来创建可定制的颜色。我使用IRremote库来改变LED的“模式”。
这是我的节目:
#include <IRremote.h>
const int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;
int redpin = 9;
int greenpin = 10;
int bluepin = 5;
void setup(){
Serial.begin(9600);
irrecv.enableIRIn();
irrecv.blink13(true);
pinMode(redpin, OUTPUT);
pinMode(greenpin, OUTPUT);
pinMode(bluepin, OUTPUT);
}
void loop(){
if (irrecv.decode(&results)){
Serial.println("Before it checks for signal");
if (results.value == 0xFFE21D) { //'TITLE' button
Serial.println("'TITLE' signal detected, before fade starts");
//Fades through colors
int i;
//green to red
for (i = 0; i < 255; i++) {
analogWrite(redpin, i);
analogWrite(greenpin, 255 - i);
analogWrite(bluepin, 0);
delay(1);
Serial.println("Green to red");
}
//red to blue
for (i = 0; i < 255; i++) {
analogWrite(redpin, 255 - i);
analogWrite(greenpin, 0);
analogWrite(bluepin, i);
delay(1);
Serial.println("Red to blue");
}
//blue to green
for (i = 0; i < 255; i++) {
analogWrite(redpin, 0);
analogWrite(greenpin, i);
analogWrite(bluepin, 255 - i);
delay(1);
Serial.println("Blue to green");
}
}
if (results.value == 0xFFD22D) { //'MENU' button
Serial.println("'MENU' button detected");
//LED red
analogWrite(redpin, 255);
analogWrite(greenpin, 0);
analogWrite(bluepin, 0);
}
if (results.value == 0xFF52AD) { //'ON/OFF' button
Serial.println("'STOP' button detected");
//Stops
analogWrite(redpin, 0);
analogWrite(greenpin, 0);
analogWrite(bluepin, 0);
Serial.println("After LED stops");
}
Serial.println("After program");
irrecv.resume();
}
}在void loop()内部,我有三个if()语句。第一个检查遥控器上的某个按钮,LED从绿色变成红色到蓝色到绿色(这只执行一次,但这是另一个线程的问题)。
第二个if()语句检查一个不同的按钮按下,发光二极管变成红色。我打算要几种不同颜色的。
第三条if()语句检查开/关按钮,并关闭发光二极管。
我能在这两者之间切换。问题是,一旦第一个if() 语句执行,而语句逐渐消失,我就无法切换到其他语句中的任何一个,直到它结束。。
我知道,一旦第一条语句被执行,它在完成之前不会检查信号,但我想不出我是如何做到的。任何帮助都是非常感谢的!
发布于 2019-06-27 19:38:01
似乎您正在尝试实现一个简单的状态机。为此,您需要切换循环/ if语句。伪码:
int mode; // 0: green, 1: red and so on
while(true) {
// check button presses
if(buttonpress) {
mode = mode+1;
}
if(mode==1)
make_leds_more_green();
else if(mode==2)
make_leds_more_red();
//...
delay(1);
}发布于 2019-06-27 19:51:16
的状态机是一条路。我将在下面概述另一个,但基本的想法是,您需要循环继续,当您淡出LED在单一的步骤。这是我的共同常规方法:
int pins[3] = { redpin, greenpin, bluepin };
int current[3] = { 0, 0, 0 };
int target[3] = { 0, 0, 0 };
led_tick() {
for (int i = 0; i < 3; i += 1) {
if (current[i] == target[i]) continue;
if (current[i] < target[i]) {
current[i] += 1;
} else {
current[i] -= 1;
}
analogWrite(pins[i], current[i]);
}
}
loop() {
// handle buttons, change target values
led_tick();
delay(1); // making this non-blocking would be even better
}发布于 2019-06-27 19:49:33
你可以试试手做的非阻塞的。
fordelaymillis()#define DELAY 5000
int step;
void greenToRed() {
// Non blocking, only check if the waiting period passed
if(changeToRed && millis() > time_1 + DELAY){
// Update the time
time_1 = millis();
// Update the step
step -= 1;
analogWrite(redpin, 255 - step);
analogWrite(greenpin, step);
analogWrite(bluepin, 0);
Serial.println("Green to red");
// Finish condition
if(step =< 0) {
changeToRed = 0;
}
}
}
void loop() {
if (results.value == 0xFFE21D) {
changeToRed = 1;
step = 255;
}
greenToRed();
}https://stackoverflow.com/questions/56797493
复制相似问题