2015-04-23 45 views
0

我遇到了一个问题,如果一个输入为高,并且如果它是低==>没有短信发送,如果低到高== >发送1条短信。 此代码无法正常工作,只需在打开GPRS时发送短信,无任何事情发生。发送短信一次与Arduino GPRS SIM900如果一个iput是高的

mclopez帮助我,谢谢你,但不工作:(,这是新的代码,我用的延迟()著述,但同样的问题。

谢谢你的帮助提前。

#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"); 
    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; 

} 
+0

嗨!您是否尝试过在以下网址发布此问题:[http://arduino.stackexchange.com/](http://arduino.stackexchange.com/) – insilenzio

+0

不,我没有,我会发布它,谢谢 –

回答

0

尽量放慢对中断的时间间隔。这可能是isr_timer()下运行,由于多种if陈述,主循环可以是锁定的。我有一个鬼鬼祟祟的怀疑你正在尝试做的太多了!

在频率过高时要小心地尝试执行太复杂的中断,否则CPU可能永远不会进入主循环,程序将“锁定”。 Reference

话说,并检查您的主回路实际上是运行何不在主loop()的底部添加一个简单的调试闪烁板载导致..

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()是否真的在执行。 它作为你与后告诉其猜测的没有别的办法通过,但真正得到一条SMS明显运行一次......

如果一切看起来不错,尝试加入一些进一步的标志周围的地方只是为了看看什么让执行和什么不是。除了那个建议我不能找到任何进一步的东西,但有兴趣找出!祝您好运

更新
刚挖出这个环节我的书签。你可能会觉得它很有用。
- Nick Gammon - Interrupts