物聯網實戰:STM32+ESP8266溫濕度數據采集上傳Linux服務器與數據庫可視化(附代碼示例)

摘要:?本文將手把手教你搭建一個完整的物聯網數據監控平臺,使用STM32采集溫濕度數據,通過ESP8266 WiFi模塊上傳至Linux服務器,并利用Python腳本將數據存儲到MySQL數據庫,最后實現每日平均值的計算和可視化展示。

關鍵詞:?STM32, ESP8266, Linux, MySQL, 物聯網, 溫濕度傳感器, 數據可視化

一、系統架構

本項目采用典型的物聯網三層架構:

  • 感知層:?STM32單片機讀取DHT11溫濕度傳感器數據,并通過ESP8266 WiFi模塊發送至服務器。
  • 網絡層:?ESP8266連接路由器,將數據傳輸至公網IP的Linux服務器。
  • 應用層:?Linux服務器上的Python腳本接收數據,并存儲到MySQL數據庫。同時,腳本還會計算每日平均值,并提供簡單的可視化圖表。

二、硬件準備

  • STM32開發板
  • DHT11溫濕度傳感器
  • ESP8266 WiFi模塊
  • 杜邦線若干

三、軟件準備

  • STM32CubeMX
  • Keil MDK
  • Putty
  • Xshell
  • MySQL
  • Python 3.x
  • Navicat for MySQL (可選)

四、STM32端開發

4.1 使用STM32CubeMX配置工程
  1. 新建工程,選擇STM32F103C8T6芯片。
  2. 配置RCC時鐘源為外部晶振。
  3. 配置GPIO引腳,用于DHT11數據讀取和ESP8266通信。
  4. 配置USART1用于與ESP8266通信。
  5. 生成Keil MDK工程代碼。
4.2 編寫STM32代碼
// DHT11數據讀取函數
void DHT11_Read_Data(float *temperature, float *humidity);// ESP8266數據發送函數
void ESP8266_Send_Data(char *data);int main(void)
{// 初始化HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();DHT11_Init();float temperature, humidity;char data[50];while (1){// 讀取DHT11數據DHT11_Read_Data(&temperature, &humidity);// 格式化數據sprintf(data, "temperature=%.1f&humidity=%.1f", temperature, humidity);// 通過ESP8266發送數據ESP8266_Send_Data(data);HAL_Delay(5000); // 每5秒采集一次數據}
}

4.3 編譯下載
  1. 在Keil MDK中編譯工程。
  2. 將編譯生成的hex文件下載到STM32開發板。

五、Linux服務器配置

5.1 安裝軟件
  1. 使用apt-get安裝必要的軟件包:
sudo apt-get update
sudo apt-get install python3 python3-pip mysql-server
  1. 安裝Python庫:
pip3 install flask pymysql
5.2 創建MySQL數據庫及數據表
  1. 登錄MySQL:
mysql -u root -p
  1. 創建數據庫:
CREATE DATABASE iot_data;
  1. 創建數據表:
USE iot_data;
CREATE TABLE temp_humidity (id INT AUTO_INCREMENT PRIMARY KEY,temperature FLOAT,humidity FLOAT,datetime DATETIME DEFAULT CURRENT_TIMESTAMP
);
5.3 編寫Python數據接收腳本
from flask import Flask, request
import pymysqlapp = Flask(__name__)# MySQL數據庫連接信息
db_config = {'host': 'localhost','user': 'root','password': 'your_password','database': 'iot_data'
}@app.route('/data', methods=['POST'])
def receive_data():# 獲取POST請求中的數據temperature = request.form.get('temperature')humidity = request.form.get('humidity')# 連接MySQL數據庫conn = pymysql.connect(**db_config)cursor = conn.cursor()try:# 插入數據sql = "INSERT INTO temp_humidity (temperature, humidity) VALUES (%s, %s)"cursor.execute(sql, (temperature, humidity))conn.commit()print("數據插入成功!")except Exception as e:print(f"數據插入失敗:{e}")conn.rollback()finally:cursor.close()conn.close()return 'OK'if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
5.4 編寫Python數據處理腳本
import pymysql
from datetime import date, timedelta# MySQL數據庫連接信息
db_config = {'host': 'localhost','user': 'root','password': 'your_password','database': 'iot_data'
}def calculate_daily_average():# 計算昨天的日期yesterday = date.today() - timedelta(days=1)# 連接MySQL數據庫conn = pymysql.connect(**db_config)cursor = conn.cursor()try:# 查詢昨天的數據sql = f"SELECT AVG(temperature), AVG(humidity) FROM temp_humidity WHERE DATE(datetime) = '{yesterday}'"cursor.execute(sql)result = cursor.fetchone()# 打印結果if result:avg_temp, avg_humidity = resultprint(f"{yesterday} 的平均溫度:{avg_temp:.2f}℃,平均濕度:{avg_humidity:.2f}%")else:print(f"{yesterday} 沒有數據記錄。")except Exception as e:print(f"數據查詢失敗:{e}")finally:cursor.close()conn.close()if __name__ == '__main__':calculate_daily_average()

