sonrasında setup fonksiyonu içerisinde ekranımızı başlatıyoruz :
voidsetup()
{
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS))
{
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
display.clearDisplay();
}
artık display nesnesiyle ekranımızı yönetmeye başlayabiliriz.
clearDisplay()
Ekranın tampon datasını siler, tüm pikseller kapalı duruma gelir.
display.clearDisplay();
display()
Display fonksiyonu ekran için yaptığınız işlemlerin ekranda gösterilmesini sağlar, aşağıdaki ya da grafik işlemleri konusunda yazdığımız tüm fonksiyonlardan sonra bu fonksiyonu kullanmamız gerekiyor, aksi halde kullanılan fonksiyonlar uno'nun ram indeki buffer da saklanıyor, ekrana gönderilmiyor.
display.display();
String İşlemleri
Ekrana yazı yazdırmak için kullanabileceğimiz fonksiyonlara bakalım;
setTextColor()
setTextColor(uint16_ttextColor)
Ekrana herhangi bir şey yazdırmadan önce yazı rengini belirlemeniz gerekiyor, belirlemezseniz kütüphane varsayılan olarak SSD1306_WHITE olarak seçiyor, zaten monochrome bir ekran için başka bir şansınız yok, piksel ya görünüyordur açıktır yani, ya da kapalıdır, kapalı olma durumu da SSD1306_BLACK ile seçilebilir.
display.setTextColor(SSD1306_WHITE);
setTextColor(uint16_ttextColor, uint16_tbgColor)
Arka plan da belirlemek istiyorum derseniz bunu sadece yazı kapalı arka plan görünür olsun istediğiniz için kullanırsınız, diğer durumda arka plan zaten siyahtır, yani inverse text yapmak için: ilk parametre yazı rengi ikinci parametre yazı arka plan rengi olarak verilebiliyor :
Yazılacak metnin boyutunu ayarlar, bu karakter boyutunuzun bir çarpanı gibi düşünülebilir, karakterini 6x8 ise ve fonksiyona 2 değerini göndermişseniz, karakterleriniz 12x16 olarak basılır. Fonksiyonun kullanım zorunluluğu yoktur; kullanılmazsa karakter olduğu boyutlarda ekrana basılır.
display.setTextSize(2);
setFont(const GFXfont *f)
Yazılacak metnin fontunu belirlemenizi sağlıyor, metin yazılmadan önce belirtilmeli. İçerisine parametre olarak gfx fontlardan birinin adresini (font isminin yanında & olmalı) girmelisiniz. Font isimlerini nerden bulabilirim? kütüphanenin içinde TrFonts klasörünün içinde bulunan fontlardan, hangisini seçecekseniz onun dosya ismiyle font ismi aynı ayarlanmıştır, farklı olabilir mi? bunun için font dosyasını açtığında en altta font tanımlamasını göreceksin :
constGFXfontFreeSansBold12pt7bTRPROGMEM
fonksiyona parametre olarak vermen gereken şey tam olarak budur:
display.setFont(&FreeSansBold12pt7bTR);
Ee bir tane font var başka yok mu? Türkçe karakter destekleyen henüz yok. Desteklemeyenlere de Adafruit GFX library içerisinde Fonts klasöründen ulaşabilirsin, projene bu fontları dahil etmek için :
#include"Fonts/FreeSans12pt7b.h"
Fonts/ yazıp font dosya adını yazman yeterli.
setCursor(int16_t x, int16_t y)
Yazılacak metnin ekrandaki pozisyonunu belirlemenizi sağlıyor, x yatay düzlemdeki genişliğe denk gelen değer y dikey düzlemde yüksekliğe denk gelen değer 0,0 ekranın sol üst köşesini ifade eder ve piksel cinsinden değerlerdir.
display.setCursor(20, 22);
metninizi 20 piksel sağa 22 piksel aşağıya kaydırmış olur.
print(const __FlashStringHelper *ifsh)
Fonksiyonun görünümü sizi korkutmasın, içine çift tırnak içinde yazacağınız metni yazmanız yeterli
display.print("Türkçe");
yazdıktan sonra metnin sonuna satır bitirme eklemek isterseniz ki bu durumda bundan sonra yazdıracağınız metin bir alt satırdan başlar, bu durumda println kullanabilirsiniz:
display.println("SSD1306");
Grafik İşlemleri
invertDisplay(bool i)
Parametresi true ise ekrandaki açık olan pikselleri kapalı, kapalı olan pikselleri açık duruma getirir, false ise eski haline döndürür:
display.invertDisplay(true);
dim(bool dim)
Parametresi true ise ekranın daha az parlaklıkla çalışmasını sağlar, false ise, tam parlaklık durumudur, varsayılan olarak ekran tam parlaklık modunda çalışır.
display.dim(true);
drawPixel(int16_t x, int16_t y, uint16_t color)
Ekran üzerinde sadece bir pikseli açmak kapatmak ya da inverse etmek için kullanılır :
display.drawPixel(5,5,1);
5,5 koordinatındaki pikseli 1 ile açabiliriz, bunun yerine SSD1306_WHITE tanımlaması da kullanılabilir.
drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color)
Ekran üzerinde yatay bir çizgi çizmenizi sağlar, x parametresi hangi x pikselinden başlayacağınızı, y hangi y satırını kullanacağınızı, w parametresi kaç piksel uzunluk istediğinizi, color parametresi rengi belirmenizi sağlar:
display.drawFastHLine(5,31,123,SSD1306_WHITE);
5. x pikselinden başlayan 31. numaralı yatay satırda, 123 piksel genişliğinde bir çizgi çizer.
drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color)
Ekran üzerinde dikey bir çizgi çizmenizi sağlar, x parametresi çizginin olacağı piksel sütununu, y parametresi hangi y pikselinden başlayacağınızı, h parametresi kaç piksel yükseklik istediğinizi, color parametresi rengi belirler.
display.drawFastVLine(2,0,32,SSD1306_WHITE);
2. kolonda 0. cı y pikselinden başlayan 32 piksel yüksekliğinde beyaz renkli bir çizgi çizer.
startscrollright(uint8_t start, uint8_t stop)
Ekranının tamamını ya da bir bölümünü sağa doğru kaydırmanızı sağlar. start ilk satırı stop son satırı ifade eder, satır demişken 8 piksel yüksekliğinde bir bloktan bahsediyoruz, ekranın yukardan aşağıya doğru 4 e bölündüğünü düşünebilirsiniz, 0,0 en üstteki 1,1 bir altındakini 2,2 alttan ikinciyi, 3,3 de en alttaki satırı sağa kaydırır:
display.startscrollright(2,2);
ekranın 16. pikselinden başlayıp 23. pixeline kadar uzanan bloğu sağa kaydırır. Aynı mantıkla :
display.startscrollleft(3,3);
de en sondaki satırı sola doğru kaydırıyor, hem sağa hem sola farklı satırları da olsa kaydıramıyoruz. kaydırmayı sonlandırmak için :
Arduino ile Hareket Sensörü (PIR Sensör) Kullanımı
HC-Sr501 sensörü kullanacağımız bu uygulamada sensörün Arduino Uno 'ya bağlanmasını ve basit bir kod ile nasıl çalıştırılabildiğine bakıyor olacağız. Sensörün nasıl çalıştığını özelliklerini ya da modifikasyonlarını merak ediyorsanız sensörü detaylıca yazdığım : Hc-SR501 Sensör İncelemesi konusuna bakıp gelebilirsiniz.
Bu sensörü basitçe bir anahtar (switch) gibi düşünebilirsiniz, tek yaptığı şey bir hareket algıladığında sinyal pini üzerinden 5v vermesidir.
Görselde gördüğünüz bağlantıyı yapmanız yeterli, ben sinyal pinini Arduino 'nun ikinci pinine bağladım, siz dilediğiniz herhangi boş bir pine bağlayabilirsiniz, 1 ve 0 pinlerinden birini tercih etmenizi önermem, seri iletişim için o pinler kullanılıyor zira.
Kod kısmına gelecek olursak o da gayet basitçe şu şekilde olacak
Burada Arduino 'nun yapacağı iş; sensör bir hareket algıladığında seri ekrana seri bir şekilde "Motion Detected!" yazacak. Sanki başka hiç işimiz yokmuş gibi :) Tamam başka işlerimiz de olabilir, örneğin hareket algılandığında alarm çalabiliriz buzzer kullanarak, ya da bir ikaz lambası da yakabiliriz aynı zamanda, ya da yanan sönen lambalar kullanabiliriz, örnekler çoğaltılabilir. Bu yapmayı hayal ettiğimiz herşeyi if bloğunun içine yazarsak işimizi görür, ancak şöyle bir durum var, hareketin algılanması tek bir durumdur, dolayısıyla hareket algılandığında tek bir işler serisi yapmak isteriz. Eğer yukarıdaki kodu kullanacak olursanız, nasıl ki seri ekrana seri şekilde defalarca ( bu aslında sensörün hareket algıladığı andan sonra sinyal pinini ne süreyle HIGH seviyede tuttuğuyla alakalı ) "Motion Detected!" yazıyorsa, oradaki tüm işleri de sinyal kesilene kadar yapacak demektir.
Peki ne yapalım, kesme kullanabiliriz, kesme tetikleyicisi olarak da RISING seçersek yani yükselen kenarda tetiklensin, bu durumda sadece bir kez istediğimiz tüm fonksiyonları çalıştırabiliriz :
Yukarıdaki kod ile sadece bir defa MotionRoutine fonksiyonu yürütülür. Diğer fonksiyonları dilediğiniz işler için kullanabilirsiniz. Interrupt konusunda henüz birşeyler yazmadım ancak kısaca bahsedelim; bu noktada artık dilediğiniz pini kullanabilirsiniz lüksüne sahip değilsiniz, arduino uno için yalnızca 2 ve 3 numaralı pinlerin kesme özelliği var, yani ya 2 ya 3 başka şansınız yok.
Kesme için diğer seçenekler de :
FALLING : hareket bittiğinde yürütülür.
HIGH : ilk örnekle aynı şekilde HIGH iken peşpeşe yürütülür.
LOW : hareket bittikten sonre bir sonraki harekete kadar peşpeşe yürütülür.
CHANGE : lazım olur mu bilmem ama 5 iken 0 olursa, ya da 0 iken 5 olursa bir kez yürütülür.
Eğer olur da sensörünüz düzgün çalışmazsa hareket algılanmadığında da fonksiyonlarını çalışıyorsa mesela; sensörün sinyal pininden arduino GND 'ye 1k 'lık bir direnç bağlarsanız bu sorunu yaşamazsını diye ümid ediyorum, Bir dikkat etmeniz gereken şey de, sensörün düzgün çalışmaya başlaması çalışmaya başladığı andan sonra bie dakikayı buluyor olması, bunu da aklınızda bulundurun derim.
Arduino ile 5v 'tan daha yüksek bir voltajı ölçmek için; ya da herhangi bir mikro denetleyici için analog referans değerinin üzerindeki bir gerilimi ölçmek istediğimizde linkteki yazıda anlattığım gerilim bölücüleri kullanırız. Henüz okumadıysanız, okuyup buraya geri dönmenizi tavsiye ederim. Örnek olsun diye 9V 'luk bir pili ölçmeye çalışalım, bu aynı zamanda en fazla 9V dc çıkışı olan farklı bir kaynak da olabilir.
Burada teorik olarak yaptığımız şey en fazla 5v olan arduino ölçme kapasitesini 9V a çıkartmaktır. Dirençleri seçerken GND 'ye bağlı olan 5 in kaç katıysa (4) kaynağın + sına bağlı olan direncin de 4'ün o katı olduğuna dikkat edin.. Toplamda dirençlerimizin GND ve arduino analog pin arasında olan üzerinde 5V diğer direnç üzerinde de 4v olmasını istiyoruz, 12V ölçüyor olsaydık ikinci direnç 4'ün değil 7'nin 4 katı olacaktı, 9 da 4, 12 'de 7 nerden geldi? Kaynak voltajı - 5v (arduino adc max) 'tan geldi. Basitçe üstteki direnç 5x, alttaki direnç 4x olmalı, 9v 'luk bir kaynak için. Bulunabilirliği göz önüne alarak 20 ve 16 yı seçmiş bulunduk.
Arduino ile voltaj okuma konusunu okumadıysanız, şimdi okumanın tam zamanı. Gelelim oradan ne farkımız var noktasına, artık ADC 'den okuduğumuz veriyi 5v üzerinden değil, gerilim bölücünün çarpanı üzerinden değerlendirmemiz gerekiyor, gerilim bölücü en basit haliyle; kaynaktaki voltaj değerini bir şeye ('x') bölmüş ve A0 noktasındaki gerilimi elde etmiş. Bizim örneğimiz için şöyle olacak:
9V / x = 5V => 9v/5v = x => x = 1.8
biz de tam tersi yol izleyerek yani ADC den okuduğumuz voltaj değerini bu çarpan ile çarparak kaynak voltajına ulaşmış olacağız. Başka türlü hesaplanabilir miydi?
(R1 + R 2) / R2 (R2 gnd ye bağlı olan direnç)
(20 + 16) / 20 => 1.8
yani maksimum direncin "toplam direnç" R2 ye oranıyla, maksimum gerilimin orta ucta oluşan ADC gerilimine oranı aynı. Koda bakacak olursak, işin matematiği dışında değişen bir şey yok :
aslına bakarsanız ölçeceğimiz maksimum gerilimi 1023 e bölüp devam etsek de olurdu. Dikkat ederseniz, vOnDivider değerini yani 5 'i 1.8 le çarpıyoruz o da 9 ediyor 😁
Haydi biraz yükselip bir SMPS devresinde giriş voltajı olan 220v AC den doğrultularak elde edilmiş DC Bara denen voltajı ölçmek istiyor olalım; 220v * √(2) = 312V DC ölçeceğiz yani, bu durumda R2 miz 5x ken R1 'imizin de 312-5 'ten 307x olması lazım. Bu noktada voltaj yükseldiği için devrenin güç değerlerini de işin içine katmak gerekecek. Önce ne direnç kullanabiliriz ona bakalım, 307 k direnç arasak bulur muyuz, bulabiliriz belki ama, 307 bizim için alt limit, bu da ne demek 220v olaki yükselirse, bizim A0 da 5v u geçecektir o yüzden daha yüksek bir direnç kullanmak daha güvenli olacaktır. Maksimumda kaça kadar çıkabilsin noktasını düşünürsek 250v AC için 354v dc demek, 355 diyelim düz hesapla; 5x e 350x kullanabiliriz, yani 5k kullanacaksak diğerini 350k k kullanmamız gerekecek.
Devreden geçen akımı hesaplayalım :
I = V / Rtop => 355V / 355K = 1mA
350K direnç üzerinde 350V oluşacak, gücü hesaplarsak;
P = I * V => 0.001 * 350 = 0.350w
burada bir sıkıntı var, nedir? piyasadan alacağımız dirençler 1/4w yani 0.25w, biz bu direnç için 0.350w harcar diyoruz, yani bizim dirence elveda bu noktada; ne yapmalıyız, ya daha yüksek güçlü bir direnç almalıyız ya da direnç sayısını artırarak dirençlerin güç tüketimlerini de dağıtabiliriz, 350K yerine iki tane 175K seri kullansak; direnç başına 0.175w güç tüketimi söz konusu olacak bu işimize yarar, ya da K lardan çıkıp M lere geçeceğiz ki devrenin akımı daha da düşsün, R2 yi 20 K 'ya çıkartalım, bu durumda R1 in de 345*4 'ten 1380K olması lazım, olmadı, olabilen ne var 1.5M ohm olabilir. Bu durumda toplam direncimiz 1520k oldu, orta noktada 5v maksimum için artık kaynakta 380V a kadar ölçüm yapabiliyor olacağız. Güç değerimiz kurtarıyor mu peki?
devre akımı; 380V/ 1520K = 250µA
1.5M direnç için güç tüketimi : "380-5" => 375V*0.25mA = 0.093w.
Umarım mevzu net olarak anlaşılmıştır, dirençlerle alakalı daha fazla detay isterseniz Direnç Parametreleri konusunu okumanızı öneririm, kafanıza takılan herhangi bir şeyi lütfen yorumlarda sormaktan çekinmeyin!
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 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 Devre Şeması
HC SR501 Sensöre LDR Bağlanması
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.
En az iki direnç ile kurulabilen voltaj bölücü devresi, elimizde olan mevcut voltajdan daha düşük farklı seviyelerde voltajları elde edebilmemize olanak sağlayan basit elektrik devrelerdir. Genellikle voltajın referans olarak lazım olduğu devrelerde oldukça iş görürler. Referans olarak voltajın lazım olması demek benim bu voltajla yük çekmek gibi bir derdim yok, ben bu voltajın seviyesini yüksek giriş empedansı olan bir devreye bağlayıp ölçmek istiyorum demektir.
Devre temel olarak şu şekildedir :
Devre temelde iki direncin seri bağlanmasıyla oluşturulur. Dirençlerin seri bağlanması sebebiyle üzerlerinden geçen akımlar eşittir. Direnç değerlerinin farklılaşması sebebiyle de dirençler üzerine düşen voltajlar değişiklik gösterir, bu durumdan istifadeyle farklı voltaj seviyeleri iki direncin birleşim noktasından alınabilir.
Devredeki akımın hesaplanması
Devredeki akımı hesaplamak için ;V= I x R eşitliğinden I = V / R 'yi elde ediyoruz, bilmeyenler için yazalım
V : Voltaj (Potansitel Fark) Volt cinsinden
I : Akım Amper cinsinden
R : Resistor, direnç Ohm cinsinden
İki adet seri direncimiz var, hat üzerindeki toplam direnci elde etmek için ikisini topluyoruz :
Rtop = R1 + R2
nihai olarak akım formülümüz şu hali alıyor :
I = Vs / (R1+R2)
Direnç üzerine düşen voltajın hesaplanması
Şimdi devreki akımı biliyoruz R2 direncinin değerini de biliyoruz, öyleyse R2 direnci üzerindeki voltaj bize devrenin çıkış voltajını verecektir, neden R1 değil de R2 derseniz, R1 in diğer tarafı GND 'ye yani referenas noktamıza 0V a bağlı 😏
Vout = R2 *Vs / (R1+R2)
Artık nihai formülden sizin için değişken olan parametre hangisiyse onu çekerek hesaplama yapabilirsiniz, Örnek verelim dersek şöyle olsun :
3.3V luk bir VS kaynağına 1 Mohm luk R1 bağlı, çıkışta elde etmek istediğimiz voltaj 0.66v 'tan daha düşük olmak zorunda olsun, Vout < 0.66v; şartını sağlayacak R2 nin değeri en yüksek kaç ohm olabilir ?
R2 yi formulden çekersek yeni hali şu olacak :
R2 < (R1*Vout)/(Vs-Vout)
R2 < (1*10^6*0.66)/(3,3-0,66)
< 660000 / 2,64
< 250 000 ; 250 KOhm
R2 küçüldükçe çıkıştaki voltaj değeri de küçülecektir. Nasıl hesaplanacağını ya da devrenin çalışmasını anlayabildiysek, artık hesaplamak yapmak için ter dökmemize gerek yok; https://ohmslawcalculator.com/voltage-divider-calculator sayfasından hangi parametreyi hesaplamak istiyorsanız boş bırakıp diğerlerini yazın ve Calculate butonuna tıklayın.
Anlaşılmayan ya da kafanıza takılan bir şey olursa yorumlardan sorabilirsiniz.
Arduino ya da benzeri gömülü sistem uygulamalarımızda ekran ihtiyaçlarımızdan birini de SSD1306 Oled monochrome ekranlar karşılıyor. Daha önceden kullananlarınız olduysa bilirler ki malesef ekranların çoğu gibi bu ekran da Türkçe karakterleri desteklemiyor (henüz benim elime geçmemiş olanlar), Daha önce 16x2 20x4 I2c ve paralel mode için ve P10 paneller için Türkçe karakter destekli kütüphaneler yayınlardım, bunlara sitedeki arama fonksiyonunu kullanarak ulaşabilirsiniz.
Son olarak SSD1306 Oled ekranlar için geliştirdiğim Türkçe karakter destekli kütüphane de bugün yayınlandı:
Arduino IDE ile SSD1306 Ekran Tükçe Kullanımı ve Kütüphanenin İndirilmesi
Arduino IDE üzerinde bulunan menüden Tools * Manage Libraries... seçeneğine tıklayarak ya da Ctrl+Shift+L tuş kombinasyonuyla açılan Library Manager 'ın arama alanına SSD1306TUR yazdığınızda sizi karşılayan ekranda Install butonuna :
ardından, eğer sisteminizde AdafruitGfx ve diğer bağımlı kütüphaneler yüklü değilse gelen uyarıya :
Install all butonuna tıklayarak yüklememizi gerçekleştirebiliriz.
Kullanımı oldukça basit, ekranla mesainiz varsa sizin için hiç bir değişiklik yok header dosyasını projenize dahil edin ve aşağıdaki örnekteki gibi kullanın :
/**
* @file writeTr_128x32_i2c.ino
* @author Hakan ÖZMEN (hakkanr@gmail.com)
* @brief
* @version 1.0
* @date 2022-11-09
* @section for more information please visit :
* https://www.devrelerim.com/2022/11/ssd1306tur-ssd1306-oled-ekran-turkce.html
* https://www.youtube.com/HakkanR
* https://github.com/HakkanR/SSD1306TUR
* @copyright Copyright (c) 2022
* BDS License, all above text must be included any redistribution.
*/
#include <Wire.h>
#include <SSD1306TUR.h>
#include "TrFonts/FreeSansBold12pt7bTR.h"
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library.
// On an arduino UNO: A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO: 2(SDA), 3(SCL), ...
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
SSD1306TUR display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void TrTextsOnScr();
void setup()
{
Serial.begin(115200);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS))
{
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
// Clear the buffer
display.clearDisplay();
TrTextsOnScr();
}
void loop()
{
// put your main code here, to run repeatedly:
}
void TrTextsOnScr()
{
display.setTextColor(SSD1306_WHITE);
display.clearDisplay();
display.setTextSize(1);
display.println(" SSD1306");
display.setFont(&FreeSansBold12pt7bTR);
display.setCursor(20, 22);
display.print("Türkçe");
display.display();
delay(3000);
}
Şuan için kütüphanede yalnızca bir tane font var, font tasarımına vakit ayırabilirim diyen arkadaşlarım bana ulaşabilirlerse sevinirim, hem bu sayede gömülü sistemlerin Türkiye ayağında open source bir kütüphaneye katkınız olur ve adınız geçer! 😎
Arduino ile LM35 sıcaklık sensörü kullanımı oldukça basittir, zira sensörün çalışma prensibi zaten oldukça basittir; her bir derece için sinyal bacağında 10mV luk voltaj değişimi gerçekleşir ve tamamen olmasa da (her zaman biraz hata vardır) bu değişimin doğrusal olduğunu söyleyebiliriz.
LM35 Pin Tanımları
Lm35 Sıcaklı Sensörünün 3 adet pini bulunmaktadır :
+ Pini : Arduino 'nun 5V pinlerinden birine bağlanır.
- Pini : Arduino 'nun GND pinlerinden birine bağlanır.
S Pini: Sinyal çıkış pini olup, Arduino 'nun Analog pinlerinden (A0,A1 vs) birine bağlanır.
Lm35 Arduino Bağlantısı
Görselde görmüş olduğunuz Lm35 modül ile 2°C ile 150°C arasında sıcaklık ölçümlerini yapabiliriz. LM35 modül ile -55 ile 150 derece arasındaki sıcaklıkları da ölçmek mümkün ancak bu farklı bir yazının konusu olabilir; devre üzerinde bazı modifikasyonlara ihtiyacı oluyor.
Arduino Lm35 ile Sıcaklık Ölçme Örnek Kod
Öncelikle Arduino ile Voltaj ölçme konusunda bilginiz yoksa : Arduino ile voltaj okuma konusunu okumanızı tavsiye ederim. Aşağıdaki kod ile her 5 saniyede bir sıcaklığı ölçüp seri monitöre yazdırabiliriz :
// Arduino LM35 Code Example
// by HakkanR 07.11.2022
// https://www.devrelerim.com/2022/11/arduino-lm35-scaklk-sensoru-ile-scaklk.html
delay(5000); 5 saniyelik bekleme yapıyor, süreyle ihtiyacınıza göre oynayabilirsiniz, Bu arada derece işareti ° ALT + 0176 tuş kombinasyonuyla çıkıyor. 😏