T-Clock 桌上小钟

干燥计划 Feb 14, 2020

本文转自小林同学的Power's Wiki

背景

我从柜子里翻出了以前做的一个玩具,拨一下开关,发现还能用,遂将资料整理一下。

硬件部分

元件:

  • Arduino 主控
  • OLED 屏幕(SSD1306 SPI)
  • RTC 时钟模块(DS1307)
  • 锂电池 & 充电模块

外壳:因暂时没有好的设计,所以没有制作外壳。

代码

#include <U8glib.h>
#include <SPI.h>
#include <Wire.h>
#include <RTClib.h>
U8GLIB_SSD1306_128X64 u8g(10, 9, 12, 11, 13);
//这里适用的OLED屏的引脚是:D0,D1,RST,DC
/*接线:
  OLED-Arduino
  D0-D10
  D1-D9
  RST-D13
  DC-D11
*/
RTC_DS1307 RTC;//RTC按照IIC接线
char monthString[37] =
{
  "JanFebMarAprMayJunJulAugSepOctNovDec"
}
;
int  monthIndex[122] =
{
  0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33
}
;
String thisMonth = "";
String thisTime = "";
String thisDay = "";
//用于定义表盘的中心
int clockCentreX = 64;
int clockCentreY = 32;
void draw(void)
{
  u8g.setFont(u8g_font_profont15);
  DateTime now = RTC.now();
  //在底部显示日期
  thisDay = String(now.day(), DEC) + "/";
  thisMonth = "";
  for (int i = 0; i <= 2; i++)
  {
    thisMonth += monthString[monthIndex[now.month() - 1] + i];
  }
  thisDay = thisDay + thisMonth + "/";
  thisDay = thisDay + String(now.year() , DEC);
  const char* newDay = (const char*) thisDay.c_str();
  u8g.drawStr(32, 63, newDay);
  thisTime = "";
  thisTime = String(now.hour()) + ":";
  if (now.minute() < 10)
  {
    thisTime = thisTime + "0";    // 在单数数字前头加个0
  }
  //数字时间
  thisTime = thisTime + String(now.minute()) ;
  const char* newTime = (const char*) thisTime.c_str();
  u8g.drawStr(10, 10, newTime);
  //画时钟盘面
  u8g.drawCircle(clockCentreX, clockCentreY, 20); // 外面的大圆
  u8g.drawCircle(clockCentreX, clockCentreY, 2);  // 里面的小圆
  //跳动显示
  for ( int z = 0; z < 360; z = z + 30 )
  {
    //始于0°,止于360°
    float angle = z ;
    angle = (angle / 57.29577951) ;   //化度数为弧度
    int x2 = (clockCentreX + (sin(angle) * 20));
    int y2 = (clockCentreY - (cos(angle) * 20));
    int x3 = (clockCentreX + (sin(angle) * (20 - 5)));
    int y3 = (clockCentreY - (cos(angle) * (20 - 5)));
    u8g.drawLine(x2, y2, x3, y3);
  }
  // 秒针
  float angle = now.second() * 6 ;
  angle = (angle / 57.29577951) ; //化度数为弧度
  int x3 = (clockCentreX + (sin(angle) * (20)));
  int y3 = (clockCentreY - (cos(angle) * (20)));
  u8g.drawLine(clockCentreX, clockCentreY, x3, y3);
  // 分针
  angle = now.minute() * 6 ;
  angle = (angle / 57.29577951) ; //化度数为弧度
  x3 = (clockCentreX + (sin(angle) * (20 - 3)));
  y3 = (clockCentreY - (cos(angle) * (20 - 3)));
  u8g.drawLine(clockCentreX, clockCentreY, x3, y3);
  // 时针
  angle = now.hour() * 30 + int((now.minute() / 12) * 6 )   ;
  angle = (angle / 57.29577951) ; //化度数为弧度
  x3 = (clockCentreX + (sin(angle) * (20 - 11)));
  y3 = (clockCentreY - (cos(angle) * (20 - 11)));
  u8g.drawLine(clockCentreX, clockCentreY, x3, y3);
  //显示自己的定制字符
  u8g.setPrintPos(100, 10);
  u8g.print("Lin");
}
void setup(void)
{
  Serial.begin(9600);
  analogReference(EXTERNAL);
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning())
  {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}
void loop(void)
{
  u8g.firstPage();
  do
  {
    draw();
  }
  while ( u8g.nextPage() );
  delay(10);
}

资料下载:

总结

这是它的背面,如果有好的设计,我将画个外壳给它装上。

参考与致谢

知识共享许可协议
本站文章除特别声明外,均采用 知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际许可协议 进行许可。
您的支持将鼓励我们继续创作!

Power Lin

一个不会讲故事的硬件工程师,不是一个合格的产品经理。

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.