16f877a+sht11 ısı,nem,zaman saati ,motor çevirme örnek

Başlatan aygun78, 08 Mayıs 2015, 16:26:28

aygun78

Merhabalar.
Pic C Compiler ile ilk defa Kuluçka makinası için nem, ısı ve motor çevirme için kendimce siteden edindiğim kodlarla 16f877a ve sht11 sensörlü projeyi bitirmek üzeriyim.
Kullandığım kodlar ve proteus dosyaları ektedir.  Yaptığım denemelerde sorunsuz çalışıyor. Eeprom kayıt ve okuma sorunsuz.
Şimdi bazı merak ettiğim noktalar var ?
1:Derleme sonrası rom %84 civarlarında bir sorun olur mu ?
2:Port ayarlamalarını yapmazsam ne gibi sorunlar çıkar ?
3:Program akışı sizce doğru mudur?
4:Gereksiz kod var mıdır ?
5:Şunu şöyle yaparsan daha stabil olur dediğiniz noktalar var mıdır ?
6:Pcb çizimini ve yolları yapamayacağım için hazır delikli pcb kullanmayı düşünüyorum .Sağlıklı mıdır?
indirme linki
https://drive.google.com/open?id=0B-ZMm7nDR7-oU3J5R29OSTIwWmc&authuser=0
[/#include <16F877A.h>
#fuses HS,NOWDT,PUT,NOPROTECT,NOLVP
#use delay(clock=4000000) 
#define use_portb_lcd TRUE

#include <internal_eeprom.c>
#include<lcd.c>
#include<sht11.c> 
// TUSLAR
#define ENTER PIN_A0
#define YUKARI  PIN_A1
#define ASAGI  PIN_a2
#define ESC  PIN_a3
//--------------cikislar-----------------------

int8 sayi,i=0,menu=0,menu_say=0,set_m=0,m_sn=0,sn=0,dkk=0,saat=0,gun,gun2, motor,motor2; 
float set_isi,set_nem,set_isi_has,set_nem_has,restemp, truehumid;

 /*A Portunun tüm bacakları çıkış olarak ayarlanıyor.*/
#int_timer0  // Timer0 kesmesi
void  timer0_kesme ()   // Kesme fonksiyonu ismi

{
    set_timer0(60);   // TMR0 değeri belirleniyor
    i++;   // i değeri 1 arttırılıyor   
    if (i==20)  // i değeri X'ye eşitse 
       {  sn++;
          m_sn++;
          i=0;
       }
       else if (sn>59){dkk++;sn=0;}
       else if (dkk>59){saat++;dkk=0;}
       else if (saat>23){gun++;saat=0;
                 write_eeprom(9,gun);}
       
}
void write_float_to_eeprom(int8 addr, float data) 
{ 
 int8 i; 

 for(i = 0; i < 4; i++) 
     write_eeprom(addr + i, *((int8*)&data + i) ) ; 
} 

//-------------------------------------- 
float read_float_from_eeprom(int8 addr) 
{ 
int8 i; 
float data; 

for(i = 0; i < 4; i++) 
   *((int8*)&data + i) = read_eeprom(addr + i); 

return(data); 
} 

void ee_oku()
{
sayi=read_eeprom(1);
if (sayi==255)
{
delay_ms(20);
set_isi=37.5;
write_float_to_eeprom(10, set_isi);
delay_ms(20);
set_isi_has=0.2;
write_float_to_eeprom(20,set_isi_has);
delay_ms(20);
set_nem=60.0;
write_float_to_eeprom(30,set_nem);
delay_ms(20);
set_nem_has=10.0;
write_float_to_eeprom(40,set_nem_has);
delay_ms(20);
gun=1;
write_eeprom(15,gun);
delay_ms(20);
motor2=10;
write_eeprom(25,motor2);
delay_ms(20);
motor=1;
write_eeprom(35,motor);
delay_ms(20);
gun2=17;
write_eeprom(45,gun2);
delay_ms(20);
write_eeprom(1,1);
}
else
{
delay_ms(20);
set_isi=read_float_from_eeprom(10);
delay_ms(20);
set_isi_has=read_float_from_eeprom(20);
delay_ms(20);
set_nem=read_float_from_eeprom(30);
delay_ms(20);
set_nem_has=read_float_from_eeprom(40);
delay_ms(20);
gun=read_eeprom(15);
delay_ms(20);
gun2=read_eeprom(45);
delay_ms(20);
motor2=read_eeprom(25);
delay_ms(20);
motor=read_eeprom(35);
delay_ms(20);
}
}

void getir()
{  
 if (input(ENTER)&&(menu==0))
   {
   printf(lcd_putc,"\f");
   menu=1;
   menu_say=0;
   m_sn=0;
   }
  
  if ((menu>0)&&(set_m==0))
  {
     
   switch(menu_say)
         {
            case 0:
             printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               printf(lcd_putc,">1-ISI SET");
               lcd_gotoxy(1,2);
               printf(lcd_putc," 2-ISI HASSASIYET");
               if (input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;printf(lcd_putc,"\f");} //set menüye git
               break;
            case 1:
             printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               printf(lcd_putc," 1-ISI SET");
               lcd_gotoxy(1,2);
               printf(lcd_putc,">2-ISI HASSASIYET");
               if (input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;printf(lcd_putc,"\f");} //set menüye git
               break;
            case 2:
             printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               printf(lcd_putc,">3-NEM SET");
               lcd_gotoxy(1,2);
               printf(lcd_putc," 4-NEM HASSASIYET");
               if (input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;printf(lcd_putc,"\f");} //set menüye git
               break;
            case 3:
             printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               printf(lcd_putc," 3-NEM SET");
               lcd_gotoxy(1,2);
               printf(lcd_putc,">4-NEM HASSASIYET");
               if (input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;printf(lcd_putc,"\f");} //set menüye git
               break;
            case 4:
             printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               printf(lcd_putc,">5-SAAT AYARI");
               lcd_gotoxy(1,2);
               printf(lcd_putc," 6-DAK. AYARI");
               if (input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;printf(lcd_putc,"\f");} //set menüye git
               break;
            case 5:
             printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               printf(lcd_putc," 5-SAAT AYARI");
               lcd_gotoxy(1,2);
               printf(lcd_putc,">6-DAK. AYARI");
               if (input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;printf(lcd_putc,"\f");} //set menüye git
               break;   
                case 6:
             printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               printf(lcd_putc,">7-MOTOR AYARI");
               lcd_gotoxy(1,2);
               printf(lcd_putc," 8-CEVIRME SUR.");
               if (input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;printf(lcd_putc,"\f");} //set menüye git
               break; 
               case 7:
             printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               printf(lcd_putc," 7-MOTOR AYARI");
               lcd_gotoxy(1,2);
               printf(lcd_putc,">8-CEVIRME SUR.");
               if (input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;printf(lcd_putc,"\f");} //set menüye git
               break; 
               case 8:
             printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               printf(lcd_putc,">9-GUN AYARI");
               lcd_gotoxy(1,2);
               printf(lcd_putc,"10-MOTOR DUR.");
               if (input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;printf(lcd_putc,"\f");} //set menüye git
               break;              
               case 9:
             printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               printf(lcd_putc," 9-GUN AYARI");
               lcd_gotoxy(1,2);
               printf(lcd_putc,">10-MOTOR DUR.");
               if (input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;printf(lcd_putc,"\f");} //set menüye git
               break; 
               }
                     
               
        if(input(ASAGI)&&(menu_say<11))
         {
             while(input(ASAGI));
             ++menu_say;
             if(menu_say==10)
              menu_say=0;
               }
          else if(input(YUKARI)&&(menu_say>0))     
               {
             while(input(YUKARI));
             --menu_say;
             if(menu_say==0)
              menu_say=0;
               }
           
           
      if (input(Esc)&&(menu==1)&&(m_sn>1))
      {
      printf(lcd_putc,"\f");
       menu=0;
         }
   
      } 
      
     
     
      
     
}
void getir2()

{
 if ((menu>0)&&(set_m==1)) 
  {
     
   switch(menu_say)
         {
            case 0:
               lcd_gotoxy(1,1);
               printf(lcd_putc," ISI SET AYARI  ");
               lcd_gotoxy(1,2);
                              printf(lcd_putc," SET :%3.1f",set_isi);
               if(input(ENTER)) {write_float_to_eeprom(10,set_isi);}
              if(input(ASAGI)&&(set_isi>0))
              {
              while(input(ASAGI));
              set_isi=set_isi-0.1;
               }
             else if(input(YUKARI)&&(set_isi<40))     
               {
             while(input(YUKARI));
             set_isi=set_isi + 0.1;
               }               
               break;
               
            case 1:
               lcd_gotoxy(1,1);
               printf(lcd_putc," ISI HAS. AYARI  ");
               lcd_gotoxy(1,2);
               printf(lcd_putc,"HAS:%3.1f",set_isi_has);
               if(input(ENTER)) {write_float_to_eeprom (20,set_isi_has);}
                if(input(ASAGI)&&(set_isi_has>0))
              {
              while(input(ASAGI));
              set_isi_has= set_isi_has-0.1;
               }
             else if(input(YUKARI)&&(set_isi_has<5))     
               {
             while(input(YUKARI));
            set_isi_has= set_isi_has+0.1;
               }               
               break;
            case 2:
               lcd_gotoxy(1,1);
               printf(lcd_putc," NEM SET AYARI  ");
               lcd_gotoxy(1,2);
                      
               printf(lcd_putc," SET %3.1f",set_nem);
               if(input(ENTER)) {write_float_to_eeprom(30,set_nem);}              
                if(input(ASAGI)&&(set_nem>0))
              {
              while(input(ASAGI));
             set_nem = set_nem-1.0;
               }
             else if(input(YUKARI)&&(set_nem<80))     
               {
             while(input(YUKARI));
             set_nem=set_nem+1.0;
               }               
               break;
            case 3:
               lcd_gotoxy(1,1);
               printf(lcd_putc," NEM HAS AYARI  ");
               lcd_gotoxy(1,2);
               printf(lcd_putc," SET :%3.1f",set_nem_has);
               if(input(ENTER)) {write_float_to_eeprom(40,set_nem_has);}              
                if(input(ASAGI)&&(set_nem_has>0))
              {
              while(input(ASAGI));
              set_nem_has= set_nem_has-1;
               }
             else if(input(YUKARI)&&(set_nem_has<30))     
               {
             while(input(YUKARI));
              set_nem_has=set_nem_has+1;
               }
               if ((input(ESC))&&(m_sn>0)) {
                set_m=0;m_sn=0;write_float_to_eeprom(40,set_nem_has);} 
               break;
               case 4:
               lcd_gotoxy(1,1);
               printf(lcd_putc," SAAT AYARI ");
               lcd_gotoxy(1,2);
               printf(lcd_putc," SET :%2D",SAAT);
              
              if(input(ASAGI)&&(saat>0))
              {
              while(input(ASAGI));
              --saat;
               }
             else if(input(YUKARI)&&(saat<23))     
               {
             while(input(YUKARI));
             ++saat;
               }
               break;
                case 5:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"DAKIKA AYARI");
               lcd_gotoxy(1,2);
               printf(lcd_putc," SET :%2D",dkk);

                if(input(ASAGI))
              {
              while(input(ASAGI));
              --dkk;
              if(dkk==-1)
             dkk=59;
               }
             else if(input(YUKARI))     
               {
             while(input(YUKARI));
             ++dkk;
             if(dkk==60)
             dkk=0;
             
               }
               break;
                 case 6:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"MOTOR AYARI");
               lcd_gotoxy(1,2);
               printf(lcd_putc," %D.saate bir",motor);
               if(input(ENTER)) { write_eeprom(35,motor);}
                if(input(ASAGI)&&(motor>0))
              {
              while(input(ASAGI));
              --motor;
               }
             else if(input(YUKARI)&&(motor<3))     
               {
             while(input(YUKARI));
             ++motor;
               }
              
               break;
                   case 7:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"CEVIRME SUR.");
               lcd_gotoxy(1,2);
               printf(lcd_putc," %D.saniye",motor2);
               if(input(ENTER)) {write_eeprom (25,motor2);}
                if(input(ASAGI)&&(motor2>5))
              {
              while(input(ASAGI));
              --motor2;
               }
             else if(input(YUKARI)&&(motor2<60))     
               {
             while(input(YUKARI));
             ++motor2;
               }
               
               break;
               case 8:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"GUN AYARI");
               lcd_gotoxy(1,2);
               printf(lcd_putc," %D.GUN",gun);
               if(input(ENTER)) {write_eeprom (15,gun);
               delay_ms(150);
               }
                if(input(ASAGI)&&(gun>0))
              {
              while(input(ASAGI));
              --gun;
               }
             else if(input(YUKARI))     
               {
             while(input(YUKARI));
             ++gun;
             if(gun==30)
             gun=1;
               }
                
               break;
               case 9:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"MOTOR DURMA ");
               lcd_gotoxy(1,2);
               printf(lcd_putc," %D.GUN",gun2);
               if(input(ENTER)) {write_eeprom (45,gun2);
               delay_ms(150);
               }
                if(input(ASAGI)&&(gun2>10))
              {
              while(input(ASAGI));
              --gun2;
               }
             else if(input(YUKARI)&&(gun2<30))     
               {
             while(input(YUKARI));
             ++gun2;
               }
               
               break;
         
               }
            if ((input(ESC))&&(m_sn>0)) {set_m=0;m_sn=0;
            
             printf(lcd_putc,"\f");
write_float_to_eeprom(10,set_isi);
delay_ms(20);
write_float_to_eeprom(20,set_isi_has);
delay_ms(20);
write_float_to_eeprom(30,set_nem);
delay_ms(20);
write_float_to_eeprom(40,set_nem_has);
delay_ms(20);
write_eeprom(15,gun);
delay_ms(20);
write_eeprom(25,motor2);
delay_ms(20);
write_eeprom(35,motor);
delay_ms(20);
write_eeprom(45,gun2);
delay_ms(20);
}
  }
}
void isi_oku ()
{ 
sht_init();
sht_rd (restemp, truehumid);
}


