Arduino ile Dijital Termometre

Arduino ile Dijital Termometre

Sümer abi'den gelen istek üzerine kütüphane kullanmadan yazılmış, 4 digit 8 segment(nokta kullanılmazsa 7 segment) led ekran kodu. Seri porttan aldığı 4 basamağa kadar olan rakamı, LED ekrana yazıyor.

Kod:
int aPin = 2;  //         A
int bPin = 3;  //      _______
int cPin = 4;  //     |       |
int dPin = 5;  //   F |   G   | B
int ePin = 6;  //     |_______|
int fPin = 7;  //     |       |
int gPin = 8;  //   E |       | C
int hPin = 9;  //     |_______|  o  H
int dig1 = 0;  //
int dig2 = 0;  //         D
int dig3 = 0;
int dig4 = 0;
int DTime = 4;
long sNum = 1234; // Varsayılan olarak LED ekranda gosterilecek numara


void setup(){
    pinMode(aPin, OUTPUT);
    pinMode(bPin, OUTPUT);
    pinMode(cPin, OUTPUT);
    pinMode(dPin, OUTPUT);
    pinMode(ePin, OUTPUT); 
    pinMode(fPin, OUTPUT);
    pinMode(gPin, OUTPUT);
    pinMode(hPin, OUTPUT);
    pinMode(A0, OUTPUT);
    pinMode(A1, OUTPUT);
    pinMode(A2, OUTPUT);
    pinMode(A3, OUTPUT);
    digitalWrite( A0, LOW);
    digitalWrite( A1, LOW);
    digitalWrite( A2, LOW);
    digitalWrite( A3, LOW);
    Serial.begin(9600);
    digiCalc(sNum);
}

void loop(){

    if (Serial.available() > 0) {
        sNum = Serial.parseInt();
        digiCalc(sNum);
    }
    
    digitalWrite( A0, LOW);   //digit 1
    pickNumber(dig1);
    digitalWrite( A0, HIGH);
    delay(DTime);
    digitalWrite( A0, LOW);
    
    digitalWrite( A1, LOW);   //digit 2
    pickNumber(dig2);
    digitalWrite( A1, HIGH);
    delay(DTime);
    digitalWrite( A1, LOW);
    
    digitalWrite( A2, LOW);   //digit 3
    pickNumber(dig3);
    digitalWrite( A2, HIGH);
    delay(DTime);
    digitalWrite( A2, LOW);
    
    digitalWrite( A3, LOW);   //digit 4
    pickNumber(dig4);
    digitalWrite( A3, HIGH);
    delay(DTime);
    digitalWrite( A3, LOW);
}

void digiCalc(long num){
    Serial.println(num);
    dig1 = num / 1000;
    num = num - (dig1 * 1000);
    dig2 = num / 100;
    num = num - (dig2 * 100);
    dig3 = num / 10;
    num = num - (dig3 * 10);
    dig4 = num;
}
 
void pickNumber(char x){
    switch(x){
        case 0: zero(0); break;
        case 1: one(0); break;
        case 2: two(0); break;
        case 3: three(0); break;
        case 4: four(0); break;
        case 5: five(0); break;
        case 6: six(0); break;
        case 7: seven(0); break;
        case 8: eight(0); break;
        case 9: nine(0); break;
        default: dot(); break;
    }
}

void clearLEDs(){  
    digitalWrite(aPin, LOW); // A
    digitalWrite(bPin, LOW); // B
    digitalWrite(cPin, LOW); // C
    digitalWrite(dPin, LOW); // D
    digitalWrite(ePin, LOW); // E
    digitalWrite(fPin, LOW); // F
    digitalWrite(gPin, LOW); // G
    digitalWrite(hPin, LOW); // H
}

void zero(boolean bDot){
    digitalWrite( aPin, HIGH);
    digitalWrite( bPin, HIGH);
    digitalWrite( cPin, HIGH);
    digitalWrite( dPin, HIGH);
    digitalWrite( ePin, HIGH);
    digitalWrite( fPin, HIGH);
    digitalWrite( gPin, LOW);
    digitalWrite( hPin, LOW);
    if(bDot) digitalWrite( hPin, HIGH);
}

void one(boolean bDot){
    digitalWrite( aPin, LOW);
    digitalWrite( bPin, HIGH);
    digitalWrite( cPin, HIGH);
    digitalWrite( dPin, LOW);
    digitalWrite( ePin, LOW);
    digitalWrite( fPin, LOW);
    digitalWrite( gPin, LOW);
    digitalWrite( hPin, LOW);
    if(bDot) digitalWrite( hPin, HIGH);
}

void two(boolean bDot){
    digitalWrite( aPin, HIGH);
    digitalWrite( bPin, HIGH);
    digitalWrite( cPin, LOW);
    digitalWrite( dPin, HIGH);
    digitalWrite( ePin, HIGH);
    digitalWrite( fPin, LOW);
    digitalWrite( gPin, HIGH);
    digitalWrite( hPin, LOW);
    if(bDot) digitalWrite( hPin, HIGH);
}

void three(boolean bDot){
    digitalWrite( aPin, HIGH);
    digitalWrite( bPin, HIGH);
    digitalWrite( cPin, HIGH);
    digitalWrite( dPin, HIGH);
    digitalWrite( ePin, LOW);
    digitalWrite( fPin, LOW);
    digitalWrite( gPin, HIGH);
    digitalWrite( hPin, LOW);
    if(bDot) digitalWrite( hPin, HIGH);
}

void four(boolean bDot){
    digitalWrite( aPin, LOW);
    digitalWrite( bPin, HIGH);
    digitalWrite( cPin, HIGH);
    digitalWrite( dPin, LOW);
    digitalWrite( ePin, LOW);
    digitalWrite( fPin, HIGH);
    digitalWrite( gPin, HIGH);
    digitalWrite( hPin, LOW);
    if(bDot) digitalWrite( hPin, HIGH);
}

void five(boolean bDot){
    digitalWrite( aPin, HIGH);
    digitalWrite( bPin, LOW);
    digitalWrite( cPin, HIGH);
    digitalWrite( dPin, HIGH);
    digitalWrite( ePin, LOW);
    digitalWrite( fPin, HIGH);
    digitalWrite( gPin, HIGH);
    digitalWrite( hPin, LOW);
    if(bDot) digitalWrite( hPin, HIGH);
}

void six(boolean bDot){
    digitalWrite( aPin, HIGH);
    digitalWrite( bPin, LOW);
    digitalWrite( cPin, HIGH);
    digitalWrite( dPin, HIGH);
    digitalWrite( ePin, HIGH);
    digitalWrite( fPin, HIGH);
    digitalWrite( gPin, HIGH);
    digitalWrite( hPin, LOW);
    if(bDot) digitalWrite( hPin, HIGH);
}

void seven(boolean bDot){
    digitalWrite( aPin, HIGH);
    digitalWrite( bPin, HIGH);
    digitalWrite( cPin, HIGH);
    digitalWrite( dPin, LOW);
    digitalWrite( ePin, LOW);
    digitalWrite( fPin, LOW);
    digitalWrite( gPin, LOW);
    digitalWrite( hPin, LOW);
    if(bDot) digitalWrite( hPin, HIGH);
}

void eight(boolean bDot){
    digitalWrite( aPin, HIGH);
    digitalWrite( bPin, HIGH);
    digitalWrite( cPin, HIGH);
    digitalWrite( dPin, HIGH);
    digitalWrite( ePin, HIGH);
    digitalWrite( fPin, HIGH);
    digitalWrite( gPin, HIGH);
    digitalWrite( hPin, LOW);
    if(bDot) digitalWrite( hPin, HIGH);
}

void nine(boolean bDot){
    digitalWrite( aPin, HIGH);
    digitalWrite( bPin, HIGH);
    digitalWrite( cPin, HIGH);
    digitalWrite( dPin, HIGH);
    digitalWrite( ePin, LOW);
    digitalWrite( fPin, HIGH);
    digitalWrite( gPin, HIGH);
    digitalWrite( hPin, LOW);
    if(bDot) digitalWrite( hPin, HIGH);
}

void dot(){
    digitalWrite( aPin, LOW);
    digitalWrite( bPin, LOW);
    digitalWrite( cPin, LOW);
    digitalWrite( dPin, LOW);
    digitalWrite( ePin, LOW);
    digitalWrite( fPin, LOW);
    digitalWrite( gPin, LOW);
    digitalWrite( hPin, HIGH);
}
 
Arduino ile Dijital Termometre

