在寒冷的冬日,没有什么比一场浪漫的雪景更让人感到温馨了。今天,我将分享一个有趣的Arduino项目——如何在0.96寸OLED屏幕上绘制一个下雪场景,并在其中添加一个可爱的雪人。这个项目不仅适合初学者,还能让你感受到编程和硬件结合的魅力。
项目背景
OLED屏幕因其高对比度和低功耗而受到许多创客的喜爱。Arduino Uno则是入门级硬件开发的不二之选。结合这两者,我们可以轻松实现一个动态的下雪场景,并在其中加入一个雪人。这个项目不仅能锻炼你的编程能力,还能让你在冬日里感受到一丝温暖。
所需材料
-
Arduino Uno:作为主控制器,负责运行代码并控制OLED屏幕。
-
0.96寸OLED屏幕(I2C接口):用于显示下雪场景和雪人。
-
面包板和连接线:用于连接Arduino和OLED屏幕。
-
USB数据线:用于将Arduino连接到电脑进行编程。
硬件连接
硬件连接非常简单。OLED屏幕通常有4个引脚:VCC、GND、SDA和SCL。将它们连接到Arduino Uno的对应引脚上:
-
VCC → Arduino的5V引脚
-
GND → Arduino的GND引脚
-
SDA → Arduino的A4引脚
-
SCL → Arduino的A5引脚
连接完成后,你的硬件部分就完成了。
软件实现
1. 安装必要的库
在开始编程之前,你需要安装以下Arduino库:
-
Adafruit GFX Library:用于图形绘制。
-
Adafruit SSD1306 Library:用于驱动OLED屏幕。
你可以通过Arduino IDE的“管理库”功能轻松安装这些库。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED显示屏幕的宽度,以像素为单位
#define SCREEN_HEIGHT 64 // OLED显示屏幕的高度,以像素为单位
#define OLED_RESET -1 // 不使用硬件复位引脚
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
struct Snowflake {
int x, y; // 雪花的坐标
int speed; // 雪花的下落速度
};
Snowflake snowflakes[50]; // 定义50片雪花
int snowmanX = 50; // 雪人的X坐标
int snowmanY = 40; // 雪人的Y坐标
void setup() {
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 初始化OLED屏幕
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.display();
// 初始化雪花
for (int i = 0; i < 50; i++) {
snowflakes[i].x = random(SCREEN_WIDTH);
snowflakes[i].y = random(-100, -10);
snowflakes[i].speed = random(1, 4);
}
}
void loop() {
display.clearDisplay(); // 清屏
// 绘制雪花
for (int i = 0; i < 50; i++) {
snowflakes[i].y += snowflakes[i].speed; // 雪花下落
if (snowflakes[i].y > SCREEN_HEIGHT) { // 如果雪花超出屏幕
snowflakes[i].x = random(SCREEN_WIDTH); // 重新生成X坐标
snowflakes[i].y = random(-100, -10); // 重新生成Y坐标
}
display.drawPixel(snowflakes[i].x, snowflakes[i].y, SSD1306_WHITE); // 绘制雪花
}
// 绘制雪人
drawSnowman(snowmanX, snowmanY);
display.display(); // 显示内容
delay(50); // 延时
}
void drawSnowman(int x, int y) {
// 绘制雪人身体
display.fillCircle(x, y - 10, 10, SSD1306_WHITE); // 头
display.fillCircle(x, y + 10, 15, SSD1306_WHITE); // 中间部分
display.fillCircle(x, y + 35, 20, SSD1306_WHITE); // 底部
// 绘制眼睛和嘴巴
display.drawPixel(x - 3, y - 15, SSD1306_BLACK); // 左眼
display.drawPixel(x + 3, y - 15, SSD1306_BLACK); // 右眼
display.drawLine(x - 5, y - 5, x + 5, y - 5, SSD1306_BLACK); // 嘴巴
}
代码解析
-
雪花的实现:
-
使用结构体
Snowflake
存储每片雪花的坐标、速度等信息。 -
每次循环中,雪花的
y
坐标增加,模拟下落效果。 -
如果雪花超出屏幕范围,则重新生成其位置。
-
-
雪人的绘制:
-
使用
fillCircle
函数绘制雪人的身体,由三个圆形组成。 -
添加眼睛和嘴巴,增强雪人的视觉效果。
-
-
OLED屏幕驱动:
-
使用
Adafruit_SSD1306
库初始化屏幕,并设置屏幕分辨率为128x64。 -
使用
drawPixel
和fillCircle
函数绘制雪花和雪人。
-
运行效果
当你上传代码并运行后,你会看到OLED屏幕上显示一个动态的下雪场景,雪花从屏幕顶部飘落,最终在底部堆叠。在雪花中,一个可爱的雪人静静地站着,仿佛在享受这场冬日的浪漫。