Итак, я пытаюсь создать программу, которая запускает различные последовательности света, используя плату 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;
*/
}