ESP32與樹莓派C++、Rust開發實戰

C++語言在ESP32、樹莓派實例

以下是關于C++語言在ESP32、樹莓派等硬件設備上的開發實例匯總,涵蓋常見應用場景和代碼示例。

ESP32開發實例

LED控制(GPIO操作)

使用ESP32的GPIO控制LED燈,示例代碼基于Arduino框架:

#include <Arduino.h>
const int ledPin = 2; // ESP32內置LED通常接GPIO2void setup() {pinMode(ledPin, OUTPUT);
}void loop() {digitalWrite(ledPin, HIGH);delay(1000);digitalWrite(ledPin, LOW);delay(1000);
}
WiFi連接與HTTP請求

ESP32連接WiFi并發送HTTP請求:

#include <WiFi.h>
#include <HTTPClient.h>const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";void setup() {Serial.begin(115200);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}HTTPClient http;http.begin("http://example.com/api");int httpCode = http.GET();if (httpCode > 0) {String payload = http.getString();Serial.println(payload);}http.end();
}void loop() {}

樹莓派開發實例

GPIO控制(使用wiringPi)

控制樹莓派GPIO引腳輸出:

#include <wiringPi.h>
#define LED_PIN 0 // 對應GPIO17int main() {wiringPiSetup();pinMode(LED_PIN, OUTPUT);while (1) {digitalWrite(LED_PIN, HIGH);delay(1000);digitalWrite(LED_PIN, LOW);delay(1000);}return 0;
}
使用libcurl發送HTTP請求

樹莓派上使用C++發送HTTP請求:

#include <iostream>
#include <curl/curl.h>size_t writeCallback(void* contents, size_t size, size_t nmemb, std::string* s) {s->append((char*)contents, size * nmemb);return size * nmemb;
}int main() {CURL* curl;CURLcode res;std::string readBuffer;curl = curl_easy_init();if(curl) {curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);res = curl_easy_perform(curl);curl_easy_cleanup(curl);std::cout << readBuffer << std::endl;}return 0;
}
傳感器數據讀取(I2C接口)

讀取BMP280氣壓傳感器數據:

#include <wiringPiI2C.h>
#include <iostream>
#include <cmath>int main() {int fd = wiringPiI2CSetup(0x76); // BMP280默認I2C地址if (fd == -1) {std::cerr << "I2C初始化失敗" << std::endl;return -1;}// 校準數據讀取和溫度/氣壓計算代碼...// 此處需根據傳感器手冊實現具體協議return 0;
}

跨平臺開發實例

串口通信

通用串口通信代碼框架:

#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <iostream>int main() {int serialPort = open("/dev/ttyUSB0", O_RDWR);if (serialPort < 0) {perror("打開串口失敗");return -1;}struct termios tty;tcgetattr(serialPort, &tty);cfsetospeed(&tty, B9600);cfsetispeed(&tty, B9600);tty.c_cflag &= ~PARENB;tty.c_cflag &= ~CSTOPB;tty.c_cflag &= ~CSIZE;tty.c_cflag |= CS8;tcsetattr(serialPort, TCSANOW, &tty);char buf[256];write(serialPort, "AT\r\n", 4);read(serialPort, &buf, sizeof(buf));std::cout << buf << std::endl;close(serialPort);return 0;
}

多線程處理

硬件設備上的多線程應用:

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void sensorTask() {while (true) {mtx.lock();std::cout << "讀取傳感器數據..." << std::endl;mtx.unlock();std::this_thread::sleep_for(std::chrono::seconds(1));}
}void networkTask() {while (true) {mtx.lock();std::cout << "發送網絡請求..." << std::endl;mtx.unlock();std::this_thread::sleep_for(std::chrono::seconds(2));}
}int main() {std::thread t1(sensorTask);std::thread t2(networkTask);t1.join();t2.join();return 0;
}

環境傳感器數據采集與MQTT傳輸
ESP32連接DHT22溫濕度傳感器,采集數據后通過MQTT協議發送至樹莓派。樹莓派運行Mosquitto MQTT broker,并訂閱主題存儲數據到SQLite數據庫。代碼示例(ESP32部分):

use esp_idf_hal::delay::FreeRtos;
use esp_idf_hal::peripherals::Peripherals;
use esp_idf_svc::mqtt::client::*;
use esp_idf_sys as _;fn main() {let peripherals = Peripherals::take().unwrap();let mqtt_conf = MqttClientConfiguration::default();let mut client = EspMqttClient::new("mqtt://raspberrypi.local", &mqtt_conf).unwrap();client.subscribe("sensors/temperature", QoS::AtLeastOnce).unwrap();
}

