Arduino ile Çocuklar için Diş Fırçalama Yardımcısı Yapımı ve Millis Fonksiyonu Kullanımı

Bu projemiz evde gündelik ihtiyaçlar sonucunda ortaya çıkan bir proje oldu. Zaten teknolojinin amaçlarından biri de bu değil mi? İnsanlığın talep gösterdiği alanlarda kolaylık, zaman ve enerji tasarrufu sağlamak.
Gelelim projemizin çıkış noktasına: 7 yaşındaki kızım günde en az 2 defa olacak şekilde dişlerini 3dk boyunca fırçalıyor. Ya da biz bu alışkanlığı küçük yaşta oturtmak için onu teşvik etmeye çalışıyoruz diyelim :) Çoğu anne-baba bunun ne demek olduğunu bilir. O yaştaki çocuklarda bu tarz süreklilik arz eden sorumlulukları güçlendirmek emek ve zaman ister. Çocuğun ilgisini çekmek gerekir. Kızım otomatik fırça kullanmasına rağmen oto fırçalar 3dk zaman tutmadığı için (genelde modele göre 1 veya 2.dk da motor titreşimi ile ikaz veriyorlar) dişlerini fırçalarken süreyi sürekli bize soruyordu. Hem diş fırçalama alışkanlığını pekiştirmek adına ona motivasyon sağlaması amacıyla, hem de doğru süreyi kendi başına kolayca takip edebilmesi için Arduino nano ile basit bir 3dk'lık timer yaptım. Kalan dakikayı takip edebilmesi için 7 segment LCD ve bitiş anında melodi çalması için de bir buzzer ekledim. Ledlerle cihazın çalıştığını ve sürenin de saymaya devam ettiğini vurguladım. Kısa sürede yapabileceğiniz ve çocuklara armağan edilecek güzel bir hediye oldu bence. Hele ki görsel olarak daha da güzelleştirilirse bence onların çok seveceği faydalı bir arkadaş olabilir.

Gerekli Malzemeler
1 adet Arduino Uno veya Nano,
1 adet 7 segment Katot tipi LCD (kod katoda göre),
1 adet Kırmızı Led,
1 adet Yeşil Led,
1 adet buzzer,
2 adet buton,
1 adet switch,
5 adet 220 ohm direnç,
2 adet 10k ohm direnç,
pil, kablo vb.

Projenin Yapılışı
Elektronik ekipmanınızı ve pili içerisine alacak herhangi bir hazne yapabilir, su geçirmezlik gibi ilave hassasiyetlere uygun tasarlayabilirsiniz. Ben elimde şu an 3d printer olmadığı için her zaman kullandığım dakota malzemesi ile bir kutu yapıp içine koydum. Ancak 3d printerdan basılacak bir muhafaza ile çok daha güzel olacağı kesin. O yüzden 3d printerim gelince daha şık bir kutu basıp burayı da güncelleyeceğim. Ebat olarak benim yaptığım kutu her bir kenarı 9cm olan bir küp.

Bağlantı Şeması


Ortak katot 7 segment LED için aşağıdaki şemaya göre de LEDler piyasada mevcut. Sizinki hangisi ise ona göre bağlayabilirsiniz.


