物聯(lián)網(wǎng)開發(fā)實戰(zhàn)-家庭溫濕度計的實現(xiàn)

前言

由于工作關(guān)系,我接觸到相關(guān)嵌入式開發(fā)睹耐。來公司3年糊探,天天耳濡目染,我覺得自己至少也得寫點嵌入式相關(guān)

目標

實現(xiàn)一個家庭溫濕度計的小工具扣汪。 直接上理想的結(jié)果

配件

esp8266開發(fā)板
溫濕度傳感器
杜邦線
usb線

image.png

淘寶搜一下.

接線

如果你和我的同款断楷,則接線應(yīng)該相同。

傳感器的GND 接 esp8266的GND
傳感器的DATA接 esp8266的 D4
傳感器的VCC 接 esp8266的 3V

image.png
image.png

平臺配置

創(chuàng)建產(chǎn)品
記得選中 密鑰認證

image.png
image.png

定義數(shù)據(jù)模型

image.png

面板設(shè)置

image.png

添加設(shè)備


image.png

用騰訊連連小程序掃描即可崭别。

編碼

編碼的邏輯
1冬筒、先連接wifi
2、再連接mqtt茅主,連接后訂閱消息舞痰,接收控制指令。
3诀姚、不斷檢查時間間隔响牛,時間到了則讀取溫度、濕度赫段。提交數(shù)據(jù)




/**
   連接wifi
   連接mqtt
   讀取溫濕度
DHT11的濕度測量分辨率是1%娃善,溫度測量分辨率是1攝氏度。
*/
#include <SimpleDHT.h>
#include <Arduino_JSON.h>


#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <PubSubClient.h>



#ifndef STASSID
#define STASSID "wifi名稱"
#define STAPSK  "wifi密碼"
#endif

const char* ssid     = STASSID;
const char* password = STAPSK;


/* 產(chǎn)品的三元組信息瑞佩,*/
#define PRODUCT_KEY       "產(chǎn)品id"
#define DEVICE_NAME       "設(shè)備id"
#define DEVICE_SECRET     "設(shè)備密鑰"
/**
   mqtt 服務(wù)器信息
*/
#define MQTT_SERVER       PRODUCT_KEY".iotcloud.tencentdevices.com"
#define MQTT_PORT         1883
/**
   過期時間
   2021-11-11 11:09:16
   ${productid}${devicename};${sdkappid};${connid};${expiry}
   11:16:52.842 -> S6UF3TTS5Resp8266living;12010126;fthome;1636600156

*/
#define MQTT_USRNAME      PRODUCT_KEY DEVICE_NAME";12010126;fthome;1636600156"

#define MQTT_CLIENT_ID         PRODUCT_KEY DEVICE_NAME
/**
   密碼規(guī)則
   row_key = base64(key)  
   token = hmacsh1(username,row_key)
   4c60988b98fe88af7211ef4baad57efc75d679c1f012100335c798ef566bedda
   ${token};hmac 簽名方法


*/
#define MQTT_PASSWD       "4c60988b98fe88af7211ef4baad57efc75d679c1f012100335c798ef566bedda;hmacsha256"


#define POST_TOPIC     "$thing/up/property/" PRODUCT_KEY "/" DEVICE_NAME
#define BODY_FORMAT    "{\"method\":\"report\",\"clientToken\":\"msg-id-%d\",\"params\":{\"temperature\":%s,\"humidity\":%s,\"upmin\":%d}}"

#define  DOWN_TOPIC "$thing/down/property/" PRODUCT_KEY "/" DEVICE_NAME

/**
   設(shè)備對服務(wù)器下發(fā)消息的回應(yīng)

*/
#define  REPLY_FORMAT  "{\"method\":\"control_reply\",\"clientToken\":\"%s\",\"code\":0,\"status\":\"success\"}"

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);


ESP8266WiFiMulti WiFiMulti;

WiFiClient    espClient;
PubSubClient  client(espClient);


int pinDHT11 = 2;


/**
   默認的上報時間
*/
int upmin = 1;

unsigned long lastMs = 0;


SimpleDHT11 dht11(pinDHT11);