GPIO狀態遠程監控系統


ESP32通過WiFi連接樹莓派API,定時上報GPIO引腳狀態。樹莓派運行Flask API接收數據,前端用Echarts實時展示狀態變化。樹莓派API路由示例:

from flask import Flask, request
app = Flask(__name__)@app.route('/gpio', methods=['POST'])
def handle_gpio():data = request.jsonprint(f"Received GPIO state: {data}")return "OK"

工業Modbus RTU轉TCP網關


ESP32通過RS485接口讀取Modbus設備數據,轉換為TCP協議轉發至樹莓派。樹莓派運行Node-RED進行協議解析和數據可視化。

硬件配置

ESP32的UART引腳需要連接RS485轉換模塊(如MAX485)。典型接線方式:

  • ESP32的TX(GPIO17)接MAX485的DI
  • ESP32的RX(GPIO16)接MAX485的RO
  • 控制引腳(如GPIO4)接MAX485的DE/RE
依賴庫

Cargo.toml中添加以下依賴:

[dependencies]
embedded-hal = "0.2"
esp32-hal = { version = "0.10", features = ["rt"] }
nb = "1.0"
modbus-rtu = "0.6"
初始化UART和GPIO
use esp32_hal::{gpio::GpioPin,pac::UART1,prelude::*,serial::{config::Config, Serial},
};
use modbus_rtu::{Master, MasterContext};let peripherals = esp32_hal::Peripherals::take().unwrap();
let pins = peripherals.pins;let mut uart = Serial::new(peripherals.UART1,Some(GpioPin::new(pins.gpio16)),Some(GpioPin::new(pins.gpio17)),Config::default().baudrate(9600),
)
.unwrap();let mut de_re_pin = GpioPin::new(pins.gpio4).into_output();

創建Modbus主站
let mut ctx = MasterContext::new(uart, move |state| {de_re_pin.set_state(state.into()).unwrap();
});
let mut master = Master::new(&mut ctx);
讀取保持寄存器
let slave_id = 0x01; // 從站地址
let reg_addr = 0x0000; // 寄存器起始地址
let reg_count = 2; // 讀取寄存器數量match master.read_holding_registers(slave_id, reg_addr, reg_count) {Ok(data) => {println!("Read data: {:?}", data);}Err(e) => {println!("Error: {:?}", e);}
}
完整示例代碼
use esp32_hal::{gpio::GpioPin,pac::UART1,prelude::*,serial::{config::Config, Serial},
};
use modbus_rtu::{Master, MasterContext};fn main() -> ! {let peripherals = esp32_hal::Peripherals::take().unwrap();let pins = peripherals.pins;let mut uart = Serial::new(peripherals.UART1,Some(GpioPin::new(pins.gpio16)),Some(GpioPin::new(pins.gpio17)),Config::default().baudrate(9600),).unwrap();let mut de_re_pin = GpioPin::new(pins.gpio4).into_output();let mut ctx = MasterContext::new(uart, move |state| {de_re_pin.set_state(state.into()).unwrap();});let mut master = Master::new(&mut ctx);loop {let slave_id = 0x01;let reg_addr = 0x0000;let reg_count = 2;match master.read_holding_registers(slave_id, reg_addr, reg_count) {Ok(data) => println!("Data: {:?}", data),Err(e) => println!("Error: {:?}", e),}esp32_hal::delay::FreeRtos::delay_ms(1000);}
}

注意事項
  • RS485總線需要終端電阻(通常120Ω)
  • 確保所有設備波特率、數據位、停止位和校驗位設置一致
  • 在發送數據前需要激活DE/RE引腳
  • 多設備通信時需注意從站地址唯一性

車載CAN總線數據分析


ESP32連接車輛OBD-II接口,采集CAN總線數據通過WebSocket傳輸。樹莓派運行Wireshark進行協議分析,存儲數據到InfluxDB時間序列數據庫。

以下是一些使用Rust語言在ESP32上連接車輛OBD-II接口、采集CAN總線數據并通過WebSocket傳輸的實例和關鍵方法:

