【问题标题】:How to set the LED to turn off from the start (Arduino)如何将 LED 设置为从一开始就关闭(Arduino)
【发布时间】:2016-10-12 06:28:44
【问题描述】:

我也是……我是 Arduino 的新手,我目前正在努力完成这项工作……但我已经做了一个小时了,运气不在我身边…… 以下是我正在做的事情的总结:我有一个 Gizduino + 644(在 Phil 有一个带有 ATmega 644 的 Arduino 副本),一个 IR 接近传感器(3 PIN - VCC,GRND,OUT),2 个 LED(红色和黄色)和 2 100ohms 电阻器。

到目前为止,这是我能做的:

  • 在 Arduino IDE 中,如果我键入“QRIN”- 接近和红色 LED 将打开...如果接近感应到其范围内的某些东西.. 黄色 LED 将打开。如果我输入“QROUT” - Proximity 将立即关闭,红色 LED 将打开 10 秒然后关闭..

这就是问题所在:

  • 如果是第一次运行,黄色 LED 总是会亮起(我的意思是我只需单击 IDE 中的上传按钮)......这是一个非常大的问题......它只会在我输入案例时关闭: 'QRIN' 和 'QROUT'..

在我的代码中,名称如下:

  • 红色 LED - 锁定
  • 黄色 LED - PROX_SENSOR_LED
  • 接近度 - PROX

这是我在 IDE 中的代码:

int LOCK = 13; //RED LED, in pin 13
int PROX = 12; //PROXIMITY, in pin 12
int ANALOG = 0; //OUT of Proximity,  in Analog 0
int PROX_SENSOR_LED = 7; //Yellow LED, in pin 7
int val = 0;  //value to store

void setup()
{
  Serial.begin(9600);
  pinMode(LOCK, OUTPUT); //set the pin # as output (VCC of the hardware)
  pinMode(PROX, OUTPUT); //set the pin # as output (VCC of the hardware)
  pinMode(PROX_SENSOR_LED, OUTPUT); //set the pin # as output (VCC of the hardware)
}

void loop()
{
  digitalWrite(PROX_SENSOR_LED, LOW); //sets the output pin initially to LOW (but doesnt work.. T_T)
  val = analogRead(ANALOG);  //read the input pin 0 to 1023
  if (val > 800)    //if the sensor value is higher threshold set OUTPUT HIGH
  {
    digitalWrite(PROX_SENSOR_LED, HIGH);  //sets output pin HIGH
    delay(100);    //waits for .1 second
  }

  char data = Serial.read(); //read 9600

  switch (data) //start of case... like 'ON' 'OFF'
  {
    case 'QRIN': //this is my 'ON'
                digitalWrite(PROX, HIGH); //turn the proximity to ON
                digitalWrite(LOCK, HIGH); //turn the lock to ON
                break;
    case 'QROUT': //this is my off 'OFF'
                digitalWrite(PROX, LOW); //turn the proximity to OFF
                digitalWrite(LOCK, HIGH); //turn the lock to ON
                delay(10000);              //for 10 seconds
                digitalWrite(LOCK, LOW);   //then off
                if (ANALOG = HIGH)  // I need this 'if' condition because if
                {    //this is not here... the Yellow LED is turn ON... 
                  digitalWrite(PROX_SENSOR_LED, LOW); //I don't know why.. T_T
                }
                break;
  }
}

【问题讨论】:

    标签: c arduino embedded arduino-ide


    【解决方案1】:

    将该行放在 setup() 的末尾:

    digitalWrite(PROX_SENSOR_LED, LOW);
    

    另外,if (ANALOG = HIGH) 是一个错误的陈述,您将 HIGH 分配给您的 ANALOG。改成if (ANALOG == HIGH)

    【讨论】:

    • 也将 prints 放入 switch case 语句中,看看您在串行读取中是否有任何问题。
    • 复位后输出为三态,设置为输出时默认为低电平,因此不需要在设置中添加额外代码。大概是第一次循环它从模拟 0 读取并获得大于 800 的值,然后在更改为从模拟 1 读取之后(由于 ANALOG = HIGH 错误, HIGH 为 1 )它不再获得大于 800 的值,所以下一个问题是为什么值 > 800 - 也许传感器输出反转?
    • @PeteKirkham 是的,正如你所说,模拟读取可能得到 5v,因此分配为 1024。所以我会让用户将额外的调试行放入 switch 语句中。
    【解决方案2】:

    所有 GPIO 将在高阻抗输入状态下启动,因此对 LED 的控制处于浮动状态 - 在这种情况下 LED 的状态将取决于 LED 驱动电路以及它是否具有上拉或上拉降电阻。也就是说是硬件问题不是软件问题。

    上传期间,Arduino 引导加载程序正在运行,它不会初始化上传过程不需要的任何 I/O。如果您无法修复硬件设计使其浮动到关闭状态,那么您需要modify the bootloader 以便尽早关闭 LED - (仍然会出现可能会或可能不会出现的故障)。这可能是个坏主意,因为您有一个特定于应用程序的引导加载程序而不是通用引导加载程序,并且对于其他应用程序设置此 I/O 引脚可能完全不受欢迎。

    也就是说,尚不完全清楚为什么 LED 在上传期间亮起是一个问题,在大多数情况下,简单地初始化 setup() 中的输出似乎是可以接受的。

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      相关资源
      最近更新 更多