C++趣味编程玩转物联网:用树莓派Pico实现一位数码管动态显示
七段数码管是一种经典的电子显示器件,广泛应用于数字时钟、电子仪表等设备。本文将通过树莓派Pico开发板,介绍如何用C++代码控制一位七段数码管显示数字。作为一个嵌入式开发项目,这不仅是初学者理解数码管工作原理的好机会,也是C++开发者在硬件编程中的一个实践案例。
项目背景与目标
七段数码管的工作原理
七段数码管由七个LED组成(共阴极或共阳极设计),通过点亮不同的LED组合显示数字0-9。它是一种经济实用的显示解决方案,特别适合初学者学习电路控制和嵌入式编程。
项目目标
实现数码管动态显示数字9到0,通过延时循环显示数字序列,掌握数码管的基础控制方法以及C++程序与硬件的结合应用。
项目所需元件
- 树莓派Pico × 1
- 一位七段数码管(共阴极) × 1
- 220Ω电阻 × 8
- 面包板 × 1
- 公对母杜邦线若干
- USB数据线 × 1
数码管的接线原理与注意事项
1. 共阴极数码管接线
- 共阴极设计:所有段的负极连接在一起,并接到Pico的GND引脚。要点亮某段LED,需将对应引脚设置为高电平。
- 限流保护:每个段LED需通过220Ω电阻连接,以避免过电流烧毁LED。
2. GPIO引脚分配
a
段:GP17b
段:GP16c
段:GP14d
段:GP13e
段:GP12f
段:GP18g
段:GP19dp
(小数点):GP15
项目电路图和接线图
核心代码实现
以下是实现数字9到0动态显示的C++代码:
#include <Arduino.h>// 定义每个段的GPIO引脚 int a = 17, b = 16, c = 14, d = 13, e = 12, f = 18, g = 19, dp = 15;// 显示数字的函数 void digital_0() { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); digitalWrite(dp, LOW); } void digital_1() { digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); digitalWrite(dp, LOW); } void digital_2() { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, HIGH); digitalWrite(dp, LOW); } void digital_3() { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(f, LOW); digitalWrite(e, LOW); digitalWrite(dp, LOW); digitalWrite(g, HIGH); } void digital_4() { digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(dp, LOW); digitalWrite(g, HIGH); } void digital_5() { digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(dp, LOW); digitalWrite(g, HIGH); } void digital_6() { digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(dp, LOW); digitalWrite(g, HIGH); } void digital_7() { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(dp, LOW); digitalWrite(g, LOW); } void digital_8() { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(dp, LOW); digitalWrite(g, HIGH); } void digital_9() { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(dp, LOW); digitalWrite(g, HIGH); }void setup() {for (int i = 12; i <= 19; i++) {pinMode(i, OUTPUT); // 将GPIO 12-19设置为输出模式} }void loop() {digital_9(); delay(1000); digital_8(); delay(1000); digital_7(); delay(1000);digital_6(); delay(1000); digital_5(); delay(1000); digital_4(); delay(1000);digital_3(); delay(1000); digital_2(); delay(1000); digital_1(); delay(1000);digital_0(); delay(1000); }
知识点解析
1. GPIO引脚控制
C++代码通过 pinMode
设置引脚为输出模式,通过 digitalWrite
控制引脚电平,点亮相应段。
2. 数字逻辑与分段控制
数字0到9的显示是基于七段LED的组合,代码中的每个函数定义了对应数字的点亮逻辑。
3. 延时与循环
delay(1000)
用于每秒切换一次数字,while
循环确保数字序列持续显示。
扩展与优化
-
添加交互性 引入按键或旋钮,控制数字切换速度或显示内容。
-
动态效果 使用PWM技术实现亮度渐变,提升视觉效果。
-
多位数码管 扩展项目至多位数码管,显示多位数字或简单字符。
-
与传感器结合 结合温度传感器或光传感器,实时显示环境数据。
项目教育意义
- C++基础巩固:数组管理、函数调用、循环控制等。
- 硬件认知提升:掌握数码管的显示原理与电路设计。
- 项目思维培养:理解从代码到硬件控制的完整链路。
结语
一位数码管的项目看似简单,却是嵌入式开发中的基础练习。通过项目实践,您不仅能熟悉C++与硬件的结合,还能为更复杂的嵌入式开发奠定基础。希望本文对您的学习有所启发!
如果您觉得本篇文章对您有帮助,欢迎点赞、收藏并分享,让更多人了解嵌入式开发的魅力!
本文章对应的精彩视频请点击-》C++编程&玩转物联网-用树莓派Pico实现一位数码管动态显示
动手实践学习套件请点击-》物联网-树莓派开发套件
欢迎加V交流
相关文章:

C++趣味编程玩转物联网:用树莓派Pico实现一位数码管动态显示
七段数码管是一种经典的电子显示器件,广泛应用于数字时钟、电子仪表等设备。本文将通过树莓派Pico开发板,介绍如何用C代码控制一位七段数码管显示数字。作为一个嵌入式开发项目,这不仅是初学者理解数码管工作原理的好机会,也是C开…...

