Как отложить выключение реле (миллис) - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь включить реле на 5 с, когда нажимаю кнопку (U), а затем выключаю его.Затем включите второй на 10 секунд и выключите его. Я хотел бы использовать функцию миллис для управления 8 реле через разные промежутки времени.Пожалуйста, исправьте мой код.

Почему это не работает?(код с одним реле)

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int ssr1 = 2;                                     
int ssr2 = 3;

int lcd_key     = 0;
int adc_key_in  = 0;

#define R   0
#define U   1
#define D   2
#define L   3
#define S   4
#define N   5

unsigned long interval = 5000;
unsigned long previousMillis = 0;

int read_LCD_buttons(){               
adc_key_in = analogRead(0);  

if (adc_key_in > 1000) return N;    
if (adc_key_in < 50)   return R;  
if (adc_key_in < 250)  return U; 
if (adc_key_in < 450)  return D; 
if (adc_key_in < 650)  return L; 
if (adc_key_in < 850)  return S;    

return N;   
}
   void setup(){
   lcd.begin(16, 2);               
   lcd.setCursor(0,0);            
   lcd.print("Select:");  
   pinMode(3, OUTPUT);   
}

void loop(){  

   unsigned long currentMillis = millis();

   lcd.setCursor(0,1);             
   lcd_key = read_LCD_buttons();  

   switch (lcd_key){               

       case U:{              
           digitalWrite(3, HIGH);               
           if ((unsigned long)(currentMillis - previousMillis) >= interval){               
           digitalWrite(3, LOW);              
           previousMillis = millis();               
           }  
           lcd.print("START");            
           break;             
       }            
       case D:{
             digitalWrite(3, LOW);
             lcd.print("STOP");                                     
             break;
      }
      case N:{                                                    
             break;
      }
  }
}

1 Ответ

0 голосов
/ 05 декабря 2018

Я предлагаю вам ознакомиться с различными уроками Arduino.Однако, основываясь на вашем запросе, я включил пример кода ниже.Обратите внимание, что это не было проверено.Тем не менее, вы должны получить представление о логике и соответственно адаптироваться.Есть много других способов достижения того же результата.

int relayState = RELAY_STATE_OFF; // track state of the relay
unsigned long relayOnAt = 0; // time at which relay was turned ON

void relay(int turnOn)
{
  if( turnOn == ON ) digitalWrite(3,HIGH);
  else digitalWrite(3,LOW);
}

void processRelay(int operateRelay) 
{
  switch(relayState){
    case RELAY_STATE_OFF: 
           if( operateRelay == 1) {
             relay(ON);
             relayState = RELAY_STATE_ON;
             relayOnAt = millis(); // remember when the relay was turned on
           }
           break;
    case RELAY_STATE_ON: // wait here for interval seconds to elapse
          if( millis() - relayOnAt >= interval) {
            relay(OFF);
            relayState = RELAY_STATE_OFF; // go back to checking key input
          }
          break;
    default:
        relayState = RELAY_STATE_OFF;
        break;
  }
}

int operateRelay = 0;
void loop(){  
   lcd.setCursor(0,1);             
   lcd_key = read_LCD_buttons();  

   operateRelay = 0;
   if( lcd_key == U ) {
     operateRelay = 1;
   }
   processRelay(operateRelay);

}
...