六、ESP8266配置

6.1 連接ESP8266

使用USB轉TTL模塊連接ESP8266,并配置好串口調試工具(如Putty)。

6.2 配置ESP8266工作模式
AT+CWMODE=1  // 設置為Station模式
AT+CWJAP="your_wifi_ssid","your_wifi_password"  // 連接WiFi
AT+CIPSTART="TCP","your_server_ip",5000  // 建立TCP連接
6.3 修改STM32代碼,通過ESP8266發送數據
// ESP8266數據發送函數
void ESP8266_Send_Data(char *data)
{// 發送AT指令char cmd[100];sprintf(cmd, "AT+CIPSEND=%d\r\n", strlen(data));HAL_UART_Transmit(&huart1, (uint8_t *)cmd, strlen(cmd), 1000);// 等待發送提示HAL_UART_Receive(&huart1, rx_buffer, sizeof(rx_buffer), 1000);// 發送數據HAL_UART_Transmit(&huart1, (uint8_t *)data, strlen(data), 1000);// 發送結束符HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", 2, 1000);
}

?

  1. 運行Python數據接收腳本:?在Linux服務器上執行?python3 data_receiver.py?啟動Flask應用,監聽來自ESP8266的數據。

  2. 燒錄STM32程序并觀察串口輸出:

    • 編譯并燒錄STM32代碼到開發板。
    • 打開串口調試工具,設置波特率與代碼一致。
    • 觀察串口輸出,確認DHT11數據讀取正常,且ESP8266成功連接WiFi并發送數據。
  3. 查看MySQL數據庫確認數據存儲:

    • 使用Navicat for MySQL或命令行工具連接到MySQL數據庫。
    • 查看iot_data數據庫中的temp_humidity表,確認數據已成功插入。
  4. 運行Python數據處理腳本:

    • 等待一段時間,讓系統積累一些溫濕度數據。
    • 每天定時運行python3 data_processor.py腳本,計算前一天的平均溫濕度并輸出到控制臺。

八、數據可視化 (可選)

為了更直觀地展示溫濕度數據,可以使用Python的數據可視化庫(如Matplotlib)生成圖表。

import matplotlib.pyplot as plt
import pymysql
from datetime import datetime, timedelta# ... (數據庫連接信息與calculate_daily_average函數代碼)# 獲取過去7天的平均溫濕度數據
def get_weekly_average():data = []today = datetime.today()for i in range(7):day = today - timedelta(days=i)sql = f"SELECT AVG(temperature), AVG(humidity) FROM temp_humidity WHERE DATE(datetime) = '{day.strftime('%Y-%m-%d')}'"cursor.execute(sql)result = cursor.fetchone()if result:data.append((day.strftime('%Y-%m-%d'), result[0], result[1]))else:data.append((day.strftime('%Y-%m-%d'), None, None))return dataif __name__ == '__main__':# ... (計算并打印日平均值)# 獲取數據并繪制圖表data = get_weekly_average()dates = [row[0] for row in data]temperatures = [row[1] for row in data]humidities = [row[2] for row in data]plt.plot(dates, temperatures, label="Temperature (°C)")plt.plot(dates, humidities, label="Humidity (%)")plt.xlabel("Date")plt.ylabel("Value")plt.title("Weekly Average Temperature and Humidity")plt.legend()plt.show()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42499.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42499.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42499.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

