Gelişen mikrokontrol teknolojileri ve artan bilgi birikimi sayesinde geliştirici düzeyinde daha yaygın kullanımına olanak tanımıştır. Burada elimden geldiği kadar bazı örnekler sunmaya çalışacağım... Görüleceği gibi ilk örneklerimizde çoğunlukla ASM üzerinde iken daha sonraları C üzerinde örnekler yer almaktadır. Hatta ilerleyen zamanlarda Arduino örneklerinin yer alması kaçınılmaz olacaktır.

7 Mayıs 2019 Salı

Arduino Uno ve DHT11 ile LED ekranlı Higrometre

Arduino Uno ve DHT11 ile LED ekranlı Higrometre

Solduğumuz hava içindeki nem miktarı bizim için önemli bir hava kalitesi faktörüdür. Çünkü havadaki nem az veya çok olursa bizi rahatsız eder.

Nem ölçmek için çeşitli ölçü araçları vardır. Bu projede piyasada bulunan DHT11 kullanarak Arduino UNO için LED ekranlı bir shield oluşturmaya çalışacağız.

DHT11
Şekil-1:DHT11 bacak bağlantıları

Nem algılamada kullanılan en basit yöntem bir at kılının  (veya insan saçının) neme bağlı boyunun kısalıp uzamasına göre ölçeklenen bir sistemde nemin ölçülmesidir. Tabii ki bu yöntemde uzama ölçümü mekanik bir sistemle desteklenerek hassasiyet artırılır.

Aynı yöntem elektronik sisteme uygulanınca, işin içine çeşitli madensel tuzlar girmektedir. Tuzun fonksiyonu ortam neminden etkilenmesidir. Birkaç yöntem vardır. Örneğin tuz iki metal plaka arasına konur ve metal plakalar kapasitif etki ile çalışır. Tuzun ortamdan aldığı neme bağlı olarak hali ile kapasite değişecektir. Çünkü plakalar arasındaki malzemelerin dielektrik sabiti değişecektir. Bu sistem bir sinyal üretecinde kullanılırsa, hali ile ortam nemine bağlı frekansı değişen bir sinyalimiz olur. Tek yapılması gereken ortam nemine göre frekans ölçüm sonucunu ölçeklemektir.

Diğer bir yöntemde madesel tuzun iletkenliği ya da direnci ölçülür. Çünkü madensel tuzun iletkenliği ortam nemine bağlı olacaktır. Dolayısı ile nem sensör direnci de ortam neminin bir fonksiyonu olacaktır.

İşte bu projede kullanılan sensör madensel tuzun iletkenliğini değişimi üzerine kuruludur.
Nem ölçümü yapılırken, ortam sıcaklığı ile ilişkisi oldukça yakındır. Neredeyse ayrılmaz bir ikilidir. Bu nedenle bu projede kullanılan nem sensörü aynı zamanda ortam sıcaklığını da ölçebilmektedir. NTC sıcaklık algılayıcı ile (sıcaklık ile direnç değeri azalan sensör).

Bu ölçümleri bir işlemci ile gerçekleştirmek mümkün olabilir. O zaman ölçüm kalibrasyonu sorunu ortaya çıkarki, bu da sonucun doğruluğundan emin olmak için iyi bir laboratuvar gerektirir.
Tüm bunlardan sonra DHT11 sensörü tüm bu bilgilerin ışığında devre işlemcisi ile birlikte küçük bir kılıfa gömülmüş ve de kalibre edilmiş olarak kullanıcıya sunulmaktadır.

DHT11 çalışma şekli adresinde DHT11 ile ayrıntılı sayılabilecek bilgi bulunmaktadır.

Tabii ki içinde bir işlemci bulunan bir sistemin dijital olarak çıkış vermesi gerekir. Burada fazla bacak kalabalıklığından kaçınmak için "one wire" olarak bir bağlantı şekli ile sensör mikrokontroller devremize bağlanabilmektedir.
Şekil-2:Projede kullanılan DHT11'in ön ve arkadan görünümü


