大型LED 時計・温湿度計

 

マイコンは ATmega64 と ATtiny2313を使用する
RTCは  RX8900の高精度 DXCXOを搭載したものを使う
温湿度素子は SH31 高精度のものを使う

 

大型LEDの仕様
発光色 緑
文字高 127mm (5インチ)
電圧 19.7V 5mA
外形 W105×H140×D16mm

ATmega64 は、温湿度と 時計のデータ取得して 温湿度LED と 月日 LEDを表示させている
大型LEDを駆動させるには、ポートが足りないので、 ATtiny2313に任せる



24V電源で 大型LEDを点灯させるため、24Vから5Vを作り出す
LM2676を使って 5Vを作る
パターンを作っている




回路図1 回路図2

ATmega64から ATTINY2313 へ日時、時間のデータを送信する。
送信方法はクロックを作り出し、データ 0.1を送る。一般的な送信方法を作っている



プログラム

AVRマイコンのI2C通信設定を行う

#define RTC_ADDR_WRITE 0x64;
#define RTC_ADDR_READ 0X65;

/---------------------------------------------
// SCL=10M/(16+ 2*100*1)=50kHz
TWBR=47; //92
TWSR=0x00; //ビット速度値
TWCR=0b00000100; // TWI SCL/SDA で使用する
//---------------------

読み取りプログラム下記になる

//---- READ TIME -------------
void READ_TIME(void)
{
int i;

RTC_RS();

for(i=0;i<12;i++){
          RTC_RE();
          rtc_rdat[i]=ans;
         }
RTC_STOP();

dsec=rtc_rdat[0] & 0x7F;
dmin=rtc_rdat[1] & 0x7F;
dhour=rtc_rdat[2] & 0x3F;
dday=rtc_rdat[4] & 0x3F;
dweek=rtc_rdat[3] & 0x07;
dmonth=rtc_rdat[5]& 0x1F;
dyear=rtc_rdat[6]& 0xFF;
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

//----------リード初期値-------------------
void RTC_RS(void)
{

/* 開始条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
TWDR=RTC_ADDR_WRITE; //64
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
TWDR=0x00;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
TWDR=RTC_ADDR_READ; //65
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

}
ーーーーーーーーーーーーー
読みだす前の アドレス設定である
その後は 連続して読みだす

//-----------リード連続----------
void RTC_RE(void)
{

/*DATA データ読込 */
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //データを取得
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
//----------リードライトストップ--------------
void RTC_STOP(void)
{
/* 停止条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTO) |(1<<TWEN);
wait_us(100);
}
//---- READ TIME -------------



ATmega64で 時計以外は小型のLEDに表示させる。
ダイナミック点灯プログラムなので、明るさは同じになるが、ブルーLEDは同じ電流では暗くなるので、
電圧を 7Vにして供給している
制限抵抗は 270Ωにしている
ーーーーーーーー
余談であるが、昔、市販品のLED時計を購入した、時計店とかで売っているメーカー品では無く
中国製なのか、ネット販売しているものだった
このLEDはブルーLEDで 1年もしないうちにセグメントがあちこち切れてしまった。
なんと、制限抵抗が数Ωだったのだ。
さすが素人設計、、、

//------- TIME SET ---------------------------
void TIME_SET(void)
{
SET_IDOU();
hyouzi();
sidx[0] = monthH;
sidx[1] = monthL;
sidx[2] = dayH;
sidx[3] = dayL;
sidx[4] = secH;
sidx[5] = secL;

sidx[6] = minH;
sidx[7] = minL;


//------MONTH ----------------------------
while(1){

PORTC = SEGCHAR[sidx[0]];
TR6_on;
wait_ms(2);
TR6_off;

PORTC = SEGCHAR[sidx[1]];
TR5_on;
wait_ms(2);
TR5_off;
wait_ms(10);

if(KEY_UP){s_dmonth++;
if(s_dmonth == 0x0A){s_dmonth=0x10;}
if(s_dmonth == 0x13){s_dmonth=0x01;}
wait_ms(300);
SET_TIME10();
sidx[0] = monthH;
sidx[1] = monthL;
}
if(KEY_DOWN){s_dmonth--;
if(s_dmonth == 0x00){s_dmonth=0x12;}
if(s_dmonth == 0x10){s_dmonth=0x0A;}
wait_ms(300);
SET_TIME10();
sidx[0] = monthH;
sidx[1] = monthL;
}


if(KEY_ENT){rtc_wdat[5] =s_dmonth;
break;
}
} //while month end