使用esp-idf-hal庫初始化CAN控制器
use esp_idf_hal::can::*;
let can_config = Configuration::default();
let can = CanDriver::new(peripherals.can, &can_config).unwrap();
配置CAN過濾器接收OBD-II數據
let filter = Filter::new(FilterType::Standard, 0x7E8, 0x7FF);
can.set_filt

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

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

相關文章

Jedis 原生之道:Redis 命令 Java 實現指南(一)

Hi~&#xff01;這里是奮斗的明志&#xff0c;很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~~ &#x1f331;&#x1f331;個人主頁&#xff1a;奮斗的明志 &#x1f331;&#x1f331;所屬專欄&#xff1a;Redis &#x1f4da;本系列文章為個人學習筆…

飛算 JavaAI 開發助手:深度學習驅動下的 Java 全鏈路智能開發新范式

飛算 JavaAI 開發助手&#xff1a;深度學習驅動下的 Java 全鏈路智能開發新范式 文章目錄飛算 JavaAI 開發助手&#xff1a;深度學習驅動下的 Java 全鏈路智能開發新范式前言飛算 JavaAI IDEA插件下載、注冊、使用智能引導操作流程Java Chat智能工作流程操作流程智能問答操作流…

Spring Boot 核心特性與版本演進解析

深度解讀自動配置原理、版本差異與 3.x 的顛覆性變革 一、Spring Boot 的核心理念與迭代主線 Spring Boot 用兩大核心武器重構了 Java 開發范式&#xff1a; 嵌入式容器&#xff1a;終結了 “war 包 Tomcat 配置地獄”&#xff0c;讓 java -jar 成為生產級部署的標準姿勢自動…

React Tailwind css 大前端考試、問卷響應式模板

功能概述 基于 React 和 Tailwind CSS 開發的在線大前端知識考試系統。頁面設計簡潔美觀&#xff0c;交互流暢&#xff0c;適合前端開發者、學習者進行自我測試和知識鞏固。系統內置多道涵蓋 React、CSS、JavaScript、HTTP 等前端核心知識點的題目&#xff0c;支持單選與多選題…

【前端】手寫代碼匯總

近期更新完&#xff0c;后面不定期更新&#xff0c;建議關注收藏點贊。 目錄快排手寫防抖節流數組扁平化&#xff08;要求使用 reduce 方法&#xff09;數組filter實現手寫一個加載圖片的函數 loadImage手寫Promise then手寫 Promise.All手寫 Promise.race手寫allsettled手寫us…

基于MATLAB 的心電信號去噪

基于Matlab的心電信號去噪 generate.m , 3450 genR.m , 953 genU.m , 891 get_obs.m , 957 CHANGELOG , 11185 find_localobs.m , 2312 fmain.m , 2272

git branch -a 還有一些已經刪除了的分支

如何處理已經刪除的遠程跟蹤分支1、刪除遠程跟蹤分支如果你確定某個遠程跟蹤分支不再需要&#xff0c;你可以使用 git branch -d -r 命令來刪除它。例如&#xff0c;要刪除名為 origin/test 的遠程跟蹤分支&#xff0c;你可以使用&#xff1a;git branch -d -r origin/test2、更…

軟件反調試(4)- 基于IsDebuggerPresent的檢測

反調原理 該檢測方式使用 IsDebuggerPresent 或者 CheckRemoteDebuggerPresent 函數&#xff0c;這兩個函數都是 kernel32.dll 中實現的 對于 IsDebuggerPresent 函數&#xff0c;如果返回值為 TRUE&#xff0c;那么表示當前進程在調試器上下文中運行 CheckRemoteDebuggerPrese…

翻譯《The Old New Thing》- Windows 媒體目錄中 onestop.mid 文件的故事

Whats the story of the onestop.mid file in the Media directory? - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20130212-00/?p5263 如果你查看你的C:\Windows\Media文件夾&#xff0c;會發現一個名為onestop的MIDI文件。這個奇怪的小MIDI文件背后有什…

【方案】前端UI布局的絕技,響應式布局,多端適配

大家好&#xff0c;歡迎來到停止重構的頻道。本期討論網頁UI布局。網頁UI布局是前端開發中占比較多的部分&#xff0c;做完網頁布局也就差不多完成了一半的工作。本期視頻&#xff0c;我們不再討論基礎的UI布局。我們希望滿足響應式布局&#xff0c;一份代碼適配PC/平板/手機等…

【鄭大二年級信安小學期】Day4上午:Bool盲注時間盲注堆疊查詢post注入HTTP頭部注入ua字段

