Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
阿杜伊诺+;gsm模块&x2B;httpread冻结_Http_Arduino_Gsm_At Command - Fatal编程技术网

阿杜伊诺+;gsm模块&x2B;httpread冻结

阿杜伊诺+;gsm模块&x2B;httpread冻结,http,arduino,gsm,at-command,Http,Arduino,Gsm,At Command,我正在尝试制作一个交互式信号量,为此,我使用了一个连接到arduino mega的rgb矩阵和一个web服务器,该服务器带有一个我从witch读取的数据库。数据库由一个运行良好的android应用程序控制,但我对arduino代码有问题 arduino必须完成以下工作: 1.使用GSM模块连接到internet。 2.连接到网站上的php并发送id,然后使用httpread从数据库接收颜色 3.用特定颜色点亮led矩阵,并以500毫秒或更短的间隔闪烁矩阵 问题:我编写的代码在一段时间后才开始工作

我正在尝试制作一个交互式信号量,为此,我使用了一个连接到arduino mega的rgb矩阵和一个web服务器,该服务器带有一个我从witch读取的数据库。数据库由一个运行良好的android应用程序控制,但我对arduino代码有问题

arduino必须完成以下工作: 1.使用GSM模块连接到internet。 2.连接到网站上的php并发送id,然后使用httpread从数据库接收颜色 3.用特定颜色点亮led矩阵,并以500毫秒或更短的间隔闪烁矩阵

问题:我编写的代码在一段时间后才开始工作,我不知道为什么。事实上,即使数据库中的颜色变为红色,矩阵仍会闪烁最后一种颜色,比如说绿色

请帮我做这个! 这是我尝试的代码:

//#include <SoftwareSerial.h>
#include <SPI.h>
#include <Adafruit_GFX.h>   // Core graphics library
#include <RGBmatrixPanel.h> // Hardware-specific library

#define CLK 11  // MUST be on PORTB! (Use pin 11 on Mega)
#define LAT 10
#define OE  9
#define A   A0
#define B   A1
#define C   A2

RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);
#define myGSM (Serial2) // RX, TX
enum _parseState {
  PS_DETECT_MSG_TYPE,
  PS_IGNORING_COMMAND_ECHO,
  PS_HTTPACTION_TYPE,
  PS_HTTPACTION_RESULT,
  PS_HTTPACTION_LENGTH,
  PS_HTTPREAD_LENGTH,
  PS_HTTPREAD_CONTENT
};

enum _actionState {
  AS_IDLE,
  AS_WAITING_FOR_RESPONSE
};
byte actionState = AS_IDLE;
unsigned long lastActionTime = 0;
byte parseState = PS_DETECT_MSG_TYPE;
char buffer[80];
byte pos = 0;
int contentLength = 0;
long timestamp = 0;
boolean ledstate = false;
int delayLength = 500; // setarea intervalului de citire baza de date
int ledPin = 13;
void resetBuffer() {
  memset(buffer, 0, sizeof(buffer));
  pos = 0;
}

String statusul = "";

