如果输入为高,则使用 arduino GPRS SIM900 发送短信 1 次 [英] send SMS for 1 time with arduino GPRS SIM900 if an iput is HIGH

查看:21
本文介绍了如果输入为高,则使用 arduino GPRS SIM900 发送短信 1 次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果输入为 HIGH,如果输入为 LOW==>,我会遇到发送 1 条短信的问题.没有短信发送,如果低到高==>发送 1 条短信.此代码不起作用,只是在我打开 GPRS 时发送短信,然后什么也没发生.

I faced a problem to send 1 SMS if an input is HIGH,and if it is LOW==> no SMS to send,if LOW to HIGH==> send 1 SMS. this code not working,just sent SMS when I turn the GPRS on,and after nothing is happened.

感谢您提前提供帮助.

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

 }

推荐答案

尝试减慢中断的间隔.有可能由于在 isr_timer() 下运行的多个 if 语句导致主循环可能被锁定.我偷偷怀疑你想做得太多!

Try slowing down the interval on the interrupt. It is possible that due to several if statements running under isr_timer()that the main loop may be locking up. I have a sneaking suspicion you are trying to do too much!

小心尝试以过高的频率执行过于复杂的中断,否则 CPU 可能永远不会进入主循环,您的程序将锁定".参考

Be careful about trying to execute too complicated of an interrupt at too high of a frequency, or the CPU may never enter the main loop and your program will 'lock up'. Reference

说到这里并检查您的主循环是否真的在运行,为什么不在主 loop() 的底部添加一个简单的调试来闪烁板载 LED..

Saying that and to check that your main loop is actually running why not add a simple debug at the bottom of the main loop() to flash the on board 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() 是否真的在执行.它显然会在您收到一条短信时运行一次,但实际上没有其他方法可以告诉它之后的猜测......

At least then you will know if the main loop() is even actually executing. It obviously runs once as you are getting a single SMS through but really with no other way of telling its a guess after that...

如果一切看起来都不错,请尝试在该位置周围添加一些其他标志,以查看执行了哪些操作,哪些未执行.除了那个建议,我找不到任何进一步的东西,但有兴趣找出来!祝你好运

If all looks good try adding some further flags around the place just to see whats getting executed and what is not. Other than that suggestion i cant spot anything further but interested to find out! Best of luck

更新
刚从我的书签中挖出这个链接.您可能会发现它很有用.
- Nick Gammon - 中断

这篇关于如果输入为高,则使用 arduino GPRS SIM900 发送短信 1 次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