我正在尝试使用GSM模块从Thingspeak服务器控制LED。接收到的数据已成功打印在串行监视器上(上次更新为"1"(,但是当我尝试将该数据分配给变量以控制Arduino的内置LED时,没有任何反应。
#include <SoftwareSerial.h>
SoftwareSerial SIM900A(10, 11);
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
SIM900A.begin(9600);
Serial.begin(9600);
while (!Serial)
;
Serial.println("Arduino is ready");
SIM900A.begin(9600);
Serial.println("SIM900A started at 9600");
delay(1000);
Serial.println("Setup Complete");
}
void loop()
{
SIM900A.println("AT");
delay(1000);
ShowSerialData();
SIM900A.println("AT+CIPSHUT");
delay(2000);
ShowSerialData();
SIM900A.println("AT+CIPMUX=0");
delay(2000);
ShowSerialData();
SIM900A.println("AT+CGATT=1");
delay(5000);
SIM900A.println("AT+CSTT="INTERNET","",""");
delay(4000);
SIM900A.println("AT+CIICR");
delay(3000);
ShowSerialData();
SIM900A.println("AT+CIFSR");
delay(5000);
ShowSerialData();
SIM900A.println("AT+CIPSTART="TCP","184.106.153.149","80"");
delay(4000);
ShowSerialData();
SIM900A.println("AT+CIPSEND");
delay(4000);
SIM900A.print("GET /channels/798173/fields/1/last");
SIM900A.print("rnx1A");
ShowSerialData();
char led = SIM900A.read();
Serial.print(led);
if (led == '1')
{
digitalWrite(LED_BUILTIN, HIGH);
}
else if (led == '0')
{
digitalWrite(LED_BUILTIN, LOW);
}
delay(8000);
}
void ShowSerialData()
{
while (SIM900A.available() != 0)
Serial.print(char(SIM900A.read()));
}
串行监视器输出的最后一部分:
CONNECT OK
AT+CIPSEND
> ⸮GET /channels/798173/fields/1/last
SEND OK
1
正如@Saurabh P Bhandari所指出的,你不能从序列中读取相同的数据两次,因此如果你想使用它,你首先需要读取变量中的数据。
String getSerialData(){
String buffer="";
while (SIM900A.available() ){
char c = SIM900A.read();
buffer+=c;
}
return buffer;
}
然后,可以使用String led = getSerialData()
用缓冲区填充led
。
在这里,您需要注意函数getSerialData
将返回缓冲区上存在的任何内容,如下所示:
GET /channels/798173/fields/1/last
SEND
HTTP RESPONSE
看来你只对HTTP RESPONSE
感兴趣,因此你可以将你的条件更新为
if(led.endsWith("1"))
...
else if(led.endsWith("0"))
根据我到目前为止的理解,在这个片段中
SIM900A.print("GET /channels/798173/fields/1/last");
SIM900A.print("rnx1A");
ShowSerialData();
ShowSerialData()
打印输出为"1"。然后立即将数据读取到变量 led
中。由于接收到的实际数据已经从ShowSerialData()
打印出来,下次调用SIM900A.read()
时将返回任何内容或模块发送的下一组数据。
您可能会受到速率限制,因为您过于频繁地访问ThingSpeak服务器。您只能使用免费帐户每 15 秒更新一次频道。显然,要求一个比更新更快的值是没有意义的,即每 15 秒使用免费帐户一次。
考虑在代码中设置一些必要的延迟,以确保您的设备不会因滥用术语而被列入黑名单。