Nextion Enhanced Mode Ekranlar
İkinci Bölüm Programlama (Önceki yazımıza https://blog.direnc.net/nextion-hmi-display-lcd-ekranlar/ adresinden ulaşabilirsiniz.)
Görsel tasarım hazırlandıktan sonra geriye modülün programlanması kalıyor.
Burada önce saatin ekranda güncellenmesi il başlayalım. Saat kısmındaki “:” işaretlerinin yarım saniye aralıkla yanıp sönmesini istedim. Ayrıca tabi ki saatin güncellenmesi gerek. Bunun için bir “Timer” objesi kullanacağız. Tıkladığımızda tasarım ekranımızın alt kısmında “gizli” görsel olmayan objelerin bulunduğu yer “tm0” isimli bir obje geliyor. Bununla birlikte sağ tarafta bu objenin özellikleri görülüyor.
Timer istenilen aralıklarla kesme yapma özelliğine sahip bir obje. Özelliklerinden “en” ile 1 = “enable” – aç veya 0=“disable” – kapat yapabiliyoruz. Kesme işlemini n zamanını ise “tm” özelliği ile yapıyoruz. Buraya zamanı milisaniye cinsinden veriyoruz. Bizim ihtiyacımız 0,5 saniye yani 500ms.
“tm0” objesine tıklanınca alt sağ kısımda “Event” altında “Timer Event” kısmı çıkıyor. Bu kısım kod yazma kısmı. Timer vermiş olduğumuz her kesme süresi sonrası buradaki kodları işleyecek. Buraya yazılacak mantıksal kod şu şekilde olacaktır. Kodları sayfa sayfa vermiyorum. Tüm projeyi buradan indirebilirsiniz.
Rtc_gün oku – gün_tekst’e yaz
Rtc_ay oku -> ay_tekst’e yaz
..
..
Eğer “:” görünüyor ise
| “:” sil
| Eğer “alarm Bayrak” var ise
| | Alarm rakamlarını “kırmızı” yap
Yoksa
| “:” yaz
| Eğer “alarm Bayrak” var ise
| | Alarm rakamlarını “beyaz” yap
Aynı yere birde alarmın var olup olmadığını bakıp “Bayrak” yapalım. Bayrak için bir “Variable” – değişken objesi ekliyoruz. “tm0” yanına bir “va0” ekleniyor. Bu objenin özellikler kısmında görüldüğü gibi “sta” = “number” olduğunu görüyoruz. Yani değişkenimiz bir rakamsal değer. Bu değerde “val” satırında görülüyor. Şimdi alarmın var olup olmadığına bakalım
Eğer “saat” yazı “alarmsaat” yazısı ile eşit ise
| Eğer “dakika” yazı “alarmdakika” yazısı ile eşit ise
| | “va0.val” 1 yap — Bayrak kaldır değişken değerini 1 yap
| | “Port 0” bir yap — port pini 0’ı “1” yap
| Yoksa
| | “va0.val” 0 yap — Bayrak indir değişken değerini 0 yap
| | “Port 0” sıfır yap – port pini 0’ı “0” yap
Nextion rakamsal olarak 32bit tam sayı rakamlar ile işlem yapabiliyor yerine göre bu +- 2.147.483.648 olabildiği gibi bazı yerlerde pozitif yani 4.294.967.296 olabiliyor. Buna dikkat etmek gerekiyor. Eğer “sta” = “string” yaparsak yazı olarak kullanabiliyoruz. Burada da yazı uzunluğunu “txt_maxl” vermemiz gerekiyor.
Şimdi kullandığımız komutlara bakalım. Komut seti için buraya tıklayınız.
RTC
Rtc gün bu parametre olarak gelişmiş modellerinde yer alıyor ve rtc0 .. rtc6’ya kadar gidiyor. İlk rtc0 yıl değeri ve rakamsal bir değer. Son değer rtc6 hafta numarasını veriyor. Bunu yazıya çevirmek için “cov”- convert-çevir komutunu kullanıyoruz. “cov” komutu 3 parametre alıyor “cov kaynak, hedef, uzunluk”. Bu komut yazıdan sayıya veya sayıdan yazıya çevirebiliyor. Örnek: “cov rtc0, tyil.txt, 4” kaynağımız rakamsal “rtc0” hedefimiz “yıl” yazısı uzunluğumuz da yıl olduğu için 4 karakter. Eğer uzunluğu 0-sıfır yaparsak uzunluğu otomatik ayarlıyor. Fakat o zaman örneğin “01” yerine “1” yazıyor. Bu da tercih edilebilir.
“if” konusu biraz ilkel, C programlaması gibi ancak karmaşık işlemler mümkün değil. Öncelikle koşul tek olması gerekiyor, ikincisi karşılaştırma değerleri değişkenler üzerinden yapıldığında simülasyonda çalışsa da program gerçek ortamda çalışmayabiliyor. Çeviricide firmware de BUG olabilir!! Örnek:
if (va0.val==gun.id)
{
va1.val++
cov va1.val, gun.txt,2
}
Simülatörde çalışırken program cihaza atıldığında çalışmayabiliyor. Dediğim gibi bir BUG olabilir.
Onun yerine if(va0.val==2) Kullanılırsa sorun olmuyor.
Kıvrımlı parantezleri ikinci satıra yazıyoruz. Parantezlerin bulunduğu satıra herhangi bir komut yazmıyoruz. “else” komutu kıvrımlı bitiş parantezinin hemen arkasına ekliyoruz. Burada “else”, “elseif” kullanabiliyoruz.
“for”, “while” gibi döngülerde var fakat burada kullanmadığımdan, bunlara girmeyeceğim.
Değişkenler ve obje değerleri varsayılan her sayfada lokal olarak görülüyor. Yani değişkenlerimiz bir başka sayfada görünmüyor. Tabii tasarım aşamasında da gözlemlediğimiz gibi “vscope” özelliğindeki “local” yerine “global” seçersek başka sayfalardan erişilebiliyor. Ancak bunun yerine 3 adet numerik değişken var “sys0”, “sys1” ve “sys2” bunlar tüm sayfalardan erişile-biliniyor. Global parametre aktarımları için bunların kullanılması öneriliyor.
“Text”-Yazı objelerinde ”button” objelerindeki gibi “touch press event” – touch dokunulduğunda olayı ve “touch release event” –touch dokunma bırakıldığında olayları mevcut. Dolayısı ile bir yazıya dokunma olayı gerçekleştirebiliyoruz. Yani üzerine bir buton objesi eklemeye gerek yok.
Bu özelliği ikinci sayfamızda kullanıyoruz. Gün yazısına dokunduğumuzda 1.bu yazının rengini değiştiriyoruz 2. Bu objenin “id” sini “sys0” değişkeninde saklıyoruz. 3. Diğer yeşil olanların da rengini beyaza çeviriyoruz. Burada renklerden bahsetmişken bu konuda fazla bilgi olmadığı için buna biraz açıklık getirelim. 3,2 inç ekranda ham bir resim 400X240X2byte yer kaplıyor. Yani 192KByte. Yani her arka plan için tam bir resim yükleyince kontrol ve adres byte ları ile 250kByte civarı hafıza götürüyor.
Nextion her piksel için 16 bit kullanıyor. Yani her piksele (0-65535) 65536 renk verebiliyoruz. Renkler RGB565 olarak yönetiliyor. İkili sayı sistemi ile bakarsak şu şekilde. Kırmızı ve mavi 32 farklı değer alırken yeşil 64 değer alabiliyor.
Bunun etkisi günümüz bilgisayarlarında 24 bit resimlerde 16milyon veya 32bit resimlerde 4milyar renk olurken bunları Nextion ekranlarına aktarmak için dönüştürdüğümüzde renk sayısı bir hayli düşebiliyor. Renk hesabı için şöyle bir formül kullanabiliriz. R değeri 0-31, G değeri 0-63 ve B değeri 0-31 ise Renk değeri =(R *2048)+(G*32)+(B). Ayrıca bazı temel renkler sabit olarak da tanımlanmış. Direkt kullanılmak istenirse RED, BLUE, GRAY, BLACK, WHITE, GREEN, BROWN, YELLOW kullanılabilir.
Renkler için yaptığım basit bir örnek. Ben “Slider”lerin arkasına resim kullandım siz kullanmayabilirsiniz. Burada 5 adet “Text” objesi, 3 adet “Slider” ve 3 adet “variable” objesi kullanıldı ve tüm kod aşağıda görülüyor.
Renk Test dosyasını buradan indirebilirsiniz.
Yukarıda port konusuna değindik. Port kullanımı başlangıçta varsayılan “input” olarak ayarlanmıştır.
Ekranlar içeride 3,3 volt ile çalıştığından IO lar 3,3Volt ile çalışıyor. Portlar 5 modda kullanılabiliyor.
Konfigürasyon “cfgpio id, state, cmp” – “cfgpio pinno, mod, bağlantı”. İd veya pinno 0 ila 7 arasında port pin numarası. Mod aşağıda açıklaması. Bağlantı “cmp” ise mod 1 de geçerli ve Mod 1 de açıklanıyor.
MOD’lar
MOD 0 – iç pull – up dirençli giriş INPUT – bu normal giriş pin gibi çalışıyor. içerde 50Kohm direnç ile artı 3,3Volta bağlı. Yani bir input pini ölçtüğünüzde +3,3volt civarı görüyorsunuz. (3,3V+-%5)
MOD 1 – bağlantılı INPUT modu – yine bu da yukarıdaki gibi giriş pini fakat girişi ekranda bir objenin “buton pres” olayına atayabiliyorsunuz. 1 den 0’a geçişi “Düşen” sinyal “buton press” olayını, 0 dan 1’e “yükselen” sinyal “button release” olayını tetikliyor.
MOD 2 – push-pull Çıkış modu. Bu modda çıkışı 1 olduğunda +3,3V verebildiği gibi 0 yapıldığında çıkışı 0 volta çekebiliyor. Yani MOSFET, veya transistor sürmek için kullanılan bilinen mod.
MOD 3 – PWM modu. GPIO4 ten GPIO7’ye kadar olan 4 port çıkışı ayrı ayrı PWM çıkışı olarak kullanılabiliniyor. PWM frekansı ayrı ayrı verilemiyor. Tüm set edilen PWM çıkışları aynı frekans ile çalışabiliyor. PWM frekansı 1Hz ile 65536Hz arası olabiliyor. Varsayılan frekans 1000Hz. Çözünürlük maalesef çok yüksek değil 0 ila 100 arası.
MOD 4 – Open Collector modu. Bu mod pini sadece sıfıra çekebiliyor. Fakat örneğin 5V devreye bağlamak için ideal +5V hattına bir direnç ile bağlandığında pin 1 yapılırsa pinde +5volt görebiliyoruz. Genelde open collector transistorleri daha yüksek voltajlarda çalışsa da 5volt üzerine çıkılmamasını tavsiye ederim. Çıkışlarda koruma amaçlı 22ohm seri direnç yerleştirilmiş dolayısı ile pinlere 5-10mA den fazla bir yük bindirilmemesini tavsiye ederim.
Kullanımı
Port konfigürasyonu ilk açılış ekranının page0 “Preinitialize Event” ön hazırlık olayında yapılması gerekir ki kullanacağımız zaman sorun yaşamayalım. Daha sonra da yapılsa sıkıntı çıkmaz ancak kullanımdan önce yapılması gerek. Saat örneğimizde bunu “page0” “preinitialize event” te yaptım.
Port pini 0 kullandım ve Push-Pull modunda yani mod 2 de kullandım.
cfgpio 0, 2, 0
burada 3. Parametre mod 1 değil ise her zaman “0”.
Bir de kullandığım eeprom fonksiyonu var. Örnek olarak alarm değeri güç kesilmiş ise saklanması gerekir. Saat kendi pili ile saati yürütüyor fakat alarm değeri gibi bir değer güç gittiğinde saklanması gerekir. Veya farz edin ki bir kontrol paneli yaptık ve sıcaklık değerini PWM il yürütüyoruz. Böyle durumlarda değerin güç kesilmelerinde saklanması gerekir ve açıldığında o değer ile devam edilebilsin. Böyle durumda EEPROM kullanılabilinir.
Yazma ve okuma için 2 adet komut bulunuyor. “wepo” write eeprom – EEPROM’a yaz ve “repo” read eeprom – EEPROM’u oku. Bunun dışında seri port vasıtası ile okuma yazma için de 2 adet komut bulunuyor “wept” ve “rept”. Dış programlama konusuna değinmeyeceğimden bu son iki komuta değinmeyeceğim.
“wepo” ve “repo” 2 parametre ile çalışıyor. Bunlardan ikincisi beklendiği gibi adres birincisi ise yazılacak parametre. Önce adresten 2. değerden başlarsak, adres 0 ila 1023 arası bir değer ve yazılacak adresin başlangıcı veriliyor. Birinci parametre ise bir değişken, bir sabit değer olabiliyor. Değişken bir “text” olabilir. Bu durumda yazıldığı alan yazının uzunluğu +1 byte yer kaplıyor. Dolayısı ile örneğin ‘direnç.net’ saklanacaksa 11byte yer kaplıyor. Sayısal değerler her zaman 4 byte yer kaplıyor. Sonuç olarak ne sakladığımız ve adreslerin hesabını ona göre yapmamız gerek.
Örnek;
repo page1.alsaat.txt,2 … wepo alsaat.txt,2
Bir de ekranların “pre-initialize” ve “post-initialize” olaylarından bahsedeceğim. “pre-initialize” yukarıda da değindiğim gibi ön hazırlık olayıdır. Bu olayda, daha ekran açılması yapılmadan önce yapılacak işler yapılır. Örneğin bir “slider” objesinin eepromdan alınacak değer ile pozisyonu belirlenecek ise bu ön hazırlıkta yapılmalıdır. Başka bir örnek saat ve dakika değerleri okunur ve ön hazırlıkta bu değerler yazılır. “post-initialize” ise ekran açıldıktan sonra yapılacak işlerdir. Yine önceki örnekten yola çıkarsak saat ve dakika değerlerini “post-initialize” olayına yazmamız durumunda sayfa değişimlerinde saat ve dakika rastgele rakamlardan oluşabiliyor ve bir anlık karmaşa görüntüsü verebiliyor. Ön hazırlıkta oluşmamış bir değeri de okumaya çalışırsak yine öngörülmeyen sonuçlar ile karşılaşabiliriz.
Son olarak “debug” butonunu tıklayarak programın çalışması görüntüsü PC ekranında test edilebiliyor. Eğer hata varsa alt sol ekranda kırmızı ile belirtiliyor ve hata yazısı üzerine tıklanınca hatanın bulunduğu satıra yönlendiriliyor. Ancak hatanın ne olduğunu kendiniz bulmanız gerek.
Projemiz hatasız ise kaç KByte yer tuttuğu vs veriliyor.
Şimdi artık programı atma zamanı. Ben kullandığım USB/seri port çeviriciden atmayı başaramadım. Birkaç kez denememe rağmen bunu gerçekleştiremedim sıkıntı benim çeviricimden kaynaklanıyor olabilir. Onun için bir MikroSD Kart kullandım en küçük 1-2GB modellerinden olsa da yetiyor. Zira ekranların en büyük modellerinin bile 48MB. Bu proje 1-1,5MB civarı.
SD kartın boş olması gerekmiyor ama boş olması tavsiye ediliyor. Ekran tft uzantılı bir dosya yaratıyor. Bulunduğu yeri bayağı bir aradım. Zira proje ile aynı yerde bulunmuyor. Buldum ama kolayı var. “File” altında “Open Build Folder” menüsü tıklandığında “bianyi” isimli klasör açılıyor ve projenizin tft uzantılı dosyasını mikroSD kartınıza kopyalıyorsunuz. Burada tek bir tft uzantılı dosya bulunmasına dikkat edin. Sonra mikroSD kartını ekranın arkasındaki SD kart yuvasına yerleştirip elektriğini kesip tekrar veriyorsunuz. Programı ekran yükleyip “success” diye bir şey yazıyor. Elektriği kesip SD kartını da çıkardıktan sonra elektriği veriyorsunuz veee….. SONUÇ karşınızda. 🙂
Burada ekran hazırlığındaki gibi adım adım programlamayı anlatmadım. Onun yerine kullandığım fonksiyon ve komutların ne işe yaradığını anlatmanın daha faydalı olacağını düşündüm. Aşağıdaki linkten indirebileceğiniz projeden bu yazımda anlattığım konuları inceleyebilirsiniz.
Saat dosyasını buradan indirebilirsiniz.
Itead Nextion Ekranları incelemek için https://www.direnc.net/akilli-tft-lcd-display adresini ziyaret edebilirsiniz.
Nextion GPIO Özellikli Ekranları incelemek için https://www.direnc.net/nextion-gpio adresini ziyaret edebilirsiniz.
Nextion 32MB Bellekli Ekranları incelemek için https://www.direnc.net/nextion-32mb-hafizasi adresini ziyaret edebilirsiniz.
Nextion 16MB Bellekli Ekranları incelemek için https://www.direnc.net/nextion-16mb-hafizasin adresini ziyaret edebilirsiniz.
Nextion 4MB Bellekli Ekranları incelemek için https://www.direnc.net/nextion-4mb-hafizasin adresini ziyaret edebilirsiniz.
Geliştirme kartlarıyla uyumlu diğer ekranları incelemek isterseniz https://www.direnc.net/gelistirme-kartlariyla-uyumlu-lcd-display adresini ziyaret edebilirsiniz.
Murat Tanatar