【问题标题】:Receiving SMS using GSM and controlling LED using Arduino使用 GSM 接收短信并使用 Arduino 控制 LED
【发布时间】:2013-04-09 22:15:03
【问题描述】:

有人想出解决上述问题的方法吗?

我们正在使用 Arduino Duemilanove 和 SIM 900 GSM 模块 (http://robokits.co.in/shop/index.php?main_page=product_info&products_id=303)

当我们发送短信#aibicidi 时,我们尝试解决端口 9-12 的闪电 LED 的类似问题,其中 i = 0 或 1、0 = 关闭、1 = 开启。例如。 #a1b1c1d1 将打开所有 LED。

当我们上传代码并通过串口监视器运行它并在串口监视器中输入#a1b1c1d1 时,我们可以看到所有的 LED 都亮了。但是,如果我们发送内容为“#a1b1c1d1”的短信,我们看不到 LED 的任何功能。

如果有人能提供一些相同的指导,那就太好了。

 char inchar; //Will hold the incoming character from the Serial Port.

 int led1 = 9;
 int led2 = 10;
 int led3 = 11;
 int led4 = 12;

 void setup()
 {
 // prepare the digital output pins
 pinMode(led1, OUTPUT);
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);
 pinMode(led4, OUTPUT);
 digitalWrite(led1, LOW);
 digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
 //Initialize GSM module serial port for communication.


 Serial.begin(9600);
 delay(3000); // give time for GSM module to register on network etc.
 Serial.println("AT+CMGF=1"); // set SMS mode to text
 delay(200);
 Serial.println("AT+CNMI=3,3,0,0"); // set module to send SMS data to serial out upon receipt 
 delay(200);
 }

 void loop() 
 {
 //If #a1b1c1d1 comes as sms, all LEDs should light up.
 if(Serial.available() >0)
 {
 inchar=Serial.read(); 
 if (inchar=='#')
   {
   delay(10);
   inchar=Serial.read(); 

 //first led
   if (inchar=='a')
     {
   delay(10);
   inchar=Serial.read();

 if (inchar=='0')
   {
   digitalWrite(led1, LOW);
   } 
 else if (inchar=='1')
   {
   digitalWrite(led1, HIGH);
   }
 delay(10);


 //Second led
 inchar=Serial.read(); 

 if (inchar=='b')
   {
   inchar=Serial.read();
 if (inchar=='0')
 {
 digitalWrite(led2, LOW);
 } 

 else if (inchar=='1')
 {
 digitalWrite(led2, HIGH);
 }
 delay(10);

 // Third led
 inchar=Serial.read(); 
 if (inchar=='c')
 {
 inchar=Serial.read();
 if (inchar=='0')
 {
 digitalWrite(led3, LOW);
 } 
 else if (inchar=='1')
 {
 digitalWrite(led3, HIGH);
 }
 delay(10);

 //Fourth led

 inchar=Serial.read(); 
 if (inchar=='d')
 {
 delay(10);
 inchar=Serial.read();
 if (inchar=='0')
 {
 digitalWrite(led4, LOW);
 } 
 else if (inchar=='1')
 {
 digitalWrite(led4, HIGH);
 }
 delay(10);
 }
 }
 Serial.println("AT+CMGD=1,4"); // delete all SMS
 }
 }
 }
 }
 }

【问题讨论】:

标签: arduino gsm at-command


【解决方案1】:

首先不要使用延迟

Serial.begin(9600);
delay(3000); // give time for GSM module to register on network etc.

这既不必要也不可靠。您可以使用AT+CFUN 和/或AT+COPS 检查网络状态,而不是等待一些随机时间。如果打开串口时GSM模块已经连接到网络,那么等待是浪费时间。如果未附加,您应该明确等待它发生(轮询 CFUN/COPS 或启用AT+CREG),否则您可能等待的时间太短。有关这些命令的更多信息,请参阅27.007 规范。

二不使用延迟

Serial.println("AT+CMGF=1"); // set SMS mode to text
delay(200);

请不要写这样的代码。请参阅 this answer 了解为什么使用延迟是一个坏主意,并参阅 this answer 了解如何正确处理的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多