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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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. …