痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 6614|回復: 18

LGC-12002白光七段顯示器電子時鐘

[複製鏈接]
發表於 2015-7-26 22:39:53 | 顯示全部樓層 |閱讀模式
自從5年前做了人生第一只時鐘,VFD時鐘,就對做時鐘非常有興趣。這陣子因為讀書、比賽、工作等因素,沒啥時間發文,也沒啥時間像以前一樣玩那麼多東東,就連很想做起來的真空管擴大機也是材料準備好就擱置在櫃子裡。

近期,看到阿乾大弄到了LGC-12002,一個內建PT6961控制IC的白光LED七段顯示器,他只需要三條控制線即可對四位數的七段顯示器進行控制。白色的LED,加上中間有秒點實在很適合做時鐘,所以又做了一個時鐘.........

以下為製作的成果,從麵包版實驗、程式,一直到電路板layout送洗都是本人親自設計的
功能及特色:
-全部晶片均經過篩選,使用原廠元件Maxmi DS1307、Prolific PL2303SA、Atmel ATmega8-16PU
-內建金電容做DS1307的備用電池,在斷電的情況下使RTC繼續計時,在通電的情況下,會自動將金電容的電充至3V左右
-內建PL2303,連接電腦並搭配我寫的PC端軟體,可以與電腦自動對時
-Micro-USB傳輸 / 供電,線材方便取得
-高亮度的白光LED七段顯示器

首先,我先在麵包版上進行實驗,將Arduino上的ATmega328拔起來(最終的產品是使用ATmega8),並更改Fuse bit使其震盪器使用內部的8MHz RC震盪器,這麼一來就不用額外一顆石英震盪器,能有效的縮小體積、減少產品成本。
AVR的Fuse bit設定值可以利用"AVR Fuse Calculator"選擇晶片,再勾選所需的功能。燒錄器使用USBasp,並搭配progisp即可設定溶絲位並且完成程式碼的燒錄。
http://www.engbedded.com/fusecalc/
1403284_800001683397789_3864017645336744720_o.jpg

接著先在洞洞板上焊接,確定沒有問題
11713741_905031326228157_9036045166830237768_o.jpg
1960883_800448620019762_380778134585582735_o.jpg

最後,送廠商少量洗板打樣,這兩張照片是半成品,由於DS1307為原廠產品比較晚到,加上我訂購的一批金電容有問題,整批均無法充電,所以又延了幾天才把產品完成
11782261_909706099094013_1975442993941353573_o.jpg
11741303_909706105760679_639165983782428738_o.jpg

最終,將所有零件焊接完成並進行測試
IMG_2785.JPG
IMG_2789.JPG

我還自己用了飛機木做了一個外框給他!
11754582_911645212233435_1748474562539800532_o.jpg


評分

17

查看全部評分

發表於 2015-7-26 22:43:09 | 顯示全部樓層
原創內容!!   

期待你之後的發表
 樓主| 發表於 2015-7-26 22:44:20 | 顯示全部樓層
程式碼的部份 & Arduino函式庫
#include <Wire.h>
#include <PT6961.h>

#define DS1307_ADDRESS 0x68
#define TIMEOUT 10000

PT6961 LED(8, 7, 6);

void SetTime();
void GetTime();
byte readByteq();
byte bcdToDec(byte val);
byte decToBcd(byte val);

byte seconds;
byte hours;
byte minutes;
int weekdays;
int days;
int months;
int years;
int DISP[4];
long time=0;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  LED.initDisplay();
}

void loop()
{
  if(Serial.available()) SetTime();
  GetTime();
  DISP[0] = (hours/10)%10;
  DISP[1] = hours%10;
  DISP[2] = (minutes/10)%10;
  DISP[3] = minutes%10;
  LED.sendDigits(DISP[0],DISP[1],DISP[2],DISP[3],seconds%2);
  delay(500);
}

void GetTime()
{
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(0x00);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  seconds = bcdToDec(Wire.read());
  minutes = bcdToDec(Wire.read());
  hours = bcdToDec(Wire.read() & 0b111111); //24 hour time

  weekdays = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  days = bcdToDec(Wire.read());
  months = bcdToDec(Wire.read());
  years = bcdToDec(Wire.read());

  Serial.print(months);
  Serial.print("/");
  Serial.print(days);
  Serial.print("/");
  Serial.print(years);
  Serial.print(" ");
  Serial.print(hours);
  Serial.print(":");
  Serial.print(minutes);
  Serial.print(":");
  Serial.println(seconds);
}

