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

别再只用串口打印了!用Arduino UNO和0.96寸OLED做个桌面小动画(附完整代码)

用Arduino UNO和0.96寸OLED打造桌面动态艺术装置你是否已经厌倦了单调的串口打印输出Arduino UNO搭配0.96寸OLED屏幕可以变身为一个迷你的数字画布为你的工作台增添一抹动态的科技艺术。本文将带你超越基础的数据显示探索如何利用这块小小的屏幕创造生动的动画效果从随机弹跳的球体到简约的数字时钟让你的硬件项目更具观赏性和趣味性。1. 硬件准备与环境搭建1.1 所需组件清单要开始这个创意项目你需要准备以下硬件Arduino UNO开发板作为整个系统的控制核心0.96寸OLED显示屏(I2C接口)推荐使用SSD1306驱动的版本杜邦线若干用于连接各组件USB数据线为Arduino供电并上传程序硬件连接非常简单只需将OLED的四个引脚与Arduino对应连接OLED引脚Arduino引脚GNDGNDVCC3.3V或5VSCLA5SDAA41.2 软件环境配置在开始编程前需要安装必要的库文件打开Arduino IDE点击工具-管理库搜索并安装以下两个关键库Adafruit_GFX_Library提供基础的图形绘制功能Adafruit_SSD1306针对SSD1306显示屏的专用驱动提示安装库时建议选择最新稳定版本以确保兼容性安装完成后可以通过以下测试代码验证硬件连接是否正常#include Wire.h #include Adafruit_GFX.h #include Adafruit_SSD1306.h #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, Wire); void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(10, 20); display.println(OLED Test Success!); display.display(); } void loop() {}2. 掌握Adafruit_GFX核心绘图功能2.1 基础图形绘制Adafruit_GFX库提供了一系列图形绘制函数以下是几个最常用的drawPixel(x, y, color)在指定位置绘制单个像素点drawLine(x0, y0, x1, y1, color)绘制直线drawRect(x, y, w, h, color)绘制空心矩形fillRect(x, y, w, h, color)绘制实心矩形drawCircle(x, y, r, color)绘制空心圆形fillCircle(x, y, r, color)绘制实心圆形drawTriangle(x0,y0,x1,y1,x2,y2,color)绘制空心三角形2.2 文本显示技巧除了图形文本显示也是OLED的重要功能。关键文本函数包括display.setTextSize(1); // 设置字体大小(1-8) display.setTextColor(SSD1306_WHITE); // 设置文本颜色 display.setCursor(0, 0); // 设置文本起始位置 display.println(Hello World!); // 输出文本注意OLED屏幕的坐标系原点(0,0)位于左上角x轴向右增加y轴向下增加2.3 屏幕刷新优化频繁刷新整个屏幕可能导致闪烁可以采用以下优化策略局部刷新只更新需要改变的部分双缓冲技术在内存中完成绘制后再一次性显示合理设置刷新率根据动画需求调整delay时间3. 创建弹跳球动画3.1 基础弹跳球实现让我们从经典的弹跳球动画开始。以下代码实现了一个在屏幕边界反弹的球体#include Adafruit_GFX.h #include Adafruit_SSD1306.h #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, Wire); int ballX SCREEN_WIDTH/2; int ballY SCREEN_HEIGHT/2; int ballRadius 5; int ballSpeedX 2; int ballSpeedY 3; void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); } void loop() { display.clearDisplay(); // 更新球的位置 ballX ballSpeedX; ballY ballSpeedY; // 边界检测与反弹 if(ballX ballRadius || ballX SCREEN_WIDTH-ballRadius) { ballSpeedX -ballSpeedX; } if(ballY ballRadius || ballY SCREEN_HEIGHT-ballRadius) { ballSpeedY -ballSpeedY; } // 绘制球体 display.fillCircle(ballX, ballY, ballRadius, SSD1306_WHITE); display.display(); delay(20); // 控制动画速度 }3.2 添加物理效果为了让动画更真实可以引入简单的物理模拟重力加速度让球体下落时加速能量损失每次碰撞后速度略微减小随机扰动增加运动的不确定性改进后的物理模型代码片段float gravity 0.1; float damping 0.95; // 能量损失系数 void loop() { display.clearDisplay(); // 应用重力 ballSpeedY gravity; // 更新位置 ballX ballSpeedX; ballY ballSpeedY; // 边界碰撞处理 if(ballY SCREEN_HEIGHT-ballRadius) { ballY SCREEN_HEIGHT-ballRadius; ballSpeedY -ballSpeedY * damping; // 添加随机水平扰动 ballSpeedX random(-2, 3); } if(ballX ballRadius || ballX SCREEN_WIDTH-ballRadius) { ballSpeedX -ballSpeedX * damping; } display.fillCircle(ballX, ballY, ballRadius, SSD1306_WHITE); display.display(); delay(20); }4. 构建迷你数字时钟动画4.1 基础时钟实现结合时间功能和简单动画可以创建一个更实用的桌面时钟#include Wire.h #include Adafruit_GFX.h #include Adafruit_SSD1306.h #include RTClib.h RTC_DS3231 rtc; Adafruit_SSD1306 display(128, 64, Wire); void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); if (!rtc.begin()) { while (1); } if (rtc.lostPower()) { rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } } void loop() { DateTime now rtc.now(); display.clearDisplay(); // 绘制时钟背景 display.drawRect(10, 10, 108, 44, SSD1306_WHITE); // 显示时间 display.setTextSize(2); display.setCursor(20, 20); if(now.hour() 10) display.print(0); display.print(now.hour()); display.print(:); if(now.minute() 10) display.print(0); display.print(now.minute()); display.print(:); if(now.second() 10) display.print(0); display.print(now.second()); // 显示日期 display.setTextSize(1); display.setCursor(20, 45); display.print(now.year()); display.print(/); display.print(now.month()); display.print(/); display.print(now.day()); display.display(); delay(200); }4.2 添加动画元素让静态的时钟变得生动起来秒针动画用动态弧线表示秒针移动时间数字变化效果数字变化时添加过渡动画背景元素随时间的天气图标或装饰元素改进后的动画时钟代码片段void loop() { DateTime now rtc.now(); static uint8_t lastSecond 61; display.clearDisplay(); // 绘制动态秒针 float angle map(now.second(), 0, 60, 0, 360) - 90; int centerX 64, centerY 32, radius 20; int endX centerX radius * cos(angle * DEG_TO_RAD); int endY centerY radius * sin(angle * DEG_TO_RAD); display.drawCircle(centerX, centerY, radius, SSD1306_WHITE); display.drawLine(centerX, centerY, endX, endY, SSD1306_WHITE); // 数字变化动画 if(now.second() ! lastSecond) { // 添加数字变化效果 display.fillRect(40, 10, 48, 20, SSD1306_BLACK); lastSecond now.second(); } // 显示数字时间 display.setTextSize(2); display.setCursor(40, 10); if(now.hour() 10) display.print(0); display.print(now.hour()); display.print(:); if(now.minute() 10) display.print(0); display.print(now.minute()); display.display(); delay(50); }5. 进阶创意项目交互式粒子系统5.1 粒子系统基础粒子系统可以创造出更复杂的视觉效果。每个粒子都有位置、速度和生命周期等属性struct Particle { float x, y; // 位置 float vx, vy; // 速度 uint8_t life; // 生命周期 uint8_t radius; // 大小 }; #define MAX_PARTICLES 50 Particle particles[MAX_PARTICLES];5.2 粒子系统实现完整的粒子系统实现代码#include Adafruit_GFX.h #include Adafruit_SSD1306.h #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define MAX_PARTICLES 30 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, Wire); struct Particle { float x, y; float vx, vy; uint8_t life; uint8_t radius; }; Particle particles[MAX_PARTICLES]; void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 初始化粒子 for(int i0; iMAX_PARTICLES; i) { resetParticle(i); } } void resetParticle(int index) { particles[index].x random(SCREEN_WIDTH); particles[index].y random(SCREEN_HEIGHT); particles[index].vx random(-2.0, 2.0); particles[index].vy random(-2.0, 2.0); particles[index].life random(50, 200); particles[index].radius random(1, 4); } void loop() { display.clearDisplay(); // 更新并绘制所有粒子 for(int i0; iMAX_PARTICLES; i) { if(--particles[i].life 0) { resetParticle(i); } particles[i].x particles[i].vx; particles[i].y particles[i].vy; // 边界检查 if(particles[i].x 0 || particles[i].x SCREEN_WIDTH) { particles[i].vx -particles[i].vx; } if(particles[i].y 0 || particles[i].y SCREEN_HEIGHT) { particles[i].vy -particles[i].vy; } // 绘制粒子 display.fillCircle(particles[i].x, particles[i].y, particles[i].radius, SSD1306_WHITE); } display.display(); delay(30); }5.3 添加交互功能通过添加传感器可以让粒子系统响应外部输入。例如使用加速度计控制重力方向// 假设使用MPU6050加速度计 #include MPU6050.h MPU6050 mpu; void setup() { // ...其他初始化代码... mpu.initialize(); } void loop() { // 获取加速度数据 int16_t ax, ay, az; mpu.getAcceleration(ax, ay, az); // 应用加速度到粒子 for(int i0; iMAX_PARTICLES; i) { particles[i].vx ax * 0.0001; particles[i].vy ay * 0.0001; // ...其余粒子更新代码... } // ...其余绘制代码... }在实际项目中我发现粒子系统的性能优化至关重要。当粒子数量较多时可以尝试以下优化减少粒子半径变化范围、简化碰撞检测、或者降低刷新频率。经过测试在Arduino UNO上30-50个粒子能够保持流畅的动画效果。

