//*---------------timer-----------------------------
void wait_ms(uint16_t m ) //1=1ms
{
while(m--) _delay_ms(1);
}
//-----
void wait_us(uint16_t m ) //1=1us
{
while(m--) _delay_us(1);
}
// 測定ルーチン -------------------------------
void hyouzi(void)
{
h=10;
tempB=tempA/h;
humB =humA/h;
tempC=tempB/h;
humC =humB/h;
tempD=tempB%h;
humD =humB%h;
n_on1=tempD;
n_on2=tempC;
n_s1=humD;
n_s2=humC;
sidx[0] = n_s2;
sidx[1] = n_s1;
sidx[2] = n_on1;
sidx[3] = n_on2;
}
void ONDO_ST(void)
{
/* スタート信号を送信 800uS 以上Lにする */
PORTB &= ~_BV(0);
DDRB |= _BV(0);
wait_ms(2);
PORTB |= _BV(0);
DDRB &= ~_BV(0);
}
//----------------------------------------
void TH_ASC(void)
{
n1=3;humH=0;humL=0;tempH=0;tempL=0;
for(i=0;i<8;i++){
humH=humH << 1;
if(w_data[n1++] == 1){humH++;}
}
for(i=0;i<8;i++){
humL=humL << 1;
if(w_data[n1++] == 1){humL++;}
}
for(i=0;i<8;i++){
tempH=tempH << 1;
if(w_data[n1++] == 1){tempH++;}
}
for(i=0;i<8;i++){
tempL=tempL << 1;
if(w_data[n1++] == 1){tempL++;}
}
for(i=0;i<8;i++){
palty=palty << 1;
if(w_data[n1++] == 1){palty++;}
}
// ondo humi
humA=humH*256+humL;
tempA=tempH*256+tempL;
// palty
paltyA=humH+humL+tempH+tempL;
}
void AMDATA(void)
{
LED_RON;
ONDO_ST();
cnt=0;n1=1;ans=0;datn=0;
while(1){
while (SDA1){cnt++;}
r_data[n1++]=cnt;cnt=0;
while (SDA0){ans++;}
datn++;
if(datn == 42){break;}
}
datn=0;n1=1;
// 0-1変換-----
for (datn=0;datn<43;datn++){
if(r_data[n1] >= 35){w_data[n1]=1;}
else{w_data[n1]=0;}
n1=n1+1;
}
TH_ASC();
hyouzi();
LED_ROFF;
}
//-----------------------------------------------------------
int main () {
//初期化 出力=1 入力=0
DDRB = 0x00; // 0b0000-0000
DDRC = 0x3F; // 0b0011-1111
DDRD = 0xFF; // 0b1111-1111
PORTD = 0x00; // L 出力
PORTC = 0x00; // L 出力
LED_RON;
wait_ms(300);
LED_ROFF;
wait_ms(300);
LED_RON;
wait_ms(300);
LED_ROFF;
wait_ms(300);
LED_RON;
wait_us(300);
LED_ROFF;
AMDATA();
while(1){
PORTD = SEGCHAR[sidx[0]];
LOL_on;
wait_ms(2);
LOL_off;
PORTD = SEGCHAR[sidx[1]];
LOH_on;
wait_ms(2);
LOH_off;
PORTD = SEGCHAR[sidx[2]];
LSL_on;
wait_ms(2);
LSL_off;
PORTD = SEGCHAR[sidx[3]];
LSH_on;
wait_ms(2);
LSH_off;
count=count+1;
if (count == 1500)
{LED_RON;
AMDATA();
count=0;
LED_ROFF;
}
} //while(1)終了
return 0;
}
//------------------------------------------------
// 7セグ用LEDテーブル --------------------------
unsigned char SEGCHAR[]=
{
// 0b0GFEDCBA
0b00111111, //0
0b00000110, //1
0b01011011, //2
0b01001111, //3
0b01100110, //4
0b01101101, //5
0b01111101, //6
0b00100111, //7
0b01111111, //8
0b01101111, //9
0b00000000, //null=10
// 0b0GFEDCBA
0b00110111, //M('U'の逆さで)
0b01011100, //o
0b01010100, //n
0b00110001, //T('「'の形で)
0b00011100, //u
0b01111011, //e
0b01111110, //W('A'の逆さで)
0b01011110, //d
0b01110100, //h
0b01110001, //F
0b01010000, //r
0b00010000, //i
0b01101101, //S('5'と同じだが構わない)
0b01011111, //a
0b01111000, //t
// 0b0GFEDCBA
0b00100000, //AMのドット
0b00010000, //PMのドット
0b00000001, //A
0b01000000, //- =25(i)
};
enum _SIDX
{
SIDX_NULL = 10,
SIDX_M,
SIDX_o,
SIDX_n,
SIDX_T,
SIDX_u,
SIDX_e,
SIDX_W,
SIDX_d,
SIDX_h,
SIDX_F,
SIDX_r,
SIDX_i,
SIDX_S,
SIDX_a,
SIDX_t,
SIDX_AM,
SIDX_PM,
SIDX_A,
SIDX_B,
};
#include <avr/io.h>
#define F_CPU 8000000UL //内部8M
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
// 擬似命令
#define LED_RON PORTC |= _BV(PC5)
#define LED_ROFF PORTC &=~_BV(PC5)
#define LOL_on PORTC |= _BV(PC2) //ONDO
#define LOL_off PORTC &=~_BV(PC2)
#define LOH_on PORTC |= _BV(PC3)
#define LOH_off PORTC &=~_BV(PC3)
#define LSL_on PORTC |= _BV(PC0) //湿度
#define LSL_off PORTC &=~_BV(PC0)
#define LSH_on PORTC |= _BV(PC1)
#define LSH_off PORTC &=~_BV(PC1)
#define SDA1 bit_is_set(PINB,PC0)
#define SDA0 bit_is_clear(PINB,PC0)
基板にLEDを4個つけ、CPUとICを配置した
電源は ACアダプタ 12vを使い
3端子レギュレータ5vをつけて、CPUの電源にする
TD62783 は12Vを加え、制限抵抗は390オームにする
CPUはATmega328を使う ATmega88でよい。
このLEDはアノードコモンなので、TD62783を使用し、アノード側はTD62503を使用した
VCCに5Vを使うと、LEDは約3.6v位加わる
TD62503で 4個の7セグメントLEDをダイナミック点灯させる
小型の7セグメントLEDより暗くなってしまった。
ーーーーーーーーーーー
原因は、小型の7セグメントLEDは2.5v位から点灯し始めるのであるが
中型の7セグメントLEDは 3,3v位から点灯を始めるのである、これは知らなかった
電源5Vにすると、この7セグメントLEDを駆動させるのは苦しいのである
赤の7セグメントLEDをクリアに表示させるため、アクリルカラーを載せる
色々な塩ビシートを試してみたが、
このバイオレットが一番気綺麗に表示する
実は、この色は、昔から、赤色LEDの表面に使われてきたものである
中型の7セグメントLEDを使って温湿度計を作ってみよう
LED は 縦33mm×横22mm
AM2302 (DHT11)
どのようにデータを抽出するのかは、LCD表示に記載しているので
今回は省略する。
ーーーーーーーーーーーーーー
define で疑似命令
整数命令 int でもよいが uint8_t を使っている AVR用の整数データである
uint8_t cnt;
uint8_t n1;
uint8_t datn;
uint8_t nw1;
uint8_t humH;
uint8_t humL;
uint8_t tempH;
uint8_t tempL;
uint8_t i;
uint8_t h;
uint16_t tempA;
uint16_t tempB;
uint16_t tempC;
uint16_t tempD;
uint16_t humA;
uint16_t humB;
uint16_t humC;
uint16_t humD;
uint8_t palty;
uint8_t paltyA;
uint8_t ans;
uint16_t count;
uint8_t sidx[] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; // 初期化 sidx[0]=0,sidx[1]=0,sidx[2]=0,sidx[3]=0
uint8_t n_on1;
uint8_t n_on2;
uint8_t n_s1;
uint8_t n_s2;
volatile uint8_t r_data[60]; //読込データ
volatile uint8_t w_data[60]; //読込データ
逸話:
LEDの使い方を間違っている設計者が大勢いる。
現実にあった例である
ダイナミック点灯で表示させた基板を 写真立てに入れる