设为首页收藏本站

咖啡集成CAFFZ - 智能开发者社区

 找回密码
 立即注册
搜索
查看: 80|回复: 1

Arduino连接SIM800C 代码 ( )

[复制链接]

6939

经验值

477

帖子

4万

金币

积分
6952
发表于 2019-3-22 14:54:00 | 显示全部楼层 |阅读模式
#include <SoftwareSerial.h>
#include <MsTimer2.h>

//SIM800 TX is connected to Arduino D8
#define SIM800_TX_PIN 8 //D8连接sim800l的tx
//SIM800 RX is connected to Arduino D9
#define SIM800_RX_PIN 9 //D9连接sim800l的rx
SoftwareSerial mySerial(SIM800_TX_PIN, SIM800_RX_PIN); //定义虚拟串口

int led3 = 3;
int led2  = 2;
int led4 = 4;
int led5 = 5;

//chnzbq authored
void setup() {
  delay(10000);//单片机和sim800l上电之后,这个延时是用来等待sim800l获取信号(获取到信号之后的状态是3s闪一下)
  Serial.begin(9600);//初始化默认串口
  Serial.println("-------------------------------------------------------------");
  SIM800Init();//初始化sim800l,并将其置于数据连接打开的状态
//  bitSet(DDRB, 5); //位操作,将D5口置高
  MsTimer2::set(1000, getData_ISR); //定时器中断1s一次,即每两秒获取一次数据
  MsTimer2::start();//开启定时器

  //led灯
  pinMode(led3, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
}
char cmd[10] = {0}; //获取到的数据,长度为10个char
char sign = 0; //步骤标志位,这样可以少加一个定时器

int errorCount=0;
void(* resetFunc) (void) = 0;

void loop() { //循环函数
  delay(500);
  char i = 0;
  for (i = 0; i <= 9; i++)Serial.write(cmd[i]); //输出获取到的数据
  if (cmd[0] == '1') {
    errorCount=0;
    Serial.println("TURE");//如果第一位为’1‘即认定
    if (cmd[1] == '1') //第一路通道 sim800C3  打开
    {
      bitSet(PINB, 5);
      digitalWrite(led3, LOW);  //LOW为打开
    }
    else if (cmd[1] == '0') //关闭
    {
      digitalWrite(led3, HIGH); //HIGH为关闭
    }


    if (cmd[2] == '1') //第二路通道 sim800C2 打开
    {
      digitalWrite(led2, LOW);
    }
    else if (cmd[2] == '0')
    {
      digitalWrite(led2, HIGH); //关闭
    }

    if (cmd[3] == '1') //第3路通道 sim800C4  打开
    {
      digitalWrite(led4, LOW);
    }
    else if (cmd[3] == '0')  //关闭
    {
      digitalWrite(led4, HIGH);
    }


    if (cmd[4] == '1') //第4路通道 sim800C5打开
    {
      digitalWrite(led5, LOW);
    }
    else if (cmd[4] == '0') //关闭
    {
      digitalWrite(led5, HIGH);
    }

  } else {
    Serial.println("FALSE");//否则数据无效
    Serial.println(errorCount);
    comFunction(); //关闭
    errorCount++;
    if(errorCount>100)
    {
     // resetFunc();
      }
   
  }
}

void comFunction()
{
    digitalWrite(led3, HIGH); ////关闭
    digitalWrite(led2, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
  }

void SIM800Init() {
  comFunction(); //关闭
  mySerial.begin(9600);//初始化串口波特率
  delay(1000);//适当延时
  Serial.println("Setup Complete!");
  
  connectGSM("AT","OK");
  connectGSM("AT+SAPBR=3,1,\"Contype\",\"GPRS\"","OK");
  connectGSM("AT+SAPBR=3,1,\"APN\",\"CMNET\"","OK");
  //connectGSM("AT+SAPBR=1,1","OK");

  mySerial.write("AT+SAPBR=1,1\r");//打开承载此时sim800l上的灯快闪
  delay(1000);
  while (mySerial.available())Serial.write(mySerial.read());
  
  delay(2000);
  while (mySerial.available())Serial.write(mySerial.read());
  mySerial.write("AT+SAPBR=2,1\r");
  delay(2000);
  
  connectGSM("AT+HTTPINIT","OK");
  connectGSM("AT+HTTPPARA=\"CID\",\"1\"","OK");
  
  mySerial.write("AT+HTTPPARA=\"URL\",\"http://cloud.caffz.com:54321/cloud/index.php?c=sim800C&a=showInfo&uid=2\"\r");//连接到服务器
  delay(2500);
  while (mySerial.available())Serial.write(mySerial.read());
  
  connectGSM("AT+HTTPACTION=0","OK");
  
  mySerial.write("AT+HTTPREAD=1,14\r");//开始获取长度为14
  delay(2000);
  while (mySerial.available())Serial.write(mySerial.read()); //串口输出
  
}

void getData() { //获取数据函数
  char cnt = 0;
  while (mySerial.available()) {
    char c = mySerial.read();
    if (c == '#') { //识别’#‘
      for (cnt = 0; cnt <= 9; cnt++)cmd[cnt] = mySerial.read(); //保存数据到cmd数组,并识别到’#‘为结束
    }
    mySerial.read();//读取剩下的字符
  }
}
void requestDataStep1() {
  mySerial.write("AT+HTTPACTION=0\r");//请求数据
}
void requestDataStep2() {
  while (mySerial.available())mySerial.read();
  mySerial.write("AT+HTTPREAD=1,14\r");//请求特定字长的数据
}
void getData_ISR() { //定时器中断,1s执行一次
  if (sign == 0)requestDataStep1(), sign++; //第一步执行 requestDataStep1
  else if (sign == 1)requestDataStep2(), sign++; //第二步执行 requestDataStep2
  else getData(), sign = 0, Serial.println("getData"); //第三步执行 getData 获取数据
}

int count=0;
void connectGSM (String cmd, char *res)
{
  count=0;
  while(1)
  {
    Serial.println(cmd);
    mySerial.println(cmd);
    delay(500);
    while(mySerial.available()>0)
    {
      if(mySerial.find(res))
      {
        delay(1000);
        return;
      }
    }
    delay(1000);
    count++;
    if(count>30)
    {
      resetFunc();
      }
   }
}

6939

经验值

477

帖子

4万

金币

积分
6952
 楼主| 发表于 2019-3-22 14:54:00 | 显示全部楼层 |阅读模式
Arduino连接SIM800C 代码 ( )
高级模式
B Color Image Link Quote Code Smilies @朋友

本版积分规则

QQ|站点统计|Archiver|手机版|小黑屋|CAFFZ社区 - 每一天我们都有新的知识产生 ( 粤ICP备18101488号  

GMT+8, 2019-9-15 22:20 , Processed in 1.326003 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表