KS0108 128×64 glcd termometre ccs c pic16f88 lm35

KS0108 128×64 glcd termometre ccs c pic16f88 lm35

PIC16F88, LM35 ve KS0108 ile grafik LCD termometre Bu devre, PIC16F88 mikrodenetleyici, iki adet LM35 sıcaklık sensörü ve KS0108 uyumlu 128×64 grafik LCD kullanılarak hazırlanmış çift kanallı basit bir termometredir. Ölçülen iki sıcaklık değeri aynı anda ekranda hem sayısal olarak hem de bar göstergesi şeklinde izlenebilir.

Devrenin sade yapısı, özellikle grafik LCD ile analog sıcaklık ölçümü denemek isteyenler için iyi bir başlangıç sunar.

Çalışma mantığı oldukça nettir: U2 ve U3 LM35 sensörlerinden gelen analog gerilimler PIC16F88’in analog girişlerine uygulanır, mikrodenetleyici bu değerleri ADC üzerinden okuyup sıcaklığa çevirir ve sonucu KS0108 grafik LCD üzerinde gösterir.

Benzer şekilde LM35 kullanılan başka bir sıcaklık kontrol uygulamasına da buradan bakılabilir.

GLCD Termometre ana bölümleri

BölümKullanılan elemanlarGörevi
Ölçüm katı2 x LM35İki farklı noktadaki sıcaklığı analog gerilim olarak üretir.
Kontrol katıPIC16F88Analog verileri okuyup sayısal sıcaklık bilgisine dönüştürür.
Görüntüleme katıKS0108 128×64 grafik LCDİki sıcaklık değerini ve doluluk çubuklarını ekranda gösterir.
Yazılım altyapısıCCS CADC okuma, ekrana yazdırma ve grafik çizim işlemlerini yürütür.

KS0108 pic16f88 lm35 devre şeması

ks0108-ccs-c-pic16f88-lm35

Şemaya göre bağlantı yapısı

Şemada LM35 sensörlerin çıkışları PIC16F88’in iki ayrı analog girişine bağlanmıştır. Grafik LCD tarafında ise veri ve kontrol hatları için mikrodenetleyicinin neredeyse tüm kullanılabilir pinleri değerlendirilmiştir.

Bu yüzden pin eşleşmesini değiştirerek devreyi yeniden düzenlemek istenirse, yazılım içindeki grafik LCD kütüphanesinin de buna göre güncellenmesi gerekir.

Harici kristal görülmemesi ve yazılım ayarları, bu devrenin dahili osilatörle çalıştığını gösterir. Bu yaklaşım devreyi sadeleştirir; ancak grafik LCD bağlantıları yoğun olduğu için pin planı baştan doğru kurulmalıdır.

PIC16F88 ile yapılan farklı ölçüm uygulamalarına buradan da göz atılabilir.

CCS C yazılımında öne çıkan noktalar

Yazılım tarafında en dikkat çekici bölüm sıcaklık okuma fonksiyonudur. get_temperature() fonksiyonu her kanal için tek seferlik ölçüm yapmıyor; 8×8 örnek alarak ortalama hesaplıyor.

Bu yöntem, ADC gürültüsünü azaltıp ekrandaki değerin daha sakin görünmesini sağlar.

Özellikle grafik LCD üzerinde sürekli güncellenen termometre uygulamalarında bu yaklaşım oldukça faydalıdır.

Ekranda yalnızca sıcaklık değeri yazdırılmıyor, aynı zamanda sıcaklığa bağlı olarak yatay bir doluluk çubuğu da oluşturuluyor.

Böylece kullanıcı hem sayısal değeri hem de hızlı görsel değişimi aynı anda takip edebiliyor.

Bu küçük detay, basit bir devreyi kullanım açısından daha anlaşılır hale getiriyor.

Ölçüm hassasiyeti ve pratik notlar

Bu tasarımda sıcaklık dönüşümü yazılım içinde doğrudan ADC sonucundan hesaplanıyor.

Bu nedenle besleme hattının kararlı olması ölçüm sonucunu doğrudan etkiler.

5V hattındaki dalgalanma arttıkça sıcaklık değeri de küçük sapmalar gösterebilir.

Daha kararlı bir sonuç istenirse düzenli besleme, kısa sensör kablosu ve iyi topraklama önemli hale gelir.

LM35 analog çıkışlı bir sensör olduğu için uzun kablolarda gürültüye daha açık davranabilir.

Sensör uzak bir noktaya taşınacaksa kablolama düzeni ve filtreleme gözden geçirilmelidir.

Daha dijital ve hat dayanımı yüksek bir alternatif düşünenler için DS18B20 tabanlı uygulamalar da fikir verebilir.

Kullanım alanları

  • İki farklı noktanın sıcaklığını aynı anda izlemek isteyen hobi projeleri
  • Soğutucu, kutu içi hava ve ortam sıcaklığını birlikte gözlemek
  • Grafik LCD sürmeyi öğrenmek isteyen PIC kullanıcıları
  • CCS C ile ADC ve GLCD kütüphanelerini bir arada denemek

