国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

網(wǎng)站開發(fā)有哪些模塊網(wǎng)站怎樣被百度收錄

網(wǎng)站開發(fā)有哪些模塊,網(wǎng)站怎樣被百度收錄,美工設(shè)計(jì)素材網(wǎng)站,網(wǎng)站規(guī)劃有前途嗎基于嵌入式的智能智能通風(fēng)系統(tǒng) 功能說明 通過微信小程序控制窗戶的開關(guān)狀體以及倒計(jì)時(shí)開關(guān)和定時(shí)開關(guān),小程序上實(shí)時(shí)顯示當(dāng)前溫度濕度和光照強(qiáng)度。 功能展示 02智能通風(fēng)系統(tǒng) Mqtt服務(wù)器 http://www.yoyolife.fun/iot:Mqtt服務(wù)器,我是在這里注…

基于嵌入式的智能智能通風(fēng)系統(tǒng)

功能說明

通過微信小程序控制窗戶的開關(guān)狀體以及倒計(jì)時(shí)開關(guān)和定時(shí)開關(guān),小程序上實(shí)時(shí)顯示當(dāng)前溫度濕度和光照強(qiáng)度。

功能展示

02智能通風(fēng)系統(tǒng)

Mqtt服務(wù)器

  • http://www.yoyolife.fun/iot:Mqtt服務(wù)器,我是在這里注冊(cè)的,免費(fèi)一個(gè),之后每個(gè)2塊錢每月。主要是結(jié)構(gòu)簡(jiǎn)單,用起來容易。
  • 下位機(jī)即ESP32要選擇mqtt地址:t.yoyolife.fun 端口:1883地址(里邊有三個(gè)地址)
  • 微信小程序要選擇mqtt:wss地址:t.yoyolife.fun/mqtt 端口:8084地址,不可選錯(cuò)。
  • 兩邊的發(fā)布和訂閱要對(duì)應(yīng)起來,一個(gè)發(fā)布一個(gè)訂閱,跟串口的Tx、Rx一樣。服務(wù)器的主題可以隨意定,意為服務(wù)器要監(jiān)聽哪個(gè)地址。
  • 設(shè)備ID即是用戶名,密碼即是密碼。
  • 調(diào)試軟件為mqttx,可自行下載https://mqttx.app/zh,調(diào)試下位機(jī)的時(shí)候可以連接上邊提到的微信小程序8084那個(gè)端口,即服務(wù)器地址:wss://t.yoyolife.fun、端口:8084、Path:/mqtt、用戶名即設(shè)備ID、密碼即密碼,然后訂閱ESP32發(fā)布的那個(gè)地址,或者向ESP32訂閱的那個(gè)地址發(fā)布信息。

程序思路

????????下位機(jī)每隔1秒發(fā)送當(dāng)前狀態(tài)數(shù)據(jù),上位機(jī)改變值之后發(fā)送一次當(dāng)前改變的數(shù)據(jù)。下位機(jī)接收之后再去分析是哪個(gè)數(shù)據(jù),再去解析。
????????關(guān)于時(shí)間思路:接受NTP時(shí)間后,轉(zhuǎn)為北京時(shí)間,然后將時(shí)間化為分鐘,即小時(shí)x60+分鐘。精度到分鐘,然后秒等于0的話執(zhí)行一次。然后上位機(jī)發(fā)送倒計(jì)時(shí)后,當(dāng)前時(shí)間再加上倒計(jì)時(shí)的時(shí)間,得到一個(gè)時(shí)間A,當(dāng)當(dāng)前時(shí)間再走到時(shí)間A時(shí)就是倒計(jì)時(shí)結(jié)束的時(shí)間。關(guān)于定時(shí)開和定時(shí)關(guān),也是如此,將時(shí)間化為分鐘傳遞給下位機(jī),下位機(jī)再獲取當(dāng)前時(shí)間去對(duì)比。

硬件制作


采用的是ESP32+微信小程序+Mqtt協(xié)議。

