2016-08-24 3 views
0

функциональность:Arduino Light не отображается один раз, а в непрерывной последовательности

пользователь нажимает на красную кнопку купола Красный купол Кнопка, то предположим, чтобы сигнализировать о том, что buttonState ВЫСОКОЕ и на последовательном мониторе, он должен печатать «1» каждые 100 мс и после задержки 5 секунд: светодиодный индикатор будет находиться в состоянии HIGH, которое загорится примерно на 10 секунд, а после этого светодиод переключится в состояние «НИЗКИЕ», что означает светодиод будет выключен.

Следовательно, поток:

Правильное поведение:

начальное state-> Последовательный монитор показывает "0", когда пользователь нажмите кнопку -> Последовательные монитор отображает "1" на каждые 100 мс и после задержки 10 секунд состояние светодиода будет ВЫСОКИЙ.

и после задержки 10 секунд индикатор состояния будет низкой, дисплей серийный монитор еще на «1», на каждые 100 мс, чтобы сигнализировать о том, что buttonstate кнопки красного купола еще при высоких

Выпуск:

Текущее Поведение: начальное state-> Последовательный монитор показывает «0», когда пользователь нажмите кнопку -> Последовательный монитор отображает один «1», а не д воспроизведение непрерывного «1» с, но после задержки 10 секунд состояние светодиода будет ВЫСОКИЙ.

и после задержки 10 секунд состояние светодиода будет низким. В этот момент светодиод снова не должен быть HIGH, однако после задержки 10 секунд состояние светодиода становится HIGH и LOW после 10 секунд. Затем он становится петлей. дисплей последовательного монитора по-прежнему находится на «1», чтобы сигнализировать о том, что кнопка кнопки красного купола по-прежнему находится на уровне HIGH

Следовательно, как включить, когда кнопка нажата, будет отображаться непрерывный «1 »и задержкой в ​​10 секунд, светодиод будет состоять из HIGH и еще 10 с задержек, состояние светодиода будет низким. и индикатор остается состояние LOW затем даже, хотя, buttonstate находится на высоком

Код:

const int buttonPin = 2; //the number of the pushbutton pin 
const int Relay  = 4; //the number of the LED relay pin 

uint8_t stateLED = LOW; 
uint8_t  btnCnt = 1; 

int buttonState = 0; //variable for reading the pushbutton status 
int buttonLastState = 0; 
int outputState = 0; 

void setup() { 
    Serial.begin(9600); 
    pinMode(buttonPin, INPUT); 
    pinMode(Relay, OUTPUT); 
    digitalWrite(Relay, LOW); 
} 

void loop() { 

    // read the state of the pushbutton value: 
    buttonState = digitalRead(buttonPin); 
    // Check if there is a change from LOW to HIGH 
    if (buttonLastState == LOW && buttonState == HIGH) 
{ 
    outputState = !outputState; // Change outputState 
} 
buttonLastState = buttonState; //Set the button's last state 

// Print the output 
    if (outputState) 
{ 
    switch (btnCnt++) { 
    case 100: 
    stateLED = LOW; 
    digitalWrite(Relay, HIGH); // after 5s turn on 
    break; 

    case 200: 
    digitalWrite(Relay, LOW); // after 10s turn off 
    break; 

    case 102: // small loop at the end, to do not repeat the cycle 
    btnCnt--; 
    break;  
} 

Serial.println("1"); 
}else{ 
    Serial.println("0"); 
    if (btnCnt > 0) { 
    // disable all: 
    stateLED = LOW; 
    digitalWrite(Relay, LOW); 
} 
    btnCnt = 0; 
} 

delay(100); 
} 

ответ

0

Что вы ожидаете, когда у вас есть delay(10000), а затем delay(2000);. Когда он должен печатать эти «1» каждые 100 мс, если вы так долго ждали?

Ваше выходное состояние изменяется при смене кнопки, но вы можете пропустить эту часть с помощью состояния кнопки напрямую - это точно так же.

Я могу себе представить что-то подобное (непроверенные, это только концепция):

const int buttonPin = 2; 
const int Relay  = 4; 

uint8_t stateLED = LOW; 
uint8_t  btnCnt = 1; 

void loop() { 
    if (digitalRead(buttonPin) == HIGH) { 

    switch (btnCnt++) { 
     case 0: case 1: 
     stateLED = HIGH; // no idea, why is that in original code, but whatever 
     break; 

     case 50: 
     stateLED = LOW; 
     digitalWrite(Relay, HIGH); // after 5s turn on 
     break; 

     case 100: 
     digitalWrite(Relay, LOW); // after 10s turn off 
     break; 

     case 102: // small loop at the end, to do not repeat the cycle 
     btnCnt--; 
     break;  
    } 

    Serial.println("1"); 

    } else { 

    if (btnCnt > 0) { 
     Serial.println("0"); 
     // disable all: 
     stateLED = LOW; 
     digitalWrite(Relay, LOW); 
    } 
    btnCnt = 0; 

    } 

    delay(100); 
} 

void setup() { 
    Serial.begin(57600); 
    pinMode(buttonPin, INPUT); 
    pinMode(Relay, OUTPUT); 
    digitalWrite(Relay, LOW); 
} 
+0

что uint8_t? и мог ли я использовать Serial.begin (9600) вместо (57600)? это имеет значение? и поэтому я могу удалить весь случай 0, так как мне не нужно инициировать stateLED = HIGH в случае 0? – Luke

+0

Я протестировал, и я также отредактировал код. Я изменил Serial.begin (57600) на Serial.beign (9600), это позволяет мне Serial.printIn («0») или («1»). Я также изменил следующий код, так как ваше предложение будет только включать светодиод в состояние HIGH, когда я должен постоянно нажимать кнопку, иначе это будет LOW. Код, который я изменил, позволяет мне нажимать кнопку один раз, а «1» будет непрерывным без необходимости непрерывного нажатия кнопки. думаю, моя кнопка не является кнопкой состояния 2, поэтому мне нужно создать состояние переключения. – Luke

Смежные вопросы