<noscript id="mmkmi"><source id="mmkmi"></source></noscript>
  • <noscript id="mmkmi"><kbd id="mmkmi"></kbd></noscript>
  • <table id="mmkmi"><source id="mmkmi"></source></table>
  • 用ESP8266傳遞BMP180的溫度和氣壓到貝殼云

    作者:wony366 | 更新時間:2016-04-07 | 瀏覽量:2855

    基本接線:


    BMP180           esp8266 

    vcc     3.3V   

    gnd     gnd

    scl              GPIO14

    sda              GPIO2



    ESP8266通過TTL 接電腦,不再贅述。


    以下是代碼:


    #include <ESP8266WiFi.h> 

    #include <SFE_BMP180.h>

    #include <Wire.h>

     

    WiFiClient client;


    const char *ssid     = "xxx";//這里是我的wifi,你使用時修改為你要連接的wifi ssid

    const char *password = "xxxx";//你要連接的wifi密碼

    const char *host = "121.42.180.30";//貝殼云地址

    char valueread;


     SFE_BMP180 pressure;// 創建一個氣壓計對象 

    double baseline; // 基準氣壓


    void setup()

    {

      Serial.begin(115200);

      Wire.begin(2,14); //定義I2C接口,并啟動,ESP8266-12E的 2 和 14 口是原本定義為I2C接口,其他模塊查看手冊,用于讀取BMP180的參數


    //下面的代碼是確保WIFI連接正確,并打印登錄路由器信息

      Serial.print("Connecting to ");

      Serial.println(ssid);  

      WiFi.begin(ssid, password);  

      while (WiFi.status() != WL_CONNECTED) {

        delay(500);

        Serial.print(".");

      }

      Serial.println("");

      Serial.println("WiFi connected");  

      Serial.println("IP address: ");

      Serial.println(WiFi.localIP());

    //下面的代碼是連接服務器

      const int httpPort =8181;

      client.connect(host, httpPort);

      delay(2000); 

      Serial.println("connecting to host");

      while (!client.connect(host, httpPort)) 

        {

        Serial.println("..");

        delay(500);

        }   

      Serial.print("connecting to ");

      Serial.println(host);

      //下面的代碼是用自己的ID 和 KEY 登錄服務器,確保服務器返回正確登錄信息,否則一直重試登錄,直到出現正確的返回信息

      

      client.write("{\"M\":\"checkin\",\"ID\":\"138\",\"K\":\"123456\"}\r\n");//登陸設備,修改成自己的ID和key


      Serial.print("waitting for host answer");

      delay(500);   

        String line = client.readStringUntil('\r');

         Serial.print(line);

        valueread=line[28];//修改自己成發送的指令的位置,我這里指令位置在是28位,此方法是參考前面網友的

        Serial.println(valueread);//此處打印的是歡迎信息,并不代表登錄成功

        while(valueread !='M')    // 此處是驗證登錄成功后返回的信息

        {

         delay(500);

          client.write("{\"M\":\"checkin\",\"ID\":\"138\",\"K\":\"123456\"}\r\n");//登陸設備,修改成自己的ID和key    

          Serial.print(".");

          String line = client.readStringUntil('\r');

         Serial.print(line);

          valueread=line[2];//此處打印的是登錄成功信息,checkinok ,這是返回字段,我偷懶,隨便取了一位值,你可以按需取

        Serial.println(valueread);

         }    

      delay(100);


      

     //下面是傳感器相關,無關云平臺

      // 初始化傳感器

      if (pressure.begin())

        Serial.println("BMP180 init success");

      else

      {

        // 糟糕,氣壓計出問題了,多半是連線有問題

        Serial.println("BMP180 init fail (disconnected?)\n\n");

        while(1); // 暫停

      }

      }

       


     

    void loop()

    {  

      baseline = getP(); //獲得基準氣壓

      Serial.print("baseline pressure: ");

      Serial.print(baseline);

      Serial.println(" hPa");   

      

      double a,p,t;

      p = getP();// 獲得一個氣壓值

      a = pressure.altitude(p,baseline);//獲得基于基準氣壓的高度值

     

      Serial.print("relative altitude: ");

      if (a >= 0.0) Serial.print(" "); // 調整正數顯示格式

      Serial.print(a,1);

      Serial.print(" meters ");  

     

      t = getT();// 獲得一個溫度值

      Serial.print("temperature: ");

      Serial.print(t,1);

      Serial.print(t);

      Serial.println(" degrees");  


     update1(138,119,166,167,p,t,a);//向服務器發數據,138是設備ID,119 166 167 是數據接口,p t a  是傳感器參數


     delay(5000);//刷新率5秒,太快,服務器會出錯


      client.write("{\"M\":\"say\",\"ID\":\"138\",\"C\":\"123456\"}\r\n"); //保持心跳,這是我的ID 和key,自己修改 ,以防掉線

    }

     

     //取得BMP180氣壓的函數

    double getP()

    {

      char status;

      double T,P,p0,a;

      // You must first get a temperature measurement to perform a pressure reading.

      // Start a temperature measurement:

      // If request is successful, the number of ms to wait is returned.

      // If request is unsuccessful, 0 is returned.

      status = pressure.startTemperature();

      if (status != 0)

      {

        // Wait for the measurement to complete:

        delay(status);

        // Retrieve the completed temperature measurement:

        // Note that the measurement is stored in the variable T.

        // Use '&T' to provide the address of T to the function.

        // Function returns 1 if successful, 0 if failure.

     

        status = pressure.getTemperature(T);

        if (status != 0)

        {

          // Start a pressure measurement:

          // The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait).

          // If request is successful, the number of ms to wait is returned.

          // If request is unsuccessful, 0 is returned.

          status = pressure.startPressure(3);

          if (status != 0)

          {

            // Wait for the measurement to complete:

            delay(status);

            // Retrieve the completed pressure measurement:

            // Note that the measurement is stored in the variable P.

            // Use '&P' to provide the address of P.

            // Note also that the function requires the previous temperature measurement (T).

            // (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.)

            // Function returns 1 if successful, 0 if failure.

            status = pressure.getPressure(P,T);

            if (status != 0)

            {

              return P;

            }

            else Serial.println("error retrieving pressure measurement\n");

          }

          else Serial.println("error starting pressure measurement\n");

        }

        else Serial.println("error retrieving temperature measurement\n");

      }

      else Serial.println("error starting temperature measurement\n");

    }


      //取得BMP180溫度的函數

    double getT()

    {

      char status;

      double T,p0;

      status = pressure.startTemperature();

      if (status != 0)

      {

        delay(status);

        status = pressure.getTemperature(T);

        if (status != 0)

        {

          status = pressure.startPressure(3);

          return T;

        }

        else Serial.println("error retrieving temperature measurement\n");

      }

      else Serial.println("error starting temperature measurement\n");

    }


    void update1(int did, int inputid1, int inputid2,int inputid3,float value1 ,float value2,float value3) // 定義一次傳遞3個參數的函數,該函數是借鑒 網友 在路上 的勞動成果

    {

    String str1="{\"M\":\"update\",\"ID\":\"";

    str1+=did;

    str1+="\",\"V\":{\"";

    str1+=inputid1;

    str1+="\":\"";

    str1+=value1;

    str1+="\",\"" ;

    str1+=inputid2;

    str1+="\":\"";

    str1+=value2;

    str1+="\",\"" ;

    str1+=inputid3;

    str1+="\":\"";

    str1+=value3;

    str1+="\"" ;

    str1+="}}\n";

     client.print(str1);  

    //下面是串口打印 傳遞到服務器的信息,以便調試

      Serial.print("update:");   

      Serial.print(inputid1);   

      Serial.print("->");   

      Serial.println(value1);   

       Serial.print("update:");   

      Serial.print(inputid2);   

      Serial.print("->");   

      Serial.println(value2); 

       Serial.print("update:");   

      Serial.print(inputid3);   

      Serial.print("->");   

      Serial.println(value3); 

    }



    數據見公開頁面 :http://www.eqytg.org/chart/138.html


    評論:共2條

    貝殼物聯 評論于:2016-04-07 20:30:48
    多謝分享,可以把代碼部分高亮顯示,編輯話題,選中代碼,代碼語音選擇C語言。
    climate 評論于:2018-04-28 14:19:14
    庫文件怎么獲得呢?
    返回頂部
    <noscript id="mmkmi"><source id="mmkmi"></source></noscript>
  • <noscript id="mmkmi"><kbd id="mmkmi"></kbd></noscript>
  • <table id="mmkmi"><source id="mmkmi"></source></table>
  • 三上悠亚在线观看