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.

21 Haziran 2019 Cuma

Arduino ile i2c LCD Sürme

Arduino ile i2c LCD Sürme

Arduino UNO ve benzeri bir Arduino modeli (veya mikrokontroller) ile bir cihaz tasarlanmak istendiği zaman bir noktadan sonra artık bacakları yetmediği çeşitli arayışlar içine gireriz.

Çözümlerden biri Arduino Mega gibi bir modele yönelmektir. Mega modelinin kartının büyük olması gibi bir sıkıntısı var.

Başka bir çözüm ise LCD kullanılıyorsa, LCD'yi bir I2C ile sürmek. Bu iş için hazır çözümler var ise de piyasada bulunabilen, ve hatta bir çoğumuzun malzeme stoğunda bulunan paralel LCD'ler ile bunu gerçekleştirebilmek pek ala mümkündür.

Şekil-1 :Projedeki malzemelerin toplu haldeki görünümü. Üstteki i2c için 4'lü kablo, soldaki PCF8574AT modülü, ortadaki 2x16 LCD ekran, ve sağdaki Arduino UNO

Bu projede Arduino UNO ile bir paralel bağlantıya sahip LCD'yi i2c üzerinden sürmek.

i2c
Bu protokol Philips tarafından bulunmuştur. (şu anda NXP olarak devam ediyor). Ama diğer firmalar patent sorunları ile karşılaşmamak adına two-wire (iki telli) olarak adlandırmak durumunda kalmışlardır. O yüzden diğer çip üreticileri bu protokole two wire ismini kullanarak donanımlarına eklemişlerdir. En çok bilinen i2c çipleri DS1307(saat) ve 24C01 vb.(eeprom) gibi çiplerdir.

i2c veya two wire gnd hattı hariç tutularak saat ve data hattı olarak adlandırılırlar iki hat üzerine aletlerin haberleşmesini oluşturur. Saat ve data hatları sadece gnd'ye çekilerek çalıştığı için her bir hat için birer pull-up direnci veya akım kaynağı gerektirir.

7 bit adresleme bilgisi gerektirdiği için 128 farklı adreste i2c aletleri adresleyebilir. Bazı çiplerde harici adresleme için bacaklar yer alırken, bazı çiplerde bu adres seçme bacakları bulunmaz. Bu çipin üreticisi ve birlikte kullanılacağı düşünülen diğer donanımlara bağlıdır.

İki veri yolu biri saat kaynağı özellikle ana kontrol çipi tarafından üretilir (master çip) ve kontrol edilir, veri hattı ise verinin akışı yönüne göre değişiklik gösterebilen veri iletim hattıdır (veri kaynağı master veya uydu sistemi-slave olabilir). Bu aletler açık kollektörlüdür. Yani i2c hattı üzerine pull-up direnci ile hatların lojik-1 seviyesine çekiliyor.

Şekil-2 :i2C hattında başlama ve durdur durumlarının dalga şekli,

Saat hattı değişirken veri hattı kararlı kalması zorunludur. Aksi durumda bu i2c hattında bulunan çipler tarafından farklı anlamlarda yorumlanır.

i2c iletişimi bir BAŞLA durumu ile başlar. Saat hattı "1" konumunda iken veri hattı "1-0" geçişi ile oluşturulur.

i2c iletişimi DURDUR durumu ile sonlandırılır. Saat hattı "1" konumunda iken veri hattı "0-1" geçişi ile oluşturulur.

Bir i2c hattı üzerine bir aktif master konabilmesine rağmen (ki hatta birden fazla master konabiliyor) bir veya birden çok slave alet bağlanabiliyor. Tabii birbirleri ile çatışmadığı sürece.
Bir master BAŞLA durumu yayınladığında birden fazla slave olduğunda hangi slave aletin hedeflendiğinin bilinmesi gerekir. Bunun için her slave aletin kendi özel adresi vardır. (bazı belgelerde bu adrese ID olarak adlandırmaktadır) Aslında en yüksek anlamlı 4 bit aletin kullanıldığı alana göre tanımlanmış bir kod ise de, bu bitleri izleyen 3-bit adres bitleridir. Bazı aletler için 3 bit için seçme bacakları vardır veya değiştirilebilir . Kalan en düşük anlamlı bit ise oku/yaz bittir.

İlk zorunlu bayt bu şekilde tanımlandıktan sonra ikinci bayta geçmeden 1 saat çevrimi süresinde yapılan iletişimin kabul edildiğini belirten bir bitlik bir iletişim yapılır. Yani bu ilk baytı kabul eden slave aleti veri hattını lojik-0 konumuna çekerek yayınlanan adresin kabul edildiğini belirtir. Bu kabul aşaması her bayt arasında yapılır. Son alınan bayta kadar. Son bayt alındıktan sonra veri hattı lojik 1 konumunda kalarak kabul değil bilgisi iletilir. Kabul bilgisini hangi alet veri alıyorsa (master veya slave) veriyi alan alet tarafından yayınlanır.

PCB incelendiğinde görüleceği üzere 3 adet 10k pull up direnci ile adreslerin +5V'a çekilmiştir. Bu nedenle çip seçim adresi 111'dir. Bu pinler lojik-0'a çekilme seçeneği vardır. Bu sayede aynı çip içeren modüller ile birden fazla LCD ekran pek ala aynı i2c hattına bağlanabilir.
Çip kodu olarak PCF8574AT olduğu için sabit slave adresi 0111 ile başlayacaktır. Dolayısı ile PCF8574A takılı olan modülün adresi 0111111x şeklinde olacak ve x burada oku/yaz bitini temsil edecektir.
PCF8574AT
PCF8574AT8 bit I/O genişleme modülü olarak üretilmiş bir çiptir. Tabii ki uygulamamızda kullanımına uygun i2c haberleşme hattı üzerinden işlemci ile iletişim kurabilme kapasitesine sahiptir. Ayrıca çip I/O pinleri giriş olarak olarak düzenlendiği zaman gelen bilgiye uygun bir kesme bilgisi üretebilen bir bacağı da vardır. Kesme bacağı açık kollektörlüdürü ve kesme bilgisi okuma esnasında üretiliri.(Bu projede kullanılmayacağı için üzerinde fazla durulmayacaktır.)

PCF8574AT port pinleri işlemci tarafından gönderilen bilgiye göre çıkış veya giriş olarak düzenlenebilir. Projemizde kullanım alanı olarak incelendiğinde portlar çıkış olarak düzenlenmektedir.
Şekil-3 :Modülün monte edilmiş haldeki görünümü

Sağdaki sıra pinler (üstten alta doğru);

  •  GND
  • +5V
  • SDA
  • SCL

şeklinde sıralanmaktadır.

LCD pinleri olarak düşündüğümüzde, E, RS,RW kontrol pinleri ve D4..D7 data pinleri kullanılmaktadır. Bu pinler PCF8574AT port pinlerine bağlanmakta kalan tek pin de LCD arkaplan aydınlatma LED'lerini yakıp söndürmek için kullanılabilmektedir.

i2c adresR5R7R8
0x38varvarvar
0x39varvaryok
0x3Avaryokvar
0x3Bvaryokyok
0x3Cyokvarvar
0x3Dyokvaryok
0x3Eyokyokvar
0x3Fyokyokyok
PCF8574AT için i2c adresini oluşturan adres seçme pinlerinde yer alan kısadevre durumlarına göre adreslerin tanımlarını oluşturan tablo.

Karakter LCD
LCD kelime olarak sıvı kristal ekran anlamında ingilizce kelimelerin ilk harflerinden oluşmaktadır. Özel bir sıvı içinde yer alan öğelerin elektrik alanı uygulandığı zaman birbirine göre konumlarını değiştirmesi esasına dayanır.
Şekil-4 :2x16 LCD ekran görünümü


Burada elektrik alanı birbirine paralel iki cam yüzey üzerine kaplanmış iletken metal levhalardan oluşur.Kaplamadan kasıt doğrudan metal malzemenin elektrik uygulanarak buharlaştırılması (plazma) ve bu metal buharının cam yüzeyinde yoğunlaştırılması ile elde edilir. Bu camların arasına sıvı kristal olarak bilinen malzeme ile konulur, ki aralık oldukça küçüktür.

Şekil-5 :Bir karakter LCD için ayrıntılı olmasa bile kesit görülmektedir.

