版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
溫濕度遠(yuǎn)程監(jiān)控系統(tǒng)(ESP32+MQTT+小程序)完整的溫濕度遠(yuǎn)程監(jiān)控系統(tǒng)方案,包含硬件端、云端和小程序端的實(shí)現(xiàn)。系統(tǒng)架構(gòu)設(shè)計(jì)硬件端實(shí)現(xiàn)(ESP32)cpp#include<WiFi.h>#include<PubSubClient.h>#include<DHT.h>//WiFi配置constchar*ssid="your_wifi_ssid";constchar*password="your_wifi_password";//MQTT配置constchar*mqtt_server="your_mqtt_broker";constintmqtt_port=1883;constchar*mqtt_user="username";constchar*mqtt_password="password";//設(shè)備配置#defineDHTPIN4#defineDHTTYPEDHT22DHTdht(DHTPIN,DHTTYPE);WiFiClientespClient;PubSubClientclient(espClient);//主題定義constchar*temp_topic="sensor/temperature";constchar*humi_topic="sensor/humidity";constchar*status_topic="device/status";voidsetup_wifi(){delay(10);Serial.println();Serial.print("Connectingto");Serial.println(ssid);WiFi.begin(ssid,password);while(WiFi.status()!=WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFiconnected");Serial.println("IPaddress:");Serial.println(WiFi.localIP());}voidreconnect(){while(!client.connected()){Serial.print("AttemptingMQTTconnection...");StringclientId="ESP32Client-";clientId+=String(random(0xffff),HEX);if(client.connect(clientId.c_str(),mqtt_user,mqtt_password)){Serial.println("connected");//發(fā)布設(shè)備在線狀態(tài)client.publish(status_topic,"online");}else{Serial.print("failed,rc=");Serial.print(client.state());Serial.println("tryagainin5seconds");delay(5000);}}}voidsetup(){Serial.begin(115200);dht.begin();setup_wifi();client.setServer(mqtt_server,mqtt_port);}voidloop(){if(!client.connected()){reconnect();}client.loop();//每10秒讀取一次傳感器數(shù)據(jù)staticunsignedlonglastMsg=0;unsignedlongnow=millis();if(now-lastMsg>10000){lastMsg=now;//讀取溫濕度floattemperature=dht.readTemperature();floathumidity=dht.readHumidity();//檢查讀取是否成功if(isnan(temperature)||isnan(humidity)){Serial.println("FailedtoreadfromDHTsensor!");return;}//發(fā)布數(shù)據(jù)到MQTTchartempString[8];charhumiString[8];dtostrf(temperature,1,2,tempString);dtostrf(humidity,1,2,humiString);client.publish(temp_topic,tempString);client.publish(humi_topic,humiString);Serial.print("Temperature:");Serial.print(tempString);Serial.print("°C,Humidity:");Serial.print(humiString);Serial.println("%");}}小程序前端實(shí)現(xiàn)html<!--pages/index/index.wxml--><viewclass="container"><viewclass="header"><textclass="title">溫濕度監(jiān)控系統(tǒng)</text><viewclass="status"><textclass="status-text">設(shè)備狀態(tài):{{connected?'在線':'離線'}}</text><viewclass="status-indicator{{connected?'online':'offline'}}"></view></view></view><viewclass="sensor-cards"><viewclass="cardtemperature"><viewclass="card-header"><textclass="card-title">溫度</text><textclass="card-unit">°C</text></view><viewclass="card-value">{{temperature||'--'}}</view><viewclass="card-time">{{tempTime||'--'}}</view></view><viewclass="cardhumidity"><viewclass="card-header"><textclass="card-title">濕度</text><textclass="card-unit">%</text></view><viewclass="card-value">{{humidity||'--'}}</view><viewclass="card-time">{{humiTime||'--'}}</view></view></view><viewclass="chart-section"><viewclass="section-title">歷史數(shù)據(jù)</view><canvascanvas-id="tempChart"class="chart"></canvas><canvascanvas-id="humiChart"class="chart"></canvas></view><viewclass="control-section"><buttonclass="btn{{connected?'btn-disconnect':'btn-connect'}}"bindtap="{{connected?'disconnectMQTT':'connectMQTT'}}">{{connected?'斷開連接':'連接設(shè)備'}}</button><buttonclass="btnbtn-refresh"bindtap="refreshData">刷新數(shù)據(jù)</button></view></view>javascript//pages/index/index.jsconstmqtt=require('../../utils/mqtt.min.js');Page({data:{connected:false,temperature:null,humidity:null,tempTime:null,humiTime:null,tempHistory:[],humiHistory:[],client:null},onLoad(){this.initChart();},onUnload(){this.disconnectMQTT();},connectMQTT(){constoptions={connectTimeout:4000,clientId:'wx_'+Math.random().toString(16).substr(2,8),username:'username',password:'password'};constclient=mqtt.connect('wxs://your-mqtt-broker/mqtt',options);client.on('connect',()=>{wx.showToast({title:'連接成功',icon:'success'});this.setData({connected:true});//訂閱主題client.subscribe('sensor/temperature');client.subscribe('sensor/humidity');client.subscribe('device/status');});client.on('message',(topic,message)=>{constvalue=parseFloat(message.toString());consttime=this.formatTime(newDate());if(topic==='sensor/temperature'){this.updateTemperature(value,time);}elseif(topic==='sensor/humidity'){this.updateHumidity(value,time);}});client.on('error',(error)=>{console.error('MQTTError:',error);wx.showToast({title:'連接失敗',icon:'none'});});this.setData({client});},disconnectMQTT(){if(this.data.client){this.data.client.end();this.setData({connected:false,client:null});wx.showToast({title:'已斷開連接',icon:'success'});}},updateTemperature(value,time){consttempHistory=[...this.data.tempHistory,{value,time}];if(tempHistory.length>20)tempHistory.shift();this.setData({temperature:value.toFixed(1),tempTime:time,tempHistory});this.drawChart('tempChart',tempHistory,'#ff6b6b','溫度');},updateHumidity(value,time){consthumiHistory=[...this.data.humiHistory,{value,time}];if(humiHistory.length>20)humiHistory.shift();this.setData({humidity:value.toFixed(1),humiTime:time,humiHistory});this.drawChart('humiChart',humiHistory,'#4ecdc4','濕度');},initChart(){//初始化圖表constsystemInfo=wx.getSystemInfoSync();this.chartWidth=systemInfo.windowWidth-40;this.chartHeight=200;},drawChart(canvasId,data,color,title){constctx=wx.createCanvasContext(canvasId);constwidth=this.chartWidth;constheight=this.chartHeight;if(data.length===0)return;//清空畫布ctx.clearRect(0,0,width,height);//繪制坐標(biāo)軸ctx.setStrokeStyle('#cccccc');ctx.setLineWidth(1);ctx.moveTo(30,20);ctx.lineTo(30,height-20);ctx.lineTo(width-10,height-20);ctx.stroke();//繪制數(shù)據(jù)線ctx.setStrokeStyle(color);ctx.setLineWidth(2);constvalues=data.map(item=>item.value);constmaxValue=Math.max(...values);constminValue=Math.min(...values);constrange=maxValue-minValue||1;data.forEach((item,index)=>{constx=30+(index/(data.length-1||1))*(width-40);consty=height-20-((item.value-minValue)/range)*(height-40);if(index===0){ctx.moveTo(x,y);}else{ctx.lineTo(x,y);}});ctx.stroke();//繪制標(biāo)題ctx.setFillStyle(color);ctx.setFontSize(12);ctx.fillText(title,40,15);ctx.draw();},refreshData(){if(this.data.client&&this.data.connected){//可以發(fā)送指令請(qǐng)求最新數(shù)據(jù)this.data.client.publish('device/control','refresh');wx.showToast({title:'刷新成功',icon:'success'});}else{wx.showToast({title:'請(qǐng)先連接設(shè)備',icon:'none'});}},formatTime(date){return`${date.getHours().toString().padStart(2,'0')}:${date.getMinutes().toString().padStart(2,'0')}:${date.getSeconds().toString().padStart(2,'0')}`;}});css/*pages/index/index.wxss*/.container{padding:20rpx;background:linear-gradient(135deg,#667eea0%,#764ba2100%);min-height:100vh;}.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:40rpx;}.title{font-size:36rpx;font-weight:bold;color:white;}.status{display:flex;align-items:center;background:rgba(255,255,255,0.2);padding:10rpx20rpx;border-radius:20rpx;}.status-text{font-size:24rpx;color:white;margin-right:10rpx;}.status-indicator{width:20rpx;height:20rpx;border-radius:50%;}.status-indicator.online{background:#4cd964;}.status-indicator.offline{background:#dd524d;}.sensor-cards{display:flex;justify-content:space-between;margin-bottom:40rpx;}.card{flex:1;background:white;border-radius:20rpx;padding:30rpx;margin:010rpx;box-shadow:010rpx30rpxrgba(0,0,0,0.1);}.card.temperature{border-top:8rpxsolid#ff6b6b;}.card.humidity{border-top:8rpxsolid#4ecdc4;}.card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20rpx;}.card-title{font-size:28rpx;color:#666;}.card-unit{font-size:24rpx;color:#9
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年新疆鐵道職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試模擬測(cè)試卷附答案解析
- 2024年安徽省淮南市單招職業(yè)適應(yīng)性考試題庫附答案解析
- 2023年天津機(jī)電職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫附答案解析
- 2024年云南體育運(yùn)動(dòng)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫附答案解析
- 2024年邯鄲應(yīng)用技術(shù)職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試模擬測(cè)試卷附答案解析
- 重彩錦鯉課件教學(xué)
- 滴滴運(yùn)營人員情緒調(diào)節(jié)技巧提升
- 2023JGES臨床實(shí)踐指南:ERCP術(shù)后胰腺炎課件
- 猜花課件教學(xué)課件
- 獨(dú)立的自己課件
- 國家開放大學(xué)電大《國際私法》形考任務(wù)1-5題庫及答案
- 《市場(chǎng)營銷專業(yè)申報(bào)》課件
- 三年級(jí)數(shù)學(xué)上冊(cè) (提高版)第8章《分?jǐn)?shù)的初步認(rèn)識(shí)》單元培優(yōu)拔高測(cè)評(píng)試題(教師版含解析)(人教版)
- 19計(jì)科機(jī)器學(xué)習(xí)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 全國職業(yè)院校技能大賽賽項(xiàng)規(guī)程(高職)農(nóng)產(chǎn)品質(zhì)量安全檢測(cè)
- DB51∕T 3179-2024 杵針技術(shù)操作規(guī)范
- 專利共同申請(qǐng)合同模板(2024版)
- 國開機(jī)考答案21-人文英語1(閉卷)
- AQ∕T 7009-2013 機(jī)械制造企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化規(guī)范
- MOOC 近代物理實(shí)驗(yàn)-西南大學(xué) 中國大學(xué)慕課答案
- 教科版三年級(jí)科學(xué)上冊(cè)課件《運(yùn)動(dòng)和位置》
評(píng)論
0/150
提交評(píng)論