久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6877|回復: 0
打印 上一主題 下一主題
收起左側

ESP8266 采用串口3通訊 WIFI代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:285607 發表于 2018-3-21 17:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <TimerOne.h>
#include<HttpPacket.h>
#include<ArduinoJson.h>
/**'
* ESP8266 采用串口3通訊
*/
#define ESP8266SerialSerial3
#define mySerial Serial
#define RES_MAX_LENGTH 500
#define SEND_SUCCESS 1
#define SEND_FAIL 0
/**
* 鏈接的AP的賬戶密碼
*/
char ssid[] ="zlei";
char pass[] ="18829237005";
/**
* Onenet 互聯網信息
*/
char oneNetServer[] ="api.heclouds.com";       //不需要修改
char deviceId[] ="10005241";
char API_KEY[] ="qB40IZOP6Rx58EZ7ow16mA=VkRQ=";
char sensorID1[] ="waterLevel";
// ESP8266于Arduino交互的數據緩存
charESP8266Response[RES_MAX_LENGTH];
// 交互數據緩存的世紀存儲長度
int resLength = 0;
// 請求時間計算的最小分度值
const unsigned long interval= 1000;
// 計時器,以毫秒為最小計數單位
unsigned long curTime = 0;
HttpPacketHead packet;
void setup() {
  ESP8266Serial.begin(115200);
  mySerial.begin(9600);
  Timer1.initialize(interval);
  Timer1.attachInterrupt(timeClock);
  intiESP8266();
}
void loop() {
postDataToServer(API_KEY,deviceId,sensorID1,1.00); // 發送數據(數據為模擬數據)
  delay(10000);
}
/**
* 制造重啟命令
*/
void(* resetFunc) (void) =0;
/**
* ESP8266 板子進行初始化
* 1. 發送 AT 指令判斷供電,TTL和WIFI模塊是否正常 返回OK表示正常
* 2. 發送 AT+CWMODE=? 指令 選擇模式1.Station模式,2. AP 模式
* 3. 發送AT+CWJAP="ssid","password" 來連接AP
*/
void intiESP8266(){
  // AT 指令, 返回OK表明供電,TTL和WIFI模塊通訊正常
if(sendATCommead("AT\r\n","OK", 1000, 2) ==SEND_SUCCESS );
  else ESP8266_Error(1);
  delay(100);
  // AT+CWMODE=? 選擇模式 1.Station模式,2. AP 模式
if(sendATCommead("AT+CWMODE=1\r\n","OK",1000,3) ==SEND_SUCCESS );
  else ESP8266_Error(2);
  // AT+CWJAP="sid","pass" 加入AP
  char cwjap[50];
  strcat(cwjap,"AT+CWJAP=\"");
  strcat(cwjap,ssid);
  strcat(cwjap,"\",\"");
  strcat(cwjap,pass);
  strcat(cwjap,"\"\r\n");
  if(sendATCommead(cwjap,"OK",2000,4)== SEND_SUCCESS );
  else ESP8266_Error(3);
}
/**
* ESP8266 錯誤信息處理
* @param type 錯誤信息類型
*/
void ESP8266_Error(inttype){
  mySerial.println("ERROR");
  mySerial.println(type);
  while(1){
   if(sendATCommead("AT\r\n","OK", 1000, 2) ==SEND_SUCCESS){
     mySerial.print("\r\nRESET!!!!!!\r\n");
      resetFunc();
    }
  }
}
/**
* Arduino 向ESP8266中發送AT指令
* @param commoned 需要發送的指令
* @param response 發送之后接收到response之后表示成功
* @param timeout 在發送命令之后 timeout 毫秒之后重新發送消息
* @param reTry 重新發送的次數
*/
unsigned intsendATCommead(char *commoned, char *response, int timeout, unsigned charreTry){
  // 多次重復發送消息,直到接收到消息。
  for(unsigned char tryTime = 0; tryTime <reTry; tryTime++){
    clearResponse(); // 清理接收緩存
    mySerial.print("send commoned ");
    mySerial.print(commoned);
    mySerial.print(" to ESP8266.\n");
    ESP8266Serial.write(commoned); // 通過串口發送命令
   curTime = 0;

    // 在延時范圍內查看回復消息,如果回復消息成功,返回成功
    while(curTime < timeout){
      readResponse();
      if(strstr(ESP8266Response, response) !=NULL){
          mySerial.println("Response is");
          mySerial.println("--------------Response Start ----------------");
          mySerial.println(ESP8266Response);
          mySerial.println("--------------Response end ------------------");
          return SEND_SUCCESS;
      }
    }
  }
  // 發送失敗
  mySerial.print("response received,content is \n >>>> ");
  mySerial.println(ESP8266Response);
  return SEND_FAIL;
}