void SetTime()
{
  byte yearset = readByteq();
  byte monthset = readByteq();
  byte dayset = readByteq();
  byte weekdayset = readByteq();
  byte hourset = readByteq();
  byte minset = readByteq();
  byte secset = readByteq();
  
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(byte(0));
  Wire.write(decToBcd(secset));  //seconds
  Wire.write(decToBcd(minset));  //minutes
  Wire.write(decToBcd(hourset));  //hours
  Wire.write(decToBcd(weekdayset));  //weekdays
  Wire.write(decToBcd(dayset));  //days
  Wire.write(decToBcd(monthset));  //months
  Wire.write(decToBcd(yearset));  //years
  Wire.write(byte(0));
  Wire.endTransmission();
  delay(100);
}

byte readByteq()
{
  while (!Serial.available())    delay(10);
  byte reading = 0;
  byte incomingByte = Serial.read();

  while (incomingByte != '\n')
  {
    if (incomingByte >= '0' && incomingByte <= '9')
    {reading = reading * 10 + (incomingByte - '0');}
    incomingByte = Serial.read();
  }
  Serial.flush();
  return reading;
}

byte bcdToDec(byte val)  
{
  // Convert binary coded decimal to normal decimal numbers
  return ( (val/16*10) + (val%16) );
}

byte decToBcd(byte val)
{
  // Convert normal decimal numbers to binary coded decimal
  return ( (val/10*16) + (val%10) );
}

PT6961.zip

86.45 KB, 下載次數: 58

評分

2

查看全部評分

發表於 2015-7-27 00:17:13 | 顯示全部樓層
少個一塊遮色板或者玻璃紙,可以把沒亮的部份遮掉,只讓有亮的字段顯示出來.

評分

2

查看全部評分

發表於 2015-7-27 07:22:10 | 顯示全部樓層
要配合 Led 的光譜選用適當的濾光片,可以增加反差與提高辨識性,當然整體也會更美觀,自己做的心血結晶不要忽略外觀的打扮,要用點心思提高整體的質感與價值。

最簡單的方法是找壓克力片,可以試試透明或偏白色的來搭。
要更美觀就再增加一層偏光膜,如汽車或大樓隔熱紙,帶著時鐘到店家實際比對選用。
也有專業的廠家在生產訂做這類的遮光濾片,利用摻色或鍍膜的方式來達成,一次一批所費不貲。

評分

2

查看全部評分

發表於 2015-7-27 10:20:45 | 顯示全部樓層
這個作品很有潛力
發表於 2015-7-27 10:52:41 | 顯示全部樓層
嗯,好像還沒有分享電路圖,當然這個沒有強制性,看你個人意願,若你閒閒沒事做的話,或許可以問問有多少人有興趣買套件來做,若有足夠的人有興趣這樣也許你就可以賺些小錢,可以幫助你再玩玩別的東西.
發表於 2015-7-27 12:04:01 | 顯示全部樓層
可以把木紋印在薄紙上然後全部貼上面板上做出木紋時鐘效果,
我的試驗:
https://youtu.be/m6oEHTKaI24

評分

1

查看全部評分

發表於 2015-7-27 12:23:04 | 顯示全部樓層
oldhan 發表於 2015-7-27 12:04 PM
可以把木紋印在薄紙上然後全部貼上面板上做出木紋時鐘效果,
我的試驗:
https://youtu.be/m6oEHTKaI24 ...

還有你這個怪招啊,若是亮度夠的話,真的很不錯.
但若是LED的亮度不夠,或者是木紋片太厚的話,可能數字就看不清楚了.

評分

1

查看全部評分

發表於 2015-7-27 15:48:53 | 顯示全部樓層
scottwang 發表於 2015-7-27 12:23 PM
還有你這個怪招啊,若是亮度夠的話,真的很不錯.
但若是LED的亮度不夠,或者是木紋片太厚的話,可能數字就看 ...

