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 秒执行一次。