Светодиод иногда не гаснет при нажатии кнопки

led

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

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

Проблема, с которой я сталкиваюсь, заключается в том, что случайно, в 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 -- */



  

, 👍3

Обсуждение

вставьте слой разделения между нажатием кнопки и полученным действием ... сделайте то же самое с ИК-кодами.... нажатие кнопки приводит к тому, что переменная флага устанавливается 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


1 ответ


3

Нашел ответ!

Я добавил серийную печать к каждой строке и понял, что мой процесс убийства по истечении времени переключался между красным и зеленым светодиодами.

Мне не нужна была функция 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 -- */


,