【问题标题】:How to make a led turn on for 5 seconds after bluetooth command如何在蓝牙命令后使 LED 亮 5 秒
【发布时间】:2015-04-22 23:54:37
【问题描述】:

我想通过 galileo gen 2 上的蓝牙模块 (hc 05) 控制一个 LED。我需要以下程序:发送一个字符后,比如说“1”,连接到引脚 2 的 LED 亮 5 秒,然后然后它关闭并等待另一个命令。我怎么能这样做?

我试过代码: (这实际上适用于 Galileo Gen 2,但我的蓝牙工作正常,我在其他示例中检查了打开和关闭 LED)

include TimerOne.h

TTYUARTClass* gSerialOnePtr = &Serial1;
char input;
int led = 2;
long offAt = 0;

enum States  // set values for enum Mode
{   
    on,
    off
};

States currentState, nextState;

void setup()
{
  Timer1.initialize(1000000); // seting interrupt time to 1 sec
  Timer1.attachInterrupt(checkBluetooth); // Declaring ISR Function name
  gSerialOnePtr->begin(9600);        //start serial connection
 pinMode(led, OUTPUT); 
  currentState = off;
}

void loop()
{
  switch(currentState)    // android app sends letters from A to I each letter turn on different Mode.
   { 
     case on://red color
       ledOn();
       break;

     case off://green color
       ledOff();
       break;       

     default: 
       ledOff();
       break;
   }
  currentState = nextState;  //saving next mode in current mode.
}

 void checkBluetooth()        //ISR for timer1
{

    if(gSerialOnePtr->available())  // checking if data arrived from bluetooth module.
    {
      input = gSerialOnePtr->read();  // save character from serial in bt.

      if(input == '1')         
      {
        currentState = on;
      }
      else if(input == '2')         
      {  
        currentState = off;
      }
    }
}

void ledOn()
{
  if( (digitalRead(led) == LOW ) ) 
  { 
    digitalWrite(led, HIGH);
    offAt = millis() + 5000; //store var of now + 5 seconds
  }

  if(digitalRead(led) == HIGH) //if led is on
  {
      if(millis() >= offAt) //see if it's time to turn off LED
      {
         digitalWrite(led, LOW); //it's time. this also re-enables the button
      }
  }
}
void ledOff()
{
  digitalWrite(led, LOW);
}

它还没有工作......

【问题讨论】:

  • 我编辑了问题,代码如上所示

标签: bluetooth arduino led


【解决方案1】:

我认为你的问题是线

currentState = nextState;  //saving next mode in current mode.

尝试评论它。或者,如果你想以我认为你想要的方式使用它,你必须写

void setup()
{
  [...]
  currentState = off;
  nextState = off;
}

[...]

void checkBluetooth()        //ISR for timer1
{
    if(gSerialOnePtr->available())
    {
      input = gSerialOnePtr->read();  // save character from serial in bt.

      if(input == '1')         
      {
        nextState = on;
      }
      else if(input == '2')         
      {  
        nextState = off;
      }
    }
}

顺便说一句,我也会写

while(gSerialOnePtr->available())

因此,如果您向其发送一个 10 字节的数组,则不必等待 10 秒...我个人也会将中断时间减少到 0.1 秒,但这不是强制性的..

编辑:

要在 5 秒后关闭,我会写

NON RETRIGGERABLE METHOD(即,如果您在开启时发送“1”,它将被丢弃)

unsigned long startTime;

void setup()
{
  [...]
  startTime = 0;
}

[...]

void ledOn()
{
    digitalWrite(led, HIGH);

    if (millis() - startTime > 5000)
        nextState = off;
}

void ledOff()
{
    digitalWrite(led, LOW);
    startTime = millis();
}

RETRIGGERABLE METHOD(即,如果您在 5 秒后发送“1”将重新开始)

unsigned long startTime;

void setup()
{
  [...]
  startTime = 0;
}

[...]

void checkBluetooth()
{
    [...]
        if(input == '1')         
        {
            nextState = on;
            startTime = millis();
        }
        else if(input == '2')         
        { 
    [...]
}    

void ledOn()
{
    digitalWrite(led, HIGH);

    if (millis() - startTime > 5000)
        nextState = off;
}

void ledOff()
{
    digitalWrite(led, LOW);
}

【讨论】:

  • 您好,感谢您的建议。我试过了,但是当我发送“1”时,led 会打开并且永远不会关闭。如果关闭,我必须发送“2”然后关闭。我想要做的是当我发送“1”时,led 应该只打开 5 秒并自动关闭......有可能这样做吗?
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 2016-05-08
  • 2022-01-07
  • 2016-05-07
  • 2018-07-08
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多