|
本人平时骑摩托车上班,有时候在等红绿灯时老想看看时间,摩托车仪表盘又没有时间显示,我就萌生了要自己做一个显示时间的小东西。基本思路是Arduino nano 接收来自DS1302时钟模块的时间,显示在0.96寸的OLED屏幕上,改天把它安装到我的小毛驴上,也能随时知道时间了:titter:
以下是接线图
下图是DS1302时钟模块和nano 的接线图
下图是0.96寸OLED屏幕的接线图
以下为烧录代码
- #include <stdio.h>
- #include <string.h>
- #include "DS1302.h"
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #define OLED_RESET 4//oled复位
- Adafruit_SSD1306 display(OLED_RESET);
-
- uint8_t RST = 5;
- uint8_t DAT = 6;
- uint8_t CLK = 7;
-
- /* 日期变量缓存 */
- char buf[50];
- char day[10];
- char buf_xingqi[10];
- char buf_day[11];
- char buf_time[10];
- /*sec flag*/
- bool secFlag = true;
- //以下为定义显示的内容
- /*-- 文字: 星 --*/
- /*-- Fixedsys12; 此字体下对应的点阵为:宽x高=16x16 --*/
- static const uint8_t PROGMEM xing_16x16[]=
- {0x00,0x00,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x01,0x00,0x11,0x00,
- 0x1F,0xF8,0x21,0x00,0x41,0x00,0x1F,0xF0,0x01,0x00,0x01,0x00,0x7F,0xFC,0x00,0x00};
- /*-- 文字: 期 --*/
- /*-- Fixedsys12; 此字体下对应的点阵为:宽x高=16x16 --*/
- static const uint8_t PROGMEM qi_16x16[]=
- {0x22,0x00,0x22,0x7C,0x7F,0x44,0x22,0x44,0x22,0x44,0x3E,0x7C,0x22,0x44,0x22,0x44,
- 0x3E,0x44,0x22,0x7C,0x22,0x44,0xFF,0x44,0x04,0x84,0x22,0x84,0x41,0x14,0x82,0x08};
-
- /* 定义DS1302对象 */
- DS1302 rtc(RST, DAT, CLK);
- #if (SSD1306_LCDHEIGHT != 64)
- #error("Height incorrect, please fix Adafruit_SSD1306.h!");
- #endif
-
- void print_time()
- {
- Time t = rtc.time();
- /* 星期转换成字符串 */
- memset(day, 0, sizeof(day));
- switch (t.day)
- {
- case 1: strcpy(day, "7"); break;
- case 2: strcpy(day, "1"); break;
- case 3: strcpy(day, "2"); break;
- case 4: strcpy(day, "3"); break;
- case 5: strcpy(day, "4"); break;
- case 6: strcpy(day, "5"); break;
- case 7: strcpy(day, "6"); break;
- }
- /* 日期格式化 */
- snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
- snprintf(buf_xingqi, sizeof(buf_xingqi), "%s", day);
- snprintf(buf_day, sizeof(buf_day), "%02d-%02d-%02d",t.yr,t.mon, t.date);
- if(secFlag) {
- snprintf(buf_time, sizeof(buf_time), "%02d:%02d", t.hr, t.min);
- secFlag = false;
- }
- else {
- snprintf(buf_time, sizeof(buf_time), "%02d %02d", t.hr, t.min);
- secFlag = true;
- }
-
- /* 打印输出 */
- Serial.println(buf_xingqi);
- }
-
- void setup()
- {
- Serial.begin(9600);
-
- rtc.halt(false);
- /* 初始化时间
- * 仅第一次上电设置时间,以后断电重启读取ds1302内的时间
- rtc.write_protect(false);//关闭写保护
- Time t(2020, 2, 19, 16,35, 00, 4);//最后一个为星期x,日:1、一:2、二:3.....
- rtc.time(t);
- rtc.write_protect(true);//开启写保护*/
- display.begin(SSD1306_SWITCHCAPVCC, 0x3C);// 使用I2C addr 0x3D初始化 (用于128x64)
- display.clearDisplay();//清除屏幕和缓冲区
- }
-
- void loop()
- {
- /* 串口显示时间 */
- print_time();
- delay(1000);
- /* 打印当前时间 */
- display.clearDisplay();// 清除屏幕和缓冲区
-
- display.setTextColor(WHITE);
- //-------------------------------
- //时间
- display.setTextSize(4);
- display.setCursor(3,3);
- display.println(buf_time);
- //星期
- display.setTextSize(1);
- //xing_16x16
- display.drawBitmap(75,40,xing_16x16,16,16,WHITE);
- display.drawBitmap(93,40,qi_16x16,16,16,WHITE);
- display.setCursor(113,45);
- display.println(buf_xingqi);
- //日期
- display.setTextSize(1);
- display.setCursor(10,45);
- display.println(buf_day);
-
- //-------------------------------
- display.display();
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|