Цикл atTiny85 до отсутствия чтения из Arduino ИЛИ тайм-аута

Я хотел бы ничего не зацикливать в моем atTiny, пока я не получу прочтение на конкретном входе или пока не будет достигнуто максимальное время. Чтение исходит от Arduino.

Вот мой пример кода, но он, похоже, не работает, код сразу выходит из цикла.

void openGate()
{
  //Set Read Gate to Pullup will LOW when closed and HIGH when open
  pinMode(readGate,INPUT_PULLUP); 

  //We want this PIN to output for the time the loop runs
  digitalWrite(pinGate, HIGH);

  whileCounter = 0;

  //Wait for Reading HIGH when the Arduino Opens the Output Pin
  //Or Exit when a certain time is reached
  while(digitalRead(readGate) == LOW || whileCounter >= waitTime ) { 

    delay(1);
    whileCounter++;  

  }
  digitalWrite(pinGate, LOW);
}

В Arduino я просто меняю PIN-код на OUTPUT, эта часть работает нормально.

pinMode(2, OUTPUT);
digitalWrite(2,LOW);

Заранее спасибо! Ваше здоровье

изменил код, как сказано в комментариях, в основной цикл

void loop(){
 if (f_wdt==1) {  // wait for timed out watchdog / flag is set when a watchdog timeout occurs
  if(circles <= count){
   //Start Setup our PINS and the millis to compare
   if(f_start==0){
    pinMode(pinGate,OUTPUT); //Set Gate as Output
    pinMode(readGate,INPUT_PULLUP); //Set Read Gate to Pullup will LOW when closed and HIGH when open
    unsigned long startMillis = millis(); //Snapshot of time
    f_start = 1;
   }
   if(f_start==1){
    digitalWrite(pinGate, HIGH); //Output High to MOSFET to open the gate
    if(digitalRead(readGate) == LOW) f_done = 1; //We got a signal, lets start new sleep circle
    unsigned long currentMillis = millis(); //Our current Millis
    if ((unsigned long)(currentMillis - startMillis) >= waitTime) f_done = 1;  //Timeout time is reached, lets start new sleep circle
   }

   if(f_done==1){
    digitalWrite(pinGate, LOW);
    pinMode(pinGate,INPUT); // set all used port to intput to save power
    pinMode(readGate,INPUT);
    f_start = 0;    // reset setup flag
    f_done = 0;     // reset open circle flag
    count = 0;      // reset sleep cycle count
    f_wdt=0;       // reset watchdog flag
    system_sleep(); // back to sleep little tiny
   }
  } else {
   count++;
   f_wdt=0;       // reset watchdog flag
   system_sleep(); // back to sleep little tiny
  }
 }
}

person Hannes Oberreiter    schedule 30.08.2016    source источник
comment
должно быть: while(digitalRead(readGate) == LOW && whileCounter < waitTime )?   -  person Pawel    schedule 30.08.2016
comment
Да, спасибо, также digitalRead ВЫСОКИЙ, потому что я использую INPUT_PULLUP   -  person Hannes Oberreiter    schedule 30.08.2016
comment
1. delay (1) довольно плох для построения счетчика тайм-аута. Проверьте и поймите пример BlinkWithoutDelay. 2. Обычно лучше всего, если вашему коду вообще не нужны циклы while. main loop () должен делать все это за вас.   -  person datafiddler    schedule 31.08.2016
comment
Привет, @datafiddler, спасибо за ввод, я изменил код, чтобы он находился внутри основного цикла, теперь много IF. Как вы думаете, так лучше? Всегда в поиске, чтобы улучшить свои навыки!   -  person Hannes Oberreiter    schedule 31.08.2016
comment
Конечно, так лучше. Если я вижу это правильно, вы можете сохранить один IF и переменную f_done, но, возможно, так будет понятнее. И никогда не бывает хорошо скрывать важную часть кода (определения переменных). Что такое круги?   -  person datafiddler    schedule 03.09.2016
comment
Привет, @datafiddler, вы можете увидеть мой полный код здесь github.com/HannesOberreiter/ bScale / blob / master / attiny / немного изменил все это сейчас, он работает уже 3 дня без проблем.   -  person Hannes Oberreiter    schedule 04.09.2016


Ответы (1)


Извините, это был мой мозговой пердун. INPUT_PULLUP является стандартным HIGH, а whileCounter был неправильным, как упоминал @Pawel.

  while(digitalRead(readGate) == HIGH && whileCounter <= waitTime ) { 

Извините.

person Hannes Oberreiter    schedule 30.08.2016