Bu halde elektrik uygulansa bile tabii ki bir görünümde bir değişiklik olmayacaktır. Bir görüntü oluşturabilmek veya görüntüde bir değişiklik yapabilmek için ışığı kutuplamak gerekir. En basitinden camların iki yüzeyi üstlerine ışığı ince yarıklardan geçiren filtreler yapıştırılır. iletkenlere elektrik alanı uygulanmadığı zaman ışık camlar arasından sorunsuz geçer ve camlar saydam görülür.
Elektrik alanı uygulandığı zaman ışık sıvı kristaller tarafından etkilendiği için ışık camlar arasından geçemez ve ekran kararır.
Şekil-6 :LCD ekran arkaplan aydınlatması ile görünümü. (arka planda görülen ışık PCF8574AT modülü tarafından oluşturulmuştur.

Buradaki kritik durum DC gerilim uygulandığı zaman sıvı kristaller kararlılığını kaybeder ve ekran saydam duruma geçer. Onun için kararlı ve görüntü için değişken gerilim uygulanması gerekir. Bu tek bir ortak bağlantı ile olan LCD ekranlarda kolaydır. Uygulanan gerilimler ortak nokta ile birlikte belirli zamanlarda gerilim değerini değiştirmektir.

Asıl iş birkaç ortak nokta olduğu zaman ortaya çıkıyor. Bu noktada çoğunlukla uygulanan yöntem adreslenmeyen ortak noktaları Vcc/2'de tutmak, adreslenen ortak bacak ile Vcc ve GND arasında adreslenen diğer ögeleri de ters kutuplamada tutmaktır. İşte LCD sürücüleri, özellikle matris ekranlarda uygulanan yöntem budur.


Şekil-7 :LCD sürücüsü örneği olarak Novatek firmasına ait NT7603 çipinin blok şeması görülmektedir.

LCD sürücüleri istenen karakter LCD çiplerinde tutulduğu için sadece dışarıdan uygulanan veri iletişimi ile istenilen görüntüyü oluşturur. Ekranda gösterilen karakter bilgisi karakter jeneratörü olarak adlandırılabilecek sabit bellekte tutulur. Hali ile gelen veriler doğrultusunda LCD çipi bu karakter üreteçlerinden karakter bilgisini okur ve karakter olarak ekrana yansıtır.

Aynı LCD çip olmasına rağmen

1x82x8-
1x162x164x16
1x202x204x20
1x402x404x40

satır x karakter sayısı) gibi karakter LCD'ler bulunmaktadır. (tablo olarak verilen LCD'lerin haricinde de karakter LCD'ler yer alabilmektedir)Ek olarak besleme, veri ve kontrol hatları birkaç bağlantı şeklinde farklılık gösterebilmektedir. Önemli olarak LCD'nin kullanılacağı yere göre arkaplan aydınlatmalı veya yansımalı olarak tipleri de bulunabilmektedir. Toshiba çipi içeren grafik LCD'ler üzerinde de karakter LCD gibi çalışabilen ürünler de vardır.

Karakter LCD çalışması ve bağlantıları 2 adet besleme,3 adet kontrol hattı ve 8 adet veri hattı mikrokontroller ile iletişim yapılır. Bunlara ek olarak 1 adet kontrast ayarı için giriş yer alır ki, buraya 10k trimpot ile istenilen kontrast ayarı yapılabilir. Burada 8 adet olarak belirtilen veri hattı, sürme teknikleri sayesinde sadece 4 veri hattı kullanımı ile kullanımı mümkündür. Tüm bu sürme hatları i2c sayesinde Arduino için besleme hariç sadece 2 hatta düşürmek de mümkündür.

Şema
Projede Arduino ve karakter LCD ayrı tutulmak kaydı ile malzemeler neredeyse SMD (yüzey montaj) yapısındadır. Hatta trimpot bile bacakları biraz kesilerek biraz da bükülerek yüzey montaj şekline getirilmiştir.

Kısaca devre üzerinden geçecek olursak; R1,R2,R3,R4 dirençleri Karakter LCD arkaplan aydınlatması LED akım sınırlama dirençleridir. Bu şekilde bağlantı oluşturulması LED bağlantılarının her zaman için aynı yapıda olmamasından kaynaklanmaktadır. R1,R3 veya R2,R4 çifti şeklinde bağlantı yapılmaktadır. Herhangi bir çift uygulanması durumunda diğer çift boş bırakılması gerekmektedir.projede R1 ve R3 çifti kullanılmıştır.
Şekil-8 :Projenin şeması. Monte edilmeyen malzemeler de şemada gösterilmiştir.

U1 (PCF8574AT) Arduino ile karakter LCD arasındaki iletişimi yani i2c haberleşmesini yönetmektedir. Arduino A4 ve A5 ile SDA ve SCL bağlantıları yapılmaktadır. SDA ve SCL bağlantı hatları üzerine R14-R15 çifti ile R16-R17 çifti pull-up direnci olarak herhangi bir çift bağlanmaktadır. Projede R14 ve R15 çifti tercih edilmiştir.

Karakter LCD pinPCF8574AT pin
D4P0
D5P1
D6P2
D7P3
EP4
R/WP5
RSP6
Bağlantı yer alamaktadır.

PCF8574AT P7 bacağı LCD arkaplan aydınlatma kontrolu için kullanılmaktadır.R10 (1k) direnç üzerinden R9(10k) pull-down direncine ve Q1 (BC817) transistörüne bağlanmaktadır. Q1 Emetör bacağı GND hattına bağlanmaktadır. Kollektör bacağı R3 veya R4 bacağına bağlanmaktadır. Projede hali hazırda R3 tercih edilmiş durumdadır.

Karakter LCD kontrast ayarı için iki ucu +5V ve GND'ye bağlı R6 (10k) trimpotun orta ucu LCD Vo bacağına bağlıdır. Elbette LCD+5V ve GND ucu bağlantıları da vardır.

Sözü edilen AT8574AT adres seçme bacaklarına R11,R12,R13 (10k) ve R5,R6,R7 (0R) dirençlerine ile yapılmaktadır. 0R olarak kastedilen kısa devre durumudur. Projede R11,R12,R13 10k direnç takılmış durumdadır ve istenirse başka bir değişiklik yapmadan R5,R6,R7 kısadevre edilerek i2c adres değişikliği sağlanmış olur.

Devre beslemesini Arduino üzerinden sağlayacak şekilde tasarlanmıştır.

R18 (1k) ve seri bağlı LED devresi besleme hatları arasına bağlanmıştır. Direnç ve LED özellikle devreye besleme bağlı olduğunda çalışır halde olduğunu göstermek üzere kullanılmaktadır. Özellikle program geliştirme esnasında sistemin çalışır halde olduğunu izlemek açısından oldukça kullanışlıdır.
Devre üzerindeki kondansatörler de filtre amaçlıdır.

Montaj
Devre montajında sıra pinler haricindeki elemanların tamamının SMD olması yüzünden elemanların hatasız monte edilmesi önemlidir. Daha sonra değiştirmeye çalışmak biraz deneyim gerektirir.
Şekil-9 :PCB'nin yollarının görünümü
Şekil-10 :SMD olarak tanımlanan elemanların yerleşimi

Şekil-11 :PCB üzerine eklenen köprülerin ve arkadaki LCD sıra pinlerin yerleşimi

Montaja doğrudan PCF8574AT başlamak; bacakların kısadevre olması halinde işlem yapmak için boş alan gereksimini yüzünden iyi olur.

Dirençlerin üzerinde değeri yazılı olduğu için minimum hata ile monte edilmesi mümkündür. Kondansatörlerin karıştırılması sorun değildir. Sadece 10uF kondansatör 805 kılıfında uygun bir yere lehimlenebilir. İsteyen 10uF elektrolitik kondansatör uygun iki besleme yolu üzerine lehimlenebilir.
Şekil-12 :Bakır yollar ve SMD elemanların birlikte görünümü

10k trimpot için dip kılıf özellikli malzeme biraz kırpma, biraz da bükme ile şekillenip SMD olarak devre üzerine lehimlenmektedir.
Şekil-13 :Bilgisayar ile üretilmiş PCB görünümü

Tüm SMD elemanlar lehimlendiktan sonra Karakter LCD için 16 pin dişi sıra pin kullanılmaktadır. bu sıra pin seçiminin LCD üzerine takılacak olan sıra pine bağlı olduğunu; istenirse doğrudan LCD üzerine erkek sıra pin ile bağlanabileceğini de ekleyelim. Besleme ve i2c hatları için 4'lü 90 derece erkek sıra pin lehimlenmektedir.
Şekil-14 :PCF8574AT modülün LCD ekran üzerine takılmış ve kabloları takılmış.

Şekil-15 :Arduino üzerine takılmış i2c ve besleme kablosu. (Klon olarak bilinen Arduino UNO kartı üzerinde i2c için sıra pin portu vardı. Bu sıra pin portu olmayan Arduino için elbette bilindik portları kullanılması gerekemektedir.)


Şekil-16 :Kabloları takılmış halde görünümü

Şekil-17 :İlk enerji verilmesi durumundaki görünümü. LCD ile ilgili bir program olmadığı için ekran kare kare bir görünüme sahiptir. (Trimpot ile ayar gerekebilir)



Malzeme Listesi

Arduino Shield kartı için Malzeme Listesi

PCF8574ATU1
22R 805 kılıfR1,R4
220R kılıfR2,R1
1k 805 kılıfR10, R18
10k trimpotR6
10k 805 kılıfR9,R11,R12,R13,R14,R15,R16,R17
BC817Q1
100nF 805 kılıfC1,C2,C3
10uFC4
0R 805 kılıfR5,R7,R8
10k 805 kılıfR10, R18
16'lı dişi sıra pinJ1
4'lü 90 derece erkek sıra pinP1

Tabii ki bu listeye ek olarak Arduino,karakter LCD ve bağlantı kabloları eklemek en azından denemeler esnasında yardımcı olacaktır.




Program
Piyasada satılan PCF8574AT için internet üzerinde araştırma yapabilirsiniz; burada konu edilen  bazı farklılıkların olacağı göz önüne alınız.. Elbette projede oluşturulma esnasından farklı bir yöntem izleme adına PCF8574AT bacak bağlantıları  kullanıldığı için kütüphanede biraz değişiklik yapılması gerekti.
Şekil-18 :İlk program ile çalışan LCD ekran

Şekil-19 :Programın test edildiği LCD ekran görünümü


Dolayısı ile proje belgeleri ile birlikte buradan indirebilirsiniz veya orjinal kütüphane üzerinde kendi bildiğiniz gibi değişiklik yapabilirsiniz.

örnek kod:;

/YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h>
#include <LiquidCrystal_K_I2C.h>

LiquidCrystal_K_I2C lcd(0x3f,16,2);  // set the LCD address to 0x3f for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("14-06-2019");
  lcd.setCursor(0,1);
  lcd.print("PCF8574AT Test");
;
}


void loop()
{
  ;
}

Güncelleme
Projelerde çoğunlukla kendi üretimimiz olan, PCB'ler kullanıldı. İşi  biraz daha ileri götürüp,PCB üretiminden ekmek yiyen iş yerlerine üretimi yaptırılınca işin rengi biraz olsun değişmektedir. Tabii az miktada PCB üretimi biraz masraflı olmaktadır. Ama ürün miktarı fazla olduğu zaman PCB başına düşen maliyet azalmaktadır.
Şekil-20: PCB çift yüzlü ve delik içi kaplamalı. Hani çoğunlukla uğraştıran köprü bağlantılarından kurtaracaktır.
Montaj açısından özellikle konnektör bağlantılarında oldukça kolaylık sağlayacaktır.
Şekil-21:Montaj olarak kendi üretimini veya piyasaya üretimi yaptırılan bir ürün üzerinde aman aman bir fark yoktur. Resimde monte edilmiş bir halde görülmektedir. PCF8574AT hemen sağındaki boş yerler i2c adres seçme  için kullanılır. Kartın solundaki boş dirençler farklı LCD arkaplan aydınlatma bacak için kullanılmaktadır.


Şekil-22: LCD üzerine takılmış ve besleme uygulanmış haldeki görünümü. Mavi LED beslemenin var olduğunu göstermektedir.
Şekil-23: Hazır test programı çalıştırılırken...

Not: Güncelleme başlığı altında verilen bilgiler, PCB üretimi yapan firmalar tarafından üretilen PCB'lerin genel yapısı hakkında bilgi içermektedir ve sadece karşılaştırma içindir. 

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