相关文章:

别再只用串口打印了!用Arduino UNO和0.96寸OLED做个桌面小动画(附完整代码)

用Arduino UNO和0.96寸OLED打造桌面动态艺术装置 你是否已经厌倦了单调的串口打印输出?Arduino UNO搭配0.96寸OLED屏幕可以变身为一个迷你的数字画布,为你的工作台增添一抹动态的科技艺术。本文将带你超越基础的数据显示,探索如何利用这块小…...

强化学习与控制理论融合:人形机器人自主恢复技术解析

1. 项目概述:当强化学习遇见经典控制理论在机器人研究领域,人形机器人从跌倒状态自主恢复一直是个棘手难题。传统方法要么依赖精心设计的脚本动作序列,要么采用纯数据驱动的强化学习策略,两者各有局限。我们的团队开发了一种混合架…...

Element表格Tooltip样式太丑?5分钟搞定自定义宽度和换行,附完整CSS配置代码

Element表格Tooltip样式优化实战:精准控制宽度与换行的CSS方案 每次看到Element表格里那条横跨整个屏幕的超长Tooltip,我都忍不住想吐槽——这用户体验简直比挤早高峰地铁还难受。作为前端开发者,我们经常遇到这样的场景:产品经理…...

Windows 10系统优化终极指南:如何用Windows10Debloater一键清理预装垃圾应用

