Arduino画圣诞树
上年圣诞节的时候,好友发了很多的圣诞树,pyq里到处都是
当然,在色彩斑斓的手机屏幕前,还坐着数不清的单身狗们
甚至有些激进分子当起了砍树先锋
刚好,期末前最后的大作业是用Arduino调用Adafruit_GFX库来画画,所以当时就想了想,还是画个简易版的圣诞树吧。
回归正题!!!
首先介绍一下Adafruit_GFX
Adafruit_GFX是一个强大的图形库,它为我们所有的LCD和OLED显示器提供了通用语法和一组图形功能。这使得我们可以在不同的图形之间转换,也可以在简单的或者是复杂的形式间进行转换。甚至是新的特性,或者是性能的改进以及故障查找都可以马上显示的彩色的图形显示器上。
具体如何在Arduino中导入这个库,就不多介绍了。
接着我们在它的库文件中加入一个新的方法——画圣诞树
首先,我们来到它的库文件夹下,找到这两个文件:
Adafruit_GFX.cpp 和 Adafruit_GFX.h
接着,我们在Adafruit_GFX.h文件中申明一条全局方法(之后在Arduino中直接调用Adafruit_GFX.h库后,可以直接使用该方法)
然后,我们在Adafruit_GFX.cpp中实现该方法:
//Draw a tree
void Adafruit_GFX::drawTree(uint16_t color){
int a1_x = 64;
int a1_y = 4;
int b1_x = 60;
int b1_y = 8;
int c1_x = 68;
int c1_y = 8;
drawLine(a1_x , a1_y , b1_x, b1_y, color);
drawLine(a1_x , a1_y , c1_x, c1_y, color);
drawLine(b1_x , b1_y , c1_x, c1_y, color);
int a2_x = 64;
int a2_y = 8;
int b2_x = 56;
int b2_y = 16;
int c2_x = 72;
int c2_y = 16;
drawLine(a2_x , a2_y , b2_x, b2_y, color);
drawLine(a2_x , a2_y , c2_x, c2_y, color);
drawLine(b2_x , b2_y , c2_x, c2_y, color);
int a3_x = 64;
int a3_y = 16;
int b3_x = 50;
int b3_y = 26;
int c3_x = 78;
int c3_y = 26;
drawLine(a3_x , a3_y , b3_x, b3_y, color);
drawLine(a3_x , a3_y , c3_x, c3_y, color);
drawLine(b3_x , b3_y , c3_x, c3_y, color);
int a4_x = 64;
int a4_y = 26;
int b4_x = 44;
int b4_y = 40;
int c4_x = 84;
int c4_y = 40;
drawLine(a4_x , a4_y , b4_x, b4_y, color);
drawLine(a4_x , a4_y , c4_x, c4_y, color);
drawLine(b4_x , b4_y , c4_x, c4_y, color);
int aa_x = 60;
int aa_y = 40;
int bb_x = 68;
int bb_y = 40;
int cc_x = 60;
int cc_y = 50;
int dd_x = 68;
int dd_y = 50;
drawLine(aa_x , aa_y , cc_x, cc_y, color);
drawLine(bb_x , bb_y , dd_x, dd_y, color);
drawLine(cc_x , cc_y , dd_x, dd_y, color);
}
该圣诞树是采用三角形和矩形的结合,其中(a_x,a_y),(b_x,b_y),(c_x,c_y)为三角形的三个点坐标,aa,bb,cc,dd则是底部矩形的坐标。
最后在Arduino中调用实现:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_MOSI 11
#define OLED_CLK 13
#define OLED_DC 9
#define OLED_CS 10
#define OLED_RESET 8
Adafruit_SSD1306 ssd(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
void setup() {
if(!ssd.begin(SSD1306_SWITCHCAPVCC)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
}
void loop() {
ssd.clearDisplay();
//画圣诞树
ssd.drawTree(SSD1306_WHITE);
ssd.display();
delay(2000);
}
此时的OLED屏如下:
这里我花了几分钟的时间画了一个可以看出是树的圣诞树哈哈哈,当然,你们可以稍微费点时间实现更好看更花哨的圣诞树。