Temelde GND hattı haricinden sadece bir tek tel bağlantısı ile sensör işlemci devresine bağlanmaktadır. Bir direnç üzerinden akım sınırlanarak veri hattına verildiği için (anlaşılacağı üzere sensör akım harcaması oldukça küçüktür.) sensör veya işlemcinin bağlı olduğu bacaklarda herhangi bir hasar olmaksızın fonksiyonlarını yerine getirebilmektedir.(Bu projedeki sensörde ek besleme hattı yer almaktadır.)

Bu bağlantıyı kullanarak çalışan en bilindik sersör DS1820'dir. Tabii ki biz burada nem ölçümü yaptığımız için sensörümüz DHT11'dir. Elbette daha iyi ölçüm yapan ve hassas sonuç üreten sensörler var, fiyat olarak bakıldığında işin öğrenilmesi aşamasında DHT11 kullanımı yerinde olacaktır. Elbette isteyen daha iyi nem algılama sensörlerini kullanabilir.

Sonuçta DHT11 sensörü veri hattı bir pull-up direnç ile birlikte Arduino'ya bağlanmaktadır. Görüleceği gibi bu hat üzerinden haberleşme sağlanmaktadır.

Şimdi sensör üzerindeki +5V bacağı ne işe yarar diye soranlara, konunun sensörün harcadığı akım ile ilgili olduğunu söyleyebiliriz. Gereken gücü veri hattı üzerinden sağlamak için akım kaynağı ve güç kontrol sistemi gerekebilir, bu darboğazı aşmak için ek besleme hattı yerinde bir çözüm olabilir.

7 parçalı LED Ekran
Nemi ölçtük bunu bir yerde göstermek durumandayız. En kolayı ölçüm sonucunun USB kablo üzerinden bilgisayarda görüntülenmesidir. Ama her zaman için bilgisayarı bu amaç için yanımızda taşıyamak biraz zor olabilir. Bunun için devre DHT11 yanına bir LED ekran eklemek iyi bir karar olabilir.
Şekil-3: İki adet 7 segman LED ekran.

2 hane yeterli olacağı düşünülerek çoğullama mantığı ile 2 adet 7 parçalı LED ekran bağlanmıştır. Her bir parça akım sınırlaması için Arduino bacaklarına seri direnç ile bağlanmıştır. LED ekranların ortak bacakları bir transistör üzerinden +5V hattına bağlanmakta , böylece LED ekran arduino üzerinden açılır kapanır hale getirilmiştir.

2 hane; önce birini hane değeri ekranda gösterilir birinci hane söndürülür, ikinci hane aktif hale getirilip ikinci hane değeri gösterilir. ve tabii ki ikinci hane söndürülür ve işlem başa döner. Bu işlem insan gözünün izleyemeyeceği bir hızla gerçekleştirilir ve iki hane de aynı anda yanıyor ve değerini gösteriyormuş gibi bir görünüm sunar.

LED ekranın bu şekilde kullanımı birçok cihazda kullanılır. Şu anda baktığınız bilgisayar ekranı veya televizyon ekranları da bu çalışma prensiplerini taşır.
Şekil-4: Arduino UNO (sağdaki) ve projede gerçekleştirilen shiled (solda)

Avantajı özellikle kısıtlı bacak yapısına sahip işlemcilerde kullanım imkanı sağlarken , aynı zamanda güç tasarrufu da sağlar. Olumsuz yanı ise karmaşık sürme algoritmalarına ihtiyaç duyarlar. Tabii bu işi donanımın kendisi yaparsa o zaman başka. Örneğin MAX7219 türü bir entegre ile bu işi yapıyorsanız, ekranda gösterilecek veriyi gönderiyorsunuz, sonrasını donanımın kendisi çözüyor. İşlemciniz bu arada kendi yapması gereken işlemlerle ilgileniyor.
Şekil-5:Arduino UNO ve shiled monteli halde.

Bu projede böyle bir uygulama olmadığına göre tabii ki her şey  Arduino üzerinde mikrokontroller olan ATMEGA328p tarafından denetlenmektedir.

Devre
Devre Arduino UNO kartı ile uyumlu olacak şekilde düzenlendiği için, diğer Arduino kartları için devre üzerinde bazı değişiklerin yapılması gerekebilir, kart uyumlu ise değişiklik yapılmadan kullanılabilir.

Beslemesini Arduino üzerinden 5V olarak almakta, Arduino da zaten bilindiği gibi ya USB bağlantısı üzerinden bilgisayardan veya Arduino üzerindeki besleme girişine bağlanan bir adaptör üzerinden de sağlanabilir.
Şekil-6: shield şeması. Kırmızı dörtgen içindeki elemanlar monte edilmemiştir.

Devre tasarımı, tek yüzlü PCB üzerine monte edilmektedir.

LED ekranlar segman parçalarını sürmek için Arduino bacakları ile arasındaki seri dirençler R5,R6,R7,R8,R9,R10,R11,R13 (220 Ohm)bağlıdır(Arduino; pin2..pin8 ve A5) . DIS1..DIS6 (3161BSR) LED ekranlardır. Her bir LED ekran sürmek için ortak bağlantıları Arduino ile transistör baz arasında R1,R2,R3,R4,R14,R15 (1k) dirençler bağlıdır. (Arduino; pin9...pin12 ve A2,A3) Her bir LED ekran orta noktası sürme transistörü Q1..Q6 (BC327) kollektör uçları bağlıdır. Bu transistörlerin Emetör uçları +5V besleme hattına bağlıdır, ki bu hat Arduino kartından alınmaktadır. Transistör baz - emetör uçları arasında pull-down dirençleri R16,R17,R18,R19,R20,R21 (10k -805 kılıf) bağlıdır.

U1 (DHT11) sensörün data ucu Arduino pin13 bağlıdır. Ayrıca bu data ucu bir pull-up direnci olarak R12 (4k7) bağlıdır. Tabii ki sensörün +5V ve GND hatlarıda Arduino +5V ve GND pinlerine bağlıdır.

Geriye C1 (100n) ve C2 (10uF) kalır ki bunlarda besleme hatlarındaki elektriksel parazitleri filtreleme amacını taşır.
Devre Elemanları

Arduino Shield kartı için Malzeme Listesi

220R 1/4 wattR5..R11,R13
1k 1/4 wattR1..R4,R14,R15
4k7 1/4 wattR12
10k (805-SMD)R16..R21
100nFC1
10µF/16VC2
DHT11U1
BC327Q1...Q6
3161BSRDIS1...DIS6
1x40 header pin erkek-

Montaj konusunda elemanların montajı kolaydır. Sadece LED ekran bacaklarına dikkat etmek gerekmekte, çünkü bacakların arasından geçen yolların kısa devre olma ihtimali yüksektir.

Şekil-7: Alt yüz yollar

Şekil-8: Elemanların bulunduğu üst yüz. Kırmızı ile işaretli elemanlar monte edilmemiştir.

Şekil-9: SMD elemanların bulunduğu alt yüzdeki yerleşimi.

Her ne kadar tasarımda istemesem de, sıra pinlerin lehimlendiği lehim alanları kartın altında kaldığı için sıra pinlerin yolların bulunduğu yüz üzerinde lehimlenmesi gerekiyor.(Ya pinler ya da diğer elemanlar seçiminde; sıra pinleri yolların tarafına kalması kararlaştırıldı)

Şekil-10: Elemanların monte edilmiş olduğu shiled PCB'nin alt ve üst yüz görünümleri

Sıra pinleri monte etmeden sıra pinlerin bir Ardunio üzerine takılıp sonra shield üzerine lehimlemek iyi bir yöntem olacaktır. Özellikle pinleri lehimledikten sonra hizalamaya çalışmaktan daha kolaydır. Hatta sıra pinlerin en son lehimlenmesi yerinde bir seçim olacaktır.
Şekil-11: Nem algılama shield ve Arduino UNO birlikte üst üste..

Kartın montajından sonra kısa devre kontrolu yapılması ve son aşama olarak tiner veya alkol gibi bir malzeme ile kartın yıkanması çalışma esnasında olası oluşabilecek sorunları ortadan kaldıracaktır.
Şekil-12:Nem algılama devresinin çalışırken görülmektedir.

