使用GSM接收短信,使用Arduino控制LED
有人想出了解决上述问题的办法吗 我们正在使用Arduino Duemilanove和SIM 900 GSM模块() 当我们发送sms#aibicidi时,我们试图解决端口9-12的闪电LED的类似问题,其中i=0或1,0=off,1=on。例如#a1b1c1d1将打开所有LED 当我们上传代码并通过串行监视器运行它并在串行监视器中输入#a1b1c1d1时,我们可以看到所有的LED亮起。但如果我们发送内容为“a1b1c1d1”的短信,我们看不到LED的任何功能 如果有人能提供一些指导,那就太好了使用GSM接收短信,使用Arduino控制LED,arduino,gsm,at-command,Arduino,Gsm,At Command,有人想出了解决上述问题的办法吗 我们正在使用Arduino Duemilanove和SIM 900 GSM模块() 当我们发送sms#aibicidi时,我们试图解决端口9-12的闪电LED的类似问题,其中i=0或1,0=off,1=on。例如#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
}
}
}
}
}
首先不要使用延迟
这既不必要也不可靠。您可以使用AT+CFUN
和/或AT+COPS
检查网络状态,而不是等待一些随机时间。如果在您打开串行连接时GSM模块已经连接到网络,那么这样等待是浪费时间的。如果未连接,则应明确等待(轮询CFUN/COPS或在+CREG启用),否则您可能会等待时间太短。有关这些命令的更多信息,请参见规范
第二,不要使用延迟
请不要这样写代码。请参阅为什么使用延迟是一个如此糟糕的主意,以及如何正确处理的建议。我能够解决上述状态问题。获取此链接,转到最后一篇文章:
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);