如何使用SIM900A和Arduino从Thingspeak服务器控制led



我正在尝试使用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 秒使用免费帐户一次。

考虑在代码中设置一些必要的延迟,以确保您的设备不会因滥用术语而被列入黑名单。

相关内容

  • 没有找到相关文章

最新更新