/**
* 向服務器發送數據請求
* @param apiKey 訪問網站的apiKey
* @param deviceID 設備ID
* @param sensorID 傳感器ID
* @param data 發送的數據
*/
void postDataToServer(char*apiKey, char *deviceID, char *sensorID, double data){
  StaticJsonBuffer<400> jsonBuffer;
  JsonObject &value =jsonBuffer.createObject();
  value["value"] = data;
  JsonObject &idDataPoints =jsonBuffer.createObject();
  idDataPoints["id"] = sensorID;
  JsonArray &dataPoints = idDataPoints.createNestedArray("dataPoints");
  dataPoints.add(value);
  JsonObject &myJson =jsonBuffer.createObject();
  JsonArray &dataStreams =myJson.createNestedArray("dataStreams");
  dataStreams.add(idDataPoints);
  // 設置POST的請求表頭
  char postData[400];
  int postLength = myJson.printTo(postData,sizeof(postData));
  packet.setHostAddress(oneNetServer);
  packet.setDevId(deviceId);
  packet.setAccessKey(API_KEY);
  packet.createCmdPacket(POST, TYPE_DATAPOINT,postData);
  int httpLength = strlen(packet.content) +postLength;
  char cmd[500];
  // 鏈接服務器
  memset(cmd, 0, 500);
  sprintf(cmd,"AT+CIPSTART=\"TCP\",\"%s\",80\r\n",oneNetServer);
  if(sendATCommead(cmd,"CONNECT",3000, 5) == SEND_SUCCESS);
  else ESP8266_Error(4);
  // 發送數據
  memset(cmd,0,500);
  sprintf(cmd,"AT+CIPSEND=%d\r\n",httpLength);
  if(sendATCommead(cmd,">",3000,3)== SEND_SUCCESS);
  else ESP8266_Error(5);
  memset(cmd,0,500);
  strcpy(cmd,packet.content);
  strcat(cmd,postData);
if(sendATCommead(cmd,"succ\"}",5000,5) == SEND_SUCCESS);
  else ESP8266_Error(6);
if(sendATCommead("AT+CIPCLOSE\r\n","CLOSED",3000,3)== SEND_SUCCESS);
  else ESP8266_Error(7);
}

/**
* @TODO 將ESP8266返回的數據返回到緩存數組中
* 1. 清理緩存數據
* 2. 將讀取的數據存入全局數組中
* 3. 超出數組長度之后
*/
void readResponse(){
  clearResponse();
  while(ESP8266Serial.available()){
    ESP8266Response[resLength++] =ESP8266Serial.read();
    if(resLength == RES_MAX_LENGTH)clearResponse();
  }
}

/**
* @todo 清理數據交互緩存區
*/
void clearResponse(){
  memset(ESP8266Response,0,RES_MAX_LENGTH);
  resLength = 0;
}

/**
* 計時器函數,單位為毫秒
*/
void timeClock(){
  curTime++;
}
溫濕度上傳數據:
#include<SoftwareSerial.h>
#include <dht11.h>
//bool SendDataByHttp();
void(* resetFunc) (void) =0;//系統復位
int ledPin = 13;
int resetWIFI = 8;
int timeCount = 0;
#define API_KEY  "5=u1Uo3anU=av33dYi3bk4aflF0="    //APIkey
#define DEVICE_ID   "19888592"                     //設備ID
#defineESP8266_WIFI_INFO   "AT+CWJAP=\"4F\",\"yy1234567\"\r\n"  
#defineESP8266_ONENET_INFO  "AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r\n"

#define SECOND  1000L
// 串口
#define _baudrate   9600
#define _rxpin      3
#define _txpin      2
#define  DBG_UART  dbgSerial   //調試打印串口
#define  WIFI_UART  Serial
SoftwareSerial dbgSerial(_rxpin, _txpin ); // 軟串口,調試打印

void setup() {
  //--------------------------------------
  //pinMode(resetWIFI, OUTPUT);//控制 模塊的重新啟動
  //pinMode(ledPin, OUTPUT);   //WIFI模塊指示燈
  digitalWrite(ledPin, HIGH);   // 使Led亮
  digitalWrite(resetWIFI, LOW); //硬件復位8266
  delay(250);
  digitalWrite(resetWIFI, HIGH);
  delay(2000);
  //--------------------------------------
  WIFI_UART.begin( _baudrate );
  DBG_UART.begin( _baudrate );

  while (!WIFI_UART) {
    ;
  }
  while (!DBG_UART) {
    ;
  }

  //------------------------------------------
  //init WIFI module
  DBG_UART.print("1. AT\r\n");
  if(ESP8266_SendCmd("AT\r\n", "OK", 1800))resetFunc();
//ESP8266_SendCmd("AT+CWMODE=3\r\n", "OK", 1800);
  delay(500);
  DBG_UART.print("2. CWJAP\r\n");
  if (ESP8266_SendCmd(ESP8266_WIFI_INFO,"GOT IP", 5000))resetFunc(); //CONNECTED
  delay(500);
  DBG_UART.print("3. CIPSTART\r\n");
  if (ESP8266_SendCmd(ESP8266_ONENET_INFO,"CONNECT", 3000))resetFunc();
  delay(500);
  ESP8266_SendCmd("AT+CIPMODE=1\r\n","OK", 2000);
  delay(500);
  DBG_UART.print("4. CIPSEND\r\n");
    if (ESP8266_SendCmd("AT+CIPSEND\r\n",">", 3000))resetFunc();
   DBG_UART.print("5. ESP8266 InitOK\r\n");
}


