Светодиод иногда не гаснет при нажатии кнопки
Я все еще новичок в этом деле, но я собрал некоторый код, который при нажатии кнопки мой сервопривод работает непрерывно, вторая кнопка вращает его в другую сторону, а третья отменяет все.
В зависимости от поворота загорается красный или зеленый свет, и это может быть также сигнал с помощью ИК-приемника.
Проблема, с которой я сталкиваюсь, заключается в том, что случайно, в 1/5 случаев, красный или зеленый светодиод не гаснет. Я могу вручную убить его с помощью третьей кнопки отмены или просто нажать пару раз, пока он не выключится, как это должно быть при следующем нажатии кнопки.
Не могу понять, где я ошибаюсь.
Я также нахожу, что мой ИК-пульт работает, возможно, в 60% случаев. Любая помощь будет очень признательна.
#include <Servo.h>
Servo servo1;
int servoPin = 9;
#include "IRremote.h"
/*----- Variables, Pins -----*/
int receiver = 12; // Signal Pin of IR receiver to Arduino Digital Pin 6
int RledPin = 5;
int GledPin = 3;
int buttonApin = 7;
int buttonBpin = 8;
int buttonCpin = 4;
unsigned long elapsedTime;
unsigned long onTime;
/*-----( Declare objects )-----*/
// Setup of proper sequencing for Motor Driver Pins
// In1, In2, In3, In4 in the sequence 1-3-2-4
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results; // create instance of 'decode_results'
void setup()
{
irrecv.enableIRIn(); // Start the receiver
servo1.attach(servoPin);
servo1.write(90);
pinMode(RledPin, OUTPUT);
pinMode(GledPin, OUTPUT);
pinMode(buttonApin, INPUT_PULLUP);
pinMode(buttonBpin, INPUT_PULLUP);
pinMode(buttonCpin, INPUT_PULLUP);
}
void loop(){
if (digitalRead(buttonApin) == LOW) // Switch is closed to start LED timer
{
digitalWrite(RledPin, HIGH); // Red LED comes On
digitalWrite(GledPin, LOW); // Green LED Goes Off
servo1.attach(servoPin); //Servo is activated
servo1.write(0); //Servo turns on clockwise
onTime = millis(); //time set
}
if(onTime > 0 && millis() - onTime > 1500) //time limit target
{
servo1.write(90); //Servo stops
servo1.detach(); //servo deactivated
delay(500); //used to sync the servo stop with the LED off
digitalWrite(RledPin, LOW); // LED goes off
onTime = 0; //time reset
}
if (digitalRead(buttonCpin) == LOW) // Switch is closed to start LED timer
{
digitalWrite(GledPin, HIGH); // Green LED comes On
digitalWrite(RledPin, LOW); // RED LED Goes Off
servo1.attach(servoPin); //Servo is activated
servo1.write(180); //Servo turns on anti-clockwise
onTime = millis(); //time set
}
if(onTime > 0 && millis() - onTime > 1500) //time limit target
{
servo1.write(90); //Servo stops
servo1.detach(); //servo deactivated
delay(500);
digitalWrite(GledPin, LOW);
onTime = 0; //time reset
}
if (digitalRead(buttonBpin) == LOW) //Deactivation Sequence KILL SWITCH
{
digitalWrite(RledPin, LOW);
digitalWrite(GledPin, LOW);
servo1.write(90);
servo1.detach();
onTime = 0; //time reset
}
if (irrecv.decode(&results)) // have we received an IR signal?
{
switch(results.value)
{
case 0xFFE01F: // DOWN button pressed
{
digitalWrite(RledPin, HIGH); // Red LED comes On
digitalWrite(GledPin, LOW); // Green LED Goes Off
servo1.attach(servoPin); //Servo is activated
servo1.write(0); //Servo turns on clockwise
onTime = millis(); //time set
}
if(onTime > 0 && millis() - onTime > 2000) //time limit target
{
servo1.write(90); //Servo stops
servo1.detach(); //servo deactivated
digitalWrite(RledPin, LOW); // LED goes off
onTime = 0; //time reset
}
break;
case 0xFF906F: // UP button pressed
{
digitalWrite(GledPin, HIGH); // Green LED comes On
digitalWrite(RledPin, LOW); // RED LED Goes Off
servo1.attach(servoPin); //Servo is activated
servo1.write(180); //Servo turns on anticlockwise
onTime = millis(); //time set
}
if(onTime > 0 && millis() - onTime > 2000) //time limit target
{
servo1.write(90); //Servo stops
servo1.detach(); //servo deactivated
digitalWrite(GledPin, LOW); // LED goes off
onTime = 0; //time reset
}
break;
case 0xFF02FD: // PAUSE button pressed
servo1.write(90);
servo1.detach();
digitalWrite(GledPin, LOW);
digitalWrite(GledPin, LOW);
break;
}
irrecv.resume(); // receive the next value
}
}/* --end main loop -- */
@Nathan Cooper, 👍3
Обсуждение1 ответ
Нашел ответ!
Я добавил серийную печать к каждой строке и понял, что мой процесс убийства по истечении времени переключался между красным и зеленым светодиодами.
Мне не нужна была функция if time elapsed много раз, только один раз. Удалил эту часть, и она работала отлично. Кажется, он тоже исправил проблемы с ИК.
Рабочий код:
#include <Servo.h>
Servo servo1;
int servoPin = 9;
#include "IRremote.h"
/*----- Variables, Pins -----*/
int receiver = 12; // Signal Pin of IR receiver to Arduino Digital Pin 6
int RledPin = 5;
int GledPin = 3;
int buttonApin = 7;
int buttonBpin = 8;
int buttonCpin = 4;
unsigned long elapsedTime;
unsigned long onTime;
/*-----( Declare objects )-----*/
// Setup of proper sequencing for Motor Driver Pins
// In1, In2, In3, In4 in the sequence 1-3-2-4
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results; // create instance of 'decode_results'
void setup()
{
irrecv.enableIRIn(); // Start the receiver
servo1.attach(servoPin);
servo1.write(90);
pinMode(RledPin, OUTPUT);
pinMode(GledPin, OUTPUT);
pinMode(buttonApin, INPUT_PULLUP);
pinMode(buttonBpin, INPUT_PULLUP);
pinMode(buttonCpin, INPUT_PULLUP);
Serial.begin(9600);
pinMode(LED_BUILTIN, HIGH);
}
void loop(){
if (digitalRead(buttonApin) == LOW) // Switch is closed to start LED timer
{
digitalWrite(RledPin, HIGH); // Red LED comes On
Serial.println("RED comes on");
digitalWrite(GledPin, LOW); // Green LED Goes Off
Serial.println("green off");
servo1.attach(servoPin); //Servo is activated
Serial.println("red servo attach");
servo1.write(0); //Servo turns on clockwise
Serial.println("red servo spins");
onTime = millis(); //time set
}
if(onTime > 0 && millis() - onTime > 1500) //time limit target
{
servo1.write(90); //Servo stops
Serial.println("servo stops spinning");
digitalWrite(RledPin, LOW); // LED goes off
digitalWrite(GledPin, LOW); // LED goes off
Serial.println("red RED goes off");
delay(500);
Serial.println("delay");
servo1.detach(); //servo deactivated
Serial.println("servo Rled dettach");
onTime = 0; //time reset
}
if (digitalRead(buttonCpin) == LOW) // Switch is closed to start LED timer
{
digitalWrite(GledPin, HIGH); // Green LED comes On
Serial.println("green comes on");
digitalWrite(RledPin, LOW); // RED LED Goes Off
Serial.println("RED goes off");
servo1.attach(servoPin); //Servo is activated
Serial.println("green servo attached");
servo1.write(180); //Servo turns on clockwise
Serial.println("green servo spins");
onTime = millis(); //time set
}
if (digitalRead(buttonBpin) == LOW) //Dectivation Sequence KILL SWITCH
{
digitalWrite(RledPin, LOW);
Serial.println("total red off");
digitalWrite(GledPin, LOW);
Serial.println("total green off");
servo1.write(90);
Serial.println("total servo off");
servo1.detach();
Serial.println("total detach");
onTime = 0; //time reset
}
if (irrecv.decode(&results)) // have we received an IR signal?
{
switch(results.value)
{
case 0xFFE01F: // DOWN button pressed
{
digitalWrite(RledPin, HIGH); // Red LED comes On
digitalWrite(GledPin, LOW); // Green LED Goes Off
servo1.attach(servoPin); //Servo is activated
servo1.write(0); //Servo turns on clockwise
onTime = millis(); //time set
}
break;
case 0xFF906F: // UP button pressed
{
digitalWrite(GledPin, HIGH); // Green LED comes On
digitalWrite(RledPin, LOW); // RED LED Goes Off
servo1.attach(servoPin); //Servo is activated
servo1.write(180); //Servo turns on clockwise
onTime = millis(); //time set
}
break;
case 0xFF02FD: // PAUSE button pressed
servo1.write(90);
digitalWrite(GledPin, LOW);
digitalWrite(GledPin, LOW);
delay(500);
servo1.detach();
break;
}
irrecv.resume(); // receive the next value
}
}/* --end main loop -- */
- Питание светодиодной ленты - Сколько ампер?
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Светодиод L продолжает гореть
- Улучшенное циклическое переключение цветов RGB.
- Плавное мигание светодиодов
- Остановить мигание светодиодов
- FastLED - Как управлять определенными светодиодами
вставьте слой разделения между нажатием кнопки и полученным действием ... сделайте то же самое с ИК-кодами.... нажатие кнопки приводит к тому, что переменная флага устанавливается
DOR = true;
.....case 0xFFE01F:
делает то же самое.... ни один из них не делает ничего другого, просто установите флаг и продолжайте.... далее вloop ()
, действуйте на состояние флагаif (DOR) {
, @jsotolaПожалуйста, примите стиль отступа и придерживайтесь его. Ваш источник едва читаем. Многие проблемы проявляются в последовательном отступе., @the busybee
Вставьте некоторые результаты отладки, чтобы увидеть, что именно происходит в вашей программе., @the busybee
Вы разбираете кнопки в аппаратном обеспечении? Если нет, то вам нужно разоблачить их в программном обеспечении с помощью [debouncer](https://github.com/TimMathias/Arduino-Debouncer). Это устранит случайные сбои, поскольку контакты переключателя подпрыгивают при переключении., @tim
@jsotola Спасибо за ответ, извините за глупость, но когда вы говорите добавить слой разделения, что это значит?, @Nathan Cooper
@tim Спасибо за предложение, я читал статьи, в которых упоминаются дебоширы, но ничего о них не знаю. Я уйду и займусь этим, спасибо., @Nathan Cooper
@NathanCooper ... не разделено
если кнопка нажата, то включается светодиод
.... разделено " если кнопка нажата, то установите флаг....
если флаг установлен, то включите светодиод` .... флаг может быть установлен несколькими событиями ... только одна функция проверяет флаг и активирует светодиод, @jsotola