void sendmyGSM(String msg, int waitMs = 100) {
  myGSM.println(msg);
  while (myGSM.available()) {
    parseATText(myGSM.read());
  }
  delay(waitMs);
}
String imeiul = "866029034128290";
void setup()
{
  myGSM.begin(115200);
  delay(1000);
  Serial.begin(115200);
  Serial.println("Setup begin");
  matrix.begin();
  delay(1000);
  matrix.fillScreen(0);
  matrix.setTextSize(1);     // size 1 == 8 pixels high
  matrix.setTextWrap(false); // Don't wrap at end of line - will do ourselves
  matrix.setCursor(5, 0);
  matrix.setTextColor(matrix.Color333(0, 7, 0));
  matrix.println("init");
  delay(10000);
  sendmyGSM("AT+CGATT=1");
  sendmyGSM("AT+SAPBR=3,1,APN,net");
  sendmyGSM("AT+SAPBR=1,1", 3000);
  sendmyGSM("AT+HTTPINIT");
  sendmyGSM("AT+HTTPPARA=\"CID\",1");
  sendmyGSM("AT+HTTPPARA=URL,http://sanctiuni.ddns.net/CNVC/Arduino.php?pan=" + imeiul);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  unsigned long now = millis();
  if ( actionState == AS_IDLE ) {
    if ( now > lastActionTime + 1500 ) {
      sendmyGSM("AT+HTTPINIT", 100);
      sendmyGSM("AT+HTTPPARA=\"CID\",1", 100);
      sendmyGSM("AT+HTTPPARA=URL,http://sanctiuni.ddns.net/CNVC/Arduino.php?pan=" + imeiul, 100);
      sendmyGSM("AT+HTTPACTION=0");
      lastActionTime = now;
      actionState = AS_WAITING_FOR_RESPONSE;
    }
  }

  while (myGSM.available()) {
    lastActionTime = now;
    parseATText(myGSM.read());
  }

  if ( millis() - timestamp > delayLength ) {
    // half a s second has passed, do something
    ledstate = !ledstate; // toggles the ledState between true/false
    if (ledstate == true) {
      matrix.fillScreen(0);
      digitalWrite(ledPin, LOW);

    }
    if (ledstate == false) {

      matrix.fillScreen(1);
      digitalWrite(ledPin, HIGH);
    }
    timestamp = millis();
  }
}

void verifica_status() {
  if (statusul == "rosu") {
    Serial.println("Panou-rosul");
    //matrix.fillScreen(0);
    matrix.fillRect(0, 0, matrix.width(), matrix.height(), matrix.Color333(7, 0, 0));
    //matrix.fillScreen(matrix.Color333(7, 0, 0));
  }
  else if (statusul == "galben") {
    Serial.println("Panou-GALBENUL");
    //matrix.fillScreen(0);
    // matrix.fillScreen(matrix.Color333(7, 7, 0));
    matrix.fillRect(0, 0, matrix.width(), matrix.height(), matrix.Color333(7, 7, 0));
  }
  else if (statusul == "albastru") {
    Serial.println("Panou-albastrul");
    // matrix.fillScreen(0);
    //matrix.fillScreen(matrix.Color333(0, 0, 7));
    matrix.fillRect(0, 0, matrix.width(), matrix.height(), matrix.Color333(0, 0, 7));
  }

  else if (statusul == "verde") {
    Serial.println("Panou-verdele");
    matrix.fillScreen(0);
    matrix.setTextSize(1);     // size 1 == 8 pixels high
    matrix.setTextWrap(false); // Don't wrap at end of line - will do ourselves
    matrix.setCursor(8, 0);
    matrix.setTextColor(matrix.Color333(0, 7, 0));
    matrix.println("OK");
  }
}

