PIC18F4550 ile DHT11 ve Nokia 5110 LCD Kullanımı
Bu yazımızda, PIC18F4550 ile DHT11 sensöründen aldığımız verileri Nokia 5110 LCD ekrana yazdırıyoruz ve DHT11 nem ve sıcaklık sensörüyle nasıl arabirim oluşturulacağına bakıyoruz. Sıcaklık (santigrat derece olarak) ve nem (bağıl nem yüzdesi, %rH olarak) değerleri 84 x 48 piksel çözünürlüğe sahip Nokia 5110 LCD’de görüntülenecektir.
Bu projede derleyici olarak CCS PIC C kullanacağız.
Gerekli Malzemeler
- PIC18F4550 mikro denetleyici
- Nokia 5110 (3310) LCD ekran
- DHT11 sensorü
- AMS1117 3.3V voltaj regülatörü ya da 3.3V kaynak
- 10 uF kondansatör
- 100 nF seramik kondansatör
- Dirençler: 3.3kΩ x 5 , 2.2kΩ x 5 , 4.7kΩ x 1
- 5V kaynak
- Devre tahtası(breadboard)
- Kablolar
Devre Şeması
Tüm GND terminaller birbirine bağlanmalıdır.
DHT11 sensörünün 4 pimi vardır (soldan sağa):
VCC: +5V hattına bağlı
Data pini: PIC18F4550 pin RB2’ye (#35) bağlı
bağlı değil pin
GND: devre toprağına bağlı (0V).
Devre şemasında gösterilen Nokia 5110’un 8 pini (soldan sağa): RST (reset), CE (chip etkinleştirme), DC (veya D/C: veri/komut), Din (veri girişi), Clk (saat), VCC (3.3V), BL (arka ışık) ve GND (toprak) olarak adlandırlır.
Nokia 5110 LCD yalnızca 3,3V ile çalışır. LCD modülü, AMS1117 3V3 voltaj regülatöründen gelen 3.3V ile beslenir, bu regülatör 5V’yi 3.3V’a düşürür.
PIC18F4550’yi LCD modüle bağlamak için her hat için voltaj bölücü kullandık yani 5 adet voltaj bölücü vardır. Her voltaj bölücü 2.2k ve 3.3k dirençlerden oluşur, bu 5V’yi yeterli olan 3V’a düşürür.
Bu nedenle, Nokia 5110 LCD pinleri PIC18F4550 MCU’ya aşağıdaki gibi bağlanır (her biri voltaj bölücü aracılığıyla):
RST (reset) pini RD0 pinine (#19) bağlanır
CE (chip etkinleştirme) pini RD1 pinine (#20) bağlanır
DC (veri/komut) pini RD2 pinine (#21) bağlanır
DIN (veri girişi) pini RC7 pinine (#26) bağlanır
CLK (saat) pini RB1 pinine (#34) bağlanır
VCC ve BL, AMS1117 3V3 regülatör çıkış pinine, GND ise devre toprağına (0V) bağlanır.
Bu projede PIC18F4550 dahili osilatörünü kullanır ve MCLR pin fonksiyonu devre dışı bırakılır.
Proje Kodu
Aşağıdaki C kodu CCS C derleyicisi içindir, 5.051 sürümü ile test edilmiştir.
Proje C kodunu derleyebilmek için Nokia 5110 LCD için bir sürücü gereklidir, indirme linki aşağıdadır. NOKIA5110.c adlı sürücü dosyasını indirdikten sonra proje klasörünüze ekleyin:
#define LCD_RST PIN_D0 #define LCD_CS PIN_D1 #define LCD_DC PIN_D2 #define DHT11_PIN PIN_B2 #include <18F4550.h> #fuses NOMCLR, INTRC_IO, NOWDT, NOPROTECT, NOLVP #use delay(clock = 8MHz) #use spi(SPI1, BAUD = 1000000, MODE = 3, BITS = 8, STREAM = LCD_STREAM) #include <NOKIA5110.c> int8 T_Byte1, T_Byte2, RH_Byte1, RH_Byte2, CheckSum; void Start_Signal(void) { output_drive(DHT11_PIN); output_low(DHT11_PIN); delay_ms(25); output_high(DHT11_PIN); delay_us(30); output_float(DHT11_PIN); } int1 Check_Response(void) { setup_timer_1(T1_INTERNAL | T1_DIV_BY_2); set_timer1(0); while(!input(DHT11_PIN) && get_timer1() < 100); if(get_timer1() >= 100) return 0; else { set_timer1(0); while(input(DHT11_PIN) && get_timer1() < 100); if(get_timer1() >= 100) return 0; else return 1; } } void Read_Data(int8 *dht_data) { int8 j; *dht_data = 0; setup_timer_1(T1_INTERNAL | T1_DIV_BY_2); for(j = 0; j < 8; j++) { set_timer1(0); while(!input(DHT11_PIN)) if(get_timer1() >= 100) { setup_timer_1(T1_DISABLED); return ; } set_timer1(0); while(input(DHT11_PIN)) if(get_timer1() > 100) { setup_timer_1(T1_DISABLED); return ; } if(get_timer1() > 50) bit_set(*dht_data, (7 - j)); } setup_timer_1(T1_DISABLED); } void main() { setup_oscillator(OSC_8MHZ); delay_ms(1000); LCD_Begin(); LCD_Clear(); LCD_SetContrast(50); LCD_DrawHLine(0, 23, LCDWIDTH); LCD_TextSize(1); LCD_GotoXY(6, 0); LCD_Print("TEMPERATURE:"); LCD_GotoXY(15, 28); LCD_Print("HUMIDITY:"); LCD_Display(); while(TRUE) { Start_Signal(); if(Check_Response()) { Read_Data(&RH_Byte1); Read_Data(&RH_Byte2); Read_Data(&T_Byte1); Read_Data(&T_Byte2); Read_Data(&CheckSum); if(CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF)) { LCD_GotoXY(24, 12); printf(LCD_Print, "%02u.0 C", T_Byte1); LCD_DrawRect(50, 12, 3, 3); LCD_GotoXY(24, 40); printf(LCD_Print, "%02u.0 %%", RH_Byte1); } else { LCD_GotoXY(24, 12); LCD_Print("ChkSum"); LCD_GotoXY(24, 40); LCD_Print("Error!"); } } else { setup_timer_1(T1_DISABLED); LCD_GotoXY(24, 12); LCD_Print("Sensor"); LCD_GotoXY(24, 40); LCD_Print("Error!"); } LCD_Display(); delay_ms(1000); } }
Son Görüntü
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.