void lcd_bilgi (){
   LCD_gotoxy(1,1); 
   printf(lcd_putc,"ISI:%3.1f ",restemp);   
   LCD_gotoxy(1,2); 
   printf(lcd_putc,"%d.GUN",gun);
   LCD_gotoxy(10,1); 
   printf(lcd_putc,"RH:%3.1f%%",truehumid);
   LCD_gotoxy(9,2); 
   printf(lcd_putc,"%02d",saat);   
   LCD_gotoxy(11,2); 
   printf(lcd_putc,":%02d",dkk);
     LCD_gotoxy(14,2); 
   printf(lcd_putc,":%02d",sn);
}
void main()
{

 lcd_init();
  LCD_gotoxy(1,1); 
   printf(lcd_putc,"      AYGUN"); 
    delay_ms(500);
   LCD_gotoxy(1,2); 
   printf(lcd_putc,"     KULUCKA ");   
   delay_ms(1000);
   printf(lcd_putc," \fISI OKUNUYOR....");  
   isi_oku();  
  delay_ms(2000);
 
 ee_oku();
 delay_ms(500);
 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // Timer0 ayarları yapılıyor
 set_timer0(60);   // TMR0 değeri belirleniyor
 enable_interrupts(INT_timer0); // int_timer0 kesmesini aktif yapar
 enable_interrupts(GLOBAL);  
 // set_tris_D(0x00); 
 // B portu komple çıkış
 //output_D(0x00); 
 printf (lcd_putc,"\f");  
 while(1)
 {
  isi_oku();  
  
  if (menu==0) {lcd_bilgi ();}    
 getir();
 getir2();

if ((set_isi-set_isi_has)>restemp)
 {OUTPUT_HIGH(pin_d0);}
if (restemp>set_isi)
 {OUTPUT_low(pin_d0);} 
 if ((set_nem-set_nem_has)> truehumid)
 {OUTPUT_HIGH(pin_d1);}
if (truehumid>set_nem)
 {OUTPUT_low(pin_d1);}
 if(motor==1)
         {            
                if( (gun<gun2)&&(dkk==00)&&(sn==00))
              {
OUTPUT_HIGH(pin_d2);

              }
               }
               
 if(motor==2)
         {      
              if( (gun<gun2)&&(saat==0)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==2)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==4)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==6)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==8)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==10)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==12)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==14)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==16)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==18)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==20)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==22)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }             
              
               }                    
  if(motor==3)
         {        
              if( (gun<gun2)&&(saat==0)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==3)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==6)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==9)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==12)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==15)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==18)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }
              if( (gun<gun2)&&(saat==21)&&(dkk==00)&&(sn==00))
              {OUTPUT_HIGH(pin_d2); }      
              
              
               }         
             
  if (sn> motor2)
{OUTPUT_LOW(pin_d2);}       
      
        
 }
  
} code]