Sonuç
DHT11 yapısı nedeniyle fazla hassasiyet beklenmemeli. Görüldüğü gibi LED ekran sadece 2 hane. Yinede nem ölçümü konusunda, azda olsa bir fikir verecektir.

Daha hassas nem ölçümü için DHT22 gibi bir seçeneğe yönelmek daha iyi olabilir.

Arduino Kodu


#include <SimpleDHT.h>
const int segA = 8;
const int segB = 6;
const int segC = 4;
const int segD = 2;
const int segE = 3;
const int segF = 7;
const int segG = 5;
const int hane1 = 9;
const int hane10 = 10;
const uint8_t rakam0[] = {LOW, LOW, LOW, LOW, LOW, LOW,  HIGH};
const uint8_t rakam1[] = {HIGH, LOW, LOW, HIGH, HIGH, HIGH,  HIGH};
const uint8_t rakam2[] = {LOW, LOW, HIGH, LOW, LOW, HIGH,  LOW};
const uint8_t rakam3[] = {LOW, LOW, LOW, LOW, HIGH, HIGH,  LOW};
const uint8_t rakam4[] = {HIGH, LOW, LOW, HIGH, HIGH, LOW,  LOW};
const uint8_t rakam5[] = {LOW, HIGH, LOW, LOW, HIGH, LOW,  LOW};
const uint8_t rakam6[] = {LOW, HIGH, LOW, LOW, LOW, LOW,  LOW};
const uint8_t rakam7[] = {LOW, LOW, LOW, HIGH, HIGH, HIGH,  HIGH};
const uint8_t rakam8[] = {LOW, LOW, LOW, LOW, LOW, LOW,  LOW};
const uint8_t rakam9[] = {LOW, LOW, LOW, LOW, HIGH, LOW,  LOW};

int pinDHT11 = 13;
SimpleDHT11 dht11;
unsigned long ilkMillis = 0;
const long interval = 1500;
byte temperature = 0;
byte humidity = 0;
int say = 0;
int birler=0;
int onlar=0;


void setup() {
  // put your setup code here, to run once:
  pinMode(segA, OUTPUT);
  pinMode(segB, OUTPUT);
  pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT);
  pinMode(segE, OUTPUT);
  pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT);
  //pinMode(segDP,OUTPUT);
  pinMode(hane1, OUTPUT);
  pinMode(hane10, OUTPUT);
  digitalWrite(hane1, HIGH);
  digitalWrite(hane10, HIGH);
  digitalWrite(segA, HIGH);
  digitalWrite(segB, HIGH);
  digitalWrite(segC, HIGH);
  digitalWrite(segD, HIGH);
  digitalWrite(segE, HIGH);
  digitalWrite(segF, HIGH);
  digitalWrite(segG, HIGH);
}

void loop() {
  // put your main code here, to run repeatedly:

  unsigned long currentMillis = millis();

  if (currentMillis - ilkMillis >= interval) {
    ilkMillis = currentMillis;
    digitalWrite(hane1, HIGH);
    digitalWrite(hane10, HIGH);
    int err = SimpleDHTErrSuccess;
    if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
      Serial.print("Read DHT11 failed, err="); Serial.println(err); delay(1000);
      return;
    }
birler=int(humidity % 10);
onlar=int(humidity / 10);
  }
  say++;
  if (say == 1)
  {
    digitalWrite(hane1, HIGH);
    digitalWrite(hane10, HIGH);
    rakam_yaz(birler);
    digitalWrite(hane1, LOW);
  }
  else if (say == 2)
  {
    say = 0;
    digitalWrite(hane1, HIGH);
    digitalWrite(hane10, HIGH);
    rakam_yaz(onlar);
    digitalWrite(hane10, LOW);
  }
}

