写延迟计时器()

Tar*_*lbi 7 c timer arduino delay

我写了这段代码,如果输入为HIGH就发送短信,你可以在其中看到,但问题是我有4个输入和延迟()s是致命的,如果我需要在一个单独的东西做一个非常错误时间(我用4个输入).

所以我需要在void loop(),Send_SMS()和initia()中用millis()或其他东西来改变delay().

有人可以帮助我,并提前谢谢你.

const int DI = 2;
const int DT = 3;
const int DGP1 = 4;
const int DGP2 = 5;

int value1_old = 0;
int value2_old = 0;
int value3_old = 0;
int value4_old = 0;

unsigned long previousMillis = 0;
unsigned long interval=100;

#include<SoftwareSerial.h>
SoftwareSerial SIM900 (7, 8);

void setup() {
    pinMode(DI, INPUT);
    pinMode(DT, INPUT);
    pinMode(DGP1, INPUT);
    pinMode(DGP2, INPUT);

    SIM900.begin(19200);
    SIM900power();
    delay(20000);

}

void SIM900power(){
    digitalWrite(9 ,HIGH);
    delay(1000);
    digitalWrite(9 ,LOW);
    delay(5000);
}

void initia(){
    SIM900.print("AT+CMGF=1\r");
    delay(100);
    SIM900.println("AT + CMGS = \"+212xxxxxxx\"");
    delay(100);
}

void Send_SMS(){
    SIM900.println((char)26);
    delay(100);
    SIM900.println();
    delay(100);
    SIM900power();
}

void loop() {
    int value1 = digitalRead (DI);
    int value2 = digitalRead (DT);
    int value3 = digitalRead (DGP1);
    int value4 = digitalRead (DGP2);

    if (value2 != value2_old && value2 == HIGH) {
        initia();
        SIM900.println("Station 85: Defaut electrique");
        delay(100);
        Send_SMS();
        value2_old = value2;
    }

    if (value3 != value3_old && value3 == HIGH)
    {
        initia();
        SIM900.println("Station 85: DefautGP1");
        delay(100);
        Send_SMS();
        value3_old = value3;
    }

    if (value4 != value4_old && value4 == HIGH)
    {
        initia();
        SIM900.println("Station 85:DD>1000");
        delay(100);
        Send_SMS();
        value4_old = value4;
    }
    value2_old = value2;
    value3_old = value3;
    value4_old = value4;
}
Run Code Online (Sandbox Code Playgroud)

}

mcl*_*pez -1

millis()当该值溢出时,该函数将失败。正如@CPU_Terminator所说,使用中断。为此,有一些有用的 Arduino 库,例如Timer1

编辑。假设您想要做的是,如果您的某些输入发生变化,则每 100 毫秒发送一条短信,您可以使用这样的代码(我删除了一些对我来说似乎不必要的延迟,如果我错了,请再次添加它们) :

#include <SoftwareSerial.h>
#include "TimerOne.h"

const int DI = 2;
const int DT = 3;
const int DGP1 = 4;
const int DGP2 = 5;
const long interval = 100000; // in microseconds

int value1 = 0;
int value2 = 0;
int value3 = 0;
int value4 = 0;
int value1_old = 0;
int value2_old = 0;
int value3_old = 0;
int value4_old = 0;
boolean changed1 = false;
boolean changed2 = false;
boolean changed3 = false;
boolean changed4 = false;

SoftwareSerial SIM900 (7, 8);

void SIM900power(){
  digitalWrite(9, HIGH);
  delay(1000);
  digitalWrite(9, LOW);
  delay(5000);
}

void initia(){
  SIM900.print("AT+CMGF=1\r");
  SIM900.println("AT + CMGS = \"+212xxxxxxx\"");
}

void Send_SMS(){
  SIM900.println((char)26);
  SIM900.println();
  delay(20);
  SIM900power();
}

void isr_timer(){
  if (changed2) {
    initia();
    SIM900.println("Station 85: Defaut electrique");
    Send_SMS();
    changed2 = false;
  }

  if (changed3) {
    initia();
    SIM900.println("Station 85: DefautGP1");
    Send_SMS();
    changed3 = false;
  }

  if (changed4) {
    initia();
    SIM900.println("Station 85:DD>1000");
    Send_SMS();
    changed4 = false;
  }
}

void setup() {
  pinMode(DI, INPUT);
  pinMode(DT, INPUT);
  pinMode(DGP1, INPUT);
  pinMode(DGP2, INPUT);

  SIM900.begin(19200);
  SIM900power();
  delay(20000);
  Timer1.initialize(interval);
  Timer1.attachInterrupt(isr_timer);
}

void loop() {
  value1 = digitalRead (DI);
  value2 = digitalRead (DT);
  value3 = digitalRead (DGP1);
  value4 = digitalRead (DGP2);

  if (value1 != value1_old && value1 == HIGH) changed1 = true;
  if (value2 != value2_old && value2 == HIGH) changed2 = true;
  if (value3 != value3_old && value3 == HIGH) changed3 = true;
  if (value4 != value4_old && value4 == HIGH) changed4 = true;

  value1_old = value1;
  value2_old = value2;
  value3_old = value3;
  value4_old = value4;

  // Here the rest of your code
}
Run Code Online (Sandbox Code Playgroud)

这样该函数isr_timer()将每 0.1 秒执行一次。