硬件選型

  • ESP32開發(fā)板(VSCode+PlatformIO環(huán)境)
  • DHT11溫濕度傳感器
  • 光敏電阻
  • 0.96寸OLED屏
  • SG90舵機(jī)(用來開關(guān)窗戶)
  • 杜邦線若干

硬件連接

在這里插入圖片描述
如圖所示,需要注意的是光敏電阻接的是模擬位引腳,共電共地要外接可以找一排排針然后一端全部連在一起,板子3V3和GND出來后,分別插在一排上,然后需要共地和共電的地方插到排針上,注意千萬要區(qū)分開來,否則短路會(huì)燒壞板子。

硬件程序


程序采用VSCode+PlatformIO環(huán)境。安裝以下庫

  • ArduinoJson 庫:解析Mqtt協(xié)議收發(fā)的json格式數(shù)據(jù)。
  • DHT sensor library庫:用于DHT11采集溫濕度數(shù)據(jù)。
  • NTPClient 庫:獲取網(wǎng)絡(luò)NTP時(shí)間。
  • PubSubClient 庫:Mqtt通訊協(xié)議。
  • U8g2 庫:OLED顯示庫。
代碼展示

以下展示部分重要代碼,完整完成在文章末尾。

Mqtt連接

const char *ssid = "Hide_2805";                            // ESP32連接的WiFi賬號(hào)
const char *password = "asdfghjkl";                        // WiFi密碼
const char *mqttServer = "t.yoyolife.fun";                 // 要連接到的服務(wù)器IP
const int mqttPort = 1883;                                 // 要連接到的服務(wù)器端口號(hào)
const char *mqttUser = "75bdfb62a1c56065949702a3a6430e38"; // MQTT服務(wù)器賬號(hào)
const char *mqttPassword = "123465";                       // MQTT服務(wù)器密碼
const char *mqttsub = "/iot/4432/wsy";                     // MQTT訂閱主題
const char *mqttpub = "/iot/4432/waa";                     // MQTT發(fā)送主題WiFiClient espClient;                              // 定義wifiClient實(shí)例
PubSubClient client(espClient);                    // 定義PubSubClient的實(shí)例DynamicJsonDocument Json(1024);                    // 定義Json實(shí)例String Debug_Mqtt = "";// Mqtt回調(diào)函數(shù)
void callback(char *topic, byte *payload, unsigned int length)
{String Str = "";Serial.print("來自訂閱的主題:"); // 串口打印:來自訂閱的主題:Serial.println(topic);           // 串口打印訂閱的主題Serial.print("信息:");          // 串口打印:信息:for (int i = 0; i < length; i++) // 使用循環(huán)打印接收到的信息{Serial.print((char)payload[i]);Str += (char)payload[i];}Serial.println();Serial.println("-----------------------");Debug_Mqtt = Str;deserializeJson(Json, Str);if (Json.containsKey("debug")){Debug = Json["debug"].as<unsigned char>();}// 倒計(jì)時(shí)if (Json.containsKey("time")){Time = Json["time"].as<unsigned char>();if (Time)Time = Now_Time + Time;}if (Json.containsKey("open")){Open_Time = Json["open"].as<unsigned int>();if(Open_Time)Open_State = 1;elseOpen_State = 0;}if (Json.containsKey("close")){Close_Time = Json["close"].as<unsigned int>();if(Close_Time)Close_State = 1;elseClose_State = 0;Serial.println("Close_Time");Serial.println(Close_Time);}if (Json.containsKey("Win_State")){Win_State = Json["Win_State"].as<bool>();if (Win_State)Ment = true;elseMent = false;}Serial.print("Json:");      // 串口打印:來自訂閱的主題:Serial.println(Debug_Mqtt); // 串口打印訂閱的主題
}void WiFi_Click(void)
{while (WiFi.status() != WL_CONNECTED) // 若WiFi接入成功WiFi.status()會(huì)返回 WL_CONNECTED{Serial.println("連接wifi中"); // 串口輸出:連接wifi中WiFi.begin(ssid, password);   // 接入WiFi函數(shù)(WiFi名稱,密碼)重新連接wifdelay(2000);                  // 若尚未連接WiFi,則進(jìn)行重連WiFi的循環(huán)}Serial.println("wifi連接成功");         // 連接wifi成功之后會(huì)跳出循環(huán),串口并輸出:wifi連接成功client.setServer(mqttServer, mqttPort); // MQTT服務(wù)器連接函數(shù)(服務(wù)器IP,端口號(hào))client.setCallback(callback);           // 設(shè)定回調(diào)方式,當(dāng)ESP32收到訂閱消息時(shí)會(huì)調(diào)用此方法while (!client.connected())             // 是否連接上MQTT服務(wù)器{Serial.println("連接服務(wù)器中");                            // 串口打印:連接服務(wù)器中if (client.connect("ESP32Client", mqttUser, mqttPassword)) // 如果服務(wù)器連接成功{Serial.println("服務(wù)器連接成功"); // 串口打印:服務(wù)器連接成功}else{Serial.print("連接服務(wù)器失敗"); // 串口打印:連接服務(wù)器失敗Serial.print(client.state());   // 重新連接函數(shù)delay(2000);}}client.subscribe(mqttsub);                    // 連接MQTT服務(wù)器后訂閱主題Serial.print("已訂閱主題,等待主題消息...."); // 串口打印:已訂閱主題,等待主題消息client.publish(mqttpub, "Hello from ESP32");  // 向服務(wù)器發(fā)送的信息(主題,內(nèi)容)
}void Pub_Mqtt(void)
{char payload[200];StaticJsonDocument<200> jsonDocument; // 聲明一個(gè)Json格式變量jsonDocument["windowstate"] = Ment;jsonDocument["temperature"] = Temp;jsonDocument["humidity"] = Humi;jsonDocument["light"] = Light;serializeJson(jsonDocument, payload);Serial.println(payload);client.publish(mqttpub, payload); // 向服務(wù)器發(fā)送的信息(主題,內(nèi)容)son轉(zhuǎn)換為字符串
}

