如果输入为高电平,则使用arduino GPRS SIM900发送短信一次

我遇到一个问题,如果输入为高,则发送1个短信,如果是低==>没有发送短信,如果低到高==>发送1个短信。 这段代码不能正常工作,只是在我开启GPRS时发送短信,之后什么都没发生。

mclopez帮助了我,谢谢你,但没有工作:(,这是我用delay()编写的新代码,但是同样的问题。

感谢您提前帮助。

#include  #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"); 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()是否实际上正在执行。 它显然会运行一次,因为你正在通过一条短信通过,但真的没有其他方式告诉它猜测后……

如果一切看起来都不错,请尝试在该地方附近添加一些标志,以查看最新执行的内容和不执行的内容。 除了这个建议,我无法发现任何进一步但有兴趣找出来! 祝你好运

更新
只是从我的书签中挖出这个链接。 你可能会发现它很有用。
– 尼克金门 – 中断