Arduino项目:在OLED屏幕上绘制下雪场景与雪人

 

在寒冷的冬日,没有什么比一场浪漫的雪景更让人感到温馨了。今天,我将分享一个有趣的Arduino项目——如何在0.96寸OLED屏幕上绘制一个下雪场景,并在其中添加一个可爱的雪人。这个项目不仅适合初学者,还能让你感受到编程和硬件结合的魅力。

项目背景

OLED屏幕因其高对比度和低功耗而受到许多创客的喜爱。Arduino Uno则是入门级硬件开发的不二之选。结合这两者,我们可以轻松实现一个动态的下雪场景,并在其中加入一个雪人。这个项目不仅能锻炼你的编程能力,还能让你在冬日里感受到一丝温暖。

所需材料

  1. Arduino Uno:作为主控制器,负责运行代码并控制OLED屏幕。

  2. 0.96寸OLED屏幕(I2C接口):用于显示下雪场景和雪人。

  3. 面包板和连接线:用于连接Arduino和OLED屏幕。

  4. 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); // 嘴巴
}

代码解析

  1. 雪花的实现

    • 使用结构体Snowflake存储每片雪花的坐标、速度等信息。

    • 每次循环中,雪花的y坐标增加,模拟下落效果。

    • 如果雪花超出屏幕范围,则重新生成其位置。

  2. 雪人的绘制

    • 使用fillCircle函数绘制雪人的身体,由三个圆形组成。

    • 添加眼睛和嘴巴,增强雪人的视觉效果。

  3. OLED屏幕驱动

    • 使用Adafruit_SSD1306库初始化屏幕,并设置屏幕分辨率为128x64。

    • 使用drawPixelfillCircle函数绘制雪花和雪人。

运行效果

当你上传代码并运行后,你会看到OLED屏幕上显示一个动态的下雪场景,雪花从屏幕顶部飘落,最终在底部堆叠。在雪花中,一个可爱的雪人静静地站着,仿佛在享受这场冬日的浪漫。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值