Kurulum sırasında dikkat edilmesi gerekenler

  • LM35 sensörlerin bacak dizilimi mutlaka kontrol edilmelidir.
  • Grafik LCD pin sırası modülden modüle değişebileceği için bağlantılar ekranın veri sayfasına göre doğrulanmalıdır.
  • PIC16F88’in analog giriş ayarları ile LCD kontrol pinleri karıştırılmamalıdır.
  • Besleme hattı temiz değilse ekrandaki sıcaklık değeri sabit görünmeyebilir.
  • Devrede neredeyse tüm pinler kullanıldığı için yazılım ve şema birlikte kontrol edilmeden kart çizimine başlanmamalıdır.

Proteus simülasyonu ve dosyalar

Bu çalışmada yalnızca kaynak kod değil, Proteus VSM simülasyon dosyası ve derlenmiş HEX dosyası da bulunuyor.

Bu sayede devreyi gerçek donanım kurmadan önce simülasyonda test etmek mümkün oluyor.

Özellikle grafik LCD bağlantılarında pin hatası yapma ihtimali yüksek olduğundan, simülasyon dosyası zaman kazandıran faydalı bir ek haline geliyor.

Grafik lcd termometre çalışma görüntüleri

main.c ccs c yazılım içeriği


#include <16F88.h>
#fuses INTRC_IO,NOWDT,NOPUT,NOMCLR,BROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG,NOPROTECT,CCPB3
#use delay (clock=8000000)
#byte PORTA = 0x0005
#byte PORTB = 0x0006 
#byte TRISA = 0x0085 
#byte TRISB = 0x0086
#byte ANSEL = 0x009B
#byte ADCON0 = 0x001F
#byte ADCON1 = 0x009F
#byte ADRESH = 0x001E
#byte ADRESL = 0x009E
#bit ADON = ADCON0.0
#bit GO_DONE = ADCON0.2

#define ON  1
#define OFF 0

#include "KS0108.c"
#include "graphics.c"
#include 

float get_temperature(int1 channel);

void main() 
{
	float temp;
	int8 length, str[5]={};
	
	TRISA=0b00000011;	//set RA0 and RA1 to input
	ANSEL=0b00000011;	//set RA0 and RA1 to analog
	ADCON1=0b11000000;	//setup adc
	
	glcd_init(on);
	glcd_fill(OFF);
	
	draw_background();
	glcd_char(0, 26, 11, 1);	
	glcd_char(0, 32, 12, 1);

	while(true)
	{
		temp=get_temperature(0); //get adc value from ADC channel 0 and convert it to temperature

		sprintf(str,"%4.1f",temp);	//convert float value to string
		glcd_string(0,4,str,1);		//and draw it on the screen

		length=(int8)((temp*2))+24;	//then draw some graphics
		if(length>124) length=124;
		if(length<24) length=24;
		glcd_rect(24, 6, length, 19, 1, 1);
		glcd_rect(length+1, 6, 125, 19, 1, 0);


		temp=get_temperature(1);	//same things to channel 1

		sprintf(str,"%4.1f",temp);
		glcd_string(0,40,str,1);

		length=(int8)((temp*2))+24;
		if(length>124) length=124;
		if(length<24) length=24;
		glcd_rect(24, 44, length, 57, 1, 1);
		glcd_rect(length+1, 44, 125, 57, 1, 0);
	}
}

float get_temperature(int1 channel)
{
	int16 value, sum1, sum2;
	int8 i, j;

	if(channel==0)
		ADCON0=0b01000000;	//select adc channel 0
	else
		ADCON0=0b01001000;	//select adc channel 1

	ADON=true;
	delay_us(100);

	sum2=0;
	for(j=0; j<8; j++)
	{
		sum1=0;
		for(i=0; i<8; i++)
		{
			GO_DONE=true;
			while(GO_DONE);
		
			value=make16(adresh,adresl);
		
			sum1+=value;
			delay_us(100);
		}
		sum1/=8;

		sum2+=sum1;
	}
	sum2/=8;
		
	ADON=false;

	return (float)sum2/2;
}

PIC16F88, iki LM35 sensör ve KS0108 grafik LCD ile kurulan bu termometre devresi, hem analog sıcaklık ölçümünü hem de grafik LCD kullanımını aynı projede birleştiren faydalı bir uygulamadır.

Kodun CCS C için hazır olması, simülasyon dosyasının bulunması ve iki kanallı yapısı, devreyi yalnızca basit bir gösterim olmaktan çıkarıp doğrudan denenebilir bir proje haline getiriyor.

Paylaş:

1 Yorum

  1. E
    Erdem

    Merhaba hocam devre çok güzel görünüyor fakat lm35 sensörünün ds18b20 kadar hassas olmadığını duymuştum bu devreyi ds18b20 ile çalışacak şekilde tasarlayabilirmisiniz

    Yanıtla

Yorum Yap