Arduino etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Arduino etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

HC-SR501 PIR Sensör İncelemesi ve Modifikasyonlar

 HC-SR501 PIR Sensör

    Arduino ve diğer gömülü sistemler uygulamaları ile hareket algılamak için tasarlanmış olan HC SR501 PIR Motion Sensör 'ün özelliklerine ve çalışma prensibine kısaca bakıyor olacağız.

PIR Ne demek?

PIR: Passive InfraRed, kelimelerinin baş harfleri alınarak oluşturulmuş bir kısaltma olarak karşımıza çıkıyor. Çoğunlukla alarm devrelerinde kullanılan PIR sensörleri, bina girişlerinde, ara katlarda ya da umumi WC lerde başımıza kısa yanma süresiyle bela olan, hareket algıladığında yanan lamba devrelerinde de görmek mümkün. 

hc sr501 PIR sensör

HC-SR501 Hareket Sensörünün Özellikleri

  • Çalışma Voltajı : 5V - 20V (aldığınız ürünün bilgi sayfasını kontrol edin, üzerinde 3.3V 'luk voltaj regülatörü var, bu aralık biraz daha aşılabilir ancak 12V 'u geçmemenizi tavsiye ederim, regülatör için giriş-çıkış arasındaki fark regülatör üzerinde ısıya dönüşür.)
  • Akım sarfiyatı : 65mA maksimum (5v ile kullanınca µA seviyelerinde)
  • TTL çıkışı : 3.3V (5V mikro denetleyiciler için de HIGH olarak kabul edilir)
  • Gecikme Süresi : ayarlanabilir 5 - 300 saniye (ilk bir dakika geçerli değil)
  • Tetikleme Metodu: tekli ya da çoklu olarak seçilebilir.
  • Algılama aralığı 7 metre içerisinde 120° 'den az.
  • Çalışma sıcaklığı  -15 ~ +70 °C
Sensörün düzgün çalışmaya başlaması bir dakikayı buluyor, bu süre içerisinde yapacağınız testlerde çıkış seviyesinin süresi 0-3 saniye aralığında olabilir bozuk olduğunu düşünmeyin bu tamamen normal.

Single Trigger Repeating Trigger Arasındaki Fark

Üzerinde bulunan jumper ile çıkış seviyesini tekrarlanabilir ya da tekli hale getirebiliyorsunuz. Bu ne demek; diyelim ki hareket sensörümüzü 20 saniye açık olacak şekilde ayarladık, hareketi aldığında 20 saniye boyunca açık kalır ve bu süre içerisindeki yeni hareket algılamaları sensörü etkilemez, 20 saniye bittiğinde kapalı konuma geçer ve yeni hareket bekliyor olur. Repeating Trigger Modda ise açık kaldığı 20 saniye içerisinde yeni bir hareket algılarsa, yeni bir 20 saniye başlatır. Ayarlanmasına gelince, ilk görselde bulunan sarı jumper, orta ve dış pine bağlı olduğunda tekrarlama modu iç tarafa ve orta pine bağlıysa tekli moda ayarlanmış oluyor.

hc-sr501 single ve repeating trigger



HC SR501 Devre Şeması

HC-SR501 Sensör Devre Şeması




HC SR501 Sensöre LDR Bağlanması

hc-sr501 ldr termistör bağlama
    Soldaki resim üzerinde pin headerların hemen arkasında bulunan morla kare içerisine aldığım alana (RL) ile referans verilmiş ancak elinizdekinde yazmıyor da olabilir, LDR, kırmızıyla işaretlediğim alana da termistör bağlanabiliyor.