Aşağıdaki kod ise kütüphane kullanarak, seri porttan aldığı 4 basamağa(4 basamakla, ya da istenirse rakamla sınırlı değil, 16 basamağa kadar rahatlıkla yazdırılabilir) kadar olan rakamı, 2x16 LCD ekrana yazan program. 237 satıra karşılık, sadece 22 satır.

Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Addr, En, Rw, Rs, d4, d5, d6, d7, backlightpin, polarity

long sNum = 1234; // Varsayılan olarak 2x16 LCD ekranda gosterilecek numara

void setup() {
  Serial.begin(9600);
  lcd.begin(16,2);
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print(sNum);
}

void loop(){
    if (Serial.available() > 0) {
        sNum = Serial.parseInt();
        lcd.clear();
        lcd.print(sNum);
    }
}
 
Arduino ile Dijital Termometre

Zafer SAHIN' Alıntı:
Aşağıdaki kod ise kütüphane kullanarak, seri porttan aldığı 4 basamağa kadar olan rakamı, 2x16 LCD ekrana yazan program. 237 satıra karşılık, sadece 23 satır.
Kütüphane kullanmak iyidir :laugh: ;D Insanı tembelliğe alıştırır :lol:

Bu arada ellerine sağlık Zafer hocam, yine döktürmüşsün :bravo: :halay:
 
Arduino ile Dijital Termometre

Valla kütüphane beni bozar arkadaş. Elcaazımla yaparım keyifle yerim, şeyy kullanırım. :D
 
Arduino ile Dijital Termometre

Ev yapımı iyidir. Her noktasına müdahale şansın var o şekilde.
Zafer kardeşim ben o kodu öyle yazmazdım. :)
Bir kere segment çıkışlarını tek bir portun sekiz ucundan yapardım. Örneğin Uno'da sekizi birden kullanıma sunulan Port D bu amaçla iyi bir seçim olurdu. Her bir karakteri temsil eden binary değerlerini de tek bir array içinde hazır ederdim. Sonra ilgili digite hangi rakam yazılacak ise arrayin o elemanındaki değeri doğrudan ve tek bir seferde Port D'ye yazardım. ( PORTD = ...; şeklinde). Tüm yazma çizme olayını da timer interrupt'a bağlar benden habersiz olarak sürekli döngünün devam etmesini sağlardım. Valla billa senin ilk kod örneğinden çok daha kısa ve kompakt olurdu. :D :D :D Hemi de kütüphaneciye muhtaç olmazdım. :lol:
 
Arduino ile Dijital Termometre

Sevgili abilerim, ikinizin de dediklerini anlayabiliyorum, ama konuşamıyorum. Yeni bir dilin ilk üç-dört kurunu almış öylece bırakmış gibiyim :D Neyse, so far so good:

Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Not: kod 8 satır :laugh:
 
Arduino ile Dijital Termometre

Az sonra yanık bi Atmega 328'in olmasın da! :p :D
Kod sekiz satır öyle mi? Include ettiğin library kaç satır??? :p
 
Arduino ile Dijital Termometre

Ahaha :D o çok satır. common anodların ucunda 220 ohm dirençler var. Şimdilik pek bi ısınma yok :D Isınırsa da ne yapalım, ben yakmazsam, sen yakmazsan, nasıl para kazanır bu atmel?? :p
 
Arduino ile Dijital Termometre

Sümer Yamaner' Alıntı:
Ev yapımı iyidir. Her noktasına müdahale şansın var o şekilde.
Zafer kardeşim ben o kodu öyle yazmazdım. :)
Bir kere segment çıkışlarını tek bir portun sekiz ucundan yapardım. Örneğin Uno'da sekizi birden kullanıma sunulan Port D bu amaçla iyi bir seçim olurdu. Her bir karakteri temsil eden binary değerlerini de tek bir array içinde hazır ederdim. Sonra ilgili digite hangi rakam yazılacak ise arrayin o elemanındaki değeri doğrudan ve tek bir seferde Port D'ye yazardım. ( PORTD = ...; şeklinde). Tüm yazma çizme olayını da timer interrupt'a bağlar benden habersiz olarak sürekli döngünün devam etmesini sağlardım. Valla billa senin ilk kod örneğinden çok daha kısa ve kompakt olurdu. :D :D :D Hemi de kütüphaneciye muhtaç olmazdım. :lol:

