作者: jamesting 時間: 2015-10-30 00:12 標題: Arduino Meter Clock
本帖最後由 jamesting 於 2015-12-16 12:14 編輯
http://www.instructables.com/id/ ... o-Powered/?ALLSTEPS
早前無意中睇到呢個,心血來潮馬上做返一個
Arduino nano + DS1307 RTC
用塊細萬用板就夠晒
DC 0- 5V 錶頭係萬惡既X寶買返黎,後來發現拆左入面粒電阻,改做 VR 會方便好多
木板都係响萬惡既X寶訂返黎,交張 CAD 圖比賣家,連激光切割只係60 人仔(一共做左三套)
開始砌模型,第一次出CAD圖訂木,唔記得計切割損耗,所以啲位有小小唔 FIT ,最後要出動 AA 膠
完成
去片
https://youtu.be/dzvClpV1gh8
經我修改既 Code,本身唔係好熟寫詩,有問題請多多指教
- /*
- Analog Panel Meter - Clock ONLY Mode
-
- Instructables Link: http://www.instructables.com/id/Analog-VU-meter-and-Clock-Arduino-Powered/
-
- Credits:
- bildr - DS1307 RTC code http://bildr.org/2011/03/ds1307-arduino/
- _____________________
- Wiring goes as follows:
- - USB red wire (5v) to VCC
- - USB black wire to GND
- - Buttons - Left/Down to Digital 2 (follow arduino tutorial: http://arduino.cc/en/uploads/Tutorial/button.png )
- - Right/Up to Digital 4
- - DS1307 RTC - SDA to Analog 4
- - SCL to Analog 5
- - Second Analog Meter to Digital 3 (PWM)
- - Minute Analog Meter to Digital 6 (PWM)
- - Hour Analog Meter to Digital 9 (PWM)
- _______________________
- Note:
- Because all meters are slightly different, the PWM values
- need to be adjusted based on your design. Feel free to use
- my code, but you will have to change some values because
- it is set to work specifically with my meters.
-
- */
- #include "Wire.h"
- #define DS1307_ADDRESS 0x68
- byte zero = 0x00; //workaround for issue #527
- int downButton = 2; // down push button to adjust time (pin 2)
- int upButton = 4; // up push button to adjust time (pin 4)
- int hours = 0;
- int minutes = 0;
- int seconds = 0;
- int lastMinute = 0;
- int lastsecond = 0;
- int hoursMeter = 9; // left meter (hours) is attached to pin 9
- int minutesMeter = 6; // right meter (min) is attached to pin 6
- int secondsMeter = 3; // right meter (Sec) is attached to pin 3
- void setup(){
- Wire.begin();
- Serial.begin(9600); //view time in serial monitor
-
- pinMode(hoursMeter, OUTPUT); // Initialize Outputs & Inputs
- pinMode(minutesMeter, OUTPUT);
- pinMode(secondsMeter, OUTPUT);
-
- //test meter
- digitalWrite(13, HIGH);
- // fade in from min to max in increments of 5 points:
- for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 1) {
- // sets the value (range from 0 to 255):
- analogWrite(hoursMeter, fadeValue);
- analogWrite(minutesMeter, fadeValue);
- analogWrite(secondsMeter, fadeValue);
- // wait for 30 milliseconds to see the dimming effect
- delay(30);
- }
- delay(100);
- // fade out from max to min in increments of 5 points:
- for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 1) {
- // sets the value (range from 0 to 255):
- analogWrite(hoursMeter, fadeValue);
- analogWrite(minutesMeter, fadeValue);
- analogWrite(secondsMeter, fadeValue);
- // wait for 30 milliseconds to see the dimming effect
- delay(30);
- }
- digitalWrite(13, LOW);
- delay(100);
- //test meter
-
- }
- void loop(){
- printDate();
- secondLED();
- delay(50);
-
- // Changing the time with buttons
- if (digitalRead(downButton) == HIGH){
- byte second = 0;
- byte minute = minutes; // Don't get confused: minute is not the same as minutes
- byte hour = hours; // Don't get confused: hour is not the same as hours
- if (minutes > 0){
- --minute;
- }else{
- minute = 59;
- if (hours > 0){
- -- hour;
- }else{
- hour = 23;
- }}
- Wire.beginTransmission(DS1307_ADDRESS);
- Wire.write(zero); //stop Oscillator
-
- Wire.write(decToBcd(second));
- Wire.write(decToBcd(minute));
- Wire.write(decToBcd(hour));
- delay(75);
- Wire.write(zero); //start
-
- Wire.endTransmission();
- }
-
- if (digitalRead(upButton) == HIGH){
- byte second = 0;
- byte minute = minutes; // Don't get confused: minute is not the same as minutes
- byte hour = hours; // Don't get confused: hour is not the same as hours
- if (minutes < 59){
- ++minute;
- }else{
- minute = 0;
- if (hours < 23){
- ++ hour;
- }else{
- hour = 0;
- }}
- Wire.beginTransmission(DS1307_ADDRESS);
- Wire.write(zero); //stop Oscillator
-
- Wire.write(decToBcd(second));
- Wire.write(decToBcd(minute));
- Wire.write(decToBcd(hour));
- delay(75);
- Wire.write(zero); //start
-
- Wire.endTransmission();
- }
- }
- byte decToBcd(byte val){
- // Convert normal decimal numbers to binary coded decimal
- return ( (val/10*16) + (val%10) );
- }
- byte bcdToDec(byte val) {
- // Convert binary coded decimal to normal decimal numbers
- return ( (val/16*10) + (val%16) );
- }
- void printDate(){
- // Reset the register pointer
- Wire.beginTransmission(DS1307_ADDRESS);
- Wire.write(zero);
- Wire.endTransmission();
- Wire.requestFrom(DS1307_ADDRESS, 7);
-
- seconds = bcdToDec(Wire.read());
- minutes = bcdToDec(Wire.read());
- hours = bcdToDec(Wire.read() & 0b111111); //24 hour time
- //print the date
- Serial.print(hours); // Un-comment to view time in serial monitor
- Serial.print(minutes); //
- Serial.println(seconds); // Don't forget to un-comment 'Serial.begin' in 'void setup' above
-
- // Specific meter levels for each hour
- // You will likly have to adjust these values.
- // Play around with the values until you get what you want.
- if (lastMinute != minutes){
- if (hours == 1 || hours == 13){
- analogWrite(hoursMeter, 21); // adjust left (hour) meter level
- }
- if (hours == 2 || hours == 14){
- analogWrite(hoursMeter, 43); // adjust left (hour) meter level
- }
- if (hours == 3 || hours == 15){
- analogWrite(hoursMeter, 65); // adjust left (hour) meter level
- }
- if (hours == 4 || hours == 16){
- analogWrite(hoursMeter, 87); // adjust left (hour) meter level
- }
- if (hours == 5 || hours == 17){
- analogWrite(hoursMeter, 108); // adjust left (hour) meter level
- }
- if (hours == 6 || hours == 18){
- analogWrite(hoursMeter, 130); // adjust left (hour) meter level
- }
- if (hours == 7 || hours == 19){
- analogWrite(hoursMeter, 152); // adjust left (hour) meter level
- }
- if (hours == 8 || hours == 20){
- analogWrite(hoursMeter, 172); // adjust left (hour) meter level
- }
- if (hours == 9 || hours == 21){
- analogWrite(hoursMeter, 192); // adjust left (hour) meter level
- }
- if (hours == 10 || hours == 22){
- analogWrite(hoursMeter, 214); // adjust left (hour) meter level
- }
- if (hours == 11 || hours == 23){
- analogWrite(hoursMeter, 234); // adjust left (hour) meter level
- }
- if (hours == 12){
- analogWrite(hoursMeter, 254); // adjust left (hour) meter level
- }
- if (hours == 0){
- analogWrite(hoursMeter, 0); // adjust left (hour) meter level
- }
- if (hours <= 18){
- digitalWrite(12, HIGH);
- }
- if (hours >= 6){
- digitalWrite(12, LOW);
- }
- if (minutes * 4.25 < 250){ // increase PWM value by 4.75 each minute
- analogWrite(minutesMeter, minutes * 4.25); // I had to use 4.75 on my meter to get 30 minutes to point exactly straight up
- }else{ // perfect would be 4.25 because 4.25 * 60 = 255
- analogWrite(minutesMeter, 250);
- }
- lastMinute = minutes;
- }
- if (seconds * 4.25 < 250){ // increase PWM value by 4.75 each minute
- analogWrite(secondsMeter, seconds * 4.25); // I had to use 4.75 on my meter to get 30 minutes to point exactly straight up
- }else{ // perfect would be 4.25 because 4.25 * 60 = 255
- analogWrite(secondsMeter, 250);
- }
- // analogWrite(secondsMeter, seconds * 4); // I had to use 4.75 on my meter to get 30 minutes to point exactly straight up
- }
- void secondLED(){
- if (seconds > lastsecond){
- FlashLED();
- }
- lastsecond = seconds;
- }
- void FlashLED(){
- digitalWrite(13, HIGH);
- delay(5);
- digitalWrite(13, LOW);
- }
https://www.hkepc.com/forum/attachment.php?aid=1837300&k=01a2c8a13eae77c3df2f0bc833154178&t=1786116455&sid=froHlhPdFi

