19 Ocak 2024 Cuma

Arduino MEGA 2560 ile NTC Termistörü ile Sıcaklık Ölçümü ve i2c LCD Ekranda Okuma

Arduino MEGA 2560 kart ile NTC Termistörünü okuyup LCD Ekranda gösterme:



Arduino üzerinden alınan +5V ile LCD ve NTC devreleri beslendi. Yapılan bağlantı yukarıdaki gibi olacak. Kullanılan NTC 10K değerindedir. NTC nin direnç değeri 25°C sıcaklıkta sahip olduğu direnç değeriyle anılırlar.




Burada tüm LDC Lerin i2c adresleri aynı. Görüldüğü üzere i2c hattı üzerinde aynı adrese ait birden çok LCD çalışabilmekte.  Çünkü LCD'ler sadece MCU dan verialma modunda olduğu için sorun çıkmamakta. Eğer LCD yerine MCU ya veri gönderen bir donanım bağlı olsaydı o zaman donanım hatası alacaktık.




LCD adresleri 0x27   ,  0x26   ve  0x25 olarak değiştirildi. 0x26 adresli Lcd AN0 kanalındaki ölçüm değerini, 0x25 adresli LCD ise AN1 kanalındaki ölçüm değerini gösterecek şekilde yazılımda gerekli düzenlemeler yapıldı.

i2c Lcd kütüphanesini linkten indirebilirsiniz. Mete Hocaya emekleri için teşekkür ederiz.


#include <Wire.h>
#include <LiquidCrystalTr_I2C.h>
#include <math.h>


LiquidCrystal_I2C Lcd_Main(0x27, 16, 2);  // i2c Lcd Adresi 0x27.  Ayrıntı için: https://www.ti.com/lit/gpn/PCF8574      
LiquidCrystal_I2C Lcd_AN0(0x26, 16, 2);
LiquidCrystal_I2C Lcd_AN1(0x25, 16, 2);

void setup()
{
 
  Lcd_Main.begin();
  Lcd_AN0.begin();
  Lcd_AN1.begin();
  Serial.begin(9600);

 
  Lcd_Main.backlight();  // Lcd Arka Plan aydınlatması açma komutu,  Kapatmak için ise Lcd_Main.noBacklight();
  Lcd_AN0.backlight();
  Lcd_AN1.backlight();
 

}

double NTC_Hesapla(int NTC_Oku) {   // Void Loop içerisindeki Ham_Deger değişkenindeki veriyi NTC_Oku değişkeni ile  NTC_Hesapla fonksiyonu içerisine aldık.
  double NTC_Hsp_Sicaklik;      // Ondalık değerimizi tutacak değişken.
  NTC_Hsp_Sicaklik = log(((10240000 / NTC_Oku) - 10000));  //  10K değerinde NTC kullandım.  25°C ortamda ölçülen direnç değeridir.
  NTC_Hsp_Sicaklik = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * NTC_Hsp_Sicaklik * NTC_Hsp_Sicaklik)) * NTC_Hsp_Sicaklik);  // https://www.thinksrs.com/downloads/programs/therm%20calc/ntccalibrator/ntccalculator.html
  NTC_Hsp_Sicaklik = NTC_Hsp_Sicaklik - 273.15;  //  Kelvin'den Santigrat çevrimi.
  return NTC_Hsp_Sicaklik;
}

void loop()
{
  int Ham_Deger = analogRead(A0);
  double sicaklik_AN0 = NTC_Hesapla(Ham_Deger);

  Ham_Deger = analogRead(A1);
  double sicaklik_AN1 = NTC_Hesapla(Ham_Deger);


  Serial.print("AN0: " );
  Serial.print(sicaklik_AN0 );
  Serial.print("  AN1: " );
  Serial.println(sicaklik_AN1 );

  // LCD 0X27
  Lcd_Main.clear();
  Lcd_Main.print("NTC SICAKLIK");
  Lcd_Main.setCursor(0,1);
  Lcd_Main.print("ÖLÇÜM UYGULAMASI");
  // LCD 0X26
  Lcd_AN0.clear();
  Lcd_AN0.print("AN-0 SICAKLIK");
  Lcd_AN0.setCursor(0,1);
  Lcd_AN0.print(sicaklik_AN0);  Lcd_AN0.print(" \337C");    //   "\337"= Derece Sembolü
  // LCD 0X25
  Lcd_AN1.clear();
  Lcd_AN1.print("AN-1 SICAKLIK");
  Lcd_AN1.setCursor(0,1);
  Lcd_AN1.print(sicaklik_AN1);  Lcd_AN1.print(" \337C");    //   "\337"= Derece Sembolü
  delay(1500);
}


30 Temmuz 2018 Pazartesi

18F4620 ve Enc28j60 ile İnternet Erişimli Digital Termostat


Bu projenin  öyküsü 1 yıl öncesine kadar uzanmaktadır. Geçtiğimiz yıl Eylül -Ekim aylarıydı. Çalıştığım iş yerinde soğuktan etkilenecek-donacak boruların çevresine ısıtıcı rezistans monte etmiş ve bunlara termostat bağlamıştık.

Termostat; üzerinde ayar butonları ve küçük 7 segment 4 adet display olan bir cihazdı. Çalıştırmak, durdurmak, çalışıp-çalışmadığını takip etmek ve sıcaklığını gözlemek için termostatın yanına kadar gitmek gerekiyordu.

Termostat bulunduğu yerde başka cihazlarda bulunmakta, bunların kontrolü için de geliniyor ve kontrol yapılıyor ama bu benim düşünceme tamamen ters bi durum. Yani 8-10 lokasyon alanında kameradan pompalara aydınlatmalardan transdüserlere kadar herşeyin uzaktan izlenebildiği bir yere getirip ilkel bi  termostat takılması  bence çok yanlıştı.

Kendimce    buna nasıl bi çözüm bulabileceğimi  araştırmaya başladım. İlk aklıma gelen, daha önce çalıştığım jeotermal serada uygulamaya koyduğum dorji modülleri ile uzaktan kontrol etmekti. Çünkü burada düşüncem, her Termostat başına pic+dorji kullanırım, komutların başına da termostat ayrımı yapacak id eklerim, tüm dorjilere göderirim ve sonrasında alıcı devrelerde id'si uyuşan devreyi aktif ederim diye düşünüyordum. Yani I2C iletişim mantığını değiştirip RF de uygulamak istiyordum.  Fakat sonra bundan da vazgeçmek zorunda kaldım, çünkü atladığım bir konu vardı. Ortamda  çok fazla gürültüye neden olacak etmenler vardı. Bu da güvensiz bir kontrol sistemi olacaktı.


Bu ve buna benzer sorunların en iyi çözümünün yerel ağ bağlantısı üzerinden kontrol etmek olduğuna karar verdim. Bunu da microchip firmasının üretmiş olduğu ENC28J60 Ethernet - Spi dönüştürücüsü ile yapabilirdim. Çünkü kullandığım CCS C Compilers içerisinde kütüphanesi mevcuttu.


ENC28J60:

Enc28J60


Enc28J60 için Datasheet sayfa 7'de bağlantı şeması bu şekilde verilmiş.
Burada;

Mcu: 18F4620
          I/O   = SPİ iletişiminin CS (chip Select) pinidir. Ben C0 pinini kullandım.
          SCK = SPİ iletişiminin clock pinidir.
          SDO = SPİ iletişiminin data çıkış pinidir.
          SDI  = SPİ iletişiminin data giriş pinidir.

Ben, birde ENC devresi ile uğraşmamak ve PCB ebatım büyümesin fazladan para ödemeyim diye şu modülü kullandım. 


PCB çizimini Diptrace ile yaptım
PCB 3D görüntüsü (Diptrace)


PCB 'leri çinde yaptırdım. Site ismi  JLCPCB 10x10 cm ölçülerde 10 ad pcb 2$, Gönderi 12,8 $ tuttu. Gerçekte sanki tam tersi gibi neyse artık o konuya girmeyelim.

JLCPCB tüm PCB aşamalarını takip etmemizi sağlıyor.

Nihayet PCB elime ulaştı, Gayet iyi görünüyor.

PCB arka tarafı.




Birkaç eleman lehimledim. Test aşamasında şuan çalışıyor.


Arka taraf. Renkli kablolar icsp bağlantısı. kırmızı soket Rs232 bağlantısı(opsiyonel).



 WEB:

18F4620 içerisine yazdığım program bu haliyle 3 ayrı ısıtıcıyı kontrol edebiliyor.  Bunlar sayfanın üst kısmında Isıtıcı A, B ve C sekmelerinden yapılıyor.  Isıtıcıya lokal ip ile 192.168.2.55 adresi üzerinden bağlanıyorum. Bu ip programlama esnasında ne yazarsanız odur. istersek modemden oto ip alacak şekilde de yapılabilir fakat her seferinde modem farklı ip vereceğinden sorun olur.

Sayfa da herbir ısıtıcı (A,B,C) nın ölçülen sıcaklık değeri, ayarlanan sıcaklık değeri ve ısıtıcı durumu gibi bilgiler yer almaktadır. Bu bilgiler silinmemesi için MCU'nun eeprom belleğinde saklanmaktadır. Bu nedenle enerji kesilse bile silinmez ve MCU işleme kaldığı yerden devam edebilir. Aynı şekilde web sayfası ilk açıldığında HTML alanlarının boş kalmaması için javascript kodu içerisine eklediğim sorgu fonksiyonu MCU dan değerleri alıp sayfayı doldurmaktadır.  Bu sayede MCU içerisindeki ayar parametreleri görülmektedir. Eğer web sayfasına MCU içerisinde değerleri sorup doldurmasaydık aşağıdaki gibi hoş olmayan görüntü olacaktı.

 Yukarıda görüldüğü üzere sayfada boşluklar var. Sayfa açıldığında ilk değerleri istemek bu nedenle önemli.