Sensörü aydınlatma amacıyla kullanacaksak, ortam ışığını ölçüp ortam ışık yakmak için aydınlıksa ışığı yakmasını engelleyebiliriz. Bunun için sensörün devresi üzerinde LDR bağlamak için bir alan bırakılmış. Şemada gördüğünüz CDS2 referansıyla yer alan eleman bord üzerinde takılı değil ancak kendimiz bu özelliği kullanmak istiyorsak, bord üzerinde bırakılmış bu alana LDR bağlayarak bu özelliği elde edebiliyoruz. Gördüğünüz gibi eleman bir ucu GND 'ye diğer ucu BISS0001 entegresinin 9 nolu bacağına gidiyor, bu bacak aynı zamanda 1Mohm 'luk bir dirençle (R3) VDD 'ye gidiyor. Burada anladığımız LDR ile 1Mohm 'luk direnç, direnç bölücü olarak kullanılacak. Entegrenin datasheet ine baktığımız zaman 9 nolu bacağın (VC) Trigger disable input pini olduğunu görüyoruz, ve şöyle bir özellik verilmiş: ( VC > 0.2VDD = enable, Vc<0.2Vdd = disabled). Burdan ne anlıyoruz, Vdd 'miz 3,3V, 
3,3 * 0.2 = 0,66v 'dan daha düşük bir voltajı 9 pinde sağlarsak triggerimiz disable olur. Bunu Sağlamak için de en yüksek 250K lık bir direnç değeri elde etmeliyiz, Nasıl hesapladık : Direnç İle Voltaj Bölücü Devreleri ve Hesaplamaları konusunu okuyabilirsiniz. Şimdi bize ışığın yanmasını istemediğimiz aydıklık seviyesinde değeri 250K 'yı geçmeyen, bir LDR lazım, LDR parametrelerini incelediğimiz zaman 10 Lux başına direnç değeri 100 Lux başıne direnç değeri 1 saniyedeki karanlık resistansı ya da 5 saniyedeki karanlık resistansı gibi değerler görürüz. Bu dark resistance değerleri genellikle 1 Mohm a yakın ya da daha yüksek değerlerdedir, devremizde de 1Mohm 'luk ortak direncimiz olduğu için hemen hemen bir çok LDR buraya uyum sağlayabilir. Aslında gün ışığının 30000 lux ile 130000 lux arasında olduğu kabulünden yola çıkarsak tam uygun olabilecek LDR yi hesaplamak da mümkündür, Bunları LDR konusunu detaylıca yazdığımızda anlatıyor oluruz. Ancak burada bu detayda bir hesaplamaya gerek kalmıyor.

    Oldu ki elinizdeki "herhangi bir LDR" devrenize uyum sağlamadı farklı seviyelerde yanıyor sönüyor falan, bu durumda devre üzerindeki R3 ü söküp yerine bir potansiyometre takarak, ışık şiddettini LDR ye bağlı olmaktan çıkartıp pota bağlı hale getirebilir ve oradan ayarlama yapabilirsiniz.

Gökhan Ünal'ın yorumlarda eklediği modifikasyon :
Hc-sr501 ldr



Arduino buton ile led yakmak | Örnek kod

Arduino buton ve led bağlantısı

 

Arduino button ile led yakma uygulamasına geçmeden önce buton nedir kısaca ona bakalım. Buton iki veya bazen ikişerli ortak olmak üzere 4 adet terminalden oluşan anahtarlama elemanıdır diyebiliriz. Anahtarlama elemanı olması sebebiyle elektrik devresine seri olarak bağlanırlar. yani devreyi herhangi bir yerinden keserler, butona basıldığı anda terminaller fiziksel olarak temas eder ve devre buton üzerinden tamamlanmış olur.


Yukarıdaki animasyona bakıldığında çalışma prensibini anlamak gayet basittir. Söz konusu animasyon Sparkfun 'un web sitesinden alınmıştır. 

    Sayfanın girişinde yer alan Arduino buton ve led bağlantısının gösterildiği görselden biraz bahsedelim. Arduino 'nun 13 üncü pinine bir ader direnç üzerinden (Buradaki direncin nasıl hesaplandığını öğrenmek için lütfen tıklayınız) ledin anod (+) ucu bağlanmıştır. Ledin diğer ucu (katot) da Arduino 'nun GND pinine bağlanmıştır. Butona gelince, görsele göre konuşmak gerekirse solda kalan terminaller birbirine içerden fiziksel olarak bağlıdır, sağdaki terminaller de içerden birbirine bağlıdır, soldaki ve sağdaki terminaller butona basıldığında birleşir ve devre tamamlanmış olur. Burada butonun bir terminalini soldakilerden üstteki ya da alttaki olabilir, Arduino 'nın digital pinlerinden birine, diğer terminali de Arduino 'nun GND pinine bağlanmıştır. Bu durumda pin üzerinde LOW kontrolü yapıyor olacağız, pinimizi kod kısmında INPUT_PULLUP olarak belirleyebildiğimiz için buton için fazladan bir direnç kullanmaktan kurtulmuş oluyoruz. Eğer ki butonda +5V anahtarlamak istiyor olsaydık, ki gördüğünüz üzere gereksiz fantastik bir durum olur bu durumda, o zaman GND' ye bağladığımız terminali 5V 'a bağlamamız ve de Arduino 'nın dijital pinine bağladığımız terminalini de bir pull down direnci ile GND 'ye bağlamamız gerekiyor olacaktı, neden ? çünkü Arduino input modlar içerisinde INPUT_PULLDOWN diye bir seçeneğimiz yok. Her iki durum için de Pull-up ya da pull-down yapmamızın nedeni digital pinin giriş seviyesinin kararsız kalmasını engellemektir. Kararsız kaldığı zaman, butona basılmasa da etraftan alacağı gürültü sebebiyle zaman zaman butona basılmış gibi davranması kaçınılmazdır. Devre ve kurgu anlaşıldıysa kod kısmına geçebiliriz.


Arduino ile buton yakmak örnek kod:


#define LED 13
#define BUTTON 7
void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(BUTTON, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(BUTTON) == LOW)
  {
    digitalWrite(LED, HIGH);
  }
  else
  {
    digitalWrite(LED, LOW);
  }
}

Şimdi satır satır bakalım neler yazdık, 

#define LED 13 satırıyla 13 yazmamız gereken yerlere artık LED yazabiliriz demiş olduk

aynı şekilde 7 yerine BUTTON yazabiliriz demiş olduk, define kullanımı hakkında detaylı bilgi sahibi olmak istiyorsanız arduino ve c++ için define kullanımını anlattığım youtube videoma bakabilirsiniz.

Geldik setup kısmına, Led imizin bağlı olduğu pini çıkış olarak ayarladık, bunda sorun yok, dikkat edeceğimiz nokta butonun bağlı olduğu pindeki INPUT_PULLUP ibaresi dikkat edin yalnızca INPUT değil, yine youtube da yayınladığım Arduino digital pinlere erişim videosunu izlemenizi tavsiye ederim tüm detayları orada bulacaksınız. Bu kısmı INPUT olarak belirlerseniz, digital pini bir dirençle pull-up yapmanız gerekmekte. 

Loop içerisinde, kod enerji kesilene kadar dönüp duracaktır, if ibaresine yabancı olanlar için yine detaylı C++ Arduino If kullanımı Videosu youtube kanalımda mevcut, digitalRead fonksiyonu ile butonun bağlı olduğu pinin seviyesini okuyoruz, eğer ki pin seviyesi LOW ise-bu durumun oluşabilmesi için butona basılmış olması gerekiyor- digitalWrite ile led in bağlı olduğu pin seviyesini HIGH yaparak ledin yanmasını sağlamış oluyoruz. Bu durumda ledimizin sürekli yanık kalmaması için butondan el çekildiğinde sönmesi için de else kısmında ledin bağlı olduğu pin seviyesini LOW yapıyoruz. 

    Konu bu kadar basit bir konu olsa da mevzuya uzak olan kimseler için anlaşılması zor olabilir, herşeyi detaylıca yazmaya çalıştım, yine de kafanızda soru işareti oluşturysa lütfen yorumlarda sormaktan çekinmeyiniz

    Herkese kolay gelsin!

Tinkercad proje linki

Arduino 16x2 (2x16) LCD Ekran Kullanımı | 4bit parallel mode - 16x2 LCD ekran pin bağlantıları

 Birçok projede hem ucuz olması hem de kolay bulunması bakımından 16x2 LCD ekranları kullanıyoruz. Bu yazımızda Arduino ile LCD Ekran Kullanımı 'na bakıyor olacağız. Üzerinde Hitachi 'nin ürettiği HD44780 sürücü entegresi bulunmakta. Aşağıda görselde ekranla birlikte 16x2 LCD ekran pin bağlantıları da verilmiştir.

Arduino 16x2 ekran pinleri

Pin detayları şu şekilde:

  • GND : Ground
  • VCC : +5V
  • Contrast : Ekran kontrastını ayarlamamıza yardımcı olur, bir potansiyometre ile 5V voltaj bölücü şeklinde konfigüre edilerek kullanılabilir, potansiyometrenin kenar uçlarını +5v ve GND ye bağlayıp orta ucu da Contrast pinine bağlayarak kontrast ayarı yapabilirsiniz.
  • RS : Register Select pini, komut mu data mı gönderiyoruz onu seçmemizi sağlıyor LOW durumda instruction (yani komut) HIGH durumda data (yani karakter) gönderiyoruz.
  • RW : Read Write seçimi için kullanılıyor, LOW : write, HIGH : read; ekrandan veri okumayacağımız için direkt olarak GND 'ye bağlayabiliriz.
  • D0-D7 : data pinleri 8 bit mode için tamamı, 4 bit mode için D4,D5,D6,D7 kullanmak yeterli.
  • Backlight(+)(-) : Arkaplan ışıklarının voltaj girişleri 220 Ω bir dirençle kullanılması sağlıklı olur, Backlight(+) pinini PWM pinlerinden birine bağlayarak ışık şiddetini de ayarlayabilirsiniz, bu durumda da direnç kullanmanızı tavsiye ederim, PWM %100 duty 'ye ulaştığında ledleriniz bozulabilir.



16x2 LCD ekran arduino bağlantısı
16x2 LCD Ekran Arduino Bağlantı Şeması

Yukarıda bulunan şemadaki bağlantıları gerçekleştirdikten sonra kodumuza geçebiliriz. Bu ekran için herhangi bir kütüphane yüklemenize gerek yok, Arduino IDE kurulumuyla birlikte LiquidCrystal kütüphanesi geliyor.

Ekranımızı denemek için aşağıdaki örnek kodu yükleyebiliriz :

// include the library code:
#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}

Kodumuzu yükledikten sonra eğer 16x2 ekrana görüntü gelmiyorsa bu potansiyometrenin ayarsızlığından olabilir, potansiyometrenizi her iki tarafa da çevirerek görüntü alabiliyor musunuz denemenizi tavsiye ederim.

Kütüphanenin bazı fonksiyonlarına kısaca bakacak olursak:

LiquidCrystal lcd(rs, en, d4, d5, d6, d7); lcd nesnesini başlatır.
lcd.begin(16, 2); ekranı başlatır 16 ve 2 ekranımızın sütun ve satır numaralarıdır.
lcd.setCursor(0, 1);  imleçi pozisyonlar ilk parametre sütun ikinci parametre satır, 
yandaki parametreler için imleç 0. sütün 1. satırda yer alacak.
lcd.print("hello, world!"); ekrana bizim için hello, world! yazar, bir metin yazmak
istediğimizde bu fonksiyonu kullanabiliriz.

Diğer örneklere Arduino IDE -> Dosya -> Örnekler -> LiquidCrystal menüsünden ulaşabilirsiniz.
Ancak IDE ile gelen LiquidCrytal Kütüphanesi Türkçe karakterleri desteklemiyor. 16x2 LCD ekran Türkçe karakter kullanımı için yazmış olduğum kütüphaneyi aşağıdaki linkten indirerek aynı fonksiyonlarla kullanabilirsiniz.


Kütüphanenin tüm fonksiyonlarını detaylı incelediğim Youtube videom


Keyifli seyirler dilerim


P10 Led Panel Nasıl Çalışır

 P10 Led Panel 32x16 toplamda 512 tane ledden oluşur. Üzerinde Hub1.2 adı verilen 8x12 lik iki adet bağlantı noktası ve 5v güç giriş bağlantısı bulunur. Hub1.2 bağlantılarının aşağıdaki resme göre soldaki giriş, diğeri ise diğer panellere bağlanabilmesi için çıkış olarak ayarlanmıştır.

P10 led panel

P10 Led panel pinoutHub1.2 bağlantı noktasının pin tanımlamaları  yandaki şekilde gösterilmiştir. ENABLE pinine HIGH sinyal uygulandığında panel aktif olur, bu pin LOW sa panelden diğer tüm parametrelere bakılmaksızın görüntü alamıyoruz.

A ve B pinleri panelde satır seçme işlemi için kullanılır. Panelin yukardan aşağıya doğru (panelin arkasındaki yön gösteren oklardan dikey olan yukarı konumu gösteriyorken) 16 satıra sırasıyla A1-A16 isimlerini verirsek seçme işlemi şu şekilde olacak 

(Burada seçme işlemiyle kastedilen ledlerin anodlarına + voltajın verilmesini sağlamaktır, A ve B nin durumuna göre seçili satırda bulunan ledlerin anodu enerjilendirilmiş olur)

BASeçilen Satırlar
00A1-A5-A9-A13
01A2-A6-A10-A14
10A3-A7-A11-A15
11A4-A8-A12-A16

DATA pini ledlerin katodlarınında belirleyicidir, yani data pininde gönderdiğimiz sinyalin LOW olduğu kısımlara denk gelen ledler çalışıyor olacak, data gönderim işlemi kısaca şöyle, data pininin seviyesi CLK pini üzerinden pir pulse gönderilerek 74HC595 'in registerine kaydırılır, A,B 0 0 iken sarı satırlar üzerine binecek olan data gönderimi yapılacak, gönderdiğiniz her data bir öncekileri ileri kaydıracak şekilde tasarlanmıştır. Tek bir satırda 8*16 = 128 tane led vardır, her birinin yanma sönük kalma durumu bu şekilde registerlara yazdırılır, sonra SCLK pinine pulse gönderilerek ilk satırın veri gönderimi tamamlanmış olur. SCLK pulse 74HC595 lerin registerlerindeki datayı çıkışlarına, yani ledlere göndermiş olur, SCLK pulse gelmeden çıkışlar yüksek empedans durumundadır. Aynı rutin 4 satıra da uygulanarak, tüm ekranın taraması tamamlanmış olur.

P10 panel data akışı

şekilde de görüldüğü üzere ilk gönderdiğiniz data şuanda 128 yazan hücreden girip yolculuğunu sol atta 1 yazan hücrede tamamlar, varsa bir sonraki panelin 128 yazan hücresinden girerek yoluna devam eder.


P10 led panelin çalışma prensibi ve devre analizi ile devresinde bulunan 74HC245 74HC04 74 HC138 ve 74HC595 entegrelerinin de nasıl çalıştığını incelediğim videoma yazının sonunda ulaşabilirsiniz. Keyifli seyirler.



16x2 Lcd Türkçe Karakter Sorunu Çözüldü! Arduino LCD ekrana yazı yazma - Arduino 16x2 Lcd ekran kullanımı

 LiquidCrystalTUR kütüphanesi nihayetinde hazır, biraz uğraştırdığını söyleyebilirim ancak neticeye de ulaşmış bulunmaktayım. Arduino 'nun ide yüklemesiyle birlikte gelen LiquidCrystal kütüphanesi, print fonksiyonuyla ne yazık ki türkçe karakterleri yazamıyor, bunun yerine custom karakterler tasarlayıp her biri için ayrı birer fonksiyon kullarak çağırmak gerekiyor.

lcd.print türkçe

 Normal şartlarda bu kütüphaneyi kullanarak print fonksiyonuyla lcd.print("Türkçe Yazı"); yazdığınızda karşılaştığınız manzara sol taraftaki gibi olacaktır, ayrıca bu kütüphaneyle ilgili benim gördüğüm bir iki eksiklik daha var, örneğin noDisplay fonksiyonuyla ekranın kapanmasını sağlayabiliyorsunuz, ancak kütüphanenin içinde ve Arduino 'nun resmi sitesindeki referanslarındaki bağlantı şemasını kullandığınızı düşünürsek, sadece ekrandaki görüntü gidiyor ve ışıklar yanmaya devam ediyor. İkincisi de kontrast problemi, kontrastı mutlaka bağladığınız pot üzerinden ayarlamak durumundasınız, peki ya bunu kod tarafında ayarlanabilir yapsaydık? yani eski LCD telefonların olduğu dönemlerden hatırlarsınız: bir kontrast ayarı olurdu ve kullanıcı oradan kontrast seviyesini ayarlayabilirdi, hatta ekran ışığı seviyesi de ayarlanabilirdi. İşte bu iki özellik de düzenlendiğimiz kütüphanenin içinde geliyor, ayarlanabilir kontrast ve arkaplan ışığı seviyesi.



    ve tabii ki kütüphaneyi düzenlemedeki asıl amacımız direkt olarak türkçe karakterlerin yazılabiliyor olması lcd.print("Türkçe Yazı"); fonksiyonuyla sağ taraftaki sonuca ulaşmanız mümkün. Tabii bunun için biz de ekranın custom karakter hafızasını kullandık, ama meraklanmayın 2 adet daha boş yeriniz kaldı hepsini doldurmadık :) 6 ve 7. bloklar boş, 0 ~ 5 arasında 5 dahil custom karakter ekleminize kütüphane türkçe karakterlerin kullanımını engellememek için müsade etmiyor.

    Söz konusu kütüphane 16x2 HD44780 chip kullanan ve A00 Rom a sahip ekranların 4 bit Mode sürülmesi için geçerli, elinizde A02 rom lu bir ekran varsa zaten türkçe karakterleri kullanabiliyor olacaksınız? Acaba öyle mi bundan emin olamadım? ama denemesi bedava : lcd.write(246); yazdığınızda ö harfi görüyorsanız rom kodunuz A02 demektir, hayır toplam işareti (sum) => Σ görüyorsanız, bu kütüphaneyi kullanabilirsiniz, normal şartlarda LiquidCrystal kütüphanesini kullandığınız bir projede sadece LiquidCrytalTUR kütüphanesini indirip (indirme linki yazının sonunda) projenize include ettiğinizde Türkça karakter özelliğini kullanabiliyor olacaksınız. Zira ayarlanabilir kontrast ve arkaplan ışığını da kullanmak isterseniz bağlantınızda ve kodunuzda ufak değişiklikler yapmanız gerekecek

const int bl = 10, cr = 9, rs = 12, en = 11,d4 = 5, d5 = 4, d6 = 3, d7 = 2;

LiquidCrystal lcd(rs, en, bl, cr, d4, d5, d6, d7);

bl değişkeni backligh için seçilmiş, cr değişkeni kontrast için seçilmiş, BL Arduino'nun 10. pinine Cr, de 9. pinine bağlanıyor olacak, tabii ki bunları değiştirebilirsiniz, ancak her ikisi için de PWM pinlerinden birini seçtiğinizden emin olun. Ekran ışığı için ekstra direnç kullanmanıza gerek yoktur.


lcd.setBacklight(20);  fonksiyonuyla ekran ışığı seviyesini 0 ile 30 seviyesi arasında

lcd.contrastLevel(91); fonksiyonuyla kontrast seviyesini ayarlayabilirsiniz 0 ile 255 arasında ayarlayabilirsiniz benim ekranımda 91 gayet düzgün çalıştı, bu ekrandan ekrana değişkenlik gösterebilir, dolayısıyla deneyerek optimum seviyeyi belirleyebilirsiniz.

Kütüphane en başından bu seviyeye gelene kadar yapılan tüm güncellemeler youtube kanalımda mevzut yanılmıyorsam 7 bölümlük bir seri oldu, izlerseniz size çok şey katacağına eminim. Linkleri ve nasıl kullanıldığına dair videomu aşağıya bırakıyorum. Konuyla alakalı sorunuz/öneriniz olursa yorumlara yazabilirsiniz.

-Herkese kolay gelsin.

indirme linki LiquidCrystalTUR



Arduino DHT11 Kullanımı - Arduino Kod - Arduino Termometre yapımı

DHT11 & Arduino UNO

  



      
DHT 11 wiring pin out

DHT 11 içerisinde NTC (Negative Temprature Coefficient) direnç ve nem sensörü bulunduran data kağıdında kendi deyimiyle => "yüksek performanslı" 8 bit mikrodenetleyici bulunan, (ölçüm yapması insanın kendi başına hava sıcaklığını ve nemini algılayabileceği süreden daha uzun süren:) , 250µs demişler ancak 2 saniye kadar sürebilir de demişler), bağlı olduğu sistemlerle "Tek hat-çift yön" serial protokolüyle konuşan güzide bir sensördür. Hep mi kötü bu kadar mı kötü, hayır tabii ki, ucuz mesela, bugünkü fiyatla 10 TL'ye almanız mümkün, düşünsenize bir NTC, bir nem sensörü, 8 bitlik "yüksek performanlı" bir mikrodenetleyici, bir kaç direnç ve kapasite, bunların takılı olduğu bir pcb, plastik muhafazası, pin headeri hatta onun takılı olduğu bir pcb daha, hepsi 10TL! Çinli malı eline almış kadıköy-eminönü seferinde bitti mi, bitmedi diyerek hepsini 10 liraya veriyor. En az sensörün kendisi kadar kaliteli bu yorumun ardından biraz teknik detaylarına bakalım.

dht11 iç görünümü

    

  1. Ölçme aralığı 20-90%RH, (Relative Humdity, bağıl nem)  0-50 ℃   
  2. Ölçüm doğruluğu Nem: ±5%RH, Sıcaklık : ±2℃
  3. Besleme gerilimi 3 - 5v5 (3v3 ve 5v luk µC lar ile kullanabilirsiniz.)
  4. İletişim, Single-Wire Two Way)
    İki tipine rastladım ben biri yalın halde satılıyor diğeri küçük bir pcbye monte edilmiş ikisi arasındaki tek fark pcb olanın üzerinde VCC-Data pini arasında bir 10K pull up direncinin olması, olaki elinizde yalın olanı var, bağlantı yaparken data pinini, sistemin VCCsine 10k bir dirençler pull-up yapmalısınız. Bu pcb li olanın bir de üzerinde kondansatör olanı var, kondansatör VCC-GND arasına giriş voltajını stabil tutmak için bağlanmış.

DHT11 Arduino UNO bağlantısı

dht 11 arduino uno wiring
dht 11 arduino wiring



  




Arduino IDE Kütüphanelerin Yüklenmesi
DHT.h No such file or directory hatası alıyorsanız

    Menuden, Araçlar * Kütüphaneleri Yönet, arama çubuğuna "DHT Sens" yazıyoruz 

DHT Sensor Library



DHT Sensor library by Adafruit yazanı yüklüyoruz.. yüklemek istediğinizde bu kütüphane başka bir kütüphaneye daha ihtiyaç duyuyor onu da yüklemek ister misiniz? diye sorunca evet deyip onu da yüklüyoruz. Kaçırdıysak, arama alanına Adafruit unified yazıp en altlara doğru iniyoruz

Adafruit Unified Sensor Library

Adafruit Unified Sensor by Adafruit yazan kütüphaneyi yüklüyoruz.

Basitçe kodumuz şöyle olacak:

#include "DHT.h"
#define DHTPIN 2     // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11   // DHT 11
 DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  Serial.println(F("DHTxx test!"));

  dht.begin();
}

void loop() {
  
  delay(2000);

  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // Check if any reads failed and exit early (to try again).
  if( isnan(h) ||  isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.println(F("°C "));
}
Sonuç: 
DHT11 sensör Seri port ekranı çıkışı

Seri Ekran çıkışınızın 115200bps ye ayarlandığından emin olun.
Video Hali için :


- Herkese Kolay gelsin.

Atmega328p Benzersiz Seri Numarası, Kod koruma

     



    Arduino UNO üzerinde bulunan mikrodenetleyici : atmega328p-u  kullanarak bir kod yazdık, derledik, bir hex dosyamız var, yazdığımız kodun, sadece "herhangi bir" atmega328p-u üzerinde çalışmasını istiyoruz, yani farklı bir mikrodenetleyiciyede çalışmasın, ya da "sadece" tek bir atmega328p-u üzerinde çalışsın istiyoruz, bir nevi kod koruma gibi, bir şekilde yazılı olan mikrodenetleyici üzerindeki kod okutularak başka bir mikrodenetleyiciye kopyalandığında çalışmasın istiyoruz.

İlk seçenek sadece kod uyumluluğunu denetlemek için kullanılabilir, hex kodu alınıp örnek olsun diye Atmega2560 a yüklendiğinde "uyumsuz olacağı düşünülerek" çalışması engellenebilir.

İkinci seçenekse, farklı bir atmega328p-u ya da atılmış olsa çalışmasın, burada kod korumadan söz edebiliriz. Peki bunu sağlamak için ne yapabiliriz? Örnek olsun diye atmega328p nin kendine özgü, her mikrodenetleyici için "benzersiz" bir seri numarası olsa, yine örnek olsun diye bu seri numarası 6F 75 57 37 37 57 FF 25 98 olsa,  ve kodumuzun en başında desek ki, mikrodenetleyicinin seri numarasını oku, bizim bildiğimiz seri numarası ile karşılaştır doğru değilse sonsuz bir döngüye gir, dolayısıyla kodun geri kalanı hiç çalışmasın. Uygun bir çözüm gibi, peki atmega328p-u bize böyle bir olanak sağlıyor mu? Datasheet e bir göz atalım:

    31.5 Serial Number The product has a serial number which offers a unique ID to identify a specified part while it is in the field. It consists of several bytes, which can be accessed from the signature address space. The Signature row includes factory-programmed data: 

 

  • ID for each device type 
  • Serial number for each device 
  • Calibration bytes for factory calibrated peripherals

 

burda bahsettiğine göre böyle bir imkan var, ancak nedir nerden buluruz nasıl okuruz gibi bir bilgi malesef yok.Ancak bu bilgiye aynı ailenin farklı bir ferdi olan atmega328pb için yayınlanan datasheet üzerinde  rastlıyoruz. 

Table 31.5 Signature Row Adressing

Siganure Byte Z-Pointer
Device Signature Byte 1 0x0000
Device Signarure Byte 2 0x0002
Device Signature Byte 3 0x0004
Rc Oscillator Calibration Byte 0x0001
Serial Number Byte 1 0x000E
Serial Number Byte 0 0x000F
Serial Number Byte 3 0x0010
Serial Number Byte 2 0x0011
Serial Number Byte 5 0x0012
Serial Number Byte 4 0x0013
Serial Number Byte 6 0x0015
Serial Number Byte 7 0x0016
Serial Number Byte 8 0x0017

     Şair burada ne anlatmak istemiş? ID for each device type ile kasıt mikrodenetleyicinin imzası yani kim olduğu bilgisi: Device Signature Byte ile verilmiş, Serial Number ise "biraz karışık olmakla birlikte" 9 ayrı adres üzerinde 8 bitlik veriler olacak şekilde; Serial Number Byte 0 ile Serial Number Byte 8 olarak kodlanmış.

    Nasıl ulaşacağız bu bilgilere ? Bu noktada boot.h yardımıza koşuyor ve bize 

boot_signature_byte_get(addr) gibi bir fonksiyon sunuyor.

boot.h main.cpp ye include edilip kullanılabilir, ;Atmel Studio için örnek kod:


#ifndef F_CPU

#define F_CPU 16000000UL

#endif

#include <avr/boot.h>

char devSignature[3]; 

char devSerial[9];

void getDevSignature(char* devsign)

{

for (size_t i = 0; i<3; i++)

{

devsign[i] = boot_signature_byte_get(i*2);

}

}

void getDevSerial(char* devSerial)

{

uint8_t add = 0;

for (size_t i = 0; i<9; i++)

{

if(i>=6)add=1;

devSerial[i+add] = boot_signature_byte_get(0x0E + i + add);

}

char tmp = devSerial[0];

devSerial[0]=devSerial[1];

devSerial[1]=tmp;

tmp = devSerial[2];

devSerial[2] = devSerial[3];

devSerial[3] = tmp;

tmp = devSerial[4];

devSerial[4] = devSerial[5];

devSerial[5] = tmp;

}

int main(void)

{

   getDevSignature(devSignature);// Device Signature -hangi mikrodenetleyici

   getDevSerial(devSerial); // Serial Number - seri numarası

}


Arduino IDE için örnek kod:

char devSerial[9];
#include <avr/boot.h>

void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Device Signature : ");
for (uint8_t i = 0; i < 3; i++)
{
Serial.print(boot_signature_byte_get(0x0 + i*2),HEX);
Serial.print(" ");
}
Serial.println("");
getDevSerial(devSerial);
Serial.println("Device Serial Number : ");
for (uint8_t i = 0; i < 9; i++)
{
Serial.print(devSerial[i],HEX);Serial.print(" ");
}
}
void loop() {
// put your main code here, to run repeatedly:

}

void getDevSerial(char* devSerial)
{
uint8_t add = 0;
for (size_t i = 0; i<9; i++)
{
if(i>=6)add=1;
devSerial[i+add] = boot_signature_byte_get(0x0E + i + add);
}
char tmp = devSerial[0];
devSerial[0]=devSerial[1];
devSerial[1]=tmp;
tmp = devSerial[2];
devSerial[2] = devSerial[3];
devSerial[3] = tmp;
tmp = devSerial[4];
devSerial[4] = devSerial[5];
devSerial[5] = tmp;
}