Sümer abi, bana 8 pin gerektiğinden PortD(RX+TX pinlerini kaybediyorum) pek uygun olmayabilir. Hoş, ISP headerleri üzerinden programladığımı varsaysam bile, bu sefer de Emre'nin ihtiyacı olandan biraz daha farklı olarak NOKTA kullanım ihtiyacım nedeni ile rakamları tanımlarken nokta yazdırabiliyor olma ihtiyacı nedeni ile doğrudan swtich-case değil de gene de ayrı bir void içinde tanımlama gerekirdi... Ama zaten kütüphane kullnamadan yazdığım kodun çok kısalacağı konusunda kesinlikle haklısın. Hatta nokta ihtiyacını kaldırınca kod 79 satıra düşüyor. Ama gene de 22 satır neree 79 satır neree :D. Yaşasın kütüphane yazarları :lol: .

Kod:
int dig1 = 0;
int dig2 = 0;
int dig3 = 0;
int dig4 = 0;
int DTime = 4;
long sNum = 1234; // Varsayılan olarak LED ekranda gosterilecek numara

void setup(){
    DDRD = B11111111;
    PORTD = B00000000;
    pinMode(A0, OUTPUT);
    pinMode(A1, OUTPUT);
    pinMode(A2, OUTPUT);
    pinMode(A3, OUTPUT);
    digitalWrite( A0, LOW);
    digitalWrite( A1, LOW);
    digitalWrite( A2, LOW);
    digitalWrite( A3, LOW);
    Serial.begin(9600);
    digiCalc(sNum);
}

void loop(){

    if (Serial.available() > 0) {
        sNum = Serial.parseInt();
        digiCalc(sNum);
    }
    
    digitalWrite( A0, LOW);   //digit 1
    pickNumber(dig1);
    digitalWrite( A0, HIGH);
    delay(DTime);
    digitalWrite( A0, LOW);
    
    digitalWrite( A1, LOW);   //digit 2
    pickNumber(dig2);
    digitalWrite( A1, HIGH);
    delay(DTime);
    digitalWrite( A1, LOW);
    
    digitalWrite( A2, LOW);   //digit 3
    pickNumber(dig3);
    digitalWrite( A2, HIGH);
    delay(DTime);
    digitalWrite( A2, LOW);
    
    digitalWrite( A3, LOW);   //digit 4
    pickNumber(dig4);
    digitalWrite( A3, HIGH);
    delay(DTime);
    digitalWrite( A3, LOW);
}

void digiCalc(long num){
    Serial.println(num);
    dig1 = num / 1000;
    num = num - (dig1 * 1000);
    dig2 = num / 100;
    num = num - (dig2 * 100);
    dig3 = num / 10;
    num = num - (dig3 * 10);
    dig4 = num;
}
 
void pickNumber(char x){
    switch(x){
        case 0: PORTD=B11111100; break;
        case 1: PORTD=B01100000; break;
        case 2: PORTD=B11011010; break;
        case 3: PORTD=B11110010; break;
        case 4: PORTD=B01100110; break;
        case 5: PORTD=B10110110; break;
        case 6: PORTD=B10111010; break;
        case 7: PORTD=B11100000; break;
        case 8: PORTD=B11111110; break;
        case 9: PORTD=B11110110; break;
    }
}
 
Arduino ile Dijital Termometre

Offf yaaa... Nedir bu satır merakı? Boyu değil işlevi!!! :p
Abicim bence IDE üzerinden yazılan koda takılma. İşlemciye yüklenen koda bak bakalım ne fark edecek.
 
Arduino ile Dijital Termometre

Herhalde bu kadar zamanda tasarım, ArGe ve testler bitmiş, nihai ürün aşamalarına gelinmiştir di mi?! :p Pek bi suskun bizim Arduino takımı bu aralar. :D
 
Arduino ile Dijital Termometre

Sümer Yamaner' Alıntı:
Herhalde bu kadar zamanda tasarım, ArGe ve testler bitmiş, nihai ürün aşamalarına gelinmiştir di mi?! :p Pek bi suskun bizim Arduino takımı bu aralar. :D
Evet abi Arduino grubumuz erken TATIL moduna girdiler bu sene :laugh: :laugh: ;D
 
Arduino ile Dijital Termometre

Doğru kışın vantilatör olmuyor o zaman kod yazıyor helici takımı! Uçakçı ise dört mevsim uçup dört mevsim kod yazıyor ve plaket üretiyor, proje bitiriyor. :yuppi: