数码之家

 找回密码
 立即注册
搜索
查看: 6240|回复: 17

[Arduino] Arduino:nano+DS1302+0.96寸OLED屏幕的时间显示器

[复制链接]
发表于 2020-2-20 22:36:05 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本人平时骑摩托车上班,有时候在等红绿灯时老想看看时间,摩托车仪表盘又没有时间显示,我就萌生了要自己做一个显示时间的小东西。基本思路是Arduino nano 接收来自DS1302时钟模块的时间,显示在0.96寸的OLED屏幕上,改天把它安装到我的小毛驴上,也能随时知道时间了:titter:

以下是接线图

整体显示效果

整体显示效果


下图是DS1302时钟模块和nano 的接线图

DS1302

DS1302


下图是0.96寸OLED屏幕的接线图

OLED

OLED



以下为烧录代码

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "DS1302.h"
  4. #include <Wire.h>
  5. #include <Adafruit_GFX.h>
  6. #include <Adafruit_SSD1306.h>

  7. #define OLED_RESET 4//oled复位
  8. Adafruit_SSD1306 display(OLED_RESET);
  9.   
  10. uint8_t RST = 5;
  11. uint8_t DAT = 6;
  12. uint8_t CLK = 7;
  13.   
  14. /* 日期变量缓存 */
  15. char buf[50];
  16. char day[10];
  17. char buf_xingqi[10];
  18. char buf_day[11];
  19. char buf_time[10];
  20. /*sec flag*/
  21. bool secFlag = true;
  22. //以下为定义显示的内容
  23. /*--  文字:  星  --*/
  24. /*--  Fixedsys12;  此字体下对应的点阵为:宽x高=16x16   --*/
  25. static const uint8_t PROGMEM xing_16x16[]=
  26. {0x00,0x00,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x01,0x00,0x11,0x00,
  27. 0x1F,0xF8,0x21,0x00,0x41,0x00,0x1F,0xF0,0x01,0x00,0x01,0x00,0x7F,0xFC,0x00,0x00};

  28. /*--  文字:  期  --*/
  29. /*--  Fixedsys12;  此字体下对应的点阵为:宽x高=16x16   --*/
  30. static const uint8_t PROGMEM qi_16x16[]=
  31. {0x22,0x00,0x22,0x7C,0x7F,0x44,0x22,0x44,0x22,0x44,0x3E,0x7C,0x22,0x44,0x22,0x44,
  32. 0x3E,0x44,0x22,0x7C,0x22,0x44,0xFF,0x44,0x04,0x84,0x22,0x84,0x41,0x14,0x82,0x08};

  33.   
  34. /* 定义DS1302对象 */
  35. DS1302 rtc(RST, DAT, CLK);

  36. #if (SSD1306_LCDHEIGHT != 64)
  37. #error("Height incorrect, please fix Adafruit_SSD1306.h!");
  38. #endif
  39.   
  40. void print_time()
  41. {
  42.     Time t = rtc.time();
  43.     /* 星期转换成字符串 */
  44.     memset(day, 0, sizeof(day));
  45.     switch (t.day)
  46.     {
  47.       case 1: strcpy(day, "7"); break;
  48.       case 2: strcpy(day, "1"); break;
  49.       case 3: strcpy(day, "2"); break;
  50.       case 4: strcpy(day, "3"); break;
  51.       case 5: strcpy(day, "4"); break;
  52.       case 6: strcpy(day, "5"); break;
  53.       case 7: strcpy(day, "6"); break;
  54.     }
  55.     /* 日期格式化 */
  56.    snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
  57.    snprintf(buf_xingqi, sizeof(buf_xingqi), "%s", day);
  58.    snprintf(buf_day, sizeof(buf_day), "%02d-%02d-%02d",t.yr,t.mon, t.date);
  59.     if(secFlag) {
  60.     snprintf(buf_time, sizeof(buf_time), "%02d:%02d", t.hr, t.min);
  61.     secFlag = false;
  62.     }
  63.     else {
  64.       snprintf(buf_time, sizeof(buf_time), "%02d %02d", t.hr, t.min);
  65.       secFlag = true;
  66.       }
  67.    
  68.     /* 打印输出 */
  69.     Serial.println(buf_xingqi);
  70. }
  71.   
  72. void setup()
  73. {
  74.     Serial.begin(9600);
  75.    
  76.     rtc.halt(false);
  77.     /* 初始化时间
  78.      *  仅第一次上电设置时间,以后断电重启读取ds1302内的时间
  79.     rtc.write_protect(false);//关闭写保护
  80.     Time t(2020, 2, 19, 16,35, 00, 4);//最后一个为星期x,日:1、一:2、二:3.....
  81.     rtc.time(t);
  82.     rtc.write_protect(true);//开启写保护*/

  83.     display.begin(SSD1306_SWITCHCAPVCC, 0x3C);// 使用I2C addr 0x3D初始化 (用于128x64)
  84.     display.clearDisplay();//清除屏幕和缓冲区
  85. }
  86.   
  87. void loop()
  88. {   
  89.     /* 串口显示时间 */
  90.     print_time();
  91.     delay(1000);
  92.         /* 打印当前时间 */
  93.    display.clearDisplay();//  清除屏幕和缓冲区
  94.       
  95.    display.setTextColor(WHITE);
  96.    //-------------------------------
  97.    //时间
  98.    display.setTextSize(4);
  99.    display.setCursor(3,3);
  100.    display.println(buf_time);
  101.    //星期
  102.    display.setTextSize(1);
  103.    //xing_16x16
  104.    display.drawBitmap(75,40,xing_16x16,16,16,WHITE);
  105.    display.drawBitmap(93,40,qi_16x16,16,16,WHITE);
  106.    display.setCursor(113,45);
  107.    display.println(buf_xingqi);
  108.    //日期
  109.    display.setTextSize(1);
  110.    display.setCursor(10,45);
  111.    display.println(buf_day);
  112.    
  113.    //-------------------------------
  114.    display.display();
  115. }
复制代码


打赏

参与人数 3家元 +65 收起 理由
温力口 + 10 谢谢分享。。。。。折腾的漂亮。。。。。。.
人艰不拆了 + 15
家睦 + 40

查看全部打赏

 楼主| 发表于 2020-2-20 22:36:59 | 显示全部楼层
自己占个沙发
回复 支持 反对

使用道具 举报

发表于 2020-2-21 20:50:23 来自手机浏览器 | 显示全部楼层
其实玩玩可以,防水要做好。

另推荐 装个 淘汰了的汽车GPS导航仪,
能地图导航
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-24 12:54:57 | 显示全部楼层
G175125 发表于 2020-2-21 20:50
其实玩玩可以,防水要做好。

另推荐 装个 淘汰了的汽车GPS导航仪,

打算直接装在仪表盘里边,这样防水什么的问题就解决了,就是仪表盘拆起来费劲,等天暖和了就开工
回复 支持 反对

使用道具 举报

发表于 2020-2-24 21:19:13 来自手机浏览器 | 显示全部楼层
这玩意儿跟那个大板子有啥区别?撸过这玩意儿还要再撸下载器么?
回复 支持 反对

使用道具 举报

发表于 2020-2-28 13:12:45 | 显示全部楼层
楼主,ds1302库文件发发看看!!!谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-27 11:57:01 | 显示全部楼层
hlwekopiy 发表于 2020-2-28 13:12
楼主,ds1302库文件发发看看!!!谢谢!

arduino ide 库文件管理器下载的,官方库文件
回复 支持 反对

使用道具 举报

发表于 2020-3-27 12:15:32 | 显示全部楼层
触景情伤 发表于 2020-2-24 21:19
这玩意儿跟那个大板子有啥区别?撸过这玩意儿还要再撸下载器么?

区别就是这个小一些。。。。。 :tongue:

自带串口芯片
回复 支持 反对

使用道具 举报

发表于 2020-3-27 12:17:22 | 显示全部楼层
建议LZ再花10几块钱买个GPS模块。。。。。

俩表的时间不一样不能忍 :lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-27 13:58:14 | 显示全部楼层
qingkong 发表于 2020-3-27 12:17
建议LZ再花10几块钱买个GPS模块。。。。。

俩表的时间不一样不能忍

好主意啊,就是不知道加了gps模块到底还能带来什么好处
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-27 14:06:01 | 显示全部楼层
qingkong 发表于 2020-3-27 12:17
建议LZ再花10几块钱买个GPS模块。。。。。

俩表的时间不一样不能忍

我查了下资料,弄个GPS模块直接获取时间,ds1302模块就省了啊,还能获得经纬度信息,不错啊
回复 支持 反对

使用道具 举报

发表于 2020-3-27 16:05:08 | 显示全部楼层
laveme 发表于 2020-3-27 14:06
我查了下资料,弄个GPS模块直接获取时间,ds1302模块就省了啊,还能获得经纬度信息,不错啊 ...

:tongue: 授时 也是GPS很重要滴一个功能。。。。
回复 支持 反对

使用道具 举报

发表于 2020-3-28 14:20:39 | 显示全部楼层
我的踏板车也是遇到这个问题,看了tb上有卖汽车用的,我想应该可以装到表盘里里面。 141842.jpg
回复 支持 反对

使用道具 举报

发表于 2020-3-28 15:36:12 | 显示全部楼层
谢谢分享。。。。。折腾的漂亮。。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-16 15:43:45 | 显示全部楼层
simxu 发表于 2020-3-28 14:20
我的踏板车也是遇到这个问题,看了tb上有卖汽车用的,我想应该可以装到表盘里里面。
...

可别买这玩意,我以前买过,垃圾
回复 支持 反对

使用道具 举报

发表于 2020-6-11 08:49:25 来自手机浏览器 | 显示全部楼层
这么调时间
回复 支持 反对

使用道具 举报

发表于 2020-6-11 10:51:41 | 显示全部楼层
建议使用ds3231,比1302精度高好几个数量级,电路也简单。

就算用GPS模块,RTC也是不能少的。
GPS获取时间有一个过程,特别是冷启动,至少要1分钟。如果开机的时候在没有信号的地方就没时间看了。

另外GPS模块还能提供速度信息,做个速度表比原厂的速度表真实。
喜欢看快乐表的就没必要了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-29 21:28 , Processed in 0.202801 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表