本帖最後由 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);
- }
複製代碼 |