void parseATText(byte b) {

  buffer[pos++] = b;

  if ( pos >= sizeof(buffer) )
    resetBuffer(); // just to be safe

  switch (parseState) {
    case PS_DETECT_MSG_TYPE:
      {
        if ( b == '\n' )
          resetBuffer();
        else {
          if ( pos == 3 && strcmp(buffer, "AT+") == 0 ) {
            parseState = PS_IGNORING_COMMAND_ECHO;
          }
          else if ( b == ':' ) {
            if ( strcmp(buffer, "+HTTPACTION:") == 0 ) {
              //Serial.println("Received HTTPACTION");
              parseState = PS_HTTPACTION_TYPE;
            }
            else if ( strcmp(buffer, "+HTTPREAD:") == 0 ) {
              //Serial.println("Received HTTPREAD");
              parseState = PS_HTTPREAD_LENGTH;
            }
            resetBuffer();
          }
        }
      }
      break;

    case PS_IGNORING_COMMAND_ECHO:    {
        if ( b == '\n' ) {
          //Serial.print("Ignoring echo: ");
          //Serial.println(buffer);
          parseState = PS_DETECT_MSG_TYPE;
          resetBuffer();
        }
      }
      break;

    case PS_HTTPACTION_TYPE:    {
        if ( b == ',' ) {
          //Serial.print("HTTPACTION type is ");
          //Serial.println(buffer);
          parseState = PS_HTTPACTION_RESULT;
          resetBuffer();
        }
      }
      break;

    case PS_HTTPACTION_RESULT:    {
        if ( b == ',' ) {
          //Serial.print("HTTPACTION result is ");
          //Serial.println(buffer);
          parseState = PS_HTTPACTION_LENGTH;
          resetBuffer();
        }
      }
      break;

    case PS_HTTPACTION_LENGTH: {
        if ( b == '\n' ) {
          //Serial.print("HTTPACTION length is ");
          //Serial.println(buffer);
          // now request content
          myGSM.print("AT+HTTPREAD=0,");
          myGSM.println(buffer);
          parseState = PS_DETECT_MSG_TYPE;
          resetBuffer();
        }
      }
      break;

    case PS_HTTPREAD_LENGTH:    {
        if ( b == '\n' ) {
          contentLength = atoi(buffer);
          parseState = PS_HTTPREAD_CONTENT;
          resetBuffer();
        }
      }
      break;

    case PS_HTTPREAD_CONTENT: {
        //Serial.write(b);
        contentLength--;
        if ( contentLength <= 0 ) {
          String str(buffer);
          str.trim();
          statusul = str;
          verifica_status();
          parseState = PS_DETECT_MSG_TYPE;
          resetBuffer();
          //Serial.print("\n\n\n");
          actionState = AS_IDLE;

        }
      }
      break;
  }
}
/#包括
#包括
#包含//核心图形库
#包括//特定于硬件的库
#定义CLK 11//必须在端口B上!(使用Mega上的针脚11)
#定义LAT 10
#定义OE 9
#定义一个A0
#定义B A1
#定义cA2
RGBMatrix面板矩阵(A、B、C、CLK、LAT、OE、false);
#定义myGSM(Serial2)//RX,TX
枚举状态{
PS\u检测\u消息\u类型,
PS\u忽略命令\u ECHO,
PS_HTTPACTION_类型,
PS_HTTPACTION_结果,
PS_HTTPACTION_长度,
PS_HTTPREAD_长度,
PS_HTTPREAD_内容
};
枚举actionState{
当你闲着的时候,
正在等待答复
};
字节actionState=AS_IDLE;
无符号长lastActionTime=0;
byte parseState=PS\u DETECT\u MSG\u TYPE;
字符缓冲区[80];
字节pos=0;
int contentLength=0;
长时间戳=0;
布尔状态=假;
int delayLength=500;//赛特区国际城市酒店
int-ledPin=13;
void resetBuffer(){
memset(buffer,0,sizeof(buffer));
pos=0;
}
字符串statusul=“”;
void sendmyGSM(字符串msg,int waitMs=100){
myGSM.println(msg);
while(myGSM.available()){
parseATText(myGSM.read());
}
延迟(waitMs);
}
字符串imeiul=“866029034128290”;
无效设置()
{
myGSM.begin(115200);
延迟(1000);
序列号开始(115200);
Serial.println(“设置开始”);
matrix.begin();
延迟(1000);
矩阵。填充屏幕(0);
matrix.setTextSize(1);//大小1==8像素高
matrix.setTextWrap(false);//不要在行尾换行-我们自己做
矩阵.setCursor(5,0);
矩阵.setTextColor(矩阵.Color333(0,7,0));
矩阵.println(“init”);
延迟(10 000);
sendmyGSM(“AT+CGATT=1”);
sendmyGSM(“AT+SAPBR=3,1,APN,净”);
sendmyGSM(“AT+SAPBR=1,1”,3000);
sendmyGSM(“AT+HTTPINIT”);
sendmyGSM(“AT+HTTPPARA=\“CID\”,1);
sendmyGSM(“AT+HTTPPARA=URL,http://sanctiuni.ddns.net/CNVC/Arduino.php?pan=“+imeiul);
引脚模式(LED引脚,输出);
}
void循环(){
无符号长现在=毫秒();
if(actionState==AS_IDLE){
如果(现在>lastActionTime+1500){
sendmyGSM(“AT+HTTPINIT”,100);
sendmyGSM(“AT+HTTPPARA=\'CID\',1',100);
sendmyGSM(“AT+HTTPPARA=URL,http://sanctiuni.ddns.net/CNVC/Arduino.php?pan=“+imeiul,100);
sendmyGSM(“AT+HTTPACTION=0”);
lastActionTime=现在;
actionState=AS_等待_响应;
}
}
while(myGSM.available()){
lastActionTime=现在;
parseATText(myGSM.read());
}
if(毫秒()-时间戳>延迟长度){
//半秒过去了,做点什么
ledstate=!ledstate;//在真/假之间切换ledstate
如果(ledstate==true){
矩阵。填充屏幕(0);
数字写入(ledPin,低电平);
}
如果(ledstate==false){
矩阵。填充屏幕(1);
数字写入(ledPin,高电平);
}
时间戳=毫秒();
}
}
无效验证状态(){
如果(状态ul==“rosu”){
序列号:println(“Panou rosul”);
//矩阵。填充屏幕(0);
matrix.fillRect(0,0,matrix.width(),matrix.height(),matrix.Color333(7,0,0));
//matrix.fillScreen(matrix.Color333(7,0,0));
}
否则如果(状态ul==“galben”){
序列号println(“Panou GALBENUL”);
//矩阵。填充屏幕(0);
//matrix.fillScreen(matrix.Color333(7,7,0));
matrix.fillRect(0,0,matrix.width(),matrix.height(),matrix.Color333(7,7,0));
}
否则如果(statusul==“albastru”){
序列号println(“Panou albastrul”);
//矩阵。填充屏幕(0);
//matrix.fillScreen(matrix.Color333(0,0,7));
matrix.fillRect(0,0,matrix.width(),matrix.height(),matrix.Color333(0,0,7));
}
else if(statusul==“verde”){
序列号:println(“Panou verdele”);
矩阵。填充屏幕(0);
matrix.setTextSize(1);//大小1==8像素高
matrix.setTextWrap(false);//不要在行尾换行-我们自己做
矩阵.setCursor(8,0);
矩阵.setTextColor(矩阵.Color333(0,7,0));
矩阵。println(“确定”);
}
}
void parseATText(字节b){
缓冲区[pos++]=b;
如果(位置>=sizeof(缓冲区))
resetBuffer();//为了安全起见
开关(解析状态){
案例PS\U检测\U消息\U类型:
{
如果(b=='\n')
resetBuffer();
否则{
如果(位置==3&&strcmp(缓冲区,“AT+”)==0){
parseState=PS\u忽略命令\u ECHO;
}
else如果(b==':'){
if(strcmp(缓冲区“+HTTPACTION:”)==0){
//Serial.println(“收到的HTTPACTION”);
parseState=PS_HTTPACTION_类型;
}
否则如果(strcmp(缓冲区“+HTTPREAD:”)==0){
//Serial.println(“收到的HTTPREAD”);
parseState=PS\u HTTPREAD\u长度;
}
resetBuffer();
}
}
}
打破
案例PS\U忽略\U命令\U回显:{
如果(b=='\n'){
//Serial.print(“忽略回音:”);
//串行打印LN(缓冲区);
parseState=PS\u DETECT\u MSG\u TYPE;
resetBuffer();
}
}
打破
案例PS_HTTPACTION_类型:{
如果(b==','){
//串行打印(“HTTPACTION类型为”);
//串行打印LN(缓冲区);
parseState=PS_HTTPACTION_结果;
重新