目錄 0 錄制文件 1 SQL注入-布爾盲注 1.1 布爾盲注優缺點 1.2 先看一下第八關嗯頁面特征 1.3 步驟 1.4 常用函數 1.5 判斷是否字符型 1.6 判斷閉合 1.7 查詢庫名 1.8 查詢數據表 1.9 獲取字段名 1.10 獲取數據 1.11 布爾盲注缺陷 2 時間盲注 2.1 基礎知識 2.2 判…

如何設計一個“真正可復用”的前端組件?

&#x1f9f1; 如何設計一個“真正可復用”的前端組件&#xff1f;&#x1f527; 一個按鈕可以寫10次&#xff0c;也可以封裝一次復用全場&#xff1b;組件是前端的積木&#xff0c;而設計模式才是組裝它們的說明書。你真的在寫“可復用”組件嗎&#xff1f;&#x1f9e0; 什么…

AlpineLinux安裝RabbitMQ及其管理界面

AlpineLinux安裝RabbitMQ及其管理界面 本文以 alpine linux 的 3.21版本為例,演示對于 RabbitMQ 在Linux 下的安裝,其他發行版本大同小異。主要是包管理軟件的命令區別,以及在線倉庫提供的 RabbitMQ 版本差異而已。 (一)安裝 Erlang 因為 RabbitMQ 是用 Erlang 語言編寫…

3S技術+ArcGIS/ENVI全流程實戰:水文、氣象、災害、生態、環境及衛生等領域應用

系統梳理3S技術的核心理論與實戰應用&#xff0c;涵蓋ArcGIS與ENVI軟件操作、空間數據管理、地圖投影轉換、遙感影像解譯、DEM地形分析、空間插值建模等關鍵技能&#xff0c;并結合農業、氣象、生態、災害等跨學科案例&#xff0c;提供從數據獲取到高級可視化的完整解決方案。無…

彈窗中el+table,二次打開彈窗,選擇列會攜帶第一次選擇的數據

1第一次打開彈窗選擇的數據&#xff0c;正確&#xff0c;然后關閉彈窗再次打開彈窗&#xff0c;重新選擇&#xff0c;第二次的數據&#xff0c;錯誤在打開彈窗/關閉彈窗等位置全部做了置空處理&#xff0c;以下是代碼&#xff1a;最后的原因是&#xff1a;el-dailog 自帶緩存&a…

RocketMQ在Spring Boot中的詳細使用指南

?? 目錄 ?? RocketMQ簡介 什么是RocketMQ? 核心概念 ??? 基礎架構組件 ?? 重要概念解釋 ?? 環境搭建 1. RocketMQ服務端安裝 Docker方式(推薦初學者) 手動安裝方式 2. 驗證安裝 ??? Spring Boot集成配置 1. 添加依賴 2. 配置文件 application.y…

基于Java+Springboot的醫院檔案管理系統

源碼編號&#xff1a;S597源碼名稱&#xff1a;基于Springboot的醫院檔案管理系統用戶類型&#xff1a;多角色&#xff0c;用戶、醫護人員、管理員數據庫表數量&#xff1a;11 張表主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven運行環境&#xff1a;Windows/M…

Pandas 學習教程

目錄 定義 基本操作 一維數組操作 二維數組操作 數據選擇過濾 數據處理 數據清洗 數據轉換 數據分析 排序 分組聚合 數據透視表 高級操作 合并數據 時間序列處理 自定義函數調用 數據可視化集成 數據導出和導入 大數據分塊處理 定義 全稱&#xff1a; panel da…

QueryWrapper 類的作用與示例詳解

通俗易懂的解釋想象一下你去圖書館找書&#xff1a;QueryWrapper 就像是一個智能的圖書管理員你告訴管理員你的需求&#xff1a;"我要找計算機類、2020年后出版的、作者是張三的書"管理員會根據你的要求組合查詢條件&#xff0c;然后去書庫幫你找書在編程中&#xff…

【PyTorch】PyTorch中torch.nn模塊的循環層

PyTorch深度學習總結 第九章 PyTorch中torch.nn模塊的循環層 文章目錄PyTorch深度學習總結前言一、循環層1. 簡單循環層&#xff08;RNN&#xff09;2. 長短期記憶網絡&#xff08;LSTM&#xff09;3. 門控循環單元&#xff08;GRU&#xff09;4. 雙向循環層二、循環層參數1. …