alexsi

Merhaba aygun78,
Kodunuzu biraz inceledim sizi öncelikle tebrik ederim. Biraz yorumdan rahatsız olmaz iseniz kodta tekrar eden yerleri ayrı biyerde alt program gibi yapıp çağırırsan kodu herseferinde yazmazsın. Mesela;
              case 0: 
               printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               printf(lcd_putc," 1-ISI SET");
               lcd_gotoxy(1,2);
               printf(lcd_putc,">2-ISI HASSASIYET");
               if (input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;printf(lcd_putc,"\f");} //set menüye git

gibi case 1 de tekrar eden yeri şöyle yazsan daha okunaklı olur ve aynısını yazmazsın.
void isihassasiyet ()
{
               printf(lcd_putc,"\f");
               lcd_gotoxy(1,1);
               printf(lcd_putc," 1-ISI SET");
               lcd_gotoxy(1,2);
               printf(lcd_putc,">2-ISI HASSASIYET");
               if (input(ENTER)&&(m_sn>0)) {m_sn=0;set_m=1;printf(lcd_putc,"\f");} //set menüye git
}
sonrada ;
case 0:
           isihassasiyet ();
case 1:
           isihassasiyet (); gibi..

port ayarlamalarını yapmazsan kararsız ve beklenmedik durumlarda istenmedik çıkışlar almana sebep olur. Giriş ise giriş çıkış ise çıkış mutlaka tanımla.
Kullanmadığın portları giriş olarak tanımla.
Rom %84 kullanman sorun olmaz. Sensor okumayamadıgında ya da cok yuksek yada cok dusuk degerler algıladıgında korumalar koyman lazım.
(çıkışı kapatman gerekiyorsa yada açman gerekiyorsa bunları yapman lazım.)
Prototip kart çok uzun vadeli olmaz ancak deneme amaçlı testlerini yapmak için uygundur.
Maindeki while icini şişirme. Herbir fonksiyon için ayrı bi alt program yaz. o fonksiyonu whilede çağır. Okuma ve yazma açısından daha rahat olur.
mesela ;
main()
{

while(1)
{
   CıkısKontol();


}
}
http://www.kontrolarge.com/ Bildiklerimiz öğrendiklerimiz kadardır. Ya bilmediklerimiz ..?