Rf Alıcı Verici 16f877A-16f628A Step-hcs04-lcd
Rf akıcı verici ile haberleşen 16f628A verici kısmı 16f877A alıcı picleri kullanılarak haberleşmesi sağlanmıştır.Alıcının görevi 60cm uxunluğunda bulunan su kabını alıcıdan gelen bilgiye göre doldurmasıdır.Doluluk oranını hcsr-04 ile ölçerken musluk açma kapatma olayını step motor sayesinde yapmaktadır. Yazılım C dilinde yazılmıştır.
.
Vericide 3 adet buton bulunmaktadır.
1.Buton Dolum oranın azaltır. %100 %75 %50 %25
2.Buton Dolum oranın arttırır %25 &50 %75 %100
3.Buton Step motoru devreye sokar.
Anlaşılacağı üzere değerler yüzde cinsinden 25 şer olarak artar ve azalır.
ALICI
#include <sudolumu.h> //su dolumu adında dosya oluşturuldu
#fuses xt,nowrt,nowdt,nobrownout,nolvp,nocpd,nodebug,noprotect,noput
#use delay(clock=4000000)
#use rs232(baud=600, xmit=PIN_B2, rcv=PIN_B1) // 3 satır sigorata ve kristal ayarıdır.
#include <lcd.c> // lcd kütüphane ilave edilidi
#use fast_io(B) // b portu step için ayarlandı
int8 check; check adında değişken tanımlandı
unsigned int16 e, distance; // mesafe sensörü için distance adında değişken tanımlandı
void main(){ // programa başlandı
char a=0;
int deger =0;
int hiz=10;
int i=0;
int dolu=0;
int b=0;
int dolum=1;
int acildi=0;
int kap=0;
// yukardaki satırlar program için gerekli değişkenlerdir.
output_a(0);
set_tris_b(2); // Configure RB1 as input
lcd_init(); // Initialize LCD module
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_2); // Configure Timer1 module
set_timer1(0); // Reset Timer1
output_high(pin_b3); //calisma göstergesi olan led
lcd_init(); // lcd çalıştırıldı
printf(lcd_putc,”\fUMUT KALAYCIOGLU\n HASAN TURAN”); // lcd ye yazı yazılıdı
output_high(pin_a2);
output_high(pin_a3);
output_high(pin_a4); // 3 adet led ilave edildi
while(1) // sonsuz döngü başladı
{
if(getc()==’X’) // vericiden X gelirse işleme başlanacak
{
a=getc(); // vericiden X ile beraber gönderilen değer okunup a değişkenine kayıt edildi
}
if(a==’A’) // a değişkeni A ise { } arasında kalan işlemi yapacak
{
deger=deger+1; // değer değişkenini 1 arttır.
if (deger<25) // değer 25 de küçük ise dolu değişkenini 25 yap
{
dolu=25;
}
if (deger<50 && deger>25)
{
dolu=50;
}
if (deger<75 && deger>50)
{
dolu=75;
}
if (deger<100 && deger>75)
{
dolu=100;
}
output_high(pin_a2); // arttırma butonuna basılırsa a2 de bulunan ledi yak
output_low(pin_a3);
output_low(pin_a4);
printf(lcd_putc,”\fORAN AYARLANIYOR\n+SU AYARI / %d”, dolu); // lcd ekranına yazı yaz
//delay_ms(100);
}
else if(a==’B’) // a değişkeni B ise
{
deger=deger-1; // değer 1 azaltıldı
if (deger<25)
{
dolu=25;
}
if (deger<50 && deger>25)
{
dolu=50;
}
if (deger<75 && deger>50)
{
dolu=75;
}
if (deger<100 && deger>75)
{
dolu=100;
}
output_low(pin_a2);
output_high(pin_a3);
output_low(pin_a4);
printf(lcd_putc,”\fORAN AYARLANIYOR\n-SU AYARI / %d”, dolu);
//delay_ms(100);
}
else if(a==’C’) // a değişkeni C ise
{
check = 0;
e = 0;
output_high(PIN_A0);
delay_us(10);
output_low(PIN_A0);
// buradan başlayıp aşağıya kadar olan yazılımlar mesafe sensörü içindir.
set_timer1(0); // Reset Timer1
while(!input(PIN_A1) && (get_timer1() < 1000));
if(get_timer1() > 990)
check = 1; // Timeout error
set_timer1(0); // Reset Timer1
while(input(PIN_A1) && (i < 25000))
e = get_timer1(); // Store Timer1 value in i
distance = e/58; // Calculate the distance
// buraya kadar olan lar mesafes sensörü için yazıldı
if (distance <15) // mesafe 15 den küçük ise
{
kap=100; // kap değişkenini 100 yap
}
if (distance<30 && distance>15)
{
kap=75;
}
if (distance<45 && distance>30)
{
kap=50;
}
if (distance<60 && distance>45)
{
kap=25;
}
if (distance >60)
{
kap=0;
}
if (kap>=dolu) // kap dolu dan büyük ve eişt ise {} arasını yap
{
printf(lcd_putc,”\fSU DOLUMU TAMAM \n SU AYARI / %d”, dolu);
if (acildi ==1) // eğer vana açılmış ise
{
for(int d = 0; d < 120; d++) // step motor vanayı kapatır
{
dolum=1;
// 1000
output_low(pin_c5);
output_low(pin_c7);
output_low(pin_c6);
output_high(pin_c4);
delay_ms(hiz);
// 1100
output_low(pin_c5);
output_low(pin_c7);
output_high(pin_c6);
output_high(pin_c4);
delay_ms(hiz);
// 0100
output_low(pin_c5);
output_low(pin_c7);
output_high(pin_c6);
output_low(pin_c4);
delay_ms(hiz);
// 0110
output_low(pin_c5);
output_high(pin_c7);
output_high(pin_c6);
output_low(pin_c4);
delay_ms(hiz);
// 0010
output_low(pin_c5);
output_high(pin_c7);
output_low(pin_c6);
output_low(pin_c4);
delay_ms(hiz);
// 0011
output_high(pin_c5);
output_high(pin_c7);
output_low(pin_c6);
output_low(pin_c4);
delay_ms(hiz);
// 0001
output_high(pin_c5);
output_low(pin_c7);
output_low(pin_c6);
output_low(pin_c4);
delay_ms(hiz);
// 1001
output_high(pin_c5);
output_low(pin_c7);
output_low(pin_c6);
output_high(pin_c4);
delay_ms(hiz);
output_low(pin_c4);
output_low(pin_c5);
output_low(pin_c6);
output_high(pin_c7);
delay_ms(hiz);
// 1100
output_low(pin_c4);
output_low(pin_c5);
output_high(pin_c6);
output_high(pin_c7);
delay_ms(hiz);
// 0100
output_low(pin_c4);
output_low(pin_c5);
output_high(pin_c6);
output_low(pin_c7);
delay_ms(hiz);
// 0110
output_low(pin_c4);
output_high(pin_c5);
output_high(pin_c6);
output_low(pin_c7);
delay_ms(hiz);
// 0010
output_low(pin_c4);
output_high(pin_c5);
output_low(pin_c6);
output_low(pin_c7);
delay_ms(hiz);
// 0011
output_high(pin_c4);
output_high(pin_c5);
output_low(pin_c6);
output_low(pin_c7);
delay_ms(hiz);
// 0001
output_high(pin_c4);
output_low(pin_c5);
output_low(pin_c6);
output_low(pin_c7);
delay_ms(hiz);
// 1001
output_high(pin_c4);
output_low(pin_c5);
output_low(pin_c6);
output_high(pin_c7); // yukarıya kadar olan yazılım step motoru hareket etttirir.
delay_ms(hiz); // step motorun çalışma hız ayarı
acildi=0;
}
}
delay_ms(2000);
}
while (kap<dolu)
{
check = 0;
e = 0;
output_high(PIN_A0);
delay_us(10);
output_low(PIN_A0);
set_timer1(0); // Reset Timer1
while(!input(PIN_A1) && (get_timer1() < 1000));
if(get_timer1() > 990)
check = 1; // Timeout error
set_timer1(0); // Reset Timer1
while(input(PIN_A1) && (i < 25000))
e = get_timer1(); // Store Timer1 value in i
distance = e/58; // Calculate the distance
if (distance <15)
{
kap=100;
}
if (distance<30 && distance>15)
{
kap=75;
}
if (distance<45 && distance>30)
{
kap=50;
}
if (distance<60 && distance>45)
{
kap=25;
}
if (distance >60)
{
kap=0;
}
printf(lcd_putc,”\fSU DOLUYOR/ %d”, kap);
printf(lcd_putc,”\n SU AYARI / %d”, dolu);
delay_ms(200);
//—————————–
if (dolum == 1) // su dolumu için step motor vanayı açar
{
for(int d = 0; d < 120; d++)
{
acildi=1; // step motorun vanayı açtığını anlamak için acildi değişkeni 1 yapılır. Vanayı kapatma işleminde buraki değere göre işlem yapılır. Vana hiç açılmamış ise kapatmaya gerek yoktur.
// 0001
output_high(pin_c5);
output_low(pin_c7);
output_low(pin_c6);
output_low(pin_c4);
delay_ms(hiz);
// 0011
output_high(pin_c5);
output_high(pin_c7);
output_low(pin_c6);
output_low(pin_c4);
delay_ms(hiz);
// 0010
output_low(pin_c5);
output_high(pin_c7);
output_low(pin_c6);
output_low(pin_c4);
delay_ms(hiz);
// 0110
output_low(pin_c5);
output_high(pin_c7);
output_high(pin_c6);
output_low(pin_c4);
delay_ms(hiz);
// 0100
output_low(pin_c5);
output_low(pin_c7);
output_high(pin_c6);
output_low(pin_c4);
delay_ms(hiz);
// 1100
output_low(pin_c5);
output_low(pin_c7);
output_high(pin_c6);
output_high(pin_c4);
delay_ms(hiz);
// 1000
output_low(pin_c5);
output_low(pin_c7);
output_low(pin_c6);
output_high(pin_c4);
delay_ms(hiz);
// 1001
output_high(pin_c5);
output_low(pin_c7);
output_low(pin_c6);
output_high(pin_c4);
delay_ms(hiz);
// yukarıya kadar olan kısım step motoru çalıştırı vanayı açar
}
dolum=0;
}
}
}
else if(a==’D’) // a değişkeni D ise yani vericiden hiçbir tuşa basılmmamış ise
{
check = 0;
e = 0;
output_high(PIN_A0);
delay_us(10);
output_low(PIN_A0);
set_timer1(0); // Reset Timer1
while(!input(PIN_A1) && (get_timer1() < 1000));
if(get_timer1() > 990)
check = 1; // Timeout error
set_timer1(0); // Reset Timer1
while(input(PIN_A1) && (i < 25000))
e = get_timer1(); // Store Timer1 value in i
distance = e/58; // Calculate the distance
// buraya kadar mesafe ölümü yapılır
if (distance <15)
{
kap=100;
}
if (distance<30 && distance>15)
{
kap=75;
}
if (distance<45 && distance>30)
{
kap=50;
}
if (distance<60 && distance>45)
{
kap=25;
}
if (distance >60)
{
kap=0;
}
// printf(lcd_putc,”\f%3Lu”, kap);
printf(lcd_putc,”\fKAP DOLULUK/ %d”, kap);
printf(lcd_putc,”\n SU AYARI / %d”, dolu);
output_low(pin_a2);
output_low(pin_a3);
output_low(pin_a4);
delay_ms(100);
}
}
}
VERİCİ
#include <mainveri.h>
#fuses INTRC_IO, NOMCLR, NOPROTECT, NOWDT, NOLVP
#use delay(clock=4000000)
//#include <lcd.c>
#use rs232(baud=600, xmit=PIN_B2, rcv=PIN_B1) // alıcı vericinin pin numaraları belirlendi
void main(){
output_high(pin_b3); //calisma gostergesi
while(1){
if(input(pin_b4)==1 && input(pin_b5)==0 && input(pin_b6)==0 ){ // b4 de bulunan butona basılırsa
putc(‘X’);
putc(‘A’); // vericiye X ve A bilgisini gönder
}
if(input(pin_b4)==0 && input(pin_b5)==1 && input(pin_b6)==0 ){ // b5 de bulunan butona basılırsa
putc(‘X’);
putc(‘B’); // vericiye X ve B bilgisini gönder
//delay_ms(100);
}
if(input(pin_b4)==0 && input(pin_b5)==0 && input(pin_b6)==1 ){ // 64 de bulunan butona basılırsa
putc(‘X’);
putc(‘C’); // vericiye X ve C bilgisini gönder
// delay_ms(100);
}
if(input(pin_b4)==0 && input(pin_b5)==0 && input(pin_b6)==0 ){ // butonlara basılmaz ise
putc(‘X’);
putc(‘D’); // vericiye X ve d bilgisini gönder
// delay_ms(100);
}
}
}
Etiketler: 16f877a, alıcı verici, C projeleri, pic ile mesafe ölçümü, rf, RF step kontrol
Eklenme Tarihi: 1 Ocak 2018
Konu hakkında yorumunuzu yazın