木紋LED時鐘很常見喔,網拍可以找到很多。
發表於 2015-7-27 15:51:26 | 顯示全部樓層
感謝 forest162 大分享,個人對 PC 端程式比較有興趣,請問您是用哪種語言寫的?是用模擬 COM PORT 嗎?
發表於 2015-7-27 16:06:45 | 顯示全部樓層
本文章最後由 scottwang 於 2015-7-27 04:08 PM 編輯
ysc 發表於 2015-7-27 03:48 PM
木紋LED時鐘很常見喔,網拍可以找到很多。


我以前看過的木紋是有挖洞的,oldhan大的不知是否有挖薄過,時間很短亮度又不足,看不清楚,但是看起來像沒有挖過的,我剛剛查看看一些各種木紋的時鐘,幾乎都有把LED部份的內層再刨薄了,可以看到框框淡淡的形狀.
發表於 2015-7-27 16:25:57 | 顯示全部樓層
scottwang 發表於 2015-7-27 04:06 PM
我以前看過的木紋是有挖洞的,oldhan大的不知是否有挖薄過,時間很短亮度又不足,看不清楚,但是看起來像沒有 ...

現在市售木紋時鐘並不是真正木皮或木頭下去挖的,而是貼木紋塑膠皮,LED 顯示器一定要緊密貼合在塑膠皮裡側,與塑膠皮若有距離就會產生類似散焦現象,原本也是很懷疑這種顯示效果,前不久開車去保養原廠送了一個,顯示效果相當不錯。
lexus.jpg

PS:隨手拿手機拍的,亮度不好控制導致字節中間部份太亮,實際目視每個字節亮度是很平均的。


 樓主| 發表於 2015-7-27 22:40:24 | 顯示全部樓層
ysc 發表於 2015-7-27 03:51 PM
感謝 forest162 大分享,個人對 PC 端程式比較有興趣,請問您是用哪種語言寫的?是用模擬 COM PORT 嗎? ...

PC端的程式是用Visual Basic寫的,裡面有"SerialPort"這個元件可以使用
發表於 2015-7-27 22:51:22 | 顯示全部樓層
forest162 發表於 2015-7-27 10:40 PM
PC端的程式是用Visual Basic寫的,裡面有"SerialPort"這個元件可以使用

了解,謝謝。
曾用 VB 裡的 MSCOMM 元件寫過程式,所以大概能體會您的作法。

記得 PL2303 還有一種不必指定 COM PORT 的驅動方式 (正式名稱已忘記),安裝好驅動程式之後能直接與應用軟體溝通,不必調整 COM PORT 號碼來對應,對這種驅動方式比較有興趣,程式難度也比較高。
 樓主| 發表於 2015-7-27 23:04:55 | 顯示全部樓層
ysc 發表於 2015-7-27 10:51 PM
了解,謝謝。
曾用 VB 裡的 MSCOMM 元件寫過程式,所以大概能體會您的作法。

在主機板BIOS的選項中有看到Super IO,內有類似位址的號碼,您是指這類的嗎?
發表於 2015-7-27 23:21:26 | 顯示全部樓層
forest162 發表於 2015-7-27 11:04 PM
在主機板BIOS的選項中有看到Super IO,內有類似位址的號碼,您是指這類的嗎? ...

不是,跟 COM PORT 實體位址或埠號無關,完全擺脫 COM PORT 概念,USB DEVICE 直接與應用程式溝通,這種方式的驅動程式跟 VCP 不同,一時想不起來正式名稱。

 樓主| 發表於 2015-7-28 00:08:36 | 顯示全部樓層
ysc 發表於 2015-7-27 11:21 PM
不是,跟 COM PORT 實體位址或埠號無關,完全擺脫 COM PORT 概念,USB DEVICE 直接與應用程式溝通,這種 ...


USB HID?
"USB human interface device" https://en.wikipedia.org/wiki/USB_human_interface_device_class

我有想過直接利用ATmega寫一個Visual USB,但尚未研究完成,就暫時以PL2303作為介面了
發表於 2015-7-28 00:13:28 | 顯示全部樓層
forest162 發表於 2015-7-28 12:08 AM
USB HID?
"USB human interface device" https://en.wikipedia.org/wiki/USB_human_interface_device_cl ...

也不是這個,HID 是 WINDOWS 內建的 USB 驅動程式,前面我說的也是要安裝 Prolific 的驅動程式,但跟 VCP 驅動程式不同,記得以前看過,剛剛上 Prolific 網站卻又找不到。

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-4-26 10:36 PM , Processed in 0.085295 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.