从蓝牙打开继电器一定秒数

Turn relay on from Bluetooth for certain amount of seconds

我正在研究 arduino 和 android phone 之间的双向通信。目前一切正常,但是我最近一直在努力解决几个问题。

  1. 如何才能点燃点火5秒?我的意思是如果 IgnitionPin 处于高电平,运行 它持续 5 秒然后自动关闭?有一种简单的延迟方法,但它在我的情况下不起作用,因为不希望任何其他延迟减慢我的脚本。

  2. 我正在使用 Arduino Uno。我想用 OFF 位置的引脚启动我的 Arduino。为什么 pin 10 总是打开然后关闭,即使使用 digitalWrite(IgnitionPin, HIGH);我试过其他引脚,它们工作正常 -> 启动时关闭。

SoftwareSerial BTserial(12,13);

char choice;

const int loopDelay = 50;

int IgnitionPin = 10;
const long ignitionInterval = 5000;
int ignitionState = HIGH;
unsigned long previousMillis = 0;

void setup() 
{
  BTserial.begin(115200);  

  digitalWrite(IgnitionPin, HIGH);
  pinMode(IgnitionPin, OUTPUT);
}
 
void loop()
{
  if (BTserial.available())
  {
    choice = BTserial.read();
  }

  if( choice == 'm' )
  {
    ignitionState = HIGH;
    digitalWrite(IgnitionPin, ignitionState);
    ignitionCountTime = millis();
  }

  if (ignitionCountTime - previousMillis >= ignitionInterval) {

    previousMillis = ignitionCountTime;

    if (ignitionState == HIGH) 
    {
      ignitionState = LOW;
    }

    digitalWrite(IgnitionPin, ignitionState);
  }
 
 delay(loopDelay);
}

编辑:

SoftwareSerial BTserial(12,13);

char choice;

const int loopDelay = 50;

int IgnitionPin = 10;
unsigned long startTime;
unsigned long ignitionInterval = 30000;
unsigned long ignitionCountTime = 0;

void setup() 
{
  BTserial.begin(115200);  

  digitalWrite(IgnitionPin, HIGH);
  pinMode(IgnitionPin, OUTPUT);
}

void loop()
{
  if (BTserial.available())
  {
    choice = BTserial.read();
  }

  if( choice == 'm' )
  {
    digitalWrite(IgnitionPin, HIGH);
    ignitionCountTime = millis();
  }

  if (ignitionCountTime - startTime >= ignitionInterval)
  {
    digitalWrite(IgnitionPin, LOW);
  }

 delay(loopDelay);
}

#1 使用 TimerOne 库或设置 ISR。 运行 ISR at,每秒 5 次。

uint32_t timeout = 5 * 60;
uint8_t flag = 1;
digitalWrite (myPin, HIGH);

if (timeout && flag) {
    timeout--;
} else {
    digitalWrite (myPin, LOW);
    flag = 0;
}

或 通过检查自某个特定时间点以来经过的时间。

unsigned long startTime;
unsigned long interval = 60000;
const byte aPin = 13;

void setup() 
{
  pinMode(aPin, OUTPUT);
  digitalWrite(aPin, HIGH);
}

void loop() 
{
  if (millis() - startTime >= interval)
  {
    digitalWrite(aPin, LOW);
  }
}

编辑

Arduino 是一个微控制器,一次只能做一件事。

SoftwareSerial BTserial(12,13);

char choice;

const int loopDelay = 50;

int IgnitionPin = 10;
uint32_t timeout = 5 * 60;
uint8_t flag = 0;

void setup() 
{
  BTserial.begin(115200);  

  pinMode(IgnitionPin, OUTPUT);
  digitalWrite(IgnitionPin, LOW);
}

void loop()
{
  if (BTserial.available())
  {
    choice = BTserial.read();
  }

  if (choice == "m") 
   { 
    timeout = 5 * 60;  //modify this timeout.
    flag = 1;
    digitalWrite(IgnitionPin, HIGH); 
   } 
   else if ((timeout > 0) && (flag == 1))
    {
            timeout--;
    }
   else 
    { 
       digitalWrite(IgnitionPin, LOW);
       flag = 0;
    }
   
 delay(loopDelay);
}

#2 - 在设置中你是 运行 'digitalWrite(IgnitionPin, HIGH);' 这将使它变高 只需使用 pinMode(IgnitionPin, OUTPUT);用于将引脚设置为输出引脚

void setup() 
{
  Serial.begin(115200);
  Serial.println("Enter AT commands:");

  BTserial.begin(115200);  

  sensors.begin(); 

  // Set Pin as an output pin
    pinMode(IgnitionPin, OUTPUT);
    digitalWrite(IgnitionPin, LOW);
}

如果您希望 IgnitionPin 在每次重启时都处于低电平 - 在调用 pinMode 之后在 setup() 中使用 'digitalWrite(IgnitionPin, LOW);'。