柏林时钟
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 13 | ||||
| × | 11 | ||||
| × | 1 |
关于这个项目
首先...
这是我在 Instructables 网站上写的教程的复制/粘贴。我仍然需要弄清楚如何从一个站点到达另一个站点。所以也许这并不像它应该的那样圆滑......但是,从一个不太日常的时钟开始。
简介:柏林时钟
柏林时钟,BerlinUhr 或 Mengenlehreuhr,可能是第一个数字时钟。
它自 1975 年以来一直存在......
您可以在这里找到很多信息:https://en.wikipedia.org/wiki/Mengenlehreuhr
是怎么制作的,怎么看时间?
简而言之,有四排灯。上面一行是小时数 x 5,下一行是从 1 到 4 的“单小时”。第三行是“分钟 x5”,底行是分钟。
如图,(实际上是一盏灯坏了……)时间是:2x5小时加3小时+6x5分钟+2分钟。
所以现在是 13:32。好吧,我想我们欧洲人更习惯于以 24 小时表示时间。格式,时钟也是。
顶部最大的灯每秒闪烁一次。
我认为在 Arduino 中制作这个时钟可能会很有趣。
第 1 步:一些电子产品
这个项目我们需要什么?
首先,(当然),我们的 Arduino。
我使用我电脑附近随处可见的 Uno 之一。
既然我们谈论时钟,我们可能会使用 RTC。我用的是便宜的 DS 1307。
对于“显示”,我们需要一些 LED。我用了 13 个黄色的、5 毫米的和 11 个红色的。 (我实际上使用 RGB 来制作红色,因为我周围没有足够的红色......)
面包板,只有孔和“焊岛”的印刷板。我只是使用了一部分所谓的“欧元卡格式”。
我用了2个电阻。一个 220 欧姆(秒 LED),另一个 68K。
还有一颗额外的IC:MAX7219。
MAX 是一个 8 位 LED 显示驱动器。我们很多人都知道它,因为它也用于 LED 矩阵。
为简单起见,我还使用了“LedControl”Arduino 库。如果您还没有,可以从这里下载:
https://github.com/wayoda/LedControl
第 2 步:设置。
你可以在这个地方找到一个非常好的 MAX 7219 数据表:
https://www.sparkfun.com/datasheets/Components/Gen...
COM-09622-MAX7219-MAX7221.pdf我不会再深入研究那个数据表,但它值得使用,它是一种“有趣”的 IC。
跳转到 Arduino。
在该方案中,您会看到一个非常简单的结构:我使用 SDA 和 SCL 来使用时钟(A 1307 突破),以及另外四个输出:用于 MAX 7219 的 DataIn、Clock 和 Chipselect,以及我们用于我们的 OUT 13闪烁的“秒”LED。
大多数事情发生在 Arduino 中:它读取时钟,将其转换为不同类型的输出,然后将数据发送到 7219。
当你阅读代码时,你会看到我只是使用我自己的语言荷兰语。例如:我使用的 int "vijfuren" 是计数 "Five-hours" 的变量,对于 "vijfminuten" 和 "vijfminuten1" 也是如此:它们给出了 "Five-minutes" 输出。
在草图中我也使用了年、月、月中的一天和工作日,在这个特别的草图中我不需要它们,但也许以后,我可以添加一个日历。
在 Fritzing(c) 布局中,IC 没有接线:我这样做是为了方便,因为它有很多输出。
让我们总结一下:
引脚 4 和 9 连接到 GND,
19是VCC
18,ISet,通过一个电阻连接到 VCC:这个电阻限制了流向输出的电流。首先,我尝试使用 20K 电阻器,但 10 分钟左右后,一切都变黑了……现在,使用 68K 电阻器,时钟仍在运行(超过 24 小时后)。但是红色和黄色的亮度存在差异,我认为这是由于红色实际上是RGB Led。我必须解决这个问题...
引脚 1 是 DataIn,这个来自 Arduino,引脚 12
引脚 12 是负载,来自 Arduino 引脚 10
引脚 13 是 Clk,来自 Arduino 11。
7219的输入到此为止。
看看输出:
7219 有可能为 8 个 7seg 显示器供电。
这些输出,DIG 0 到 DIG 4 在这里用于驱动 LED 的“线”:由于“五分钟”线中有 11 个 LED,我使用 DIG 1 和 DIG 2 来驱动它们。
其他输出:A 到 G 段和 DP(正常 7Seg 显示)。
在这种情况下(使用 LedControl),我将二进制字发送给他们(字节格式,如 B01010100)。
在那里我犯了一个错误。一些逻辑告诉我 SEG A 将是 MSB,B 是第二个最高有效位,依此类推,直到 DP,我认为这将是最低有效位 (LSB)。错误...出于某种原因,IC 制造商认为 DP 将是 MSB。看不出逻辑...
这让我改变了我的编码,因为我已经焊接了 LED ......
第 3 步:LED
在这个原理图上,您可以看到 LED 是如何连接在一起的。我只画了前三个,其他的都是一样的。
秒 LED 直接连接到引脚 13。
图为“它是如何工作的”。现在是 17 点 47 分...
好吧,底行不是很清楚,它在面包板上。我希望你相信我它真的有效。 (确实如此!)。
哦,还有一步……
第 4 步:步骤“最后”,代码。
#include #include const int DS1307 =0x68;// A5 =SCL, A4 =SDA const char* days[] ={"Sunday", "Monday" , "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};const char*months[] ={"January", "February", "March", "April", "May", “六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};字节秒=0;字节分钟 =0;字节小时 =0;字节工作日=0;字节月日 =0;字节月 =0;字节年 =0;字节最后一分钟 =0;字节 lastSecond =0;国际LED =13;字节空 =B0000000;字节 een =B01000000;字节 twee =B01100000;字节干 =B01110000;字节 vier =B01111000;字节 vijf =B01111100;字节 zes =B01111110;字节 zeven =B01111111;字节 acht =B11111111;字节负数 =B01000000; byte tien =B01100000;byte elf =B01110000; int a=0; int b =0; int c =0; int vijfMinTwee=0;int uitgang =低; /*pin 12连接到DataIn pin 11连接到CLK pin 10连接到LOAD */LedControl lc=LedControl(12, 11, 10, 1);unsigned long delaytime=100; void setup() { Wire.begin(); Serial.begin(9600);pinMode (Led, OUTPUT);lc.shutdown(0, false); /* 将亮度设置为中等值 */ lc.setIntensity(0, 8); /* 并清除显示 */ lc.clearDisplay(0);}void loop() { readTime(); digitalWrite(Led, uitgang); if (second !=lastSecond){ if (uitgang ==LOW) uitgang =HIGH;否则 uitgang =低; digitalWrite (Led, uitgang); lastSecond =秒; } if (minute !=lastMinute) { printTime(); lastMinute =minute;}}byte bcdToDec(byte val) {return ((val/16*10) + (val%16));}void printTime() { char buffer[3];long minuten =minute;long uren =小时;int vijfmin =分钟/5; int eenminuut =分钟 -(vijfmin * 5);int vijfuren =uren/5; int eenuren =uren - (vijfuren *5); a =vijfmin;数字(); vijfmin =b; vijfMinTwee =c;a =eenminuut;digitaal(); eminuut =b; a =维杰富伦; digitalaal();vijfuren =b;a =eenuren;数字();eenuren =b; lc.setRow(0, 4, vijfuren);lc.setRow(0, 3, eenuren); lc.setRow(0, 1, vijfmin);lc.setRow(0, 2, vijfMinTwee); lc.setRow(0, 0, eenminuut);}void readTime() { Wire.beginTransmission(DS1307); Wire.write(byte(0)); Wire.endTransmission();Wire.requestFrom(DS1307, 7); second =bcdToDec(Wire.read());minute =bcdToDec(Wire.read());hour =bcdToDec(Wire.read());工作日 =bcdToDec(Wire.read()); monthday =bcdToDec(Wire.read());month =bcdToDec(Wire.read());年 =bcdToDec(Wire.read()); }void digitalaal(){switch (a){ case 0:b=nul; c=空;休息;情况 1:b =een; c=空;休息;情况 2:b =twee; c=空;休息;情况 3:b =干燥; c=空;休息;情况 4:b =vier; c=空;中断;案例 5:b =vijf; c=空;休息;情况 6:b =zes; c=空;休息;情况 7:b =zeven; c=空;休息;情况 8:b =acht; c=空;休息;案例 9:b =acht; c =负;休息;情况 10:b=acht; c =田;休息;情况 11:b=acht; c =小精灵;休息; } }
我相信很简单。
此草图的另一个好处:现在您将学习如何用荷兰语进行计数...从 0 到 11...;-)
希望你喜欢这个!
马克
代码
Github
https://github.com/wayoda/LedControlhttps://github.com/wayoda/LedControl制造工艺