【问题标题】:How to control an led from Thingspeak server using SIM900A and Arduino?如何使用 SIM900A 和 Arduino 控制 Thingspeak 服务器的 LED?
【发布时间】:2019-06-12 11:13:53
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 您正在接收变量 led 中的数据?
  • 否,输出即“1”正在从 ShowSerialData() 打印。如果我删除它,Serial.print(led) 不会打印任何数据。
  • 好的,尝试在 char led = SIM900A.read(); 之前评论 ShowSerialData() 函数
  • AT+CIPSEND > GET /channels/798173/fields/1/last SEND OK
  • 这是新的输出。 (不打印数据)

标签: arduino sim900


【解决方案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"))

【讨论】:

  • 非常感谢。我按照您的建议对代码进行了必要的更改,现在它运行良好。
【解决方案2】:

据我目前所了解的,在这个sn-p中

SIM900A.print("GET /channels/798173/fields/1/last");  
SIM900A.print("\r\n\x1A");
ShowSerialData(); 

ShowSerialData() 正在打印输出“1”。然后立即将数据读入变量led。由于接收到的实际数据已经从ShowSerialData() 打印出来,下次您调用SIM900A.read() 时将不返回任何内容或返回您的模块发送的下一组数据。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

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