Arduino Kodu
Bu projede millis() fonksiyonunu kullandım. Millis() fonksiyonu arduino enerjilendiğinde çalışmaya başlayan ve arka planda mili saniye cinsinden sürekli geçen zamanı tutan bir fonksiyon. Kodun herhangi bir yerinde millis(); olarak çağırdığınızda size Unsigned Long cinsinde bir değer döndürür. Bu değeri kullanarak geçen süreyi öğrenebilir ve farklı işlemler arasında süreli kontroller sağlayabilirsiniz. (Bu değerde değişkenler kapasitelerinden dolayı en fazla 49.7 günlük sayma yapabilirler. O yüzden bundan daha uzun süreli bir sayaçta arduino saymaya sıfırdan başlayacaktır. )
E şimdi diyeceksiniz ki delay(); fonksiyonu da aynı işi yapıyor. Aslında öyle değil. Delay komutunu kullandığımızda arduino durur. Başka hiçbir işlem yapamaz. Boş boş süre dolana kadar bekler. Bu hem kodu yavaşlatır hem de o sırada çalışmasına ihtiyaç duyulan fonksiyonları da bekletir. O yüzden kullanışlı değildir. Bunun yerine millis() kullanılarak hem arduino durdurulmadan hem de başka işlemelere devam edilerek kodun çalıştırılması sağlanır.
Örnek: 1 saniye yanan ve 1 saniye sönen led yapılmak istendiğinde yeni başlayan her kullanıcı delay kullanarak aşağıdaki kodu yazar:
digitalWrite(3,HIGH);
delay (1000);
digitalWrite(3,LOW);
delay (1000);
Evet, bu kodu çalıştırdığımızda istene gerçekleşir ancak millis kullanarak bu işlem sistemi bekletmeden yapılabilir.
simdikizaman=millis(); //arduino ne zamandır çalışıyor kaç ms olmuş onu aldık.

if (simdikizaman-oncekizaman >=1000) { //gecen süre 1sn ve üzerinde ise
digitalWrite(3,HIGH);
oncekizaman=simdikizaman; artık eski zamanı güncelliyoruz yokse hep >=1 olurdu
}
else {digitalWrite(3,LOW);}

Basit kodlarda arduinonun işlem gücü yeterinden fazla olacağı için delay ile ilgili sorun yaşamamış olabilirsiniz. Ancak eşgüdümlü kontrollerin yapıldığı karmaşık kodlarda delay'ler kodu yavaşlatır ve bu sırada yapılması gereken bazı kontroller çalışmayacağı için hata oluşabilir. O yüzden delay yerinde millis() kullanılmalıdır.

KODU:

// MUCİT PİLOT 2020
// FIRÇALAMATİK
// Çocuklar için diş fırçalama sayacı


int a = 7; // 7 segment Katot tip LCD için Pinleri tanımlıyoruz
int b = 8;
int c = 10;
int d = 11;
int e = 12;
int f = 6;
int g = 5;

int Do = 262; //buzzer için notaları tanımlıyoruz
int Re = 294;
int Mi = 330;
int Fa = 349;
int Sol = 392;
int La = 440;
int Si = 494;
int Doo = 523;

//diğer led ve butonlar için pinler
int ledkirmizi = 4;
int ledyesil = 3;
int buzzer = 2;
int buton = 13;
int reset = 9;

unsigned long simdikizaman =0; //millis için kullanılacak değişkenlerimiz
unsigned long oncekizaman= 0;
unsigned long ledoncekizaman= 0;
int butondurumu = 0;
int resetdurumu = 0;
unsigned long gecenzaman = 0;
unsigned long ledgecenzaman = 0;

void setup() {
pinMode(a, OUTPUT); // Pinlerin çıkış/giriş pini olduğunu belirtiyoruz.
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(ledkirmizi, OUTPUT);
pinMode(ledyesil, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(buton, INPUT);
pinMode(reset, INPUT);

}

void loop() {
  simdikizaman=millis(); //şu ana kadar geçen zaman bilgisini aldık.
  oncekizaman=simdikizaman; // arduino açılalı zaman geçmiş olabilir. O yüzden iki değişkeni de aynı düzleme getiriyoruz
  ledoncekizaman=simdikizaman;
  gecenzaman=0;
  ledgecenzaman=0;

// 7 segment LCD "0" Sayısını yazar.
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,LOW);

  
  
  digitalWrite(ledyesil, LOW); //başlangıçta yeşil led sönük
  digitalWrite(ledkirmizi, HIGH); //başlangıçta kırmızı led power on durumunu göstermek için açık
   
  if (digitalRead(buton) == 1) {  //başlat butonuna basılıp basılmadığına göre durum değişkenini güncelliyoruz
      butondurumu = 1;
      
      }
  if (digitalRead(reset) == 1) { //reset butonuna basılıp basılmadığına göre durum değişkenini güncelliyoruz
      butondurumu = 0;
      
      }
      
  while (butondurumu == 1){ //başlata basılmışsa
    
   simdikizaman=millis();
   ledgecenzaman=simdikizaman-ledoncekizaman;
   gecenzaman=simdikizaman-oncekizaman;

      
    if (ledgecenzaman >= 500) { //süre saydığı için yeşil led 1 sn ile yanıp sönüyor (500 yanık 500 sönük 1 sn)
      digitalWrite(ledyesil, !digitalRead(ledyesil)); //ledyesil HIGH ise LOW, LOW ise HIGH yapıyor.
      ledoncekizaman = millis(); //onceki zamanı güncelliyoruz, yoksa hep yanar
    }

    if (gecenzaman <= 60000){ //eğer daha 60snden az zaman geçmişse 7 segment lede 3dk kaldı yazacak. 60000ms=60sn=1dk
      // "3" Sayısını yazar.
      digitalWrite(a, HIGH);
      digitalWrite(b,HIGH);
      digitalWrite(c,HIGH);
      digitalWrite(d,HIGH);
      digitalWrite(e,LOW);
      digitalWrite(f,LOW);
      digitalWrite(g,HIGH);
      
    }
       if (gecenzaman > 60000 && gecenzaman <= 120000){ //eğer 1dk dan fazla ve  2dkdan az zaman geçmişse 7 segment lede 2dk kaldı yazacak
      // "2" Sayısını yazar.
        digitalWrite(a,HIGH);
        digitalWrite(b,HIGH);
        digitalWrite(c,LOW);
        digitalWrite(d,HIGH);
        digitalWrite(e,HIGH);
        digitalWrite(f,LOW);
        digitalWrite(g,HIGH);
        
    }
       if (gecenzaman > 120000){ //eğer 1dk dan az kalmışsa 7 segment lede 1dk kaldı yazacak
        // "1" Sayısını yazar.
        digitalWrite(a, LOW);
        digitalWrite(b,HIGH);
        digitalWrite(c,HIGH);
        digitalWrite(d,LOW);
        digitalWrite(e,LOW);
        digitalWrite(f,LOW);
        digitalWrite(g,LOW);
        
    }

   
   if (digitalRead(reset) == HIGH) { //reset butonuna basılırsa buton durumu 0 yapıp while'dan çıkmasını sağlar
       butondurumu = 0;
       }

   if (gecenzaman>=180000) {  //3dk geçmişse kırmızı ledi söndür, yeşili sabit yak
    digitalWrite(ledkirmizi, LOW);
    digitalWrite(ledyesil, HIGH);

    // Sürenin bittiğini göstermek için "0" Sayısını yazar.
      digitalWrite(a,HIGH);
      digitalWrite(b,HIGH);
      digitalWrite(c,HIGH);
      digitalWrite(d,HIGH);
      digitalWrite(e,HIGH);
      digitalWrite(f,HIGH);
      digitalWrite(g,LOW);
    //belirleyeceğiniz bir müziği çalıdabilirsiniz.
    tone(buzzer, Do);
    delay(500);
    noTone(buzzer);
    delay(20);
    tone(buzzer, Re);
    delay(500);
    noTone(buzzer);
    delay(20);
    tone(buzzer, Mi);
    delay(500);
    noTone(buzzer);
    delay(20);
    tone(buzzer, Sol);
    delay(500);
    noTone(buzzer);
    delay(20);
    tone(buzzer, Mi);
    delay(500);
    noTone(buzzer);
    delay(20);
    tone(buzzer, Sol);
    delay(500);
    noTone(buzzer);
    delay(20);

    //süre dolduğu için buton durumu güncelleyip while dan çıkartıyoruz.
    butondurumu=0;
    }
    
  } //while bitiş
  
  


}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Test Videosu

Yorumlar

Bu blogdaki popüler yayınlar

QTR-8A Kızılötesi Çizgi Sensörü Kullanımı ve Basit PID Çizgi İzleyen Robot Yapımı

A4988 Step Motor Sürücü Kartı ile NEMA Step Motor Kullanımı

Arduino ile ESP8266 Kullanımı ve İnternet Erişimi Serisi -1 (İnternet Üzerinden Veri Çekme)