2016-08-30 38 views
0

我想在我的atTiny循环,直到我得到一个特定的输入读取或达到最大时间。阅读来自Arduino。atTiny85循环直到没有从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 
    } 
} 
} 
+0

应该是:'while(digitalRead(readGate)== LOW && whileCounter Pawel

+0

是的,谢谢,digitalRead也是HIGH,因为我使用INPUT_PULLUP –

+0

1. delay(1)建立超时计数器相当糟糕。检查并了解BlinkWithoutDelay示例。 2.通常,如果你的代码根本不需要while循环,那么你最好。主循环()应该为你做所有这些东西。 – datafiddler

回答

0

对不起,被我大脑放屁。 INPUT_PULLUP是标准的HIGH,而@Pawel提到的Counter是错误的。

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

对不起。