2015-11-09 6 views
2

Я застреваю, пытаясь получить определенные фрагменты кода для запуска только один раз для нажатия кнопки (digitalRead).Код запуска После нажатия кнопки - Arduino

void setup() { 
    // Set up and init all outputs to off 
    pinMode(2, INPUT); 
    pinMode(7, INPUT); 

    Serial.begin(9600); 
    while (!Serial); 
    Serial.println("Test"); 

    for(byte i = 0; i<OutputCount; i++){ 
     pinMode(outputs[i][OutputPin], OUTPUT); 
     digitalWrite(outputs[i][OutputPin], LOW); 

     // Set up an event fuse for this output. 
     eventFuse.newFuse(i, outputs[i][OffTime], INF_REPEAT, OutputHandler); 
    } 

    // Set MsTimer2 for one second per tick. 
    MsTimer2::set(100, timerTick); 
    MsTimer2::start(); 
} 

void loop(){ 
    if (digitalRead(2) == HIGH) { 
     while (i < 1){ 
      switchPos = 2; 
      MsTimer2::start(); 
      i++; 
     } 
    } 
    else if (digitalRead(7) == HIGH) { 
     while (i < 1){ 
      switchPos = 7; 
      MsTimer2::stop(); 
     } 
    } 
    else { 
     switchPos = 0; 
     i = 0; 
    } 
} 

Приведенный выше код использует коробчатый стандартный пример Lamp Timer, который поставляется с библиотеками MsTimer2 и EventFuse.

В секции цикла есть несколько циклов, в которых шов будет бесконечным. Все, что мне нужно, это война, чтобы запустить код, который вы видите внутри циклов while, только один раз. Есть идеи?

Любая помощь была бы высоко оценена!

Благодаря

+0

Что вы пытаетесь достичь с помощью петель? У вас есть один одноионный цикл (т. Е. Не служит никакой дополнительной цели) и один бесконечный цикл. Кроме того, где вы определяете i? – ajshort

+0

Возможно, вы забыли 'i ++' во втором 'while' в' loop() '. – MikeCAT

ответ

2

Простая реализация с использованием некоторых флагов:

int twoFlag, sevenFlag; 

void loop(){ 
    if (digitalRead(2) == HIGH) { 
     if (!twoFlag) { 
      switchPos = 2; 
      MsTimer2::start(); 
      delay(10); // to avoid errors from chattering or bouncing 
      twoFlag = 1; 
     } 
    } else { 
     twoFlag = 0; 
    } 
    if (digitalRead(7) == HIGH) { 
     if (!sevenFlag) { 
      switchPos = 7; 
      MsTimer2::stop(); 
      delay(10); // to avoid errors from chattering or bouncing 
      sevenFlag = 1; 
     } 
    } else { 
     sevenFlag = 0; 
    } 
} 
Смежные вопросы