void loop() {
  if (++timeCount >= 10)
  {
    DBG_UART.print("OneNet_SendDatastart\r\n");
    if (SendDataByHttp())
      DBG_UART.print("OneNet_SendDatasuccess!\r\n");
    else
      DBG_UART.print("OneNet_SendDatafail!\r\n");

    timeCount = 0;
  }
  delay(500);

}
bool findstr(String str,char *key)
{
  int num = str.length();
  int len = strlen(key);

  int i, k;

  if (num >= len)
  {

    for (i = 0; i <= num - len; i++)
    {
      for (k = 0; k < len; k++)
      {
        if (str[k + i] != key[k])break;
      }
      if (k >= len)return true;
    }
  }

  return false;

}
/*
   doCmdOk
   發送命令至模塊,從回復中獲取期待的關鍵字
   keyword: 所期待的關鍵字
   成功找到關鍵字返回true,否則返回false
*/
bool ESP8266_SendCmd(StringstrCmd, char *OkKey, unsigned int timeout)
{
  String strData = "";
  char c;
  unsigned long t;
  WIFI_UART.print(strCmd);
  //等待應答
  t = millis();
  while ((t + timeout) > millis())
  {
    while (WIFI_UART.available())
    {
      c = WIFI_UART.read();
      strData += c;
    }
  }
    if (findstr(strData, OkKey))
    {
      DBG_UART.println(strData);
      return false;
    }
    else
    {
      DBG_UART.print(strData);
      return true;
    }
}
  String CreateDataForHttp(char *strStreamId,double value)
  {
    //String str ="{\"datastreams\":[{\"id\":\"" +String(strStreamId) +"\",\"datapoints\":[{\"value\":" +String(value) + "}]}]}"; //默認為完整JSON型
    String str = "{\"" +String(strStreamId) + "\":" + String(value) + "}";//type=3
    return str;
  }
  bool SendDataByHttp()
  {
    int cnt;
    char c;
    String ptr;
    String strData = "";
    unsigned long timeout = 0;
    char val=analogRead(A0);
    float temp=val*0.4888;
    ptr =CreateDataForHttp("sys-mmm",temp); //自己定義數據,或者獲取傳感器數據
    cnt = ptr.length();
    //發送數據 http

    WIFI_UART.print("POST /devices/"+ String(DEVICE_ID) + "/datapoints?type=3 HTTP/1.1\r\n");//DBG_UART.print("POST /devices/" + String(DEVICE_ID) +"/datapoints HTTP/1.1\r\n");
    WIFI_UART.print("api-key:" +String(API_KEY) + "\r\n");//DBG_UART.print("api-key:" +String(API_KEY) + "\r\n");
   WIFI_UART.print("Host:api.heclouds.com\r\n");//DBG_UART.print("Host:api.heclouds.com\r\n");
    WIFI_UART.print("Content-Length:"+ String(cnt) + "\r\n");//DBG_UART.print("Content-Length:"+ String(cnt) + "\r\n");
    WIFI_UART.println(); // DBG_UART.println();
    WIFI_UART.print(ptr);//DBG_UART.print(ptr);
    WIFI_UART.println(); //DBG_UART.println();
    DBG_UART.println(ptr);
    //delay(1000);
    //等待結果
    strData = "";
    timeout = millis();
    while (millis() - timeout < 5000)
    {
      while (WIFI_UART.available())
      {
        c = char(WIFI_UART.read());
        strData += c;
      }
    }
    if (findstr(strData, "OK"))
    {
      DBG_UART.println(strData);
      return true;
    }
    else
    {
      DBG_UART.println(strData);
      return false;
    }
  }

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品视频一区二区 | 一区二区在线观看av | 日韩一区二区视频 | 成人av电影天堂 | 欧美啊v在线观看 | 国产一级在线 | 国产欧美在线视频 | 精品国产一区二区三区免费 | 国产91久久精品一区二区 | 亚洲精品日韩视频 | 久久精品国产v日韩v亚洲 | 精品1区2区3区4区 | 国产99小视频 | 日本成人中文字幕 | 精品在线一区 | 国产精品成人av | 国产玖玖 | 一区二区三区免费 | gav成人免费播放视频 | 成人中文字幕在线观看 | 蜜桃在线一区二区三区 | 久久久久久久久毛片 | 国产精品久久久久久久久久久久冷 | 欧美黄色网 | 亚洲一级视频在线 | 国产无套一区二区三区久久 | 日韩欧美在线一区 | 中文字幕在线精品 | 精品久久国产视频 | 国产精品视频免费看 | 精品久久久久久久 | 亚洲人成在线播放 | 成人在线一区二区三区 | 久久精品亚洲 | 黄色一级片在线播放 | 国产中文 | 成人国产精品入口免费视频 | 国产精品区二区三区日本 | 午夜理伦三级理论三级在线观看 | 欧美aaa级| 福利片在线看 |