HC-SR04 mesafeye göre led yakma

Başlatan ChiliPepper, 20 Ekim 2020, 15:14:40

ChiliPepper

Merhaba arkadaşlar buradaki hatam ne olabilir ledin belirlediğim mesafeden bir süre sonra sönmesi lazım ama sürekli yanıyor

#include <12F675.h>

#FUSES NOWDT                    
#FUSES INTRC_IO                  
#FUSES NOPROTECT              
#FUSES NOMCLR                  
#FUSES NOPUT
#FUSES NOBROWNOUT 
#FUSES NOCPD

#use delay(clock=4000000)
#define trig  pin_a5
#define echo  pin_a4
#define led  pin_a2

#use fast_io(a)

int16 distance, time;          
int sayac;

void main()
{

  setup_adc( ADC_OFF );
  set_tris_a(0b00100000);
  delay_ms(1000);                              // Boot-up delay
  setup_timer_1(RTCC_INTERNAL | RTCC_DIV_1);    // initiating timer
  
while(true)
{
output_high(trig);                        // ping the sonar
delay_us(20);                            // sending 20us pulse
output_low(trig);

while(!input(echo))                      // wait for high state of echo pin
{}

set_timer1(0);                          // setting timer zero

while(input(ECHO))                      // Wait for high state of echo pin
{}

time=get_timer1();                      // Getting the time

distance=time/58 ;            // Calculating the distance
                            
sayac++;
delay_ms(100);


if(distance<10)
{
  sayac = 0;
}

if(sayac<20)
{
  output_high(pin_a2); 
  delay_ms(100);
}

if(sayac>20)
{
  output_low(pin_a2);
  delay_ms(100);
}
}
}

ChiliPepper

#use fast_io(a) kısmını silince düzeldi  :'(

erdcan

Alıntı yapılan: ChiliPepper - 20 Ekim 2020, 15:14:40Merhaba arkadaşlar buradaki hatam ne olabilir ledin belirlediğim mesafeden bir süre sonra sönmesi lazım ama sürekli yanıyor

#include <12F675.h>

#FUSES NOWDT                    
#FUSES INTRC_IO                  
#FUSES NOPROTECT              
#FUSES NOMCLR                  
#FUSES NOPUT
#FUSES NOBROWNOUT 
#FUSES NOCPD

#use delay(clock=4000000)
#define trig  pin_a5
#define echo  pin_a4
#define led  pin_a2

#use fast_io(a)

int16 distance, time;          
int sayac;

void main()
{

  setup_adc( ADC_OFF );
  set_tris_a(0b00100000);
  delay_ms(1000);                              // Boot-up delay
  setup_timer_1(RTCC_INTERNAL | RTCC_DIV_1);    // initiating timer
  
while(true)
{
output_high(trig);                        // ping the sonar
delay_us(20);                            // sending 20us pulse
output_low(trig);

while(!input(echo))                      // wait for high state of echo pin
{}

set_timer1(0);                          // setting timer zero

while(input(ECHO))                      // Wait for high state of echo pin
{}

time=get_timer1();                      // Getting the time

distance=time/58 ;            // Calculating the distance
                            
sayac++;
delay_ms(100);


if(distance<10)
{
  sayac = 0;
}

if(sayac<20)
{
  output_high(pin_a2); 
  delay_ms(100);
}

if(sayac>20)
{
  output_low(pin_a2);
  delay_ms(100);
}
}
}

Kod içerisinde while döngüsünde; ilk if şartında distance değişkeninizi sorgulamışsınız mesafe 10'dan küçük olursa sayaç değişkenini sıfırlamışsınız. Eğer ki mesafe 10'dan küçük değilse sayaç her 100ms'de 1 birim artacak. Bu da 2 saniye boyunca ultrasonik sensörün önünde en az 11cm mesafe uzaklıkta bir cisim bulunması gerektiği anlamına geliyor. Burada ultrasonik sensörünüzün önündeki engelin sürekli olarak orada durması gerektiğini ve düz bir şekilde görmesi gerektiğini hatırlatmak isterim. Eğer ki sensörün önüne hiç bir engel koymadan test işleminizi yaptıysanız veya 2sn gibi bir süre bekletmediysek ultrasonik sensör anlık olarak 0 cm mesafe ölçebilir. Burdan kaynaklı bir sorun olabilir