Isıtıcı durumu kısmında iki farklı fonksiyon bulunmaka. Bunlar,
OTO: Isıtıcının otomatik modda; yani, set değerini gözeterek ısıtıcıyı devreye sokup çıkartıyor.
MAN: Isıtıcının manuel modda; ısıtıcı, ISITICI ON ve ISITICI OFF butonları ile devreye alınır. Set değerine bakılmaksızın ssdece verilen komutu uygular. Oto moddayken bu butonlar komut almaz.

Yesil Renk: Üzerinde yazan OTO-MAN durumuna göre ısıtıcının şuan devrede olduğunu gösterir.
Kırmızı Renk: Üzerinde yazan OTO-MAN durumuna göre ısıtıcının şuan devre dışı olduğunu gösterir.

Ayrıca bir diğer özellik ise manuel moddan otomatik moda alındığında , manuel konumdayken ısıtıcının on yada off durumu neyse, otomatik moddan manuel moda alınca eski manuel çalışma şekline devam eder.

18F4620 içerisine yazdığım program bu haliyle 3 ayrı ısıtıcıyı kontrol edebiliyor.




Lokal ip dışında internet üzerinden kontrol etmek için modem üzerinden 80 portunu 192.168.2.55 adresine yönlendirmemiz gerekmektedir.





11 Ekim 2017 Çarşamba

LCD Ekranlı, Alarmlı Saat

12864B_GLCD

GLCD Ekran



GLCD Ekran Arka Taraf



Grafik LCD : Grafik LCD olarak Winstar firmasının WG12864B-TMI-V#N ekranını kullandım. 
Bu ekranın;
5V çalışma gerilimi, 2,4" ekran boyutu, NT7108 konrolcüsü, 8 bit data hattı, Led arka plân aydınlatması,  2.54mm 20 pin SIL bağlantı, -20 ile +70°C arasında sıcaklıkta çalışabilme gibi özellikleri vardır.


GLCD Ekran Pins

VDD           :  +5 V  Besleme
GND           :  - Besleme
Vo               : Ekran kontrast ayar pini
DB0~~DB7: Ekran data pinleri
CS1             :GLCD bank 1 secme ucu
CS2             :GLCD bank 2 secme ucu
RST            :Ekran reset pin
R/W            :Ekran okuma yazma mod pini
DI               :Ekran data-komut seçim pini
E                 :LCD aktif pini
Vee             :Negatif voltaj pini
LIGHT      :LCD arka aydınlatma (5v)





 DS 1302 RTC ENTEGRESI

DS1302 RTC Görünümü


1302 pinout



Vcc2=    Normal Besleme.
Vcc1=    Pil'den Besleme.
X1-X2= 32,768 KHz Crystall.
GND=   0 V Besleme.
CE=       Giriş pini. Entegreyi aktif etme pini.
I/O=       Giriş-Çıkış Pini. Data ve komutlar bu pinden okunup-yazılmaktadır.
SCLK=  İletişim protokolü pals giriş ucu.

Maxim_Dallas firmasının üretmiş olduğu; içerisinde, 2100 yılına kadar takvim bilgilerinin kayıtlı olduğu entegredir. Entegrenin CE, I/O ve SCLK pinleri dahili olarak 40KOhm direnç ile Pull-Down bağlantı yapılmıştır. Vcc2 normal besleme girişidir. Vcc1 Pilden besleme girişidir. Eğer Vcc2 gerilimi, Vcc1 geriliminden 0,2V fazla ise, Entegre  Vcc2 'den beslenmeye başlar. 2V ile 5,5V arasında gerilimde çalışabilir. Pil ile 2V beslemede yaklaşık 110nA (nanoAmper)  akım çeker. X1-X2 pinleri arasına 32,768 KHz kristal bağlanmalı ve kristal gövdesi GND'ye irtibatlandırılmalıdır. (Bkz:Sayfa5-Figure2).


PROGRAMLAMA

Devre genel olarak 1 adet PIC16F877A, 1 adet Ds1302,1 adet CR2032 pil, 1 adet Buzzer, 1 adet GLCD ve biri Set, biri de Arttır/Up butonu olmak üzere 2 adet butondan oluşmaktadır. Tabi bunun yanında enerji besleme katını da ilave etmem gerekir.


Ana Ekran