void callback(char *topic, byte *payload, unsigned int length)
{


  char input[length];

  for (int i = 0; i < length; i++) {
    //Serial.print((char)payload[i]);
    input[i] = (char)payload[i];
  }
  if (strstr(topic, DOWN_TOPIC))
  {
    JSONVar myObject = JSON.parse(input);

    if (JSON.typeof(myObject) == "undefined")
    {
      return ;
    }

    //消息類型
    if (myObject.hasOwnProperty("method")) {
      Serial.print("myObject[\"method\"] = ");

      Serial.println(myObject["method"]);

      //是否控制下發(fā)指令
      if (strstr(myObject["method"], "control")) {

        Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");

    Serial.println(input);


        /**
           {
          "method": "control",
          "clientToken": "clientToken-0a9dc8ef-1b3b-45f0-af55-a10988431f00",
          "params": {
          "upmin": 1
          }
          }
        */

        //先應(yīng)答
            char jsonBuf[128];

        sprintf(jsonBuf, REPLY_FORMAT, (const char*)myObject["clientToken"]);

              Serial.println(jsonBuf);


    boolean d = client.publish(POST_TOPIC, jsonBuf);

    if (d) {
      Serial.println("reply control msg ok ");

    } else {
      Serial.println("reply control error ");

    }
        


        if (myObject.hasOwnProperty("params")) {

          Serial.println(myObject["params"]["upmin"]);

          Serial.println(JSON.typeof(myObject["params"]["upmin"]));

          if (JSON.typeof(myObject["params"]["upmin"]) == "number") {
            upmin = myObject["params"]["upmin"];

          }






        }



      }


    }


  }

}


void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");

    // Attempt to connect
    if (client.connect(MQTT_CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD)) {
      Serial.println("connected");
      // 訂閱消息
      client.subscribe(DOWN_TOPIC);
      Serial.println("subscribe done");

    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}


void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(ssid, password);

  Serial.println();
  Serial.println();
  Serial.print("Wait for WiFi... ");

  while (WiFiMulti.run() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  delay(500);

  timeClient.begin();

  /**
     連接服務(wù)器
  */



  client.setServer(MQTT_SERVER, MQTT_PORT);
  client.setCallback(callback);



}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  //符合間隔數(shù)據(jù)聚磺,上報一次
  if (millis() - lastMs >= upmin * 1000 ) {
    lastMs = millis();
    Serial.println("start up msg ");

    //上報1次。
    float temperature = 0.0;
    float humidity = 0.0;

    int err = SimpleDHTErrSuccess;
    if ((err = dht11.read2(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
      return;
    }
    char jsonBuf[128];
    int timestamp = millis();

    char   ts[6] = "";
    char   hs[6] = "";

    dtostrf(temperature, 2, 2, ts);

    dtostrf(humidity, 2, 2, hs);


    sprintf(jsonBuf, BODY_FORMAT, timestamp, ts, hs,upmin);

    boolean d = client.publish(POST_TOPIC, jsonBuf);

    if (d) {
      Serial.print("up msg ok ");

    } else {
      Serial.print("up msg error ");

    }






  }


  client.loop();


  delay(5000);
}

代碼中的參數(shù)的獲取位置

image.png

注意事項

  • 讀取的溫度和濕度沒有小數(shù)
    雖然我代碼寫的是 浮點數(shù)炬丸,但是實際讀取結(jié)果只能整數(shù)瘫寝。這是因為我買的傳感器只支持整數(shù)蜒蕾。精度不夠。

  • 騰訊mqtt的文檔地址

https://github.com/tencentyun/qcloud-iot-esp-wifi

其他地方完全看不懂焕阿。尤其其中topic

  • Mqtt參數(shù)的密碼問題

密碼我不會代碼生成咪啡,所以選中在線計算。

這里要注意暮屡,記得勾選 我圖中的base64格式密鑰撤摸。

image.png
  • 最后的結(jié)果


    image.png
image.png
  • 后續(xù)

增加OLED屏幕和空氣質(zhì)量

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喳整,一起剝皮案震驚了整個濱河市掉冶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凌蔬,老刑警劉巖莺掠,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衫嵌,死亡現(xiàn)場離奇詭異,居然都是意外死亡彻秆,警方通過查閱死者的電腦和手機楔绞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唇兑,“玉大人酒朵,你說我怎么就攤上這事≡剑” “怎么了耻讽?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長帕棉。 經(jīng)常有香客問我针肥,道長,這世上最難降的妖魔是什么香伴? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任慰枕,我火速辦了婚禮,結(jié)果婚禮上即纲,老公的妹妹穿的比我還像新娘具帮。我一直安慰自己,他們只是感情好低斋,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布蜂厅。 她就那樣靜靜地躺著,像睡著了一般膊畴。 火紅的嫁衣襯著肌膚如雪掘猿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天唇跨,我揣著相機與錄音稠通,去河邊找鬼衬衬。 笑死,一個胖子當著我的面吹牛改橘,可吹牛的內(nèi)容都是我干的滋尉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼飞主,長吁一口氣:“原來是場噩夢啊……” “哼狮惜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碌识,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤碾篡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丸冕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡薛窥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年胖烛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诅迷。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡佩番,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出罢杉,到底是詐尸還是另有隱情趟畏,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布滩租,位于F島的核電站赋秀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏律想。R本人自食惡果不足惜猎莲,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望技即。 院中可真熱鬧著洼,春花似錦、人聲如沸而叼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葵陵。三九已至液荸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脱篙,已是汗流浹背莹弊。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工涤久, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忍弛。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓响迂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親细疚。 傳聞我的和親對象是個殘疾皇子蔗彤,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容