基于数码管和OLED的Arduino桌面级显示设备
前序
前天才回到学校,打扫了两天的宿舍,今天终于有空整理自己的东西了。于是我找到了尘封已久的基于数码管和OLED的Arduino桌面级显示设备(之前做好了,但是由于各种原因被我拆掉了一些零件),今天可算是把它修复了,以后就挂宿舍欣赏了(手动滑稽)。
关于数码管程序及OLED的Arduino程序编写可查看我之前的博客,在此我就不在多叙述。
附上链接:
注:代码注释较少(个人认为比较简单),大家可观看代码中的一些显示的,然后自行修改即可
视频效果
没有仪器,手有点抖,原谅在下技术不过关,大家将就着看吧。
由于CSDN不能上传视频,而且gif大小有限制,只能用分段的GIF了。
源码
由于本人不会发链接下载,所以就直接贴出来了。
如果大家有需要我可以发个下载链接(看留言人数哟)。
注:代码注释较少(个人认为比较简单),大家可观看代码中的一些显示的,然后自行修改即可
/* 数码管和OLED多彩显示
* 用于装饰桌面
* OLED基于Adafruit库编写
* 数码管基于时序编写
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//OLED显示屏的SCL接A5,SDA接A4
#define D_a 2 //一一对应晶体管的单个管
#define D_b 3
#define D_c 4
#define D_d 5
#define D_e 6
#define D_f 7
#define D_g 8
#define D_h 9
#define COM1 10 //对应4位晶体管的管号位
#define COM2 11
#define COM3 12
#define COM4 13
bool Digital_tube_number[37][8] = { //若效果不好可自行修改
{0,0,0,0,0,0,1,1},//0
{1,0,0,1,1,1,1,1},//1
{0,0,1,0,0,1,0,1},//2
{0,0,0,0,1,1,0,1},//3
{1,0,0,1,1,0,0,1},//4
{0,1,0,0,1,0,0,1},//5
{0,1,0,0,0,0,0,1},//6
{0,0,0,1,1,1,1,1},//7
{0,0,0,0,0,0,0,1},//8
{0,0,0,0,1,0,0,1},//9
{0,0,0,1,0,0,0,1},//A10
{0,0,0,0,0,0,0,0},//B11
{0,1,1,0,0,0,1,0},//C12
{0,0,0,0,0,0,1,0},//D13
{0,1,1,0,0,0,0,0},//E14
{0,1,1,1,0,0,0,0},//F15
{0,1,0,0,0,0,1,0},//G16
{1,0,0,1,0,0,0,0},//H17
{1,1,1,1,0,0,1,0},//I18
{1,0,0,0,1,1,1,0},//J19
{1,1,0,1,0,0,0,0},//K20
{1,1,1,0,0,0,1,0},//L21
{0,0,0,1,0,0,1,0},//M22
{1,1,0,1,0,1,0,0},//N23
{0,0,0,0,0,0,1,1},//O24
{0,0,1,1,0,0,0,0},//P25
{0,0,0,0,0,0,1,0},//Q26
{0,0,0,1,0,0,0,0},//R27
{0,1,0,0,1,0,0,0},//S28
{0,1,1,1,0,0,1,0},//T29
{1,0,0,0,0,0,1,1},//U30
{1,0,0,0,0,0,1,0},//V31
{1,1,1,1,1,1,0,0},//W32
{1,1,1,1,1,1,0,0},//X33
{1,0,0,0,1,0,0,0},//Y34
{1,1,1,1,1,1,1,1},//不显示
{1,1,1,1,1,1,1,0},//小数点36.
};
int delay_time = 2;
void setup() {
// put your setup code here, to run once:
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(1000); // Pause for 2 seconds
display.clearDisplay();
display.cp437(true); //若声明则使用CP437字符集(默认关闭)
display.setTextSize(1); // 字体大小
display.setTextColor(WHITE); // 字体颜色
display.setCursor(20,8); // 字体位置(未声明将顺序向下)
display.println(F("Welcome back!"));
display.setCursor(40,16);
display.println(F("FenYun!"));
display.display();
delay(2000); // Pause for 2 seconds
for(int i=D_a;i<=D_h;i++){
pinMode(i,OUTPUT);
}
for(int i=COM1;i<=COM4;i++){
pinMode(i,OUTPUT);
}
}
void loop() {
// put your main code here, to run repeatedly:
display.clearDisplay();
display.setTextSize(4);
display.setCursor(0,0);
display.setTextColor(WHITE);
display.write(3);
display.display();
display.startscrolldiagright(0x00, 0x0F);
Digital_tube_dynamic_display(0,5,0,8,5,1);
Digital_tube_dynamic_display(5,2,0,36,5,1);
display.startscrolldiagleft(0x00, 0x0F);
Digital_tube_dynamic_display(15,14,23,16,5,2);
Digital_tube_dynamic_display(34,30,23,36,5,2);
Digital_tube_dynamic_display(3,2,3,36,5,2);
display.clearDisplay();
display.stopscroll();
display.cp437(true); //若声明则使用CP437字符集(默认关闭)
display.setTextSize(1); // 字体大小
display.setTextColor(WHITE); // 字体颜色
display.setCursor(30,0); // 字体位置(未声明将顺序向下)
display.println(F("Just do it!"));
display.setCursor(40,8);
display.println(F("FenYun!"));
display.setCursor(1,16); // 字体位置(未声明将顺序向下)
display.println(F("Fight! Fight! Fight!"));
display.setCursor(35,24);
display.println(F("FenYun323!"));
display.display();
Digital_tube_display_sametime(2);
delay(2500);
}
/* 动态显示
* a数码管1显示,b数码管2显示,c数码管3显示,d数码管4显示,
* time1视觉暂留最短时间,time2动态时间
*/
void Digital_tube_dynamic_display(int a,int b,int c,int d,int time1,float time2)
{
if(time1>6){
time1 = 6;
}
for(int i=0;i<time2*250/time1;i++){
Digital_tube_display(1,a);
delay(time1);
Digital_tube_display(2,b);
delay(time1);
Digital_tube_display(3,c);
delay(time1);
Digital_tube_display(4,d);
delay(time1);
}
}
void Digital_tube_display_sametime(int number)
{
digitalWrite(COM1,HIGH);
digitalWrite(COM2,HIGH);
digitalWrite(COM3,HIGH);
digitalWrite(COM4,HIGH);
for(int i=0;i<8;i++){
digitalWrite(2+i,Digital_tube_number[number][i]);
}
}
void Digital_tube_display(int com,int number)
{
for(int i=COM1;i<=COM4;i++){
digitalWrite(i,LOW);
}
switch(com){
case 1:
digitalWrite(COM1,HIGH);
break;
case 2:
digitalWrite(COM2,HIGH);
break;
case 3:
digitalWrite(COM3,HIGH);
break;
case 4:
digitalWrite(COM4,HIGH);
break;
}
for(int i=0;i<8;i++){
digitalWrite(2+i,Digital_tube_number[number][i]);
}
}