【花雕学编程】Arduino动手做(249)---GC9A01模拟月盈月亏

2025-04-091427


【花雕学编程】Arduino动手做(249)---GC9A01模拟月盈月亏图2

【花雕学编程】Arduino动手做(249)---GC9A01模拟月盈月亏图1

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(7)
驴友花雕
驴友花雕
作者

驴友花雕
驴友花雕
作者


驴友花雕
驴友花雕
作者
实验场景图 动态图


驴友花雕
驴友花雕
作者
实验场景图 动态图


驴友花雕
驴友花雕
作者
代码解析
1. 月相阶段控制
使用 phase 参数控制月相循环:
phase 为 0.0 表示“新月”,月亮完全消失。
phase 为 0.5 表示“满月”,整个月亮完全可见。
phase 为 1.0 表示完成一个周期,返回到“新月”。
2. 动态阴影
通过绘制黑色圆形模拟月亮的阴影:
在“新月到满月”阶段(phase >= 0.5),阴影从月亮右侧逐渐消失。
在“满月到新月”阶段(phase < 0.5),阴影从左侧逐渐增大。
3. 动态绘制
每帧重绘月亮和背景,使用颜色对比模拟阴影和月亮的变化。
4. 圆形轨迹控制
使用 fillCircle() 函数绘制月亮和阴影,通过 shadow_x 和 phase 动态调整阴影的中心位置和大小。
5. 效果表现
动态月相:月亮从新月逐渐变为满月,然后再回到新月,完成一次完整循环。
平滑过渡:通过帧速率和阴影圆心位置的渐变,使月相变化自然流畅。
视觉效果:深蓝色背景与白色月亮形成对比,增强视觉冲击力。
驴友花雕
驴友花雕
作者
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目之五十:GC9A01屏之实现一个动态的全屏月相模拟月盈月亏
实验开源代码
[code]/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目之五十:GC9A01屏之实现一个动态的全屏月相模拟月盈月亏
*/
// GC9A01---------- ESP32
// RST ------------ NC(复位引脚,此处未连接)
// CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
// DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
// SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
// SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
// GND ------------ GND(接地引脚,连接到ESP32的接地端)
// VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"
// 定义屏幕引脚
#define TFT_CS 4 // 片选引脚
#define TFT_DC 2 // 数据/命令引脚
#define TFT_RST -1 // 重置引脚(未使用时设置为 -1)
// 初始化屏幕对象
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
// 屏幕参数
#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 240
#define MOON_RADIUS 100 // 月亮半径
#define FRAME_DELAY 500 // 帧延迟
// 定义颜色
#define MOON_COLOR tft.color565(255, 223, 0) // 金黄色月亮
#define BACKGROUND_COLOR tft.color565(10, 10, 50) // 深蓝色背景
// 绘制月相的函数
void drawMoon(float phase) {
// 清屏,设置深蓝背景
tft.fillScreen(BACKGROUND_COLOR);
// 绘制完整金黄色月亮
tft.fillCircle(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, MOON_RADIUS, MOON_COLOR);
// 动态遮罩实现阴影
int shadow_x = SCREEN_WIDTH / 2 + (phase - 0.5) * 2 * MOON_RADIUS;
if (phase < 0.5) {
// 月亏:右侧被遮盖
tft.fillCircle(shadow_x, SCREEN_HEIGHT / 2, MOON_RADIUS, BACKGROUND_COLOR);
} else if (phase < 1.0) {
// 月盈:左侧被遮盖
tft.fillCircle(shadow_x, SCREEN_HEIGHT / 2, MOON_RADIUS, BACKGROUND_COLOR);
}
// 如果 phase = 0.5 满月,不添加任何遮罩,确保完整显示
}
void setup() {
Serial.begin(115200);
tft.begin(); // 初始化屏幕
tft.setRotation(2); // 设置屏幕方向
tft.fillScreen(BACKGROUND_COLOR); // 设置初始背景
}
void loop() {
static float phase = 0.0; // 月相值范围 [0.0, 1.0]
drawMoon(phase); // 绘制当前月相
delay(FRAME_DELAY); // 延长帧间隔,增强动态可见性
phase += 0.05; // 更慢的相位变化
if (phase > 1.0) { // 循环回到新月
phase = 0.0;
}
}[/code]
驴友花雕
驴友花雕
作者



- 没有更多了 -