主函數(shù)及時(shí)間片

// 時(shí)間片
void Time_Slice(void)
{if (F_Time_10ms){F_Time_10ms = 0;}if (F_Time_100ms){F_Time_100ms = 0;Display();Log_Print();// Ctrl_Motor();Ctrl_Window();}if (F_Time_500ms){F_Time_500ms = 0;Light = analogRead(LIGHT_PIN);Light = 100 - (Light * 100 / 4095);}if (F_Time_2s){F_Time_2s = 0;DHT11_Get();Pub_Mqtt();TimeClient.update();Serial.println(TimeClient.getFormattedTime());Hour = TimeClient.getHours();Min = TimeClient.getMinutes();Sec = TimeClient.getSeconds();Now_Time = Hour * 60 + Min;}if (F_Time_5s){F_Time_5s = 0;Serial.print("目前時(shí)間");Serial.println(Now_Time);Serial.print("開窗時(shí)間");Serial.println(Open_Time);Serial.print("關(guān)窗時(shí)間");Serial.println(Close_Time);Serial.print("倒計(jì)時(shí)時(shí)間");Serial.println(Time);}
}
// 初始化
void setup()
{Sys_Init();U8g2_Init();u8g2.setCursor(0, 8);u8g2.print("U8g2 OK!");u8g2.sendBuffer();Serial.begin(115200); // 串口函數(shù),波特率設(shè)置u8g2.setCursor(0, 8 + 12 * 1);u8g2.print("串口 OK!");u8g2.sendBuffer();WiFi_Click();u8g2.setCursor(0, 8 + 12 * 2);u8g2.print("WiFi OK!");u8g2.sendBuffer();Timer0_Init();Motor_Init();TimeClient.begin();TimeClient.setTimeOffset(28800); //+1地區(qū)偏移3600u8g2.setCursor(0, 8 + 12 * 3);u8g2.print("NTP OK!");u8g2.sendBuffer();DHT.begin();u8g2.setCursor(0, 8 + 12 * 4);u8g2.print("DHT11 OK!");u8g2.sendBuffer();delay(2000);
}
// 主函數(shù)
void loop()
{client.loop(); // 回旋接收函數(shù)  等待服務(wù)器返回的數(shù)據(jù)Time_Slice();
}

舵機(jī)控制函數(shù)

// 控制窗戶
void Ctrl_Window(void)
{if (Open_State){if (Open_Time == Now_Time){Ment = true;Open_State = 0;}}if (Close_State){if (Close_Time == Now_Time){Ment = false;Close_State = 0;}}if (Time){if (Time == Now_Time){Time = 0;Ment = !Ment;}}if (Ment){ledcWrite(2, 26);}else{ledcWrite(2, 70);}
}

硬件修改代碼作為己用

用戶如需借用代碼,只需修改關(guān)鍵部分即可,例如Mqtt的Key、發(fā)布訂閱地址,WiFi的賬號(hào)密碼等。

初始化修改

// 硬件宏定義
#define LED_Pin 2 // 板載LED
#define DHT11_Pin 4
#define DHTTYPE DHT11
#define LIGHT_PIN 33#define MOTOR_A1 12 // 預(yù)留步進(jìn)電機(jī)
#define MOTOR_A2 14
#define MOTOR_A3 27
#define MOTOR_A4 26#define Lamp_Pin1 12
#define Lamp_Pin2 13
#define LED_Pin_Gnd 14
#define DuJ_Pin 25 // 開窗舵機(jī)const char *ssid = "Hide_2805";                            // ESP32連接的WiFi賬號(hào)
const char *password = "asdfghjkl";                        // WiFi密碼
const char *mqttServer = "t.yoyolife.fun";                 // 要連接到的服務(wù)器IP
const int mqttPort = 1883;                                 // 要連接到的服務(wù)器端口號(hào)
const char *mqttUser = "75bdfb62a1c56065949702a3a6430e38"; // MQTT服務(wù)器賬號(hào)
const char *mqttPassword = "123465";                       // MQTT服務(wù)器密碼
const char *mqttsub = "/iot/4432/wsy";                     // MQTT訂閱主題
const char *mqttpub = "/iot/4432/waa";                     // MQTT發(fā)送主題

callback函數(shù)中修改地方

// 倒計(jì)時(shí)
if (Json.containsKey("time"))	// 判斷當(dāng)前接受的是哪個(gè)字符串
{Time = Json["time"].as<unsigned char>();	// 做一些處理if (Time)Time = Now_Time + Time;
}

Pub_Mqtt函數(shù)中修改地方

jsonDocument["windowstate"] = Ment;// 需要發(fā)布的Json鍵和值
jsonDocument["temperature"] = Temp;
jsonDocument["humidity"] = Humi;
jsonDocument["light"] = Light;

微信小程序制作


軟件采用的是微信開發(fā)者工具,下載軟件即可使用,無需復(fù)雜環(huán)境,成品直接發(fā)布就能使用,方便快捷。

軟件程序

  • 引入Mqtt的js包。
  • 請(qǐng)求獲取系統(tǒng)地址權(quán)限,請(qǐng)求天氣API(高德),獲取當(dāng)?shù)靥鞖狻?/li>
  • 請(qǐng)求Mqtt服務(wù)器,訂閱相關(guān)地址。
  • 獲取接受的數(shù)據(jù),Json解析。
  • 按鍵像相關(guān)地址發(fā)布Json數(shù)據(jù)。