Elimdeki 3 değişik atmega328p ile denedim her birinde farklı seri numaraları elde ettim, bir eşleşme olacağını düşünmüyorum, deneyenler yorumlara yazabilir.




-Kolay gelsin.

Atmel Studio, Atmel ICE, Arduino UNO Hata Ayıklama

Geçtiğimiz günlerde siparişini verdiğim Atmel ICE elime ulaştı, 
 
    Break pointimi ekledim, Atmel-ICE, Arduino UNO bağlantısını ICSP soketi üzerinden gerçekleştirdim. Atmel-ICE ve Arduino usb ile bilgisayarıma bağlı, herşey hazır gibi. Projeyi kaydediyorum,
  Debug menüsünden Start debugging and break e tıklıyorum, hoop : Launh Failed başlıklı bir hata :
 
Failed to launch session with debugWIRE. This could be caused by reset line circuitry or disabled debugWIRE interface. Make sure that reset line is free before continuing. Do you want to use SPI to enable the DWEN fuse?
 
Arkadaş diyor ki, debugWIRE üzerinden hata ayıklama yapamıyorum, nedeni reset devresi ya da DWEN fuse nin kapalı olması olabilir, hmm.. orjinal Arduino Uno kullanıyorum, zannımca reset devresiyle alakalı bir sorun olamaz, ancak arduino IDE debug kullanmadığından DWEN fuse kapalı olabilir, ve zaten soruyor istersen DWEN fuse ü senin için aktif etmemi ister misin, Evet diyorum. Çok güzel, DWEN aktif edildi, gücü kesip tekrar bağlayın diyor, yapıyorum ve yeniden Launch Failed :
 
Setting debugWire fuse seems to have failed. Check your clock and fuse setting. 
 
Tamam, anladık ki başka bi sıkıntı var, Ancak artık başka bi sıkıntı da var, Uno nun üzerinde Blink yüklüydü ledim yanıp sönüyordu, artık yanıp sönmüyor yani UNO artık çalışmıyor ve Device Programming üzerinden Uno ya bağlanıp artık kod da atamıyorum :
 
Failed to enter programming mode. ispEnterProgMode: Error status received: Got 0xc0, expected 0x00 (Command has failed to execute on the tool)
 
Unable to enter programming mode. Verify device selection, interface settings, target power, security bit, and connections to the target device.
 
Arduino IDE üzerinden deniyelim; Examples / Blink, com port hala görüyor, bu iyiye işaret olabilir, upload diyoruz:
 
         Using Port                            : COM21
         Using Programmer               : arduino
         Overriding Baud Rate          : 115200
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x26
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x26
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x26
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x26
 
 
geçmiş olsun.. hata ayıklama yapalım diye çıktığımız bu kutlu yoldan, artık çalışmayan bir arduino UNO ile geri dönüyoruz :)
 
tamam bozulmuş olabilirsin ve bu bozulma bu olaya denk gelmiş olabilir, başka bir arduino uno ile tüm süreci tekrarlıyorum: sonuç 2 tane çalışmayan Arduino UNO..
 
biraz geri saralım, ilk hatadaki atladığımız reset hattı hikayesine, Make sure that reset line is free, Hattımız free mi değil? bakalım referans dizaynda neler var?
 

 

Malesef Reset hattımız "free" değil. Usb to com bridge, aynı zamanda IDE üzerinden Arduino ya kod atmamıza olanak sağlayan ATMEGA8U2-MU ile bir bağlantı söz konusu ve işin iyi tarafı board üzerinde bu bağlantıyı ayırabileceğimiz "Reset EN" adında bir jumper mevcut, bu bağlantıyı ince bir neşterle ayırıyorum, artık reset line free..
 

 

 

Tekrar Deniyoruz,  Debug menüsünden Start debugging and break e tıklıyorum,:



sonuç şahane, break pointimiz çalıştı, o andaki tüm registerlerimizi PORT directionlarımızı ve on off durumlarını görebiliyoruz, ayynen visual studio da kullandığımız debug sistemi gibi değişkenlerimizin değerlerini görebiliyor, adım adım ilerleyebiliyor, quickWatch ekleyip özellikle takip etmek istediğimiz değişkenin peşine düşebiliyoruz.
 
    Uno nun eski haline dönebilmesi için, debug menusundan ; disable debugWire and close demek gerekiyor, ayrıca board üzerindeki iki pine iki pinli erkek pin header bağlayıp üzerine de bir jumper takıp ("eskiden harddisklerin slave master ayarı yapmak için kullandığımız jumper) la Reset Enable durumunu da kolayca kontrol edebilirsiniz. 
 
-Kolay gelsin.

 

Türksat Saat Kanalı ve IRIG-B Time Code

Türksat Saat Kanalından Saat Bilgisi Nasıl Alınır? Uyduda kanalları dolaşırken, şu Türksat Saat kanalı hep dikkatimi çekmiştir. Özellikle  S...