抖音本地生活火爆!普通人如何申請抖音本地生活服務商?

當前,隨著抖音外賣的正式開放,抖音本地生活的熱度也迎來了新的高潮,與抖音本地生活服務商怎么申請等話題相關的詞條更是成為了多個創業者社群的熱搜榜單的常客。 事實上,就抖音本地生活服務商怎么申請等問題本身而言,…

nvm安裝報錯(鏡像問題)

一、問題報錯 安裝的時候如果跟著網上早些時候的配置,調整了setting文件,配置鏡像的話,可能報這個錯誤。 這個是因為他沒檢索到后面的鏈接地址,因為鏡像的地址新的已經更換了。使用這個吧: node_mirror: https://npm…

java基礎01—根據源碼分析128陷阱以及如何避免128陷阱

源碼分析128陷阱 如上圖所示,int類型數據超過127依舊能正常比較,但Integer類型就無法正確比較了 /*** Cache to support the object identity semantics of autoboxing for values between* -128 and 127 (inclusive) as required by JLS.** The cache …

Python 文件操作:打開數據處理的大門

在 Python 的學習之旅中,文件操作是一個非常實用且必不可少的技能。不論是數據分析還是日常的數據處理,良好的文件操作技巧都能讓你的編程之路更加順暢。今天,我將帶你走進 Python 文件操作的世界,不僅教你如何讀寫文件&#xff0…

視頻監控管理平臺智能邊緣分析一體機視頻監控系統客流統計檢測算法

在當今數據驅動的時代,客流統計作為商業分析的重要手段,其準確性和實時性對于商家決策具有至關重要的影響。隨著技術的發展,智能邊緣分析一體機結合了邊緣計算與深度學習技術,為客流統計提供了更為高效、精準的解決方案。 首先&am…

美容師有什么話術技巧?美業人如何提升自己的銷售技巧?博弈美業門店管理系統分享經驗

作為一名美容師,有一些話術和銷售技巧可以幫助你提升服務質量和銷售業績。以下是博弈美業收銀系統分享的一些建議: 1.建立信任: 在與客戶交流時,表現出真誠、友好和專業的態度。傾聽客戶的需求,并給予針對性的建議&a…

跟我練習100道FPGA入門題目~(2/100)

難度指數:一顆星 關鍵詞:組合邏輯、入門基礎 點擊此處直接答題:F學社-全球FPGA技術提升平臺 (zzfpga.com) 提交代碼就能看到波形圖和電路圖啦! (在社區加入群聊,更多學友等著和你探討~)

CTF-PWN-kernel-前置

文章目錄 打包上傳測試腳本檢查保護調試腳本編寫Intel Syntax特點:示例: AT&T Syntax特點:示例: 對比總結 c庫中asm的匯編 用到啥更新啥,一直更新ing 打包上傳測試腳本 #!/bin/sh gcc expolit.c -static -masmintel -g -o expolit mv expolit fs/ cd core find…

淮北在選擇SCADA系統時,哪些因素會影響其穩定性?

關鍵字:LP-SCADA系統, 傳感器可視化, 設備可視化, 獨立SPC系統, 智能儀表系統,SPC可視化,獨立SPC系統 在選擇SCADA系統時,穩定性是一個關鍵因素,因為它直接影響到生產過程的連續性和安全性。以下是一些影響SCADA系統穩定性的因素: 硬件質量…

微服務-初級篇

微服務-初級篇 認識微服務1.1 單體架構1.2 分布式架構1.3 微服務 SpringCloud2.1 了解2.2 服務拆分原則2.3 服務拆分效果 Nacos注冊中心3.1 認識和安裝Nacos3.1.1 Nacos下載3.1.2 Nacos安裝 3.2 服務注冊到Nacos Feign遠程調用4.1 Feign引入4.2 Feign配置 認識微服務 1.1 單體…

如何利用java依賴jave-all-deps實現視頻格式轉換

視頻格式轉換是常見的需求,通過使用Java依賴庫jave-all-deps可以實現視頻格式的轉換。本文將詳細介紹在Java中如何利用jave-all-deps實現視頻格式轉換。 什么是jave-all-deps庫? jave-all-deps是一款基于FFmpeg庫的Java音視頻編解碼庫。它提供了一系列AP…

java 實現人臉特征提取和比對

特征提取 1. 安裝必要的庫 確保你已經安裝了JPEG庫、BLAS和LAPACK庫。在Ubuntu或Debian系統上,可以使用以下命令安裝: sudo apt-get update sudo apt-get update sudo apt-get install build-essential cmake sudo apt-get install libgtk-3-dev sud…

【C語言】標識符大通關!

目錄 1. 簡介2. 標識符的定義3. 標識符的命名規則3.1 有效字符3.2 長度限制 4. 關鍵字與保留字5. 標識符的作用域5.1 塊作用域5.2 文件作用域5.3 函數作用域5.4 原型作用域 6. 命名規范與最佳實踐6.1 命名習慣6.2 避免沖突 7. 標識符示例與解析8. 參考文獻9. 結束語 1. 簡介 標…

Zynq系列FPGA實現SDI視頻編解碼+UDP以太網傳輸,基于GTX高速接口,提供3套工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦本博已有的 SDI 編解碼方案本博已有的以太網方案本博已有的FPGA圖像縮放方案1G/2.5G Ethernet PCS/PMA or SGMII架構以太網通信方案AXI 1G/2.5G Ethernet Subsystem架構以太網通信方案本方案的縮放應用本方案在Xilinx--Kintex系列…

2024年全國青少年信息素養大賽復賽及決賽、我知道的有這些

周末兩天2024年全國青少年信息素養大賽復賽部分賽區已經結束,還沒有考試的同學加緊備考后面的2次,成績預計(7月13日、7月20日兩次考試)結束之后的2周左右出,2024年全國青少年信息素養大賽決賽將在2024年8月16日-20日在…

解決:Flink向kafka寫數據使用Producer精準一次(EXACTLY_ONCE)異常

在使用flink向kafka寫入數據報錯:Caused by: org.apache.kafka.common.KafkaException: Unexpected error in InitProducerIdResponse; The transaction timeout is larger than the maximum value allowed by the broker (as configured by transaction.max.timeou…

文獻解讀-基準與方法研究-第十六期|《GeneMind 公司的 GenoLab M 測序平臺 WGS 和 WES 數據基準測試》

關鍵詞:基準與方法研究;基因測序;變異檢測; 文獻簡介 標題(英文):Accuracy benchmark of the GeneMind GenoLab M sequencing platform for WGS and WES analysis標題(中文&#xf…

差分+前綴和習題集

&#xff08;luogu題號&#xff09; P6568 [NOI Online #3 提高組] 水壺 思路分析 前綴和優化問題。 其實題意就是讓你求有k1個數的區間和最大值&#xff0c;那么直接前綴和優化&#xff0c;就可以通過本題。 代碼 #include<bits/stdc.h> using namespace std;const in…

@component注解的分類

Component作用類似于xml文件里面的<Bean>:交給IOC去創建相關的實體類對象&#xff1b; 如果用xml配置的話&#xff0c;還要在xml配置文件中添加<context:component-scan base-package”掃描范圍路徑”> Component有三個主要的衍生注解&#xff0c;它們分別用于標…

QByteArray 轉換成 QString 類型

在Qt中&#xff0c;QByteArray和QString是兩種常用的數據類型&#xff0c;分別用于處理字節數組和字符串。如果你有一個QByteArray對象&#xff0c;并希望將其轉換為QString對象&#xff0c;你可以使用QString的構造函數或fromUtf8()靜態方法來完成這一轉換。 以下是兩種常用的…