【问题标题】:atTiny85 loop till no read from arduino OR timeoutatTiny85 循环直到没有从 arduino 读取或超时
【发布时间】:2016-08-30 16:19:31
【问题描述】:

我不想在我的 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);

提前致谢! 干杯

将 cmets 中的代码更改到主循环中

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
  }
 }
}

【问题讨论】:

  • 应该是:while(digitalRead(readGate) == LOW &amp;&amp; whileCounter &lt; waitTime )?
  • 是的,谢谢,digitalRead 也很高,因为我使用 INPUT_PULLUP
  • 1. delay(1) 构建超时计数器是相当糟糕的。检查并理解 BlinkWithoutDelay 示例。 2. 通常,如果您的代码根本不需要 while 循环,那么您最好。主循环()应该为你做所有这些事情。
  • 嗨@datafiddler 感谢您的输入,我将代码更改为在主循环内,现在有很多 IF。你认为这更好吗?一直在寻找提高我的技能!
  • 当然更好。如果我没看错,你可能会保存一个 IF 和变量 f_done,但这样可能更清楚。隐藏代码的重要部分(变量定义)从来都不是一件好事。什么是圆圈

标签: arduino attiny


【解决方案1】:

对不起,是我放屁。 INPUT_PULLUP 是标准的 HIGH,而正如@Pawel 提到的,whileCounter 是错误的方法。

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

对不起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多