https://www.hkepc.com/forum/attachment.php?aid=1837301&k=9f9367329110ad20253563bfd6b445ac&t=1786116455&sid=froHlhPdFi

https://www.hkepc.com/forum/attachment.php?aid=1837302&k=8a4925003d8316b6e3bc8e675b12ba53&t=1786116455&sid=froHlhPdFi

https://www.hkepc.com/forum/attachment.php?aid=1837303&k=219510c06f4e5dff1668ce25fa067dac&t=1786116455&sid=froHlhPdFi

https://www.hkepc.com/forum/attachment.php?aid=1837304&k=05d4ed03f112925466a1acb2dd278e47&t=1786116455&sid=froHlhPdFi

https://www.hkepc.com/forum/attachment.php?aid=1837305&k=8ec88895be52938dd09a64f8e7912795&t=1786116455&sid=froHlhPdFi

https://www.hkepc.com/forum/attachment.php?aid=1837306&k=a03b9918abbcf7b887e366a1e601e523&t=1786116455&sid=froHlhPdFi

https://www.hkepc.com/forum/attachment.php?aid=1837307&k=08e0cb833b84e54d44c2fa1097971e89&t=1786116455&sid=froHlhPdFi

https://www.hkepc.com/forum/attachment.php?aid=1837308&k=f3bcd05d0789d0b57d3fe86c42274fc4&t=1786116455&sid=froHlhPdFi

