阿杜伊诺+;gsm模块&x2B;httpread冻结
我正在尝试制作一个交互式信号量,为此,我使用了一个连接到arduino mega的rgb矩阵和一个web服务器,该服务器带有一个我从witch读取的数据库。数据库由一个运行良好的android应用程序控制,但我对arduino代码有问题 arduino必须完成以下工作: 1.使用GSM模块连接到internet。 2.连接到网站上的php并发送id,然后使用httpread从数据库接收颜色 3.用特定颜色点亮led矩阵,并以500毫秒或更短的间隔闪烁矩阵 问题:我编写的代码在一段时间后才开始工作,我不知道为什么。事实上,即使数据库中的颜色变为红色,矩阵仍会闪烁最后一种颜色,比如说绿色 请帮我做这个! 这是我尝试的代码:阿杜伊诺+;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毫秒或更短的间隔闪烁矩阵 问题:我编写的代码在一段时间后才开始工作
//#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_结果;
重新