29浏览
查看: 29|回复: 4

[项目] 【Arduino 动手做】DIY Arduino模拟时钟

[复制链接]
一个有趣、好看的模拟风格时钟,而且制作起来也非常简单。

这次我将教你如何制作一个有趣又美观的时钟,而且制作起来也非常简单。精确的时间会以椭圆形模拟时钟的形式显示在一块大型液晶显示屏上。你还可以通过三个按钮轻松调整时间。

在这种情况下,为了简单起见,不使用实时时钟模块,因此精度不是很高,主要取决于微控制器内的晶体。

【Arduino 动手做】DIY Arduino模拟时钟图1

驴友花雕  中级技神
 楼主|

发表于 昨天 09:45

【Arduino 动手做】DIY Arduino模拟时钟

该设备由几个部件组成:

- Arduino Nano微控制器

- 基于 ST7920 芯片的 LCD 显示屏,分辨率为 128x64 点

- 和三个按钮

【Arduino 动手做】DIY Arduino模拟时钟图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 09:46

【Arduino 动手做】DIY Arduino模拟时钟

基本代码可从 blaber.com.pl 网站下载,并根据上述显示器进行调整,该显示器比原始版本更易于访问且价格便宜得多。代码是对数字时钟的修改,虽然可以运行,但仍需要在图形处理方面做大量工作。这是一个很好的示例,展示了如何使用 u8g2 库在不同类型的显示器上绘制对象和写入文本。

开机后,时间是12:00,我们需要手动设置当前时间。三个按钮让设置变得简单。中间的按钮用于进入设置模式,第一次点击设置分钟,第二次点击设置小时。在设置模式下,箭头可以通过另外两个按钮移动。说到精度,考虑到我们没有使用RTC模块,这个时钟相当准确。就我而言,24小时内,实际时间和时钟时间之间的差异只有几秒钟。

最后,将该装置装入一个合适的盒子中,该盒子由厚度为3mm和5mm的PVC材料制成,并涂有自粘彩色壁纸。

【Arduino 动手做】DIY Arduino模拟时钟图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 09:48

【Arduino 动手做】DIY Arduino模拟时钟

项目代码

  1. #include <Arduino.h>
  2. #include <U8g2lib.h>
  3. #include <TimerOne.h>
  4. U8G2_ST7920_128X64_1_SW_SPI u8g2(U8G2_R2, /* clock=*/ 13, /* data=*/ 11, /* CS=*/ 10, /* reset=*/ 8);
  5. byte inPin1 = 7;                  //digital input sw-1 marking hours or minutes
  6. byte inPin2 = 6;                  //sw-2 digital input correcting minutes
  7. byte inPin3 = 5;                  //digital input sw-3 correcting hours
  8. byte P1, P2;                      //button states
  9. uint8_t s, m, g;                  //declaration of seconds, minutes and hours
  10. boolean kropki;                   //variable of the dots
  11. const char tarczaX[60] = {        //X coordinates of the target points
  12.   64, 61, 56, 53, 50, 48, 45, 42, 40, 40,
  13.   35, 34, 31, 29, 28, 28, 28, 29, 31, 34,
  14.   35, 38, 40, 42, 45, 48, 50, 53, 56, 61,
  15.   64, 68, 72, 76, 79, 82, 85, 87, 90, 92,
  16.   94, 96, 98, 99, 100, 100, 100, 99, 98, 96,
  17.   94, 92, 90, 87, 85, 82, 79, 76, 68, 64 };
  18. const char tarczaY[60] = {        //y coordinates of the target points
  19.   54, 54, 54, 54, 53, 52, 51, 49, 48, 48,
  20.   44, 43, 40, 37, 35, 32, 27, 26, 23, 21,
  21.   19, 17, 15, 13, 12, 10,  9,  8,  8,  8,
  22.    8,  8,  8,  8,  8,  9, 10, 12, 13, 15,
  23.   17, 19, 21, 23, 26, 32, 35, 37, 40, 42,
  24.   44, 46, 48, 48, 48, 52, 53, 54, 54, 54 };  
  25.   
  26. void setup() {
  27.   u8g2.begin();
  28.   pinMode(inPin1, INPUT_PULLUP);          //setting the pin as a digital input
  29.   pinMode(inPin2, INPUT_PULLUP);
  30.   pinMode(inPin3, INPUT_PULLUP);
  31.   u8g2.setContrast(220);
  32.   Timer1.initialize(1000000);
  33.   Timer1.attachInterrupt(toggleOutput);
  34.   P1 = 0; P2 = 0; s = 0; m = 0; g = 0;
  35. }
  36. void loop() {
  37.   u8g2.setFont(u8g2_font_9x15B_tr);
  38.   u8g2.setFontDirection(2);           //select the direction of subtitles
  39.   Dipsw();
  40.   u8g2.firstPage();
  41.   char m_str[3];
  42.   strcpy(m_str, u8x8_u8toa(m, 2));    //Replace m with a string with 2 digits
  43.   do {
  44.     u8g2.drawStr(115,27,"9");
  45.     u8g2.drawStr(20,27,"3");
  46.     u8g2.drawStr(67,0,"6");
  47.     u8g2.drawStr(73,52,"12");
  48.     u8g2.drawDisc(64,32,3);                     //center of the clock
  49.     u8g2.drawDisc(42,57,2);                     //hour 1
  50.     u8g2.drawDisc(24,49,2);                     //hour 2
  51.     u8g2.drawDisc(24,14,2);                     //hour 4
  52.     u8g2.drawDisc(42,5,2);                      //hour 5
  53.     u8g2.drawDisc(85,5,2);                      //hour 7
  54.     u8g2.drawDisc(104,14,2);                    //hour 8
  55.     u8g2.drawDisc(104,49,2);                    //hour 10
  56.     u8g2.drawDisc(85,57,2);                     //hour 11   
  57.     if (P1 == 1){ u8g2.drawStr(10,0,"M");}      //marking correcting minutes
  58.     if (P1 == 2){ u8g2.drawStr(10,0,"H");}      //marking of correcting hours
  59.     //drawing hour hand
  60.     if (g == 0 or g == 12){u8g2.drawTriangle(64,49, 67,32, 61,32);}
  61.     if (g == 1 or g == 13){u8g2.drawTriangle(50,49, 67,34, 61,30);}
  62.     if (g == 2 or g == 14){u8g2.drawTriangle(40,42, 65,35, 60,30);}
  63.     if (g == 3 or g == 15){u8g2.drawTriangle(32,32, 64,35, 64,29);}
  64.     if (g == 4 or g == 16){u8g2.drawTriangle(40,21, 63,29, 63,35);}
  65.     if (g == 5 or g == 17){u8g2.drawTriangle(48,13, 66,30, 62,34);}
  66.     if (g == 6 or g == 18){u8g2.drawTriangle(64,13, 68,32, 60,32);}
  67.     if (g == 7 or g == 19){u8g2.drawTriangle(79,13, 67,34, 62,30);}
  68.     if (g == 8 or g == 20){u8g2.drawTriangle(88,21, 66,35, 63,30);}
  69.     if (g == 9 or g == 21){u8g2.drawTriangle(96,32, 64,35, 64,29);}
  70.     if (g == 10 or g == 22){u8g2.drawTriangle(88,42, 64,35, 65,28);}
  71.     if (g == 11 or g == 23){u8g2.drawTriangle(79,49, 67,31, 62,35);}
  72.     //drawing a second hand
  73.     u8g2.drawLine(64,32, tarczaX[s], tarczaY[s]);
  74.     // draw minute hand
  75.     //u8g2.drawStr(20,50,m_str);
  76.     if (m == 0) {u8g2.drawLine(67,32, 64,54); u8g2.drawLine(61,32, 64,54);}
  77.     if (m == 1) {u8g2.drawLine(67,32, 60,54); u8g2.drawLine(61,32, 60,54);}
  78.     if (m == 2) {u8g2.drawLine(67,32, 56,54); u8g2.drawLine(61,32, 56,54);}
  79.     if (m == 3) {u8g2.drawLine(66,33, 53,54); u8g2.drawLine(61,31, 53,54);}
  80.     if (m == 4) {u8g2.drawLine(66,33, 50,53); u8g2.drawLine(61,31, 50,53);}
  81.     if (m == 5) {u8g2.drawLine(65,34, 48,52); u8g2.drawLine(61,30, 48,52);}
  82.     if (m == 6) {u8g2.drawLine(64,34, 45,51); u8g2.drawLine(61,30, 45,51);}
  83.     if (m == 7) {u8g2.drawLine(64,34, 42,49); u8g2.drawLine(61,30, 42,49);}
  84.     if (m == 8) {u8g2.drawLine(64,34, 40,48); u8g2.drawLine(61,30, 40,48);}
  85.     if (m == 9) {u8g2.drawLine(64,35, 38,46); u8g2.drawLine(61,30, 38,46);}
  86.     if (m == 10) {u8g2.drawLine(65,35, 35,44); u8g2.drawLine(62,30, 35,44);}
  87.     if (m == 11) {u8g2.drawLine(64,35, 34,43); u8g2.drawLine(62,29, 34,43);}
  88.     if (m == 12) {u8g2.drawLine(64,35, 31,40); u8g2.drawLine(62,29, 31,40);}
  89.     if (m == 13) {u8g2.drawLine(64,35, 29,37); u8g2.drawLine(63,29, 29,37);}
  90.     if (m == 14) {u8g2.drawLine(64,35, 28,35); u8g2.drawLine(63,29, 28,35);}
  91.     if (m == 15) {u8g2.drawLine(64,35, 28,32); u8g2.drawLine(63,29, 28,32);} //
  92.     if (m == 16) {u8g2.drawLine(63,35, 28,27); u8g2.drawLine(64,29, 28,27);}
  93.     if (m == 17) {u8g2.drawLine(63,35, 29,26); u8g2.drawLine(64,29, 29,26);}
  94.     if (m == 18) {u8g2.drawLine(63,35, 31,23); u8g2.drawLine(64,29, 31,23);}
  95.     if (m == 19) {u8g2.drawLine(63,35, 34,21); u8g2.drawLine(64,29, 34,21);}         
  96.     if (m == 20) {u8g2.drawLine(63,35, 35,19); u8g2.drawLine(65,29, 35,19);}
  97.     if (m == 21) {u8g2.drawLine(63,35, 38,17); u8g2.drawLine(65,29, 38,17);}
  98.     if (m == 22) {u8g2.drawLine(62,34, 40,15); u8g2.drawLine(65,29, 40,15);}
  99.     if (m == 23) {u8g2.drawLine(62,34, 42,13); u8g2.drawLine(65,29, 42,13);}
  100.     if (m == 24) {u8g2.drawLine(62,34, 45,12); u8g2.drawLine(66,29, 45,12);}
  101.     if (m == 25) {u8g2.drawLine(61,34, 48,10); u8g2.drawLine(66,32, 48,10);}
  102.     if (m == 26) {u8g2.drawLine(61,33, 50,9); u8g2.drawLine(66,30, 50,9);}
  103.     if (m == 27) {u8g2.drawLine(66,32, 53,8); u8g2.drawLine(61,33, 53,8);}
  104.     if (m == 28) {u8g2.drawLine(67,32, 56,8); u8g2.drawLine(61,33, 56,8);}
  105.     if (m == 29) {u8g2.drawLine(67,32, 61,8); u8g2.drawLine(61,32, 61,8);}         
  106.     if (m == 30) {u8g2.drawLine(67,32, 64,8); u8g2.drawLine(61,32, 64,8);} ///
  107.     if (m == 31) {u8g2.drawLine(67,32, 68,8); u8g2.drawLine(61,32, 68,8);}
  108.     if (m == 32) {u8g2.drawLine(67,32, 72,8); u8g2.drawLine(61,32, 72,8);}
  109.     if (m == 33) {u8g2.drawLine(67,32, 76,8); u8g2.drawLine(61,31, 76,8);}
  110.     if (m == 34) {u8g2.drawLine(67,32, 79,8); u8g2.drawLine(62,31, 79,8);}
  111.     if (m == 35) {u8g2.drawLine(67,33, 82,9); u8g2.drawLine(62,30, 82,9);}
  112.     if (m == 36) {u8g2.drawLine(66,34, 85,10); u8g2.drawLine(62,30, 85,10);}
  113.     if (m == 37) {u8g2.drawLine(66,34, 87,12); u8g2.drawLine(62,30, 87,12);}
  114.     if (m == 38) {u8g2.drawLine(66,34, 90,13); u8g2.drawLine(63,30, 90,13);}
  115.     if (m == 39) {u8g2.drawLine(66,35, 92,15); u8g2.drawLine(63,30, 92,15);}         
  116.     if (m == 40) {u8g2.drawLine(66,35, 94,17); u8g2.drawLine(63,30, 94,17);}
  117.     if (m == 41) {u8g2.drawLine(65,35, 96,19); u8g2.drawLine(64,30, 96,19);}
  118.     if (m == 42) {u8g2.drawLine(65,35, 98,21); u8g2.drawLine(64,30, 98,21);}
  119.     if (m == 43) {u8g2.drawLine(65,35, 99,23); u8g2.drawLine(64,29, 99,23);}
  120.     if (m == 44) {u8g2.drawLine(64,35, 100,26); u8g2.drawLine(64,29, 100,26);}
  121.     if (m == 45) {u8g2.drawLine(64,35, 100,32); u8g2.drawLine(64,29, 100,32);} ///
  122.     if (m == 46) {u8g2.drawLine(64,35, 100,35); u8g2.drawLine(64,29, 100,35);}
  123.     if (m == 47) {u8g2.drawLine(64,35, 99,37); u8g2.drawLine(64,29, 99,37);}
  124.     if (m == 48) {u8g2.drawLine(64,35, 98,40); u8g2.drawLine(64,29, 98,40);}
  125.     if (m == 49) {u8g2.drawLine(64,35, 96,42); u8g2.drawLine(65,28, 96,42);}         
  126.     if (m == 50) {u8g2.drawLine(64,35, 94,44); u8g2.drawLine(65,28, 94,44);}
  127.     if (m == 51) {u8g2.drawLine(63,35, 92,46); u8g2.drawLine(66,30, 92,46);}
  128.     if (m == 52) {u8g2.drawLine(63,35, 90,48); u8g2.drawLine(66,30, 90,48);}
  129.     if (m == 53) {u8g2.drawLine(64,34, 87,48); u8g2.drawLine(66,29, 87,48);}
  130.     if (m == 54) {u8g2.drawLine(63,35, 85,48); u8g2.drawLine(67,31, 85,48);}
  131.     if (m == 55) {u8g2.drawLine(67,31, 82,52); u8g2.drawLine(63,35, 82,52);}
  132.     if (m == 56) {u8g2.drawLine(67,31, 79,53); u8g2.drawLine(62,35, 79,53);}
  133.     if (m == 57) {u8g2.drawLine(67,31, 76,54); u8g2.drawLine(62,35, 76,54);}
  134.     if (m == 58) {u8g2.drawLine(67,31, 72,54); u8g2.drawLine(62,34, 72,54);}
  135.     if (m == 59) {u8g2.drawLine(67,31, 68,54); u8g2.drawLine(62,32, 68,54);}                  
  136.   } while ( u8g2.nextPage() );
  137.   delayMicroseconds(10000);
  138. }
  139. void toggleOutput(){
  140.     s++;
  141.     if (s == 60) {
  142.       s = 0;
  143.       m++;
  144.     }
  145.     if (m == 60) {
  146.       m = 0;
  147.       g++;
  148.     }
  149.     if (g == 24) {
  150.       g = 0;
  151.     }
  152.     kropki = !kropki;               //blinking colon every 1 sec.
  153. }
  154. void Dipsw(){
  155.   byte readPin1, readPin1A, readPin2, readPin2A, readPin3, readPin3A;
  156.   readPin1 = digitalRead(inPin1);           //read the state of the rotation button
  157.   readPin2 = digitalRead(inPin2);           //reading the status of the right move button
  158.   readPin3 = digitalRead(inPin3);           //reading the state of the move left button
  159.   delay(1);
  160.   readPin1A = digitalRead(inPin1);
  161.   readPin2A = digitalRead(inPin2);
  162.   readPin3A = digitalRead(inPin3);
  163.   if (readPin1 == LOW and readPin1 == readPin1A) {
  164.     //setting the time - selecting hours or minutes
  165.     P1++;
  166.     delay(200);
  167.     if (P1 == 3){
  168.       P1 = 0;
  169.     }
  170.   }  
  171.   if (readPin2 == LOW and readPin2 == readPin2A) {
  172.     //correcting hours and minutes up
  173.     if (P1 == 1){                           //correcting minutes
  174.        m++;
  175.        if (m == 59) {m = 0;}
  176.     }
  177.     if (P1 == 2){                           //framing minutes
  178.       g++;
  179.       if (g == 24){g = 0;}
  180.     }
  181.     delay(200);
  182.   }
  183.   if (readPin3 == LOW and readPin3 == readPin3A) {
  184.   //correcting hours and minutes down
  185.     if (P1 == 1){                           //correcting minutes
  186.       m--;
  187.       if (m >= 60) {m = 59;}
  188.       if (m <= 0) {m = 59;}
  189.     }
  190.     if (P1 == 2){                           //correcting hours
  191.       g--;
  192.       if (g >= 24){g = 23;}
  193.       if (g <= 0){g = 23;}
  194.     }
  195.     delay(200);
  196.   }
  197. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 09:49

【Arduino 动手做】DIY Arduino模拟时钟

附录
【Arduino 动手做】DIY Arduino模拟时钟
项目链接:https://www.hackster.io/mircemk/diy-arduino-analog-clock-93aead
项目作者:北马其顿 米尔塞姆克(Mirko Pavleski)

项目视频 :https://www.youtube.com/watch?v=EkwxNqki2ew
项目代码:https://www.hackster.io/code_files/598371/download

【Arduino 动手做】DIY Arduino模拟时钟图1

回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail