数字の信号を7セグのLEDに表示させる記事は山のようにありますが、7セグLEDから数字を取り出すのは見かけません。
職場で使う責任者呼び出しベル(ファミレスのあれです)を活用してるのですが、最近どこのラインから、どのような用件で呼ばれたのかも記録に残すようにとの指示がありました。面倒なことは機械にやらせようと思い、作ってみました。
使ってるのはこれです。呼び出しに特化していて無駄な機能やI/Oが一切ありません。その分安いです。
やることは、このス◯ジオの左側の2桁の7セグ表示信号から数字を取り出してARUDUINO UNOでシリアル変換してパソコン上のエクセルかメモ帳に保存する。ということです。
ス◯ジオのカバーを外すとLEDの乗った基盤が出てきます。PICマイコンからの信号でトランジスタをオンオフしています。14個のうち左の6個が6桁のドライブ、右の8個が7がセグ+DPのドライブ、信号はトランジスタのベースの足部分に細い線をはんだ付けして取り出します。7セグのA〜Gのうち、CとDの信号はなくても数字に変換できるので今回ははんだ付けしません。
上の写真ですが、その信号をトランジスタのゲートで受けてAruduino unoのデジタルi/oピンに入力します。
uno のコードです。
int a_7seg = 3; // 7セグ表示ledのA
int b_7seg = 4; // 7セグ表示ledのB
int e_7seg = 5; // 7セグ表示ledのE
int f_7seg = 6; // 7セグ表示ledのF
int g_7seg = 7; // 7セグ表示ledのG
int tenline_7seg = 10; // 7セグ表示ledの2桁
int dp_7seg = 11; // 7セグ表示ledのDP
int oneline_7seg = 12; // 7セグ表示ledの1桁
int led1 = 13;
int number = 0;
int number_ten = 0;
void setup(){
pinMode( a_7seg, INPUT_PULLUP );
pinMode( b_7seg, INPUT_PULLUP );
pinMode( e_7seg, INPUT_PULLUP );
pinMode( f_7seg, INPUT_PULLUP );
pinMode( g_7seg, INPUT_PULLUP );
pinMode( tenline_7seg, INPUT_PULLUP );
pinMode( dp_7seg, INPUT_PULLUP );
pinMode( oneline_7seg, INPUT_PULLUP );
Serial.begin( 9600 );
pinMode( 13, OUTPUT );
}
void loop(){
// tenline_7segがLOWならば0.3ms後に2桁めの数字として取り込む
if(digitalRead(tenline_7seg) == LOW ){
delayMicroseconds(50);
if (digitalRead(dp_7seg) == HIGH){
if(digitalRead(e_7seg) == LOW){
// 8,6,2,0
if(digitalRead(f_7seg) == LOW){
// 8,6,0
if(digitalRead(b_7seg) == LOW){
// 8,0
if(digitalRead(g_7seg) == LOW){
number_ten = 8;
}else{
number_ten = 0;
}
}else{
number_ten = 6;
}
}else{
number_ten = 2;
}
}else{
// 9,7,5,4,3,1
if(digitalRead(f_7seg) == LOW){
// 9,5,4
if(digitalRead(a_7seg) == LOW){
// 9,5
if(digitalRead(b_7seg) == LOW){
number_ten = 9;
}else{
number_ten = 5;
}
}else{
number_ten = 4;
}
}else{
// 7,3,1
if(digitalRead(a_7seg) == LOW){
// 7,3
if(digitalRead(g_7seg) == LOW){
number_ten = 3;
}else{
number_ten = 7;
}
}else{
if(digitalRead(b_7seg) == LOW){
number_ten = 1;
}else{
number_ten = 0;
}
}
}
}
}// 1000msec後の7セグの状態を1桁目の数字として取り込む
delayMicroseconds(1000);
if (digitalRead(dp_7seg) == HIGH){
if(digitalRead(e_7seg) == LOW){
// 8,6,2,0
if(digitalRead(f_7seg) == LOW){
// 8,6,0
if(digitalRead(b_7seg) == LOW){
// 8,0
if(digitalRead(g_7seg) == LOW){
number = 8;
}else{
number = 0;
}
}else{
number = 6;
}
}else{
number = 2;
}
}else{
// 9,7,5,4,3,1
if(digitalRead(f_7seg) == LOW){
// 9,5,4
if(digitalRead(a_7seg) == LOW){
// 9,5
if(digitalRead(b_7seg) == LOW){
number = 9;
}else{
number = 5;
}
}else{
number = 4;
}
}else{
// 7,3,1
if(digitalRead(a_7seg) == LOW){
// 7,3
if(digitalRead(g_7seg) == LOW){
number = 3;
}else{
number = 7;
}
}else{
if(digitalRead(b_7seg) == LOW){
number = 1;
}
}
}
}
}
}
// numberが0でなければシリアルポートへ出力
if(number != 0 ){
Serial.println( "" );
//Serial.print( 1 );
Serial.print( number_ten );
Serial.print( number );
Serial.print( " call " );
digitalWrite(led1,HIGH);
delay(32000 );
digitalWrite(led1,LOW);
number_ten = 0;
number = 0;
}}
unoから teratermでパソコンに取り込みます。
受信した時刻を表示させるため、”call”と受信したら、時刻を送り返すマクロをループさせて、エコーをオンにして、あたかも 時刻も受信したように見せています。
マクロのコードです。
do
wait 'call'
gettime time_now_str "%m/%d %H:%M"
sendln time_now_str
;doへ戻る
loop
めちゃ簡単です。
0 件のコメント:
コメントを投稿