SPA 单页面深入解读:优劣势剖析及实现方法
SPA(Single Page Application)单页面应用 什么是 SPA? SPA(Single Page Application,单页面应用)是一种 Web 应用程序,它通过 JavaScript 动态更新单一页面上的内容,而不是像传统的多页面应用程序那样每次用户与应用交互时都请求一个新的 HTML 页面。通过使用 AJAX 请…...

机器学习系列----关联分析
目录 1. 关联分析的基本概念 1.1定义 1.2常用算法 2.Apriori 算法的实现 2.1 工作原理 2.2 算法步骤 2.3 优缺点 2.4 时间复杂度 2.5实际运用----市场购物篮分析 3. FP-Growth 算法 3.1 工作原理 3.2 算法步骤 3.3 优缺点 3.4 时间复杂度 3.5实际运用——网页点…...

json数据四大加载方式
效果: 一、使用 import 静态加载 JSON 原理 使用 ES 模块的 import 语法直接引入 JSON 文件。Webpack/Vite 等构建工具会将 JSON 文件解析成 JavaScript 对象。 优点 简单直接,适合静态数据。不需要额外的网络请求。数据会随着打包文件一起部署。 缺点 J…...

JavaScript 中的数组(Array)对象的内置方法
JavaScript 中的数组(Array)对象提供了许多内置方法,用于对数组进行创建、操作、遍历和搜索等操作。以下是一些常用的数组方法及其简要说明: 创建和初始化数组 Array(): 创建一个新的空数组,或者根据提供的参数创建一…...