下邊是具體代碼。

天氣數(shù)據(jù)

  getUserLocation: function () {let that = this;wx.getSetting({success: (res) => {console.log("天氣", res);if (res.authSetting["scope.userLocation"] != undefined &&res.authSetting["scope.userLocation"] != true) {wx.showModal({title: "請(qǐng)求授權(quán)當(dāng)前位置",content: "需要獲取您的地理位置,請(qǐng)確認(rèn)授權(quán)",success: function (res) {if (res.cancel) {wx.showToast({title: "拒絕授權(quán)",icon: "none",duration: 1000,});} else if (res.confirm) {wx.openSetting({success: function (dataAu) {if (dataAu.authSetting["scope.userLocation"] == true) {wx.showToast({title: "授權(quán)成功",icon: "success",duration: 1000,});//再次授權(quán),調(diào)用wx.getLocation的APIthat.getLocation();} else {wx.showToast({title: "授權(quán)失敗",icon: "none",duration: 1000,});}},});}},});} else if (res.authSetting["scope.userLocation"] == undefined) {//調(diào)用wx.getLocation的APIthat.getLocation();} else {//res.authSetting['scope.userLocation'] == true//調(diào)用wx.getLocation的APIthat.getLocation();}},});},getLocation() {let that = this;wx.getLocation({type: "wgs84",success(res) {console.log("經(jīng)緯度", res);if (res?.errMsg === "getLocation:ok") {/* ----------------通過經(jīng)緯度獲取地區(qū)編碼---------------- */wx.request({url: "https://restapi.amap.com/v3/geocode/regeo?parameters",data: {key: KEY, //填入自己申請(qǐng)到的Keylocation: res.longitude + "," + res.latitude, //傳入經(jīng)緯度},header: {"content-type": "application/json",},success: function (res) {console.log("坐標(biāo)轉(zhuǎn)換和查詢天氣", res.data);wx.setStorageSync("city",res.data.regeocode.addressComponent.adcode //地區(qū)編碼);that.setData({location: res.data.regeocode.addressComponent.city +" " +res.data.regeocode.addressComponent.district,});wx.request({url: "https://restapi.amap.com/v3/weather/weatherInfo",data: {key: KEY, //填入自己申請(qǐng)到的Keycity: res.data.regeocode.addressComponent.adcode, //傳入地區(qū)編碼},header: {"content-type": "application/json",},success: function (weather) {console.log("天氣", weather.data);that.setData({temp: weather.data.lives[0].temperature, //溫度weatherText: weather.data.lives[0].weather, //天氣描述 晴天 下雨天...welcome: "今天的天氣是 " + weather.data.lives[0].weather + ",又是愛豆的一天!", //歡迎語});},});},});}},});},

Mqtt協(xié)議

  connectMqtt() {let that = this;const options = {connectTimeout: 4000,address: "t.yoyolife.fun/mqtt", //輸入的地址port: 8084, //輸入的端口號(hào)username: "75bdfb62a1c56065949702a3a6430e38", //輸入的用戶名password: "123465", //輸入的密碼};console.log("address是:", options.address);client = mqtt.connect(MQTTADDRESS, options); //連接client.on("connect", (e) => {console.log('連接成功');})client.on("reconnect", (error) => {console.log("正在重連:", error);wx.showToast({icon: "none",title: "正在重連",});});client.on("error", (error) => {console.log("連接失敗:", error);wx.showToast({icon: "none",title: "mqtt連接失敗",});});// 訂閱一個(gè)主題let message = this.data.push;client.subscribe(this.data.push, {qos: 0}, function (err) {if (!err) {console.log("訂閱成功", message);wx.showToast({icon: "none",title: "添加成功",});}});client.on("message", (topic, message) => {console.log("收到地址:", topic);console.log("收到消息:", message.toString());let getMessage = {}; //收到的消息try {getMessage = JSON.parse(message); //收到的消息轉(zhuǎn)換成json對(duì)象console.log(getMessage);that.setData({temperature: getMessage.temperature,humidity: getMessage.humidity,light: getMessage.light,windowsta: getMessage.windowstate,})} catch (error) {console.log("JSON解析失敗!");}})}

修改代碼作為己用

用戶如需借用代碼,只需修改關(guān)鍵部分即可,例如Mqtt的Key、發(fā)布訂閱地址,WiFi的賬號(hào)密碼等。

程序初始化

const KEY = "1acc1391bf1593cf96f258d2f9ebe552";	//注意這里是高德地圖的KEY 不是Mqtt服務(wù)器的KEYconst app = getApp();
import mqtt from "../../utils/mqtt.min";		//加載的Mqtt協(xié)議的文件名
const MQTTADDRESS = "wxs://t.yoyolife.fun/mqtt"; //mqtt服務(wù)器地址

data中數(shù)據(jù)

    welcome: "你好,這里是Shiboven。",//主頁顯示push: "/iot/4432/waa", //訂閱地址subscr: "/iot/4432/wsy", //發(fā)布地址

connectMqtt函數(shù)

    const options = {connectTimeout: 4000,		//重連時(shí)間address: "t.yoyolife.fun/mqtt", //Mqtt服務(wù)器地址port: 8084, //Mqtt服務(wù)器端口號(hào)username: "75bdfb62a1c56065949702a3a6430e38", //Mqtt用戶名password: "123465", //Mqtt密碼};

總結(jié)

項(xiàng)目本身功能簡(jiǎn)單,但是包含內(nèi)容還是挺多的,擴(kuò)展的話也比較容易。

項(xiàng)目地址:
https://download.csdn.net/download/weixin_42320020/88758864

http://m.aloenet.com.cn/news/33461.html

相關(guān)文章:

  • wordpress 架站 電子書百度網(wǎng)盤下載速度
  • 四川華泰建設(shè)集團(tuán)網(wǎng)站網(wǎng)絡(luò)營(yíng)銷渠道策略有哪些
  • 網(wǎng)站更換服務(wù)器影響網(wǎng)站優(yōu)化的主要內(nèi)容
  • 有個(gè)網(wǎng)站可以學(xué)做ppt模板十大營(yíng)銷案例分析
  • 任何網(wǎng)站都可以做谷歌推廣的嗎專業(yè)的網(wǎng)頁制作公司
  • 新塘做網(wǎng)站東莞有哪些做推廣的網(wǎng)站
  • 榆林國(guó)貿(mào)網(wǎng)站建設(shè)怎么做關(guān)鍵詞排名靠前
  • 新疆錦旭建設(shè)工程公司網(wǎng)站seo信息優(yōu)化
  • 比較出名的文創(chuàng)產(chǎn)品南寧百度seo
  • 深圳 微網(wǎng)站建設(shè)ydgcm獎(jiǎng)券世界推廣網(wǎng)站
  • 如何判斷網(wǎng)站html5上海高端seo公司
  • 網(wǎng)站開源模板百度指數(shù)排名明星
  • app平臺(tái)網(wǎng)站搭建潮州seo建站
  • 雙語網(wǎng)站建設(shè)報(bào)價(jià)百度鏈接提交收錄入口
  • dw網(wǎng)頁設(shè)計(jì)期末作業(yè)seo的主要分析工具
  • 公司網(wǎng)站設(shè)計(jì)方案網(wǎng)站查詢是否安全
  • 天津做網(wǎng)站哪個(gè)公司好seo排名優(yōu)化工具推薦
  • 做游戲開發(fā)需要學(xué)哪些技術(shù)優(yōu)化大師下載安裝app
  • 網(wǎng)站建設(shè) 長(zhǎng)沙百度推廣怎么提高關(guān)鍵詞排名
  • 勝芳網(wǎng)站建設(shè)qiansi全國(guó)疫情最新情況公布
  • 前端怎么做電商網(wǎng)站網(wǎng)絡(luò)營(yíng)銷和網(wǎng)絡(luò)銷售的關(guān)系
  • 做論壇網(wǎng)站需要哪些前置審批申請(qǐng)一個(gè)網(wǎng)站需要多少錢
  • 網(wǎng)站域名備案需要資料網(wǎng)站內(nèi)鏈優(yōu)化
  • 專業(yè)的營(yíng)銷型網(wǎng)站最新報(bào)價(jià)網(wǎng)絡(luò)推廣策劃
  • 怎么給網(wǎng)站做aapseo優(yōu)化專家
  • 廈網(wǎng)站建設(shè)培訓(xùn)學(xué)校創(chuàng)建網(wǎng)站要錢嗎
  • 做外貿(mào)網(wǎng)站需要什么卡西安網(wǎng)站快速排名提升
  • 外貿(mào)需要網(wǎng)站做生產(chǎn)車間展示友聯(lián)互換
  • 網(wǎng)站規(guī)劃與設(shè)計(jì)范文seo招聘網(wǎng)
  • 什么樣建網(wǎng)站百度的seo排名怎么刷