void rakam_yaz(int rakam)
{
  //  int rakam = 9;
  if (rakam == 0) {
    digitalWrite(segA, rakam0[0]);
    digitalWrite(segB, rakam0[1]);
    digitalWrite(segC, rakam0[2]);
    digitalWrite(segD, rakam0[3]);
    digitalWrite(segE, rakam0[4]);
    digitalWrite(segF, rakam0[5]);
    digitalWrite(segG, rakam0[6]);
  }
  else if (rakam == 1) {
    digitalWrite(segA, rakam1[0]);
    digitalWrite(segB, rakam1[1]);
    digitalWrite(segC, rakam1[2]);
    digitalWrite(segD, rakam1[3]);
    digitalWrite(segE, rakam1[4]);
    digitalWrite(segF, rakam1[5]);
    digitalWrite(segG, rakam1[6]);
  }
  else if (rakam == 2) {
    digitalWrite(segA, rakam2[0]);
    digitalWrite(segB, rakam2[1]);
    digitalWrite(segC, rakam2[2]);
    digitalWrite(segD, rakam2[3]);
    digitalWrite(segE, rakam2[4]);
    digitalWrite(segF, rakam2[5]);
    digitalWrite(segG, rakam2[6]);
  }
  else if (rakam == 3) {
    digitalWrite(segA, rakam3[0]);
    digitalWrite(segB, rakam3[1]);
    digitalWrite(segC, rakam3[2]);
    digitalWrite(segD, rakam3[3]);
    digitalWrite(segE, rakam3[4]);
    digitalWrite(segF, rakam3[5]);
    digitalWrite(segG, rakam3[6]);
  }
  else if (rakam == 4) {
    digitalWrite(segA, rakam4[0]);
    digitalWrite(segB, rakam4[1]);
    digitalWrite(segC, rakam4[2]);
    digitalWrite(segD, rakam4[3]);
    digitalWrite(segE, rakam4[4]);
    digitalWrite(segF, rakam4[5]);
    digitalWrite(segG, rakam4[6]);
  }
  else if (rakam == 5) {
    digitalWrite(segA, rakam5[0]);
    digitalWrite(segB, rakam5[1]);
    digitalWrite(segC, rakam5[2]);
    digitalWrite(segD, rakam5[3]);
    digitalWrite(segE, rakam5[4]);
    digitalWrite(segF, rakam5[5]);
    digitalWrite(segG, rakam5[6]);
  }
  else if (rakam == 6) {
    digitalWrite(segA, rakam6[0]);
    digitalWrite(segB, rakam6[1]);
    digitalWrite(segC, rakam6[2]);
    digitalWrite(segD, rakam6[3]);
    digitalWrite(segE, rakam6[4]);
    digitalWrite(segF, rakam6[5]);
    digitalWrite(segG, rakam6[6]);
  }
  else if (rakam == 7) {
    digitalWrite(segA, rakam7[0]);
    digitalWrite(segB, rakam7[1]);
    digitalWrite(segC, rakam7[2]);
    digitalWrite(segD, rakam7[3]);
    digitalWrite(segE, rakam7[4]);
    digitalWrite(segF, rakam7[5]);
    digitalWrite(segG, rakam7[6]);
  }
  else if (rakam == 8) {
    digitalWrite(segA, rakam8[0]);
    digitalWrite(segB, rakam8[1]);
    digitalWrite(segC, rakam8[2]);
    digitalWrite(segD, rakam8[3]);
    digitalWrite(segE, rakam8[4]);
    digitalWrite(segF, rakam8[5]);
    digitalWrite(segG, rakam8[6]);
  }
  else if (rakam == 9) {
    digitalWrite(segA, rakam9[0]);
    digitalWrite(segB, rakam9[1]);
    digitalWrite(segC, rakam9[2]);
    digitalWrite(segD, rakam9[3]);
    digitalWrite(segE, rakam9[4]);
    digitalWrite(segF, rakam9[5]);
    digitalWrite(segG, rakam9[6]);
  }
}

Kod yukarıda verildiği şekildedir.
erişebilirsiniz. Bu kütüphane one wire bağlantısı üzerinden nem ve sıcaklık bilgisinin sensörden (DHT11) ve bizim kullanabileceğimiz bilgi durumuna getiren temel kodları taşır.


İndirilecek Dosyalar


Translate

Sayfalar

Etiketler

İzleyiciler