如果输入为HIGH,则发送1条短信时遇到问题===>如果LOW到HIGH==>发送1条短信。这个代码不起作用,只是在我打开GPRS时发送短信,然后什么都没发生。
mclopez帮了我,谢谢,但没有工作:(,这是我用delay()编写的新代码,但有同样的问题
感谢您提前提供帮助。
#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=1r");
delay(100);
SIM900.println("AT + CMGS = "xxxxxxxxxx"");
delay(100);
}
void Send_SMS(){
SIM900.println((char)26);
delay(100);
SIM900.println();
delay(5000);
}
void isr_timer(){
if (changed2) {
initia();
SIM900.println("Station 85: Defaut electrique");
delay(100);
Send_SMS();
value2_old = value2;
changed2 = false;
}
if (changed3) {
initia();
SIM900.println("Station 85: DefautGP1");
delay(100);
Send_SMS();
value3_old = value3;
changed3 = false;
}
if (changed4) {
initia();
SIM900.println("Station 85:DD>1000");
delay(100);
Send_SMS();
value4_old = value4;
changed4 = false;
}
}
void setup() {
pinMode(DI, INPUT);
pinMode(DT, INPUT);
pinMode(DGP1, INPUT);
pinMode(DGP2, INPUT);
SIM900.begin(19200);
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;
}
试着放慢中断的间隔。由于在isr_timer()
下运行了几个if
语句,主循环可能被锁定。我偷偷怀疑你想做的太多了!
小心尝试以过高的频率执行过于复杂的中断,否则CPU可能永远不会进入主循环,您的程序将"锁定"。参考
这么说,并检查您的主循环是否真的在运行,为什么不在主loop()
的底部添加一个简单的调试,以闪烁板上led。。
int onBoardLED = 13;
void setup()
{
pinMode(onBoardLED, OUTPUT);
// And all the rest
}
void loop()
{
// Doing stuff
if (onBoardLED == LOW) digitalWrite(ledPin, HIGH);
else digitalWrite(ledPin, LOW);
}
至少到那时,您将知道主loop()
是否真的在执行。很明显,当你收到一条短信时,它会运行一次,但在那之后,它真的没有其他方式来告诉你这是一个猜测。。。
如果一切看起来都很好,试着在这个地方添加一些进一步的标志,看看什么被执行了,什么没有执行。除了这个建议,我再也找不到什么了,只是想知道!祝好运
更新
刚刚从我的书签中找到了这个链接。你可能会发现它很有用
-Nick Gammon-中断