网络安全之国际主流网络安全架构模型
目前,国际主流的网络安全架构模型主要有: ● 信息技术咨询公司Gartner的ASA(Adaptive Security Architecture自适应安全架构) ● 美国政府资助的非营利研究机构MITRE的ATT&CK(Adversarial Tactics Techniques &…...

电子应用设计方案-16:智能闹钟系统方案设计
智能闹钟系统方案设计 一、系统概述 本智能闹钟系统旨在为用户提供更加个性化、智能化和便捷的闹钟服务,帮助用户更有效地管理时间和起床。 二、系统组成 1. 微控制器 - 选用低功耗、高性能的微控制器,如 STM32 系列,负责整个系统的控制和数据…...

【FRP 内网穿透 从0到1 那些注意事项】
【摘要】 最近跟第三方团队调试问题,遇到一个比较烦的操作。就是,你必须要发个版到公网环境,他们才能链接到你的接口地址,才能进行调试。按理说,也没啥,就是费点时间。但是,在调试的时候&#…...

力扣 LRU缓存-146
LRU缓存-146 /* 定义双向链表节点,用于存储缓存中的每个键值对。 成员变量:key和value存储键值对。preb和next指向前一个和后一个节点,形成双向链表。 构造函数:默认构造函数:初始化空节点。参数化构造函数࿱…...

Elasticsearch简介与实操
Elasticsearch是一个分布式、高扩展、高实时的搜索与数据分析引擎。以下是对Elasticsearch的详细介绍: 一、基本概述 Elasticsearch是Elastic Stack(以前称为ELK Stack)的核心组件,Logstash和Beats有助于收集、聚合和丰富数据并将…...

用python将一个扫描pdf文件改成二值图片组成的pdf文件
使用墨水屏读书现在似乎越来越流行,这确实有一定的好处,例如基本不发热,电池续航时间超长,基本不能游戏所以有利于沉浸式阅读,还有不知道是不是真的有用的所谓防蓝光伤害。但是,如果阅读的书籍是扫描图片组…...

Failed to start Docker Application Container Engine
说明: 1)访问应用业务,读取不到数据,show databases;查看数据库报错 2)重启docker服务,服务启动失败,查看日志报错如下图所示 3)报错信息:chmod /data/docker: read-only…...

ESLint的简单使用(js,ts,vue)
一、ESLint介绍 1.为什么要用ESLint 统一团队编码规范(命名,格式等) 统一语法 减少git不必要的提交 减少低级错误 在编译时检查语法,而不是等js引擎运行时才检查 2.eslint用法 可以手动下载配置 可以通过vue脚手架创建项…...

实景三维赋能国土空间智慧治理
随着城市化进程的不断推进,国土空间的合理规划与高效管理成为政府面临的一项重大挑战。在这个过程中,实景三维技术作为一种新兴的信息技术手段,正在逐渐改变传统国土空间治理的方式,为智慧城市的建设提供了新的可能。本文旨在探讨…...

树链剖分(重链剖分)
树链剖分的核心思想就是将一棵树剖分成一条一条的链 因为树不好处理 但链比较好处理 为了学会它 我们先要学会树上dfs(深度优先搜索) 然后就没了(雾) Because 树链剖分需要用到两个dfs 哦对了 我们还要了解以下的知识点 1.子…...

幻读是什么?用什么隔离级别可以防止幻读?
幻读是什么? 幻读(Phantom Read) 是数据库事务中的一种现象,指的是在一个事务中,当执行两次相同的查询时,第二次查询返回的结果集包含了第一次查询中不存在的行,或者第一次查询中存在的行在第二…...

[Unity Demo]从零开始制作空洞骑士Hollow Knight第二十集:制作专门渲染HUD的相机HUD Camera和画布HUD Canvas
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作HUD Camera以及让两个相机同时渲染屏幕二、制作HUD Canvas 1.制作法力条Soul Orb引入库2.制作生命条Health读入数据3.制作吉欧统计数Geo Counter4.制作…...

智能安全配电装置在高校实验室中的应用
摘要:高校实验室是科研人员进行科学研究和实验的场所,通常会涉及到大量的仪器设备和电气设备。电气设备的使用不当或者维护不周可能会引发火灾事故。本文将以一起实验室电气火灾事故为例,对事故原因、危害程度以及防范措施进行分析和总结…...

网络安全等级保护测评机构管理办法(全文)
网络安全等级保护测评机构管理办法(公信安〔2018〕765号) 第一章 总则 第一条 为加强网络安全等级保护测评机构(以下简称“测评机构”)管理,规范测评行为,提高等级测评能力和服务水平,根据《中华人民共和国网络安全法…...

Flutter:shared_preferences数据存储,数据持久化,token等信息存储
官方示例:简单调用 // 初始化示例 final SharedPreferences prefs await SharedPreferences.getInstance(); // 存int await prefs.setInt(counter, 10); // 存bool await prefs.setBool(repeat, true); // 存double await prefs.setDouble(decimal, 1.5); // 存st…...

FileProvider高版本使用,跨进程传输文件
高版本的android对文件权限的管控抓的很严格,理论上两个应用之间的文件传递现在都应该是用FileProvider去实现,这篇博客来一起了解下它的实现原理。 首先我们要明确一点,FileProvider就是一个ContentProvider,所以需要在AndroidManifest.xml里面对它进行声明: <provideran…...

python学习记录18
1 函数的定义 python中的函数指使用某个定义好的名字指代一段完整的代码,在使用名字时可以直接调用整个代码,这个名字叫做函数名。利用函数可以达到编写一次即可多次调用的操作,从而减少代码量。 函数分为内置函数与自定义函数。内置函数例…...

云原生之k8s服务管理
文章目录 服务管理Service服务原理ClusterIP服务 对外发布应用服务类型NodePort服务Ingress安装配置Ingress规则 Dashboard概述 认证和授权ServiceAccount用户概述创建ServiceAccount 权限管理角色与授权 服务管理 Service 服务原理 容器化带来的问题 自动调度:…...

redis工程实战介绍(含面试题)
文章目录 redis单线程VS多线程面试题**redis是多线程还是单线程,为什么是单线程****聊聊redis的多线程特性和IO多路复用****io多路复用模型****redis如此快的原因** BigKey大批量插入数据测试数据key面试题海量数据里查询某一固定前缀的key如果生产上限值keys * ,fl…...

再次讨论下孤注一掷
在孤注一掷中的黑客技术里面,简单介绍了电影孤注一掷中用的一些"黑科技",这里继续讨论下,抛弃这些黑科技,即使在绝对公平的情况下,你也一样赢不了赌场 相对论有一个假设就是光速不变,这里也有个…...

LeetCode46.全排列
LeetCode刷题记录 文章目录 📜题目描述💡解题思路⌨C代码 📜题目描述 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例1 输入:nums [1,2,3] 输出:[[1,2,…...

蓝桥杯-洛谷刷题-day4(C++)
目录 1.高精度乘法 i.P1303 A*B Problem高精度乘法 2.P4924 [1007] 魔法少女小Scarlet i.题目 ii.代码 3.二维数组 i.二维数组的建立 ii.备份 iii.二维数组的转动 4.指令的及时处理 1.高精度乘法 即,将每一位变为数组中的一位,并在数组中以倒序排列&a…...

c++总复习
1. C 中的移动语义及其作用 定义 移动语义是 C 11 引入的一种重要特性,它用于优化对象的资源管理,特别是在涉及对象所有权转移的场景中。传统的 C 语义在对象赋值或传递给函数时,通常会进行拷贝操作,即创建源对象的一个完整副本&…...

设计模式之策略模式-工作实战总结与实现
文章目录 应用场景存在问题解决方案继续延伸 应用场景 假设有这样的业务场景,大数据系统把文件推送过来,根据不同类型采取不同的解析方式。多数的小伙伴就会写出以下的代码: public class Question {public static void main(String[] args…...

E - 11/22 Subsequence题解
文章目录 大致思路代码 大致思路 预处理: 用pos1, pos2, posls 分别记录 1 1 1, 2 2 2 , / / / 在字符串中的『位置』 用cum1 和 cum2 分别存储了 1 1 1 和 2 2 2 的前缀和,这样可以快速获取任意区间内的 1 1 1 和 2 2 2 的『数量』 查询处理: 对于每个查询…...