作者: peter95811658 時間: 2015-10-30 00:42
好有趣
"H" "M" "S" 個背板係自己整嗎?
作者: 燕飛 時間: 2015-10-30 00:52
勁!
不過顆電可以用幾耐?
作者: jamesting 時間: 2015-10-30 01:13
回覆 2# peter95811658
呢個係 DC 0-5V 錶頭
我一次淘左9個返黎
因為 0-5V 錶頭背板係分左 25 格,唔岩時間既 0-12 同 0-60
所以我就買多左一個分 30格既 DC 0-30V 錶頭返黎
SCAN 左個背板,再係電腦改返做 0-12 同 0-60
作者: jamesting 時間: 2015-10-30 01:15
回覆 3# 燕飛
電池係比 DS1307 RTC IC 記憶用
依家暫時用住 USB 比電,計過電流用 50mA 左右,遲下再諗下用唔用電池比電
作者: peter95811658 時間: 2015-10-30 01:38
回覆 peter95811658
呢個係 DC 0-5V 錶頭
我一次淘左9個返黎
因為 0-5V 錶頭背板係分左 25 格,唔岩時間 ...
jamesting 發表於 2015-10-30 01:13
作者: fxffx 時間: 2015-10-30 08:25
正呀!好工藝!
作者: Charcoal99 時間: 2015-10-30 10:18
中間那段 hour PWM adjust, 用查表向法會否更簡潔及易維護些
在起始定義 adjMeterLevel 陣列
- int adjMeterLevel[] = { 0, 21, 43, 65, 87, 108, 130, 152, 172, 192, 214, 234,
- 254, 21, 43, 65, 87, 108, 130, 152, 172, 192, 214, 234 };
- if (lastMinute != minutes){
- analogWrite(hoursMeter, adjMeterLevel[hours]);
- ....
- }
作者: jamesting 時間: 2015-10-30 10:36
回覆 8# Charcoal99
其實唔係我寫,我只係加左個秒錶落去
原作者咁寫,估計係方便其他人改
因為入面提到
- Note:
- Because all meters are slightly different, the PWM values
- need to be adjusted based on your design. Feel free to use
- my code, but you will have to change some values because
- it is set to work specifically with my meters.
- // Specific meter levels for each hour
- // You will likly have to adjust these values.
- // Play around with the values until you get what you want.
作者: stephenwong 時間: 2015-10-30 12:49
建議加一個溫度錶,一個濕度錶,再放一個上下倒轉錶扮鐘擺!啱啱用晒6支PWM pins!
作者: YES_MAN 時間: 2015-10-30 16:23
建議加一個wifi module
上网自動校準
作者: jamesting 時間: 2015-10-30 17:08
回覆 10# stephenwong
正有此意
作者: jamesting 時間: 2015-10-30 17:08
回覆 11# YES_MAN
咁不如GPS
作者: YES_MAN 時間: 2015-10-30 20:14
室內收不到GPS
作者: xiao 時間: 2015-10-31 00:11
老音響很喜歡用 UV 表顯示音樂音量跳躍
請問這個鐘可以改到這樣跳嗎, 秒的動感更多, 更省電
作者: jamesting 時間: 2015-10-31 00:40
回覆 15# xiao
我就無咁既能力啦
作者: cooltaxi 時間: 2015-10-31 22:24
原作者是這樣用,所以只有二個錶頭,平常作VU錶用.
作者: jamesting 時間: 2015-11-1 00:55
回覆 17# cooltaxi
呢樣當然知道
但如果好似 CHING 咁講,我就唔知點做啦
作者: klxcan 時間: 2015-11-1 09:57
c hing,即係個秒針可以好似機械表咁,不停地由左'掃'到右?咁去度59秒之後去番最左邊,其實由59秒去番1秒個個動作會唔會影響準確度?用wifi自動校準做唔做到呢?謝謝
作者: C_Law 時間: 2015-11-1 20:59
好有趣!
諗到個令秒針有小小鐘擺效果的玩法,但凡雙數秒就指到正,單數秒就加 N 秒,令秒針位置上升之餘有 N 秒來回擺動,例如 N =5:
真實秒數:00 01 02 03 04...57 58 59
秒針位置:00 06 02 08 04...62 58 64
不過會秒針最大位置會變成 64,要令 30 指到正中,秒針個錶的 Range 就要由 -4 到 64,要改過秒針個錶的刻度。
如果不改刻度,可以試下 30 秒前的單數秒 +N,單數秒超過 30 後就變 -N,雙數秒就一直維持指正。照舊 N =5 的話:
真實秒數:00 01 02 03 04...28 29 30 31 32...57 58 59
秒針位置:00 06 02 08 04...28 34 30 26 32...52 58 54
作者: msc 時間: 2015-11-2 01:02
個壳張圖用乜嘢 CAD 劃, 難唔難用, 可唔可以介紹一吓.
作者: jamesting 時間: 2015-11-2 01:32
回覆 20# C_Law
好提意,但我真係唔係好識寫詩
唔知有無高手可以幫到手啦
作者: jamesting 時間: 2015-11-2 01:33
回覆 21# msc
自動貓
我都係初初學
真係唔識教人
作者: C_Law 時間: 2015-11-2 18:05
在 void printDate() 入面開頭加多個 Valuable:
int pSwing = 5; //width of the pendulum's swing
再在原本的 228 行之前先檢查單數秒:
if (seconds % 2 == 1) { //odd second
seconds = seconds + pSwing;
}
由於 228~232 的 if...else 已將秒針的 analogWrite 數值上限設定到 250(59s),所以就算 seconds 加到超過 59,秒針都只會係去到 59。你亦可以試下改到上限為 255(60s)。
如果想在 30s 的時候改變擺動方向,可以在檢查單數秒之前再加上:
if ((seconds == 30) && (pSwing > 0)){
pSwing = -pSwing;
}
作者: jamesting 時間: 2015-11-3 02:15
回覆 24# C_Law
多謝CHING
作者: xiao 時間: 2015-11-5 11:11
原來早就有人想出來....期待看到大作的影片....
作者: jamesting 時間: 2015-12-16 12:12
回覆 26# xiao
終於有時間放條片上youtube
https://youtu.be/dzvClpV1gh8
作者: xiao 時間: 2015-12-21 14:59
回覆 27# jamesting
厲害
作者: carlchanhm 時間: 2016-1-11 16:26
Super ...
the board from where? taobao?
作者: jamesting 時間: 2016-1-19 01:38
回覆 29# carlchanhm
yup
作者: carlchanhm 時間: 2016-1-19 11:20
any new project?
作者: schmike 時間: 2016-4-29 10:41
想問下淘寶用咩詞語找到呢d做木箱呢?
via HKEPC Reader for Android
作者: jamesting 時間: 2016-4-30 02:33
回覆 32# schmike
木板激光切割加工 椴木层夹板
作者: jamesting 時間: 2016-4-30 02:34
回覆 31# carlchanhm
近期啲 project 就大件啦
玩 EV charger
作者: GbE 時間: 2016-4-30 06:13
作者: jamesting 時間: 2016-4-30 22:19
回覆 35# GbE
主力 mode 3
岩岩尋日老細話玩埋 mode 4