Ana ekranda, Tarih, Saat, Haftanın günü ve ayarlanan alarm saatleri görünmektedir.  Büyük punto saati göstermektedir. Altta; 15:15 ayarlanan 1. alarm, 14:21 ise ayarlanan 2. alarmdır. Eğer; ana ekranda iken up butonuna basılırsa alarmlar aktif yada pasif edilebilir. Alarm saatlerinin başında bulunan yuvarlak (radio button) kısımlar alarmların aktif/pasif edilme durumunu gösterir. Alarm; yuvarlağın, içi boş ise pasif, içi dolu ise aktiftir. 
Ayarlanan alarm zamanı geldiğinde 1 dk boyunca alarm çalar.Alarm susturulmak istendiğinde UP butonuna basmak yeterlidir. Ayrıca her saat başı 4 adet, her buçuk'da da 2 adet dit sesi çalar. 
Enerji kesilip-gelme durumunda DS1302 pilden beslendiği için saat bilgisini kaybetmez. Ayarlanan alarm saat bilgileri de pic'in dahili eepromunda kayıtlı olduğu için alarm bilgileri de korunur. Kısacası uzun süre olsa dahi enerji kesintilerinden devre etkilenmez. Fakat enerjisiz durumlarda alarmın çalmayacağı unutulmamalıdır.


Menü=1 Saat Ayar Ekranı


Ana ekrandayken SET tuşuna basıldığında saat ayar ekranı gelmektedir. Up butonu kullanılarak saat ayarlaması yapılır. Buradan sonraki tüm menüler aynı şekilde SET ve UP butonlarına basarak ayarlanır.



Menü=2 Dakika Ayar Ekranı

Menü=3 Ay'ın Günü Ayar Ekranı


Menü=4 Ay Ayar Ekranı


Menü=5 Yıl Ayar Ekranı


Menü=6 Gün Ayar Ekranı


Menü=7 Alarm-1 Saat Ayar Ekranı (Alarm-2 Aynısı)


Menü=8 Alarm-1 Dakika Ayar Ekranı





YAZILIM 

16F877A mikrodenetleyicisine yüklenecek olan Hex dosyası ve devrenin kurulacağı  PCB çizimi linklerden ulaşılabilir. Pcb kendi çizimimdir. Saat'i bunun üzerinde çalıştırdım. Linkdeki dosyaların şifresi         abdullah.tekin            dir. PCB linkindeki dosyayı herhangi bir pcb firmasına gönderirseniz size hazırlayıp gönderebilir.

3D kart görüntüsü


PCB genel amaçlı kullanım için tasarım yapıldığından çok fonksiyoneldir. Bunlar;

PicAnalog girişine bağlı 8 Adet Analog giriş (Sıcaklık, Basınç, Gerilim vs ölçümü)
Analog enstrumanlar için ayrı besleme girişi.
PicUart çıkışına bağlı Dorji DRF7020D20 için hazır soket bağlantısı,
PicUart çıkışına bağlı extra soket SIL4 (Vcc-Tx-Rx-Gnd),
Pic Port-D çıkışında 2 adet GLCD soketi SIL20 (Winstar 12864 TypeA ve B'ye göre ).
Kart beslemesi için 10VA- 12V Trafo ve 78K05.
DS1302 Rtc entegre.
CR2032 pil soketi.
7 adet extra giriş-çıkış pini.



PCB üzerinde saat devresini çalıştırabilmek için;

R1-R5-R6:   10K
PIC:             16F877A
RTC:            DS1302
Y1:               20 MHz Kristal
Y2:               32,768 KHz Kristal
C1-C4:         100 uF  35V
C3-C2:         22pF
C7-C8:         100nF
B1:               CR2032 PİL
GLCD_B:   128x64 LCD Ekran
7805:            MC7805ACK
POT:            50K POT
LCD_LIGHT: Pinler kendi arasında birleştirilirse Lcd Ekran ledi yanar.
PT150 Vcc:  Bu pinin + ile gösterilen kısmına +5V bağlanacak.
Pwr:             Power Ledi
D2-D5:         1N4001 vb.
RST:             Pic reset buton bağlantısı
ICSP:           Icsp programlama bağlantı noktası. PGD ve PGC pull-down yapılmalı.
                      (soldan-sağa= Vpp-Vcc-GND-PGD-PGC )
Trafo:          12V 10VA trafo ( PCB programında trafo kılıfını kendim çizdim)
AN0:            An-Vcc Pinleri arasına Set butonu bağlanacak.
AN1:            An-Vcc Pinleri arasına Up butonu bağlanacak.
AN2:            An-Gnd Pinleri arasına 5V buzzer bağlanacak. AN girişler 5mm SIL3 header/klamens                         uyumludur.

PCB üzerinde diğer kısımlar opsiyoneldir.