fay_elektronik

proje yazılımında timer1 in interrupt service routine bölümünü göremedim burayamı eklemediniz acaba

ChiliPepper

Alıntı yapılan: erdcan - 20 Ekim 2020, 17:14:33Kod içerisinde while döngüsünde; ilk if şartında distance değişkeninizi sorgulamışsınız mesafe 10'dan küçük olursa sayaç değişkenini sıfırlamışsınız. Eğer ki mesafe 10'dan küçük değilse sayaç her 100ms'de 1 birim artacak. Bu da 2 saniye boyunca ultrasonik sensörün önünde en az 11cm mesafe uzaklıkta bir cisim bulunması gerektiği anlamına geliyor. Burada ultrasonik sensörünüzün önündeki engelin sürekli olarak orada durması gerektiğini ve düz bir şekilde görmesi gerektiğini hatırlatmak isterim. Eğer ki sensörün önüne hiç bir engel koymadan test işleminizi yaptıysanız veya 2sn gibi bir süre bekletmediysek ultrasonik sensör anlık olarak 0 cm mesafe ölçebilir. Burdan kaynaklı bir sorun olabilir

Herhangi bir sorun oluşmadı. Sonradan düzenlediğim şekliyle amacım 120cm içerisine biri girdiğinde ledi yakmak kimse yoksa 1 dk sonra ledi kapatmak bu şekilde sorunsuz çalıştı

ChiliPepper

Alıntı yapılan: fay_elektronik - 20 Ekim 2020, 17:15:05proje yazılımında timer1 in interrupt service routine bölümünü göremedim burayamı eklemediniz acaba

#include <12F675.h>

#FUSES NOWDT                    
#FUSES INTRC_IO                  
#FUSES NOPROTECT              
#FUSES NOMCLR                  
#FUSES NOPUT
#FUSES NOBROWNOUT 
#FUSES NOCPD


#use delay(clock=4000000)
//#use rs232 ( baud=9600, xmit=pin_A1, rcv=pin_A0, parity=N, stop=1 )
#define trig  pin_a5
#define echo  pin_a4
#define led  pin_a2



int16 distance, time;          
int16 sayac = 0;

void main()
{

  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  set_tris_a(0b00100000);
  delay_ms(1000);                              // Boot-up delay
  setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);    // initiating timer
    


 while(true)
 {
 output_high(trig);                        // ping the sonar
 delay_us(20);                            // sending 20us pulse
 output_low(trig);

 while(!input(echo))                      // wait for high state of echo pin
 {}

 set_timer1(0);                          // setting timer zero

 while(input(echo))                      // Wait for high state of echo pin
 {}

 time=get_timer1();                      // Getting the time

 distance=time/58 ;            // Calculating the distance
                            
 sayac++;
 
 
 
 if(distance<120)
 {
  sayac = 0;
 }
 
 if(sayac<550)
 {
  output_high(pin_a2);
  delay_ms(100);
 }
 
 if(sayac>550)
 {
  output_low(pin_a2);
  delay_ms(100);
 }
 }
}


bu şekilde kullandım bir sorun çıkarmadı daha yeniyim bu konuda dediğiniz kısım
enable_interrupts(INT_TIMER1);               
enable_interrupts(GLOBAL);  bu kodlar mı

sifirzero

https://www.sifirzero.com/2020/06/pic-programlama-ccs-c-mesafe-sensor.html?m=0
İsine yararsa bir tane örnek veriyorum. Kolay gelsin.fast io veya standart io bazen sorun çıkartiyor.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir