当前位置: 首页 > article >正文

STM32+Arduino环境搭建后,你的第一个项目可以不是点灯:用官方核心库驱动OLED和读取传感器

STM32Arduino环境搭建后你的第一个项目可以不是点灯用官方核心库驱动OLED和读取传感器当你终于完成了STM32在Arduino环境下的搭建看着IDE界面和开发板是不是有种然后呢的迷茫别急着从点灯开始让我们直接进入两个更酷的项目驱动OLED显示和读取环境传感器数据。这不仅能让你的开发板真正活起来还能立即获得可视化的反馈和成就感。1. 准备工作硬件连接与库安装在开始编码前我们需要确保硬件正确连接并安装必要的库。假设你手头有一块STM32F103C8T6开发板Blue Pill、SSD1306 OLED屏幕I2C接口和DHT11温湿度传感器。硬件连接示意图STM32引脚外设连接备注3.3VOLED VCC电源正极GNDOLED GND电源地线PB6OLED SCLI2C时钟线PB7OLED SDAI2C数据线3.3VDHT11 VCC传感器电源GNDDHT11 GND传感器地线PA1DHT11 DATA传感器数据线注意不同型号的STM32开发板I2C引脚可能不同请查阅你的开发板原理图确认SCL/SDA引脚。库安装步骤打开Arduino IDE点击工具-管理库...搜索并安装以下库U8g2用于驱动OLED显示DHT sensor library用于读取DHT11数据Adafruit Unified SensorDHT库的依赖项安装完成后你可以在文件-示例中看到这些库的示例代码但我们接下来会从头开始编写。2. 项目一让OLED说Hello STM32OLED屏幕是嵌入式开发中最实用的外设之一它能提供直观的视觉反馈。我们将使用U8g2库来驱动SSD1306 OLED。2.1 初始化U8g2库U8g2库支持多种显示控制器和通信方式我们需要选择适合我们硬件的构造函数#include U8g2lib.h #include Wire.h // 使用硬件I2C的构造函数 U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset*/ U8X8_PIN_NONE);这段代码初始化了一个128x64像素的SSD1306 OLED显示器使用硬件I2C通信。U8X8_PIN_NONE表示我们没有连接复位引脚。2.2 编写第一个显示程序在setup()函数中初始化显示然后在loop()中显示文本void setup() { u8g2.begin(); // 初始化显示 } void loop() { u8g2.clearBuffer(); // 清除内部内存 u8g2.setFont(u8g2_font_ncenB14_tr); // 选择字体 u8g2.drawStr(0, 20, Hello); // 在坐标(0,20)处写Hello u8g2.drawStr(0, 40, STM32!); // 在坐标(0,40)处写STM32! u8g2.sendBuffer(); // 将内存内容发送到显示器 delay(1000); }上传代码后你应该能看到OLED上显示了两行文字。如果屏幕没有反应检查I2C引脚连接是否正确是否选择了正确的U8g2构造函数屏幕是否需要上拉电阻有些模块已经内置2.3 进阶显示技巧U8g2库功能强大除了显示文字还能绘制图形。试试这段代码void loop() { u8g2.clearBuffer(); // 绘制边框 u8g2.drawFrame(0, 0, 128, 64); // 显示不同大小的文字 u8g2.setFont(u8g2_font_6x10_tr); u8g2.drawStr(5, 15, STM32 Arduino); u8g2.setFont(u8g2_font_10x20_tr); u8g2.drawStr(10, 40, OLED Demo); // 绘制进度条 static uint8_t width 0; u8g2.drawBox(10, 50, width, 5); width (width 1) % 100; u8g2.sendBuffer(); delay(50); }这段代码展示了如何绘制边框、使用不同字体以及创建简单的动画效果。U8g2库还支持位图显示、各种几何图形绘制等功能值得深入探索。3. 项目二读取环境传感器数据现在让我们为系统添加环境感知能力。DHT11虽然精度不高但价格低廉且易于使用非常适合入门。3.1 初始化DHT传感器首先包含必要的库并初始化传感器对象#include DHT.h #define DHTPIN PA1 // 传感器连接的引脚 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE);在setup()函数中启动传感器void setup() { Serial.begin(115200); dht.begin(); }3.2 读取并显示传感器数据DHT11的典型读取间隔为2秒太快会导致读取失败。我们可以在OLED上同时显示温度和湿度void loop() { delay(2000); // DHT11需要至少2秒间隔 float h dht.readHumidity(); // 读取湿度(%) float t dht.readTemperature(); // 读取温度(°C) if (isnan(h) || isnan(t)) { Serial.println(读取DHT11失败!); return; } // 在串口监视器输出 Serial.print(湿度: ); Serial.print(h); Serial.print(% 温度: ); Serial.print(t); Serial.println(°C); // 在OLED上显示 u8g2.clearBuffer(); u8g2.setFont(u8g2_font_6x10_tr); u8g2.drawStr(0, 15, 环境监测); u8g2.setFont(u8g2_font_10x20_tr); char buffer[20]; sprintf(buffer, %.1f C, t); u8g2.drawStr(10, 40, buffer); sprintf(buffer, %.1f %%, h); u8g2.drawStr(10, 65, buffer); u8g2.sendBuffer(); }3.3 提高读取稳定性DHT11对时序要求严格在STM32上可能需要微调。如果遇到频繁读取失败可以尝试在传感器VCC和GND之间添加一个100nF的电容使用更短的数据线在代码中添加重试逻辑float readDHTTemperature() { float t dht.readTemperature(); for (int i 0; i 3 isnan(t); i) { delay(100); t dht.readTemperature(); } return t; }4. 项目整合创建环境监测仪表现在我们将两个项目结合起来创建一个完整的环境监测系统定期更新显示并保留最高/最低记录。4.1 系统设计我们需要跟踪以下数据当前温度和湿度历史最高和最低温度显示更新时间代码结构如下#include U8g2lib.h #include Wire.h #include DHT.h // OLED和DHT初始化代码... float maxTemp -100, minTemp 100; unsigned long lastUpdate 0; void setup() { // 初始化代码... } void loop() { // 每5秒更新一次 if (millis() - lastUpdate 5000) { lastUpdate millis(); float t readDHTTemperature(); float h readDHTHumidity(); if (!isnan(t) !isnan(h)) { maxTemp max(maxTemp, t); minTemp min(minTemp, t); updateDisplay(t, h); } } } void updateDisplay(float temp, float humidity) { u8g2.clearBuffer(); // 绘制界面框架 u8g2.drawFrame(0, 0, 128, 64); u8g2.drawHLine(0, 16, 128); // 显示标题 u8g2.setFont(u8g2_font_6x10_tr); u8g2.drawStr(5, 13, 环境监测系统); // 显示当前数据 u8g2.setFont(u8g2_font_10x20_tr); char buffer[20]; sprintf(buffer, %.1f C, temp); u8g2.drawStr(10, 35, buffer); sprintf(buffer, %.1f %%, humidity); u8g2.drawStr(70, 35, buffer); // 显示极值 u8g2.setFont(u8g2_font_6x10_tr); sprintf(buffer, 高:%.1f 低:%.1f, maxTemp, minTemp); u8g2.drawStr(10, 50, buffer); // 显示更新时间 sprintf(buffer, 更新:%02d:%02d, (millis()/60000)%60, (millis()/1000)%60); u8g2.drawStr(10, 63, buffer); u8g2.sendBuffer(); }4.2 添加按钮控制为了增加交互性我们可以添加一个按钮来切换显示模式。连接一个按钮到PA0引脚带10K上拉电阻#define BUTTON_PIN PA0 enum DisplayMode {CURRENT, MAX_MIN, GRAPH}; DisplayMode mode CURRENT; void checkButton() { static unsigned long lastPress 0; if (digitalRead(BUTTON_PIN) LOW millis() - lastPress 200) { lastPress millis(); mode (DisplayMode)((mode 1) % 3); } } void loop() { checkButton(); // 其余代码... }然后根据模式修改updateDisplay()函数添加不同的显示布局。5. 深入理解STM32在Arduino环境下的特殊考量虽然我们使用了Arduino环境但STM32与传统的AVR Arduino仍有一些差异需要注意。5.1 GPIO速度配置STM32的GPIO可以配置不同的速度这在Arduino环境中通常被忽略void setup() { // 配置传感器引脚为高速输入 pinMode(DHTPIN, INPUT); GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.Pin digitalPinToPinName(DHTPIN); GPIO_InitStruct.Mode GPIO_MODE_INPUT; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(digitalPinToPort(DHTPIN), GPIO_InitStruct); }5.2 I2C引脚重映射某些STM32型号支持I2C引脚重映射如果默认I2C引脚被占用可以这样重映射void remapI2CPins() { __HAL_AFIO_REMAP_I2C1_ENABLE(); // 启用I2C1引脚重映射 // 现在I2C1的SCL是PB8SDA是PB9 }5.3 低功耗考虑STM32的低功耗特性是AVR Arduino不具备的。即使在这个简单项目中我们也可以加入简单的休眠#include STM32LowPower.h void setup() { LowPower.begin(); } void loop() { // 读取传感器并更新显示... LowPower.deepSleep(5000); // 休眠5秒 }6. 项目扩展思路这个基础项目可以扩展出许多有趣的方向数据记录添加SD卡模块定期记录环境数据无线传输通过ESP8266或HC-05将数据发送到手机或服务器警报系统当温度超过阈值时触发蜂鸣器或继电器电池供电设计低功耗版本使用18650电池长时间工作外壳设计3D打印一个专业的外壳做成完整的产品每个扩展都可以作为一个独立的学习项目逐步提升你的STM32开发能力。

相关文章:

STM32+Arduino环境搭建后,你的第一个项目可以不是点灯:用官方核心库驱动OLED和读取传感器

STM32Arduino环境搭建后,你的第一个项目可以不是点灯:用官方核心库驱动OLED和读取传感器 当你终于完成了STM32在Arduino环境下的搭建,看着IDE界面和开发板,是不是有种"然后呢?"的迷茫?别急着从点…...

Chandra真实案例分享:看看83分OCR模型如何处理复杂排版文档

Chandra真实案例分享:看看83分OCR模型如何处理复杂排版文档 1. 为什么Chandra与众不同——布局感知OCR的革命 传统OCR工具最令人头疼的问题是什么?不是识别率不够高,而是它们把文档当作"一堆文字"来处理,完全忽略了排…...

不止于中文:为你的LVGL项目轻松添加多语言支持(RTL文本+FreeType动态字体加载)

智能设备多语言UI实战:LVGL集成RTL语言与动态字体加载全方案 当智能家居控制面板需要同时显示阿拉伯语和中文时,工程师们往往会遇到文字方向混乱、字体缺失和内存暴增三大难题。去年为迪拜某酒店项目开发温控系统时,我们团队就曾因阿拉伯语连…...

Vite项目里动态加载SVG图标库,并集成到ElementPlus的el-select下拉框(保姆级配置流程)

Vite项目中动态加载SVG图标库与ElementPlus的深度集成实践 在Vue3生态中,Vite作为新一代构建工具已经逐渐成为主流选择。结合ElementPlus这一优秀的UI组件库,我们可以构建出高效、优雅的前端应用。本文将聚焦于一个实际开发中常见的需求:如何…...

Pixelle-Video:5分钟掌握AI全自动短视频生成,告别复杂剪辑

Pixelle-Video:5分钟掌握AI全自动短视频生成,告别复杂剪辑 【免费下载链接】Pixelle-Video 🚀 AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video 你是否…...

终极Xshell配色方案大全:250+款主题让你的命令行界面焕然一新

终极Xshell配色方案大全:250款主题让你的命令行界面焕然一新 【免费下载链接】Xshell-ColorScheme 250 Xshell Color Schemes 项目地址: https://gitcode.com/gh_mirrors/xs/Xshell-ColorScheme 还在忍受单调的黑白终端界面吗?每天面对相同的颜色…...

智能配置黑苹果:OpCore Simplify如何让OpenCore EFI创建变得简单高效

智能配置黑苹果:OpCore Simplify如何让OpenCore EFI创建变得简单高效 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑苹果配…...

产品经理实战:手把手教你写一份能落地的京东秒杀PRD(附完整模板)

产品经理实战:从需求到落地的京东秒杀PRD全流程指南 每次打开京东APP,那个醒目的红色秒杀入口总让人忍不住点进去——限时低价、限量抢购的刺激感,是电商平台最有效的流量引擎之一。但作为产品经理,当你接到"优化秒杀模块&q…...

别再踩坑了!Docker部署Kafka时`KAFKA_ADVERTISED_LISTENERS`配置详解与避坑指南

Docker部署Kafka时KAFKA_ADVERTISED_LISTENERS配置的终极指南 当你第一次尝试在Docker中部署Kafka时,可能会遇到一个令人困惑的问题:明明Kafka服务已经正常运行,但客户端却总是报错"Error connecting to the cluster"或"Fail…...

揭秘Windows系统安全:OpenArk开源工具的全方位守护方案

揭秘Windows系统安全:OpenArk开源工具的全方位守护方案 【免费下载链接】OpenArk The Next Generation of Anti-Rookit(ARK) tool for Windows. 项目地址: https://gitcode.com/GitHub_Trending/op/OpenArk 在数字化时代,Windows系统安全已成为每…...

别再硬编码密码了!Android Gradle打包时,如何安全地管理签名密钥(附keystore.properties配置)

Android应用签名密钥安全管理的进阶实践 在Android应用开发中,签名密钥是应用身份的唯一标识,也是应用商店验证开发者身份的重要凭证。然而,很多开发者仍然习惯在build.gradle文件中直接硬编码这些敏感信息,这种做法不仅存在安全隐…...

Cursor Free VIP破解工具终极指南:三步骤永久免费使用Cursor Pro功能

Cursor Free VIP破解工具终极指南:三步骤永久免费使用Cursor Pro功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve re…...

从网吧无盘到装机U盘:深入WinPE内存运行原理,用ADK构建可脚本化复用的PE工厂

从网吧无盘到装机U盘:深入WinPE内存运行原理,用ADK构建可脚本化复用的PE工厂 在技术运维和系统部署领域,预安装环境(Preinstallation Environment,简称PE)一直是工程师们的得力助手。想象一下这样的场景&a…...

PCIe 5.0测试揭秘:用33GHz还是50GHz示波器?一份给硬件验证工程师的避坑清单

PCIe 5.0测试实战指南:示波器选型与测量精度优化策略 当实验室的示波器屏幕上首次跳出32GT/s信号的眼图时,我盯着那组颤抖的波形线,突然意识到传统测试方法正在面临前所未有的挑战。PCIe 5.0带来的不仅是翻倍的带宽,更是一场测量方…...

RH850 F1开发避坑指南:选项字节配置不当,我的程序怎么都烧不进去?

RH850 F1开发实战:选项字节配置陷阱与看门狗调试全解析 第一次将编译好的程序烧录进RH850 F1系列MCU时,我盯着纹丝不动的调试器界面,后背渗出一层冷汗——JTAG接口毫无反应,仿佛芯片成了一块砖头。这种场景对许多从STM32转向瑞萨平…...

别再傻傻遍历了!C++中vector<uint8_t>与原始数组互转的3种高效写法(附性能对比)

别再傻傻遍历了&#xff01;C中vector<uint8_t>与原始数组互转的3种高效写法&#xff08;附性能对比&#xff09; 在音视频编解码、网络协议解析或嵌入式系统开发中&#xff0c;我们经常需要在vector<uint8_t>和原始数组之间进行数据转换。传统遍历方法虽然直观&am…...

OpCore Simplify:黑苹果配置终极指南,5步告别复杂手动设置

OpCore Simplify&#xff1a;黑苹果配置终极指南&#xff0c;5步告别复杂手动设置 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果配置过…...

别再让缓存穿透拖垮你的SpringBoot服务了!手把手教你用Redisson布隆过滤器搞定它

布隆过滤器实战&#xff1a;用Redisson为SpringBoot构建高性能缓存防护盾 凌晨三点&#xff0c;服务器告警短信再次将你惊醒——又是缓存穿透导致数据库雪崩。作为经历过多次类似事故的后端开发者&#xff0c;我深知这种看似简单的查询漏洞对系统的毁灭性打击。本文将分享如何…...

从美颜到元宇宙:3D Morphable Model如何悄悄改变你的数字生活?

从美颜到元宇宙&#xff1a;3D Morphable Model如何悄悄改变你的数字生活&#xff1f; 当你打开手机里的美颜App&#xff0c;滑动捏脸参数时&#xff0c;是否想过屏幕背后是一套怎样的技术在支撑&#xff1f;当你在电商平台试戴虚拟眼镜&#xff0c;或在游戏中创建专属虚拟形象…...

别再只用HTTP了!用C#和WebSocket给你的WinForms/WPF程序加个实时数据看板

用C#和WebSocket构建WinForms/WPF实时数据看板的实战指南 在桌面应用开发中&#xff0c;我们经常遇到需要展示实时数据的场景——无论是金融行业的股票行情看板、制造业的设备监控面板&#xff0c;还是企业内部的消息推送中心。传统HTTP轮询方案不仅效率低下&#xff0c;还会给…...

解决poi-tl合并Word时遇到的‘xsi前缀未绑定’报错:一个命名空间引发的血案

深入解析poi-tl合并Word文档时的XML命名空间陷阱 当你使用poi-tl库合并Word文档时&#xff0c;突然遇到"xsi前缀未绑定"的错误提示&#xff0c;这背后隐藏着Office Open XML(OOXML)格式的深层机制。这个看似简单的错误实际上揭示了Word文档内部XML结构的复杂性&#…...

PowerShell ImportExcel模块:无需Excel的完整数据处理终极指南

PowerShell ImportExcel模块&#xff1a;无需Excel的完整数据处理终极指南 【免费下载链接】ImportExcel PowerShell module to import/export Excel spreadsheets, without Excel 项目地址: https://gitcode.com/gh_mirrors/im/ImportExcel 你是否曾为Excel数据处理而烦…...

树莓派没显示器也能玩?手把手教你用RealVNC Viewer远程桌面(附分辨率修复教程)

树莓派无显示器实战&#xff1a;RealVNC远程桌面配置与分辨率优化指南 树莓派作为一款性价比极高的微型计算机&#xff0c;常被用作家庭媒体中心、物联网网关或轻量级服务器。但许多用户在脱离显示器使用时&#xff0c;会遇到远程桌面分辨率异常的问题——窗口要么小得看不清&…...

斯坦福MUSK模型:多模态AI在癌症诊疗中的突破与应用

1. 斯坦福MUSK模型&#xff1a;多模态AI如何革新癌症诊疗作为一名长期关注医疗AI应用的从业者&#xff0c;最近斯坦福团队在《Nature》发表的MUSK模型让我眼前一亮。这个基于1亿病理图像和10亿文本数据训练的多模态Transformer&#xff0c;在23项病理学基准测试中全面超越现有模…...

14个核心概念一次讲透!小白也能轻松入门大模型,速收藏!

本文用日常场景类比&#xff0c;解释了大模型的14个核心概念&#xff0c;如大模型是超级大脑、预训练是打基础、微调是专精技能、提示词是明确指令等&#xff0c;帮助新手轻松理解大模型的核心逻辑和运作方式。 1. 大模型&#xff08;Large Language Model, LLM&#xff09;大白…...

【必收藏】2026年版:我敢断言,90%的传统开发人都将面临“阵痛性转型”!

作为深耕CSDN多年的技术博主&#xff0c;见过太多传统开发人的迷茫——2026年&#xff0c;这种迷茫正在变成“生存焦虑”&#xff0c;但我敢断言&#xff1a;今年&#xff0c;90%的传统开发人都将面临**“阵痛性转型”**&#xff01; 先澄清一个误区&#xff1a;不是IT岗位变少…...

别再手动拼了!用Axure RP9中继器+动态面板,10分钟搞定可滚动的下拉复选框原型

高效构建Axure RP9动态下拉复选框&#xff1a;中继器与动态面板的黄金组合 在原型设计领域&#xff0c;时间就是竞争力。面对产品评审会议前的最后一刻需求变更&#xff0c;或是需要快速验证复杂交互逻辑的场景&#xff0c;Axure RP9的中继器(Repeater)与动态面板(Dynamic Pane…...

FreeRTOSConfig.h 配置实战:从新手到高手,这20个宏定义你调对了吗?

FreeRTOSConfig.h 配置实战&#xff1a;从新手到高手&#xff0c;这20个宏定义你调对了吗&#xff1f; 在嵌入式开发中&#xff0c;FreeRTOS作为一款轻量级实时操作系统&#xff0c;其核心配置文件FreeRTOSConfig.h的合理设置直接关系到系统的稳定性与性能。很多开发者在初次接…...

用Python实战PCA异常检测:手把手教你计算T²和SPE统计量(附完整代码)

用Python实战PCA异常检测&#xff1a;手把手教你计算T和SPE统计量&#xff08;附完整代码&#xff09; 在工业过程监控、金融风控或设备故障预警等场景中&#xff0c;异常检测始终是数据分析的核心挑战之一。传统单变量控制图难以捕捉高维数据中的复杂关系&#xff0c;而主成分…...

AI 写论文哪个软件最好?实测对比后,虎贲等考 AI 凭毕业论文全流程实力出圈

每到毕业季&#xff0c;无数本科生、硕士研究生都会陷入同一个难题&#xff1a;毕业论文无从下笔&#xff0c;选题没方向、大纲不会搭、文献找不到、写完查重居高不下&#xff0c;格式排版更是让人崩溃。这时大家都会纠结同一个问题&#xff1a;AI 写论文哪个软件最好&#xff…...