如何使用SIM900A和Arduino控制来自Thingspeak服务器的LED?

时间:2019-06-12 11:13:53

标签: arduino sim900

我正在尝试使用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("\r\n\x1A");
  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

3 个答案:

答案 0 :(得分:1)

根据我到目前为止所了解的内容,在此代码段

unordered_map

SIM900A.print("GET /channels/798173/fields/1/last"); SIM900A.print("\r\n\x1A"); ShowSerialData(); 打印输出为'1'。然后,您立即将数据读入变量ShowSerialData()。由于已经从led打印了接收到的实际数据,因此下次调用ShowSerialData()时将不返回任何内容,也不返回模块发送的下一组数据。

答案 1 :(得分:1)

如@Saurabh P Bhandari所指出的,您不能两次从序列中读取相同的数据,因此,如果要使用它,首先需要读取变量中的数据。

WHERE CONTAINS (Comment, 'OTHER MIE-Explanation of BMI')

然后,您可以使用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

答案 2 :(得分:1)

由于您太频繁地访问ThingSpeak服务器,您可能会受到速率的限制。您只能使用免费帐户每15秒更新一次频道。显然,要求一个值快于可更新的值是没有意义的,即使用免费帐户每15秒更新一次。

请考虑在代码中添加一些必需的延迟,以确保您的设备不会因为滥用条款而被列入黑名单。