日々の記録

ほどよく書いてきます。

温度計

2012年05月30日 21時00分39秒 | その他雑記
昨日、ダイナミック点灯に成功した。

今日はマイコン内蔵のADCを使ってLM35というICの出力電圧を読み取り
温度を表示してみた。

結構うまくいったが、結構ずれがある。調べてみると内蔵1.1Vの参照電圧がずれている。
ほどよく補正してできあがり。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ダイナミック点灯

2012年05月30日 00時16分11秒 | その他雑記


ダイナミック点灯に挑戦。うまくいった。

ArduinoのDIGIATLのPin0からPin7がPORTDに対応します。NPNトランジスタ経由でアノードコモンの7セグLEDに接続。
DIGITALのPin8から13がPORTBですが、8,9,10,11を使って表示する桁を選択します。こちらはハイサイドスイッチなのでPNPトランジスタ経由で駆動します。

何も考えずに適当に回路つくったらトランジスタ12個、抵抗20本という回路になりましたが、マイコンのポートはLEDくらいなら直接駆動できるようなので、トランジスタは不要で、抵抗8本のみでよかったのかもしれません。

あと、高い桁の部分の0表示、消灯するような場合分けをしたら成功でしょうか。
以下コード


unsigned char SevenSeg[] = {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111};  // an array for 7 segment LED display
unsigned char SevenSegDigits[] = {0b00001110, 0b00001101, 0b00001011, 0b00000111}; //define digits

void setup() {
 DDRD=0b11111111; //setting PORTD0-7 for output
 DDRB=0b00001111; //setting PORTB0-3 for output
}
void loop() {
 unsigned int Value;
 unsigned char DigitVal[3];

  for(int i=0;i<10000;i++){  //表示する値

   Value=i;
   for(char ii=0;ii<4;ii++){  //各桁に分ける
    DigitVal[ii]=Value%10;
    Value=Value/10;
   }
   
    for(char k=0;k<2;k++){  //表示ループ
     for(char j =0;j<4;j++){
      PORTB=SevenSegDigits[j];
      PORTD=SevenSeg[DigitVal[j]];
      delay(1);  //表示の停止待ち時間
     }
    }
  }
}
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduinoで7セグLED

2012年05月28日 20時57分58秒 | 電子工作
このあいだArduinoをAmazonで買って以来、ぽちぽちいじっている。
Arduino-IDEでもプログラムするけどAVR Studio 6でも裸AVR用にプログラムも作りつつ勉強しています。

ArduinoにもPORTD=0b11111111;とかの命令が送れたらいいのになと思いながらコード書いてましたが、
調べたらArduinoでもPORTDなど直接操作できるみたい。


以下のコードはPORTD、つまりDIGITALの0から7を7セグのAからHまでに割り振り、動かします。
行の頭のスペースが消えちゃうので読みにくいけど、これで動きます。

unsigned char SevenSeg[] = {
0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111}; // an array for 7 segment LED display

void setup() {
DDRD=0b11111111; //setting PORTD for output
}
void loop() {
for(int i=0;i<10;i++){
PORTD=SevenSeg[i];
delay(500);
}
// PORTD=0b10000000; //display dot
// delay(500);
}



ちなみに、これを知らずに昨日はすごく長いコードを書いてしまった。上のコードはコンパイルして694バイト、下のは1530バイトにもなります。
恥ずかしながら載せると、でも、確かどこかのHPを参考にして作りました。特にconst int LedCountなどは拾いモンです。

const int LedCount = 10;
int ledPins[] = {
0, 1, 2, 3, 4, 5, 6, 7, 13 }; // an array of pin numbers to which LEDs are attached

void setup() {
// initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards:
for (int thisLed = 0; thisLed < LedCount; thisLed++) {
pinMode(ledPins[thisLed], OUTPUT);
}
}
void loop() {
int i;
for(i=0;i<10;i++){
DispOut(i);
delay(500);
}
// DispOff();
// delay(500);
}

void DispOff(){
int i;
for(i=0;i digitalWrite(i,LOW);
}
}
void DispOut(int Num){
if(Num == 0) {
DispOff();
digitalWrite(0, HIGH); //まじムダ
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
}

if(Num==1) {
DispOff();
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
}

if(Num==2) {
DispOff();
digitalWrite(0,HIGH);
digitalWrite(1,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(6,HIGH);
}

if(Num==3) {
DispOff();
digitalWrite(0,HIGH);
digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(6,HIGH);
}

if(Num == 4) {
DispOff();
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
}

if(Num == 5) {
DispOff();
digitalWrite(0, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
}

if(Num == 6) {
DispOff();
digitalWrite(0, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
}

if(Num == 7) {
DispOff();
digitalWrite(0, HIGH);
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
}

if(Num == 8) {
DispOff();
digitalWrite(0, HIGH);
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
}

if(Num == 9) {
DispOff();
digitalWrite(0, HIGH);
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
}

}
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする