2016-08-25 2 views
0

Функциональность:Предотвращение ButtonState Переключение от высокого к низкому

Перед красная кнопка купол нажата (не 2 состояние кнопки), серийный монитор напечатает список «0», и когда красный кнопка купола, состояние кнопки переключается с LOW на HIGH, поэтому на последовательном мониторе будет распечатываться список «1».

Однако, когда кнопка находится в состоянии ВЫСОКИЙ, серийный монитор печатает «1», и пользователь не сможет переключать состояние кнопки от HIGH до LOW. Следовательно, кнопка может переключаться только с HIGH на LOW автоматически после периода, задержки (25 секунд).

Поэтому правильное поведение:

Исходное состояние печати => 00000000000000 (когда пользователь нажимает на красную кнопку купольной => изменение buttonstate низкого до высокого) 111111111111111111 (когда пользователь нажимает на кнопку, ничего не происходит) 111111111111111111 (после задержки 25s, buttonState будет переключаться от высокого к низкому) 0000000000000

НОМЕРА:

На данный момент пользователи могут переключаться между LOW и HIGH, а HIGH - LOW. Значение: поток => 00..000 (кнопка нажимается пользователем, переключается с LOW на HIGH) 111 ... 111 (кнопка нажимается пользователем, переключается с HIGH на LOW) 0000 ...

И я не совсем уверен в как включить кнопку только для переключения с LOW на HIGH, но отключите кнопку для переключения с HIGH на LOW.

Значение, когда пользователь нажимает кнопку, может изменять состояние кнопки от «0» до «1», но не может изменить состояние кнопки, когда оно находится в «1».

Следовательно, я хотел бы запросить некоторую помощь, которая позволит выполнить следующее правильное поведение.

Благодаря

Код:

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 10s turn on 
     break; 

     case 250: 
     digitalWrite(Relay, LOW); // after 20s turn off 
     //Toggle ButtonState to LOW from HIGH without user pressing the button 
     digitalWrite(buttonPin, LOW); 
     break; 

     case 252: // small loop at the end, to do not repeat the LED 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

Вам нужно установить outputState и пусть он установлен, пока он не будет сброшен через 25 секунд. Если кнопка все еще нажата, то это будет цикл на 251.

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; 

bool outputState = false; 

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

void loop() { 

    outputState |= digitalRead(buttonPin); // if pushButton is high, set outputState (low does nothing) 

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

     case 250: 
     digitalWrite(Relay, LOW); // after 20s turn off 
     //Toggle ButtonState to LOW from HIGH without user pressing the button 
     outputState = false; // reset state to low 
     break; 
     case 251: // loop (it might happen, if previous step sets outputState=false but button is still pressed -> no action) 
     --btnCnt; 
     outputState = false; 
     break; 
    } 

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

    delay(100); 
} 
+0

Чтобы подтвердить, что это позволить buttonState оставаться включенными в ВЫСОКОМ: «1», для установленного периода времени, пока по истечению времени (20 лет) , он автоматически переключится на LOW. Во-вторых, когда buttonState находится в HIGH в течение периода (20 с), переключение HIGH -> LOW не произойдет. я прав? – Luke

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

  • Нет связанных вопросов^_^