Windows 10系统优化终极指南:如何用Windows10Debloater一键清理预装垃圾应用 【免费下载链接】Windows10Debloater Script to remove Windows 10 bloatware. 项目地址: https://gitcode.com/gh_mirrors/wi/Windows10Debloater 你是否曾为Windows 10系统中那些…...

医学影像分割新突破:5分钟快速部署MedSAM实现精准AI辅助诊断

医学影像分割新突破:5分钟快速部署MedSAM实现精准AI辅助诊断 【免费下载链接】MedSAM Segment Anything in Medical Images 项目地址: https://gitcode.com/gh_mirrors/me/MedSAM 医学影像分割是医疗AI领域的关键技术,能够帮助医生从CT、MRI等影像…...

为什么有这么多以字母 “C” 为开头的编程语言?

在Reddit上有个提问:为什么有这么多以字母 “C” 为开头的编程语言?题主从4个月前开始学习编程,对编程语言的数量印象深刻,但后来他意识到有很多字母为“C”的编程语言,例如:C、C、CSS、Objective-C……这是…...

别再手动调格式了!EndNote插入Word/WPS参考文献的3个高效技巧与4个常见Bug修复

别再手动调格式了!EndNote插入Word/WPS参考文献的3个高效技巧与4个常见Bug修复 文献管理工具EndNote与办公软件的协同使用,已成为科研工作者和学术写作者的标配。但当你在Word或WPS中插入参考文献时,是否经常遇到格式混乱、序号错位、插件失效…...

Go微服务踩坑记:解决grpc连接Consul时‘too many colons in address’报错(保姆级教程)

Go微服务实战:破解gRPC连接Consul的‘too many colons in address’陷阱 当你在微服务架构中尝试用gRPC连接Consul服务发现时,控制台突然抛出too many colons in address错误——这个看似简单的报错背后,隐藏着gRPC解析器与Consul协议之间的…...

从装备混乱到极致有序:TQVaultAE如何彻底改变你的泰坦之旅体验

从装备混乱到极致有序:TQVaultAE如何彻底改变你的泰坦之旅体验 【免费下载链接】TQVaultAE Extra bank space for Titan Quest Anniversary Edition 项目地址: https://gitcode.com/gh_mirrors/tq/TQVaultAE 你是否曾在《泰坦之旅》中面对满屏的传奇装备不知…...

机器视觉里,光学到底在忙什么?

同样一套相机和算法,为什么有人拍得清清楚楚,你却只拍到一片白? 很多机器视觉项目,输在的不是模型,也不是相机,而是光学没有被真正设计。 光一旦没打对,后面的识别、定位、测量,都…...

GetQzonehistory:三步轻松备份你的QQ空间历史说说,永久保存青春记忆

GetQzonehistory:三步轻松备份你的QQ空间历史说说,永久保存青春记忆 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经想过,那些年发在QQ空间…...

从PID调参到机器人控制:深入浅出聊聊二阶系统‘阻尼比’这个核心参数

从PID调参到机器人控制:深入浅出聊聊二阶系统‘阻尼比’这个核心参数 在调试一台六轴机械臂的关节伺服系统时,工程师小王盯着示波器上反复震荡的电流曲线皱起了眉头——明明已经反复调整了PID参数,电机仍然会在目标位置附近持续振荡3-4次才能…...

如何用AI加速MRI扫描:FastMRI项目的完整入门指南

如何用AI加速MRI扫描:FastMRI项目的完整入门指南 【免费下载链接】fastMRI A large-scale dataset of both raw MRI measurements and clinical MRI images. 项目地址: https://gitcode.com/gh_mirrors/fa/fastMRI 想象一下,你正躺在MRI扫描仪中&…...

AI智能体输入编译器:从自然语言到结构化任务流的工程实践

1. 项目概述:一个为AI智能体“翻译”人类指令的编译器最近在折腾AI智能体(Agent)的开发,发现一个挺有意思的痛点:我们人类随口说的一句话,比如“帮我查一下明天北京的天气,然后告诉我该穿什么衣…...

别再只会用Navicat了!DBeaver操作PostgreSQL序列、函数、视图保姆级指南

从Navicat到DBeaver:PostgreSQL高级功能实战手册 当你第一次在DBeaver中右键点击数据库对象时,可能会惊讶于这个开源工具的功能深度。作为长期使用Navicat的开发者,我在半年前被迫切换到DBeaver时经历了从怀疑到惊喜的转变。本文将分享那些让…...

深入汽车电子安全:拆解NXP VR5510如何为S32G网关实现ASIL D功能安全

深度解析NXP VR5510:ASIL D级电源管理芯片在S32G网关中的安全架构设计 当S32G车载网关处理器需要处理来自自动驾驶域、智能座舱和传统ECU的海量数据时,其电源系统的可靠性直接关系到整车的功能安全。作为NXP专为ASIL D场景设计的PMIC,VR5510通…...

AISMM自评估工具全维度拆解,从L1基础感知到L5自主演进的7大能力标尺与12项否决性指标

更多请点击: https://intelliparadigm.com 第一章:2026奇点智能技术大会:AISMM自评估工具 AISMM(Artificial Intelligence System Maturity Model)自评估工具是2026奇点智能技术大会正式发布的开源框架,旨…...

ConvNeXt 系列改进:结合 DCNv4 变形卷积,突破 ConvNeXt 对不规则形状目标的建模瓶颈

一、开篇:纯卷积的复兴与形状建模困境 1.1 2025-2026:卷积神经网络的重生之年 2026年的计算机视觉领域正在经历一场深刻的结构性转变。在Vision Transformer(ViT)和Swin Transformer主导了数年的话语权之后,纯卷积神经网络正在以一种令人瞩目的方式强势回归。这场“文艺…...

保姆级教程:在Ubuntu 22.04上搞定tiny-cuda-nn,加速你的NeRF模型训练

保姆级教程:在Ubuntu 22.04上搞定tiny-cuda-nn,加速你的NeRF模型训练 当你在复现最新的NeRF论文时,是否曾被漫长的训练时间劝退?作为2023年最火的3D重建技术之一,NeRF对计算资源的需求让许多研究者头疼。而tiny-cuda-…...

SAP ABAP实战:用BAPI_PR_CHANGE批量更新采购申请,别再一条条改了

SAP ABAP高效开发:BAPI_PR_CHANGE批量处理采购申请的工程化实践 采购申请(Purchase Requisition)作为企业采购流程的起点,其数据维护效率直接影响采购部门的运作效能。当面对数百甚至上千条需要同步更新文本、状态或关键字段的采购…...

创业公司AI能力建设白皮书(AISMM轻量级实施框架首次公开)

更多请点击: https://intelliparadigm.com 第一章:AISMM模型在创业公司中的应用全景图 AISMM(Agile Intelligence Strategy Maturity Model)是一种融合敏捷开发、数据智能与战略演进的三维成熟度框架,专为资源受限但决…...

Pecker框架:时序电路缺陷定位的创新解决方案

1. 硬件缺陷定位的挑战与Pecker框架概述在芯片设计领域,缺陷定位一直是验证流程中最耗时费力的环节。据统计,硬件设计项目中超过60%的验证时间都消耗在缺陷定位上。传统基于频谱的缺陷定位技术(SBFL)虽然在软件工程领域取得了显著…...

基于向量数据库的代码语义搜索:Codex MCP Server部署与AI编程助手集成指南

1. 项目概述:Codex MCP Server 是什么? 如果你最近在折腾 AI 开发工具链,尤其是围绕着 Cursor、Claude Desktop 或者 VSCode 的 Copilot Chat 这些智能编程环境,那你很可能已经听说过 MCP(Model Context Protocol&…...

用STM32F103C8T6的GPIO模拟I2C,驱动AD5593R DAC模块输出多路电压(附完整代码)

基于STM32F103C8T6的GPIO模拟I2C驱动AD5593R实现精密电压输出 在嵌入式开发中,I2C总线因其简洁的两线制设计而广受欢迎,但硬件I2C外设资源有限的情况时有发生。当手头只有STM32F103C8T6这类基础型号的最小系统板时,GPIO模拟I2C协议成为突破硬…...

Acepe:下一代智能体开发环境的设计理念与实战指南

1. 项目概述:Acepe,一个面向未来的智能体开发环境 如果你和我一样,在过去一年里尝试过各种AI编程助手,从Copilot到Cursor,再到Claude Code,你可能会有一个共同的感受:它们很强大,但也…...

中国项目管理工具市场迎来智能化拐点:Gitee如何引领技术团队数字化转型

2026年的项目管理工具市场正在经历一场深刻的变革,从单纯的任务管理平台向智能化协作生态转变。在这场数字化转型浪潮中,Gitee作为中国最大的代码托管平台,凭借其"代码管理"双核引擎的创新架构,正成为技术团队实现高效协…...

Windows风扇控制终极解决方案:Fan Control专业配置指南

Windows风扇控制终极解决方案:Fan Control专业配置指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...

零基础AI写作助手:oobabooga文本生成平台一键安装指南

零基础AI写作助手:oobabooga文本生成平台一键安装指南 【免费下载链接】one-click-installers Simplified installers for oobabooga/text-generation-webui. 项目地址: https://gitcode.com/gh_mirrors/on/one-click-installers 还在为复杂的AI环境配置而烦…...

告别云端依赖:在树莓派4B上用sherpa-ncnn实现离线语音识别(C++实战)

树莓派4B离线语音识别实战:sherpa-ncnnC全流程解析 在智能家居、工业物联网等边缘计算场景中,语音交互正逐渐成为标配功能。但依赖云服务的方案存在延迟高、隐私泄露风险等问题,而树莓派这类嵌入式设备的计算资源又有限。本文将带你用sherpa…...

从零构建现代化个人知识库:全栈TypeScript、Next.js与双链笔记实践

1. 项目概述:从零到一,构建一个现代化的个人知识管理工具 最近在整理自己的笔记和项目资料时,总是感觉现有的工具要么太重、要么太散,要么就是数据被锁在某个平台里,迁移起来特别麻烦。相信很多开发者、内容创作者或者…...