18f4520 + 16x2 lcd + sensör

Başlatan trukla, 28 Mayıs 2015, 15:10:25

trukla

merhabalar;
Benim 18f4520+ 16x2 lcd + herhangi bir sensör kullanarak yapmam gereken bir projem var.LM35 kullanarak termometre devresini hoca örnek olarak yaptığı için kabul etmiyor ve malesef başka projede bulamıyorum(bilgi eksikliğimden dolayı).Bu sefer farklı bir proje sht11(sıcaklık ve nem sensörü) kullanarak yapılan bir proje buldum.fakat bununda kodları 128x64 glcd için.Benim sorum Bu kodları 16x2 lcd için değiştirebilir miyiz?, nasıl değiştirebiliriz ya da yukarıdaki ekipmanlarla daha farklı ne gibi bir proje tasarlayabilirim? proteus çizimi , baskı devre montaj vs. kısımlarını severek yapıyorum ve o konuda bilgi sahibi olduğumu söyleyebilirim fakat iş programlama kısmına geldiğinde bilgim olmadığı için hiçbirşey yapamıyorum.Lütfen söylediklerimden benim için kod yazmanızı istediğimi düşünmeyin sadece nasıl yapabiliriz noktasındayım çünkü bir kaç kez benzer tepkiler aldım.Gerektiği takdirde proteus çizimimi ve elimde bulunan c kodlarını paylaşabilirim.
kullandığım derleyici ccs ve lcd de ismimi yazabilmek için bitmap kullandım.

herkese teşekkürler iyi çalışmalar.

Recep METE

Kodları yayinlada üzerinde calisalim. Yardımcı olmaya çalışırız.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Denizccan

hc-sr04 ultrasonik mesafe sensörü kullanarak mesafe ölçümü yapabilirsin. Yeterli sayıda kaynağı olan bir sensör, ucuz ve  kolay ulaşılabilir.

mehmet

SHTxx pahalı, DHTxx olanlarını tavsiye ederim. Ya da DS18B20
olabilir.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

trukla

Alıntı yapılan: Recep METE - 28 Mayıs 2015, 17:36:38
Kodları yayinlada üzerinde calisalim. Yardımcı olmaya çalışırız.

#include <18F452.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#device ADC=10          // 10 bitlik ADC kullanılacağı belirtiliyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
//#use fast_io(e)            //Port yönlendirme komutları E portu için geçerli
#use fast_io(a)            //Port yönlendirme komutları A portu için geçerli
#include <HDM64GS12x.c>
#include <graphics.c>
#include <stdio.h>
#define sht_data_pin   PIN_c1    //SHT11 data ucu 
#define sht_clk_pin    PIN_c0    //SHT11 clock ucu
#INT_AD                          // ADC çevrimi bitti kesmesi
#define mode pin_e0
#define yukari pin_e1
#define asagi pin_e2
#define ok pin_a5



unsigned long int bilgi;
float voltaj;            
float restemp, truehumid, basinc;
float g_restemp, g_truehumid, g_basinc;
char s_sicaklik[6];    
char s_nem[6]; 
char s_basinc[6]; 

char tmp[]="C";
char tmp1[]="%";
char tmp2[]="kPa";
void comstart (void)
{
 output_float(sht_data_pin);  //data high
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(1);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(1);
 output_bit(sht_data_pin, 0); //data low
 delay_us(1);
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(2);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(1);
 output_float(sht_data_pin);  //data high
 delay_us(1);
 output_bit(sht_clk_pin, 0);  //clk low
}

//***** SHT11 yazma fonksiyonu*****

int1 comwrite (int8 iobyte)
{
 int8 i, mask = 0x80;
 int1 ack;

 //Komut gönderilir
 delay_us(4);
 for(i=0; i<8; i++)
  {
   output_bit(sht_clk_pin, 0);                          //clk low
   if((iobyte & mask) > 0) output_float(sht_data_pin);  //data high if MSB high
   else output_bit(sht_data_pin, 0);                    //data low if MSB low
   delay_us(1);
   output_bit(sht_clk_pin, 1);                          //clk high
   delay_us(1);
   mask = mask >> 1;                                    //shift to next bit
  }

 //Shift in ack
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(1);
 ack = input(sht_data_pin);   //get ack bit
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(1);
 output_bit(sht_clk_pin, 0);  //clk low
 return(ack);
}

//***** SHT11 veri okuma fonksiyonu *****

int16 comread (void)
{
 int8 i;
 int16 iobyte = 0;
 const int16 mask0 = 0x0000;
 const int16 mask1 = 0x0001;

 //shift in MSB data
 for(i=0; i<8; i++)
  {
   iobyte = iobyte << 1;
   output_bit(sht_clk_pin, 1);                //clk high
   delay_us(1);
   if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit
   else iobyte |= mask0;
   output_bit(sht_clk_pin, 0);                //clk low
   delay_us(1);
  }

 //send ack 0 bit
 output_bit(sht_data_pin, 0); //data low
 delay_us(1);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(2);
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(1);
 output_float(sht_data_pin);  //data high

 //shift in LSB data
 for(i=0; i<8; i++)
  {
   iobyte = iobyte << 1;
   output_bit(sht_clk_pin, 1);                //clk high
   delay_us(1);
   if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit
   else iobyte |= mask0;
   output_bit(sht_clk_pin, 0);                //clk low
   delay_us(1);
  }

 //send ack 1 bit
 output_float(sht_data_pin);  //data high
 delay_us(1);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(2);
 output_bit(sht_clk_pin, 0);  //clk low

 return(iobyte);
}

//***** SHT11 okuma için bekleme fonksiyonu *****

void comwait (void)
{
 int16 sht_delay;

 output_float(sht_data_pin);                     //data high
 output_bit(sht_clk_pin, 0);                     //clk low
 delay_us(1);
 for(sht_delay=0; sht_delay<30000; sht_delay++)  // wait for max 300ms
  {
   if (!input(sht_data_pin)) break;              //if sht_data_pin low, SHT75 ready
   delay_us(10);
  }
}

//***** SHT11 iletişimini resetleme fonksiyonu *****

void comreset (void)
{
 int8 i;

 output_float(sht_data_pin);    //data high
 output_bit(sht_clk_pin, 0);    //clk low
 delay_us(2);
 for(i=0; i<9; i++)
  {
   output_bit(sht_clk_pin, 1);  //toggle clk 9 times
   delay_us(2);
   output_bit(sht_clk_pin, 0);
   delay_us(2);
 }
 comstart();
}

//***** SHT11 soft-reset fonksiyonu *****

void sht_soft_reset (void)
{
 comreset();           //SHT75 communication reset
 comwrite(0x1e);       //send SHT75 reset command
 delay_ms(15);         //pause 15 ms
}

//***** SHT11 sıcaklık ölçüm fonksiyonu *****

int16 measuretemp (void)
{
 int1 ack;
 int16 iobyte;

 comstart();             //alert SHT75
 ack = comwrite(0x03);   //send measure temp command and read ack status
 if(ack == 1) return;
 comwait();              //wait for SHT75 measurement to complete
 iobyte = comread();     //read SHT75 temp data
 return(iobyte);
}

//***** SHT11 nem ölçüm fonksiyonu *****

int16 measurehumid (void)
{
 int1 ack;
 int16 iobyte;

 comstart();            //alert SHT75
 ack = comwrite(0x05);  //send measure RH command and read ack status
 if(ack == 1) return;
 comwait();             //wait for SHT75 measurement to complete
 iobyte = comread();    //read SHT75 temp data
 return(iobyte);
}

//***** SHT11 sıcaklık & nem hesaplama fonksiyonu *****

void calculate_data (int16 temp, int16 humid, float & tc, float & rhlin, float & rhtrue)
{
 float  rh;

 //calculate temperature reading
 tc = ((float) temp * 0.01) - 40.0;

 //calculate Real RH reading
 rh = (float) humid;

 rhlin = (rh * 0.0405) - (rh * rh * 0.0000028) - 4.0;

 //calculate True RH reading
 rhtrue = ((tc - 25.0) * (0.01 + (0.00008 * rh))) + rhlin;
}

//***** SHT11 sıcaklık &nem ölçme ve hesaplama fonksiyonu *****

void sht_rd (float & temp, float & truehumid)
{
 int16 restemp, reshumid;
 float realhumid;
 restemp = 0; truehumid = 0;

 restemp = measuretemp();    //measure temp
 reshumid = measurehumid();  //measure RH
calculate_data (restemp, reshumid, temp, realhumid, truehumid);  //calculate temp & RH
}

//***** SHT11 başlatma fonksiyonu *****

void sht_init (void)
{
 comreset();    //reset SHT75
 delay_ms(20);  //delay for power-up
}

//***** MPX5100 okuma fonksiyonu *****

void mpx5100_read(){
      set_adc_channel(0);                    // RA0/AN0 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);                          // Kanal seçiminde sonra bu bekleme süresi verilmelidir
      bilgi=read_adc();                      // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
      voltaj=0.0048828125*bilgi;             // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
      basinc=((voltaj+5*0.095)/(5*0.009));   //Gerilim değerinden basınç hesaplama formulu
}

void glcd_image(int tip)
{
char i,j;
signed char k;
if (tip==0){                     //Açılış ekranı yükleniyor 
for( i = 0 ; i < 64 ; i ++ )
{
for( j = 0 ; j < 16 ; j ++)
{
for(k=7;k>-1;--k)
{
if( bit_test(image_0[i][j] ,7-k ))
glcd_pixel( j*8+k,i, ON );
}
}
}
}
if (tip==1){                     //Ana ekran yükleniyor
for( i = 0 ; i < 64 ; i ++ )
{
for( j = 0 ; j < 16 ; j ++)
{
for(k=7;k>-1;--k)
{
if( bit_test(image_1[i][j] ,7-k ))
glcd_pixel( j*8+k,i, ON );
}
}
}
}
}

//********** ANA PROGRAM FONKSİYONU*******

void main()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
   set_tris_C(0xFF);
   set_tris_E(0x00000111);  
   set_tris_A(0x00010001);  
   set_tris_D(0x00);  
   set_tris_B(0x00);

   setup_adc(adc_clock_div_32);   // ADC clock frekansı fosc/32
   setup_adc_ports(RA0_ANALOG);   // Tüm AN girişleri analog
   enable_interrupts(INT_AD);     // AD çevrimi bitti kesmesi tanıtılıyor
   enable_interrupts(GLOBAL);     // Tüm kesmeler aktif
   sht_init();
   delay_ms(100);
   glcd_init(ON);
   glcd_fillScreen(0);
   glcd_image(0);
   delay_ms(4000);
   glcd_fillScreen(0);
   glcd_image(1);

   while(1)   // sonsuz döngü
   {
   sht_rd (restemp, truehumid);
   mpx5100_read(); 
   
   sprintf(s_sicaklik,"%f",g_restemp);
   glcd_text57(45,3,s_sicaklik,2,off);
   
   sprintf(s_sicaklik,"%f",restemp);
   glcd_text57(45,3,s_sicaklik,2,on);
   glcd_text57(110,3,tmp,2,on); 
   glcd_circle(105,5,2,no,on);

   sprintf(s_nem,"%f",g_truehumid);
   glcd_text57(60,25,s_nem,2,off);
   
   sprintf(s_nem,"%f",truehumid);
   glcd_text57(60,25,s_nem,2,on);
   glcd_text57(45,25,tmp1,2,on);   
   glcd_pixel(46,26,off);
   glcd_pixel(47,26,off);
   glcd_pixel(46,27,off);
   glcd_pixel(47,27,off);
   
   glcd_pixel(52,36,off);
   glcd_pixel(53,36,off);
   glcd_pixel(52,37,off);
   glcd_pixel(53,37,off);
   
   

   if(basinc>=100){
   sprintf(s_basinc,"%f",g_basinc);
   glcd_text57(35,47,s_basinc,2,off);
   glcd_text57(45,47,s_basinc,2,off);
   sprintf(s_basinc,"%f",basinc);
   glcd_text57(35,47,s_basinc,2,on);
   glcd_text57(105,51,tmp2,1,on);
   }
   if(basinc<100){
   sprintf(s_basinc,"%f",g_basinc);
   glcd_text57(35,47,s_basinc,2,off);
   glcd_text57(45,47,s_basinc,2,off);
   sprintf(s_basinc,"%f",basinc);
   glcd_text57(45,47,s_basinc,2,on);
   glcd_text57(105,51,tmp2,1,on);
   }
   g_restemp=restemp;
   g_truehumid=truehumid;
   g_basinc=basinc;
   delay_ms(100);
   

   }
}


dediğim gibi kodu kendim yazmadım buldum proteusta çizimini yapıp çalıştırdım.Sorunum lcdyi 128x64 değilde 16x2 kullanmak ve diğer bir sorum SHT11 yerine DHT11 kullandığım zaman ne gibi değişiklikler yapmam lazım.İlginiz için sağolun

RaMu

#5
http://www.expkits.com/?s=destek.htm
Sayfada crl+F ile dht11 birde dht11 diye arama yapabilirsin.

Nette ccsc ile dht11 direk 2x16 LCD ile örnekleri mevcut.

mesaj birleştirme:: 28 Mayıs 2015, 21:20:22

Serdar Çiçek hocamızın çok kullanılan bir CcsC kitabı var,
içindeki örnekleri ücretsiz olarak paylaşılmış durumda,
oradanda beğendiğin varsa deneyebilirsin:
https://320volt.com/ccs-c-ornek-uygulama-kod-arsivi-c-ve-hex/
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html