【问题标题】:Unable to toggle Arduino State from HIGH to LOW after delay延迟后无法将 Arduino 状态从高切换到低
【发布时间】:2016-10-21 14:57:32
【问题描述】:

功能:

Arduino 使用以下功能: 1.红外传感器 2. LED灯 3. 马达风扇 4. 接力

因此,当用户接近 IR 传感器时,它会给出一个 serialPrint 为“1”,因为它检测到接近,这会将 LED 和电机风扇的状态从 LOW 切换到 HIGH。但是,5s 后,motorfan 的状态会从 HIGH 切换到 LOW,而 LED 的状态仍然会保持 HIGH,只要 serialPrint 为 '1' 就会保持 HIGH。

但是,当用户离开红外传感器附近时,LED 状态会在 10 秒后从高电平切换到低电平。

我做了什么:

我做过的代码:

const int signalPin = 1; //wire pin to analog for IR Sensor 


//Motor-Fan Relay
byte FanRelay = 4;
byte LightRelay = 6;

int IRSignal; //variable signal, will hold the analog value read by Arduino


 long duration;
int distance;
unsigned long Timer;
unsigned long Interval = 10000; //teh repeat Interval
unsigned long MotorFanOff = 5000;

void setup() 
{
  //Execute only once at startup 

  //pinMode (FanPin , OUTPUT) ; // Set pinMode for FanPin as OUTPUT, display  
  pinMode (signalPin, INPUT);  //infared sensor line will be an input to the Arduino
  pinMode(FanRelay, OUTPUT);
  pinMode(LightRelay, OUTPUT);
   Serial.begin(9600); // Open serial port to communicate with the Ultrasaonic Sensor
}

void loop() 
{

  //execute multiple times in a loop

  IRSignal = analogRead(signalPin); //arduino reads the value from the infared sensor
  distance = 9462 / (IRSignal -16.92);
  if(distance < 30 && distance > 0)
  {
     Timer = millis(); 
     // Write a pin of HIGH
     Serial.println("1");
    //Set motor-fan to operate

    digitalWrite (FanRelay, HIGH);
    digitalWrite (LightRelay, HIGH);

     //After a delay of 5s, MotorFan will toggle to LOW
    //Toggle MotorFan to LOW after 5s
    if ((millis()-Timer)>MotorFanOff){

       digitalWrite (FanRelay, LOW);
    }
  }
  else
  {

     Serial.println("0");
     //Check if Timer is longer than 10s

     if ((millis()-Timer)>Interval){

        digitalWrite (LightRelay, LOW);
        digitalWrite (FanRelay, LOW);
     }

  }
  delay(1000);
}

问题:

此时,在测试时,当红外传感器的 serialPrint 为“1”时,LED 和电机风扇的状态都会从低切换到高。但是,我面临的主要问题是 MOTORFAN 的状态在 5 秒后不会从 HIGH 切换到 LOW,但是当 serialPrint 为“0”时,这两种状态都只会切换到 LOW。

那么,我做错了什么?请帮助。谢谢。

【问题讨论】:

    标签: arduino arduino-uno


    【解决方案1】:

    小心! Arduino 上的前两个引脚用于串行通信,如果您将它们用于其他用途,则会中断。切换到更高的引脚号,问题应该会消失。

    【讨论】:

    • 更高的密码?你指的是arduino的数字引脚吗?继电器使用了这 2 个引脚号,这无关紧要
    • 我快速检查了我的微型板(可能不一定与您的板相对应),但在这里,引脚 0 和 1 用于串行通信。您写道,signalPin 正在使用引脚 1。那肯定是串行引脚之一。将它们切换到另一个引脚,它应该可以工作(如果代码正确,我还没有检查)。
    • 哦,但我使用模拟 PIN 1 来阅读。这也有关系吗?
    • 哎呀-我的错!不,你是对的,那应该没关系 [开始深入分析,因为还没有其他答案......] ... ... ...好的,分析了你的代码,我可以告诉你if ((millis()-Timer)&gt;MotorFanOff) 永远不会是真的。问题是它是一个 if,而不是一个“waitFor”。它将评估为假,然后循环函数将退出(延迟 1 秒)并重新开始。检查距离,如果 distance 落入所需的时间间隔,则计时器重置,然后检查 MotorFanOff 超时,这将再次失败,因为这或多或少为 0。
    • 好的!我对这个类比有点迷失了,对if ((millis()-Timer)&gt;MotorFanOff) 的 if 条件的评估永远不会是真的,因为它不应该计算 5 秒,而如果条件,距离是真的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多