7浏览
查看: 7|回复: 2

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

[复制链接]
一个有趣的漂亮的模拟式时钟,它的构建也非常简单。

这次我将向您展示如何制作一个有趣的好看的时钟,它的构建也非常简单。确切的时间时间以椭圆形模拟时钟的形式显示在大型 LCD 屏幕上。时间也可以借助三个按钮轻松调节。

在这种情况下,为了简单起见,没有使用实时时钟模块,因此精度没有那么高,主要取决于微控制器内的晶体。
该设备由几个组件组成:
- Arduino Nano 微控制器
- 基于 ST7920 芯片的 LCD 显示屏,分辨率为 128x64 点
- 和三个按钮

基本代码是从 blaber.com.pl 站点下载的,方法是将其调整为上述显示,比原始显示更易于访问且便宜得多。代码是对数字时钟的修改,虽然它可以工作,但它仍然需要在图形上做大量的工作。这是如何使用 u8g2 库在不同类型的显示器上绘制对象和写入文本的一个很好的示例。

开机时,时间是12:00,我们必须手动设置当前时间。我们在三个按钮的帮助下使它变得简单。中间按钮用于进入设置模式,第一次点击设置分钟,第二次点击小时。在设置模式下,箭头在其他两个按钮的帮助下移动。在精度方面,考虑到我们不使用 RTC 模块,时钟非常准确。就我而言,24 小时实时与时钟之间的差异只有几秒钟。
最后,将设备内置到一个合适的盒子中,由厚度为 3 毫米和 5 毫米的 PVC 材料制成,并涂有不干胶彩色壁纸。

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

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

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

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

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

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

驴友花雕  中级技神
 楼主|

发表于 3 小时前

【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. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 小时前

【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