极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 29097|回复: 11

ESP8266模块连接智能创客平台

[复制链接]
发表于 2015-1-23 20:56:55 | 显示全部楼层 |阅读模式
本帖最后由 pzg123 于 2015-7-9 18:02 编辑

8266模块不是很稳定



回复

使用道具 举报

 楼主| 发表于 2015-1-23 20:58:20 | 显示全部楼层
本帖最后由 pzg123 于 2015-7-9 18:03 编辑

#include <SoftwareSerial.h>//声明软串口库
#include <EEPROM.h>

#define reset_8266 4//定义引脚
#define httpled 5
#define led1_pin 6
#define led2_pin 7
#define led3_pin 8

SoftwareSerial mySerial(9, 10); // RX, TX

//请到m.znck007.com申请登陆->家中环境->网关,里可以看到!
char apiKey[] = "****************";  //设置apikey
char server[] = "api.znck007.com";  //声明API网址
//char server[] = "192.168.12.85";  //声明服务器

String ssid="*****";//登陆路由器需要的ssid名称以及密码
String pwd="********";

unsigned long timer,last_http;
int sid=3,count_busy=0;
int state1=0,state2=0,state3=0;
bool ishttpget,isUpdate;
char updateData[20]={0};

void setup(){
  Serial.begin(115200);
  mySerial.begin(9600);
  
  pinMode(httpled,OUTPUT);
  pinMode(reset_8266,OUTPUT);
  pinMode(led1_pin,OUTPUT);
  pinMode(led2_pin,OUTPUT);
  pinMode(led3_pin,OUTPUT);
  digitalWrite(reset_8266,LOW);
  state1 = EEPROM.read(0);//读EEPROM
  state2 = EEPROM.read(1);
  state3 = EEPROM.read(2);
  digitalWrite(led1_pin,state1);//设置开关状态
  digitalWrite(led2_pin,state2);
  digitalWrite(led3_pin,state3);

  //Serial.println("ATE0");
  //delay(1000);
  if(conf_JAP(ssid,pwd));//登陆路由器
  mySerial.println("setup success");
}

void loop(){
  String str = "";
  while (Serial.available()){
    str = Serial.readString();//Serial.readString()返回的是一个String,很长的字符串时也不会出现丢失
  }
  if(str.length()){
    if(str.indexOf("Apache/2.2.15")>0){//查找字符串
      mySerial.print("\n<<< reply ");
      mySerial.print(millis() - timer);
      mySerial.println(" ms");
      ishttpget=true;
      digitalWrite(httpled,LOW);
    }
    char body[12]={0};
    get_znck_body(str,body);//获取只是{xxxxxxxx}的字符
    mySerial.println(body);
    int s=get_sid(body); //获取sid
    int n=get_nid(body);//获取nid
    int d=get_data(body);//获取data
    if(s==sid){
      switch(n){
        case 0:
        EEPROM.write(0,d);//保存到EEPROM
        digitalWrite(led1_pin,d);//设置开关状态
        break;
        case 1:
        EEPROM.write(1,d);
        digitalWrite(led2_pin,d);
        break;
        case 2:
        EEPROM.write(2,d);
        digitalWrite(led3_pin,d);
        break;
        default:break;
      }
      isUpdate=true;//是否更新标记
      char front[10]={0};
      memcpy(front,body,9);      
      sprintf(updateData,"%supdate}",front);//创建更新字符串
    }
  }
  
  if(isUpdate){//更新
    isUpdate=false;
    last_http = millis();
    mySerial.println("\n>>> UPDATE");
    static char buf[20]={0};
    sprintf(buf,"%s",updateData);
    Post_Data(buf);  //POST到网址,apiKey,字符
    return;
  }
  
  if(millis()-last_http>=5000){//间隔5秒
    if(ishttpget || millis() - last_http >= 20000){//获取有数据或间隔20秒
      last_http = millis();
      ishttpget=false;
      digitalWrite(httpled,HIGH);
      mySerial.print(count_busy);
      mySerial.println(" >>> REQ");
      static char buf[20]={0};
      sprintf(buf,"{ck001000000000}"); //%s ,updateData
      Post_Data(buf);  //POST到网址,apiKey,字符
    }
  }
}

void get_znck_body(String p,char *s){ //获取只是{ckxxxxxx}的字符
  char rechar[12]={0};
  int bufi=0;
  bool isend=false;
  int charnum=0;   
  for(bufi=0;bufi<p.length();bufi++){
    if(p[bufi]=='{') isend=true;
    if(isend) rechar[charnum++]=p[bufi];
    if(p[bufi]=='}'){
      isend=false;
      break;
    }
  }
  sprintf(s,"%s",rechar);
}

void Post_Data(char* thisData){//send the HTTP PUT request:
  if(start_Mux(1,server,80)){//建立tcp链接
    mySerial.println("connecting ok");
    String cmd; //创建发送字符串
    cmd = "POST /index.php HTTP/1.0\r\n";
    cmd += "Host: ";
    cmd += server;
    cmd += "\r\n";
    cmd += "apikey: ";
    cmd += apiKey;
    cmd += "\r\n";
    cmd += "Accept: *";
    cmd += "/";
    cmd += "*\r\n";
    cmd += "Content-Length: ";
    size_t thisLength = strlen(thisData);
    cmd += String(thisLength);
    cmd += "\r\n";
    cmd += "Content-Type: application/x-www-form-urlencoded\r\n";
    cmd += "\r\n";
    cmd += String(thisData);
    cmd += "\r\n";
   
    count_busy = 0;
    timer = millis();
    if(Send(cmd)) mySerial.println("Send ok");//发送字符串
    else  mySerial.println("Send fail");
  }
  else{
    mySerial.println("connection failed");
    count_busy++;
    if(count_busy>=22){//网络掉线或ESP8266无响应(死机)3-5分钟重启ESP8266
      count_busy = 0;
      mySerial.println("ESP8266_RESET WAIT...");
      digitalWrite(reset_8266,HIGH);
      delay(200);
      digitalWrite(reset_8266,LOW);
      delay(5000);
    }
  }
}

boolean Send(String str){//发送
  Serial.print("AT+CIPSEND=");
  Serial.println(str.length());
  unsigned long start;
  bool found=false;
  start = millis();
  while(millis()-start<3000){//设置超时,3秒内没有找到">"字符,退出,返回false
    if(Serial.find(">")==true ){
      found = true;
      break;
    }
  }
  if(found) Serial.print(str);
  else return false;

  start = millis();
  while(millis()-start<4500){
    if(Serial.available()>0){
      if(Serial.find("SEND OK")==true)
      return true;
    }
  }
  return false;
}

boolean conf_JAP(String ssid , String pwd){ //配置登陆路由器需要的ssid名称以及密码
  Serial.print("AT+CWJAP=");
  Serial.print("\"");
  Serial.print(ssid);
  Serial.print("\"");
  Serial.print(",");
  Serial.print("\"");
  Serial.print(pwd);
  Serial.println("\"");
  
  unsigned long start = millis();
  while (millis()-start<18000){
    if(Serial.find("OK")==true) return true;
  }
  return false;
}

boolean start_Mux(byte type, String addr, int port){ //建立tcp链接或者注册UDP端口号(单路模式)
  Serial.print("AT+CIPSTART=");
  if(type>0) Serial.print("\"TCP\"");
  else Serial.print("\"UDP\"");
  Serial.print(",");
  Serial.print("\"");
  Serial.print(addr);
  Serial.print("\"");
  Serial.print(",");
  Serial.println(String(port));
  
  String data;
  unsigned long start = millis();
  while(millis()-start<4500){ //当串口有完成数据返回时,结束语句
    if(Serial.available()>0){
      char a =Serial.read();
      data=data+a;
    }
    if(data.indexOf("OK")!=-1||data.indexOf("ALREAY CONNECT")!=-1) return true;
  }
  return false;
}

int get_sid(char *buff){ //获取sid
  if(strstr(buff,"{ck")&&strstr(buff,"}")&&strlen(buff)>10){
    char charsid[4]={0};
    memcpy(charsid,buff+3,3);
    int intsid=atoi(charsid);
    return intsid;      
  }
  else return 0;
}

int get_nid(char *buff){ //获取nid
  if(strstr(buff,"{ck")&&strstr(buff,"}")&&strlen(buff)>10){
    char charNid[4]={0};
    memcpy(charNid,buff+6,3);
    int intNid=atoi(charNid);
    return intNid;      
  }
  else return 0;
}

int get_data(char *buff){ //获取data
  if(strstr(buff,"{ck")&&strstr(buff,"}")&&strlen(buff)>10){
    char charData[4]={0};
    memcpy(charData,buff+9,1);
    int intData=atoi(charData);
    return intData;      
  }
  else return 0;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-23 21:07:31 | 显示全部楼层
图                                                   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-23 21:10:21 | 显示全部楼层
程序都是东拼西凑的           
回复 支持 反对

使用道具 举报

发表于 2015-3-5 10:44:25 | 显示全部楼层
Lz这个东西我测试失败啊...我用arduino UNO+8226根本加入不了热点 路由器看不到信息的...
回复 支持 反对

使用道具 举报

发表于 2015-3-6 12:48:36 | 显示全部楼层
pzg123 发表于 2015-1-23 21:10
程序都是东拼西凑的

请问你是用Mega吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-14 23:57:44 | 显示全部楼层
林定祥 发表于 2015-3-6 12:48
请问你是用Mega吗?

ATmega328P自己DIY的板
回复 支持 反对

使用道具 举报

发表于 2015-5-6 10:33:44 | 显示全部楼层
pzg123 发表于 2015-3-14 23:57
ATmega328P自己DIY的板

我也自己diy了一个板,但是还没弄5v转3.3v的电路,请问大神用的什么比较稳定,我想用ams1117 3.3来着。还有atmega328p  ram小,通过esp8266上传到yeelink可以实现么,你的代码我还没具体看。。
回复 支持 反对

使用道具 举报

发表于 2015-6-5 18:03:19 | 显示全部楼层
Huanjl 发表于 2015-5-6 10:33
我也自己diy了一个板,但是还没弄5v转3.3v的电路,请问大神用的什么比较稳定,我想用ams1117 3.3来着。还 ...

1117-3.3完全没问题。可以放心使用。
回复 支持 反对

使用道具 举报

发表于 2015-6-6 09:39:57 | 显示全部楼层
rick_hou 发表于 2015-6-5 18:03
1117-3.3完全没问题。可以放心使用。

哦,谢谢拉,由于我没买到,就用了两节干电池
回复 支持 反对

使用道具 举报

发表于 2016-10-25 22:31:49 | 显示全部楼层
请问下esp8266要不要刷什么固件,还是直接用?
回复 支持 反对

使用道具 举报

发表于 2016-10-26 09:41:53 | 显示全部楼层
不要用AT指令就很稳定啦。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 15:18 , Processed in 0.046789 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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