19 Temmuz 2019, 16:27:50

Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d


Arduino Nano ve 4 ultrasonik sensör kullanmak

Başlatan overlok, 25 Kasım 2018, 13:44:51

overlok

Merhabalar. Arduino Nano ile 4 adet ultrasonik sensör kullanmaya çalışıyorum. Örnek kodlar aşağıda. Çıkışları birbirinden bağımsız 5 saniye aktif etmek istiyorum. Her  hangi bir çıkışa "delay 5000" eklediğimde süre dolmadan diğer çıkışlar aktif olmuyor. Nasıl yapmam gerekiyor? Kodların bu halinden başka  yazımı için ayrıca önerilere açığım.

#define ledPin 2
#define ledPin1 3
#define ledPin2 4
#define ledPin3 5

#define trigPin 6
#define echoPin 7
#define trigPin1 8
#define echoPin1 9
#define trigPin2 10
#define echoPin2 11
#define trigPin3 12
#define echoPin3 13

void setup() {
  
Serial.begin (9600);
  
pinMode(trigPinOUTPUT);
  
pinMode(echoPinINPUT);
  
pinMode(trigPin1OUTPUT);
  
pinMode(echoPin1INPUT);
  
pinMode(trigPin2OUTPUT);
  
pinMode(echoPin2INPUT);
  
pinMode(trigPin3OUTPUT);
  
pinMode(echoPin3INPUT);
  
pinMode(ledPinOUTPUT);
  
pinMode(ledPin1OUTPUT);
  
pinMode(ledPin2OUTPUT);
  
pinMode(ledPin3OUTPUT);
}

void loop() {
 
long durationdistance;
 
digitalWrite(trigPinLOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPinHIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPinLOW);
  
duration pulseIn(echoPinHIGH);
  
distance = (duration/2) / 29.1;

  if (
distance 60 ){
    
digitalWrite (ledPinHIGH);
  } 
  else {
    
digitalWrite (ledPinLOW);
  }
 
long duration1distance1;
 
digitalWrite(trigPin1LOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPin1HIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPin1LOW);
  
duration1 pulseIn(echoPin1HIGH);
  
distance1 = (duration1/2) / 29.1;

if (
distance1 60 ){
    
digitalWrite (ledPin1HIGH);

else {
    
digitalWrite (ledPin1LOW);
}
long duration2distance2;
 
digitalWrite(trigPin2LOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPin2HIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPin2LOW);
  
duration2 pulseIn(echoPin2HIGH);
  
distance2 = (duration2/2) / 29.1;

if (
distance2 60 ){
    
digitalWrite (ledPin2HIGH);

else {
    
digitalWrite (ledPin2LOW);
}
long duration3distance3;
 
digitalWrite(trigPin3LOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPin3HIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPin3LOW);
  
duration3 pulseIn(echoPin3HIGH);
  
distance3 = (duration3/2) / 29.1;

if (
distance3 60 ){
    
digitalWrite (ledPin3HIGH);

else {
    
digitalWrite (ledPin3LOW);

}}
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

Kabil ATICI

Arduino ide üzerinde,

Dosya>örnekler>Digital>BlinkWithoutDelay

örneğindeki gibi yapabilirsin.

Ama aynı anda 4 tane pulsein fonksiyonunu kullanamazsın.(özellikle uno ile)
Mega ile her birine 1 timer kullanarak birbirinden bağımsız okuma yapabilirsin. Ama bunu pulsein fonksiyonunun kullandığın her bir timer'a uygarlayarak yapabilirsin.
ambar7

overlok

Hocam teşekkürler. Konu beni biraz aşar görünüyor  :)  :) Röle bacaklarına yüksek değerli kondansatör taksam nasıl olur? Tam 5 sn olmasa da problem olmaz. Birde devrede 7805 var. Besleme 12v 1,5 amper adaptör kullandım. 7805 biraz fazla ısınıyor gibi.
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

crazy

Mesafe 60 cm yüksek ise mi 5 saniye boyunca aktif olacak çıkışlar.

Kabil ATICI

7805 ısınması konusu, devrenin ne kadar akım çektiği ile ilgili. Çünkü devre ne kadar akım çekerse 7805 üzerinde harcanması gereken güç miktarı artıyor ve ısınıyor.

Harcanan Güç= (12V-5V)/devrenin çektiği akım

12V besleme gerilimin, 5V 7805'in devreye verdiği gerilim.

Eğer devren kurulu halde değil ise LM2596 ile yapılan güç kaynaklarını biliyorsunuz, onları kullanabilirsiniz. Bu tür devrelerde çalışma şekli nedeniyle 7805'e göre  aynı akım harcamasında ısınma olmaz.
ambar7

fide

Gecikme ile alakalı ben şunu kullanıyorum.

processPlanner değişkenini tanımladım.
 
Void loop
() 
{
ProcessPlanner++;
Delay(1);
İf(processplannerr%5000=1000)
{
sensor oku


İf(processplannerr%5000=2000)
{
sensor2 oku

}

İf(processplannerr%5000=3000)
{
sensor3 
oku


}

Mantık şu. Bir değişken sürekli sayar.
Değişkenin 5000e bölümünden kalan 1000 ise (5saniyenin 1.saniyesinde) bir işi
2. Saniyede 2.işi....
Yap.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

overlok

Alıntı yapılan: crazy - 25 Kasım 2018, 21:22:26Mesafe 60 cm yüksek ise mi 5 saniye boyunca aktif olacak çıkışlar.
60 cm altında ise 5 saniye aktif olacak çıkışlar.
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

ladybird

"Bana ait sözcükler olsun isterdim. Ama kullandığım bu sözcükler, bilmiyorum kaç bilinçte sürüklendi." Jean Paul Sartre

crazy

26 Kasım 2018, 02:06:21 #8 Son düzenlenme: 26 Kasım 2018, 02:14:10 crazy
Hocam bu şekilde dener misiniz.  #define ledPin 2
#define ledPin1 3
#define ledPin2 4
#define ledPin3 5

#define trigPin 6
#define echoPin 7
#define trigPin1 8
#define echoPin1 9
#define trigPin2 10
#define echoPin2 11
#define trigPin3 12
#define echoPin3 13
long durationdistance;
long duration1distance1;
long duration2distance2;
long duration3distance3;

volatile unsigned int count 0count_1 0;
static 
int flag 0flag_1 0;
ISR(TIMER1_COMPA_vect) {

  
count++;
  
count_1++;

}
void setup() {

  
pinMode(trigPinOUTPUT);
  
pinMode(echoPinINPUT);
  
pinMode(trigPin1OUTPUT);
  
pinMode(echoPin1INPUT);
  
pinMode(trigPin2OUTPUT);
  
pinMode(echoPin2INPUT);
  
pinMode(trigPin3OUTPUT);
  
pinMode(echoPin3INPUT);
  
pinMode(ledPinOUTPUT);
  
pinMode(ledPin1OUTPUT);
  
pinMode(ledPin2OUTPUT);
  
pinMode(ledPin3OUTPUT);
  
Serial.begin(57600);
}

void loop() {

  
cli();
  
TCCR1A 0;
  
TCCR1B 0;
  
TCNT1  0;
  
OCR1A 15624// 1 saniye
  
TCCR1B |= (<< WGM12);
  
TCCR1B |= (<< CS12)  | (<< CS10);
  
TIMSK1 |= (<< OCIE1A);
  
sei();

  
digitalWrite(trigPinLOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPinHIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPinLOW);
  
duration pulseIn(echoPinHIGH);
  
distance = (duration 2) / 29.1;

  
digitalWrite(trigPin1LOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPin1HIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPin1LOW);
  
duration1 pulseIn(echoPin1HIGH);
  
distance1 = (duration1 2) / 29.1;

  
digitalWrite(trigPin2LOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPin2HIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPin2LOW);
  
duration2 pulseIn(echoPin2HIGH);
  
distance2 = (duration2 2) / 29.1;

  
digitalWrite(trigPin3LOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPin3HIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPin3LOW);
  
duration3 pulseIn(echoPin3HIGH);
  
distance3 = (duration3 2) / 29.1;


  
/********************************************************************/

  
if (distance <= 60 && flag == )//mesafe 60cm altında ise 
  
{
    
digitalWrite(ledPinHIGH);//ledi yak
    
count 0;
    
flag 1;
  }
  if (
count 5)//5 saniye bekle
  
{
    
digitalWrite(ledPinLOW); //5 saniye sonra sondur
  
}
  if (
distance 60 && flag == 1)//mesafe 60cm fazla ise tekrar 60 cm altına dustugunde 5 saniye ledi yakmak ıcın
  
{
    
flag 0;
  }
  
/******************************************************************/

  
if (distance1 <= 60 && flag_1 == )
  {
    
digitalWriteledPin1HIGH);
    
count_1 0;
    
flag_1 1;
  }
  if (
count_1 5)//5 saniye bekle
  
{
    
digitalWriteledPin1LOW); //5 saniye sonra sondur
  
}
  if (
distance1 60 && flag_1 == 1)
  {
    
flag_1 0;
  }
  
Serial.println(distance);
  
Serial.println(distance1);
}

overlok

@crazy Hocam çok teşekkür ederim. Şu an tinkercad üzerinden simülasyonunu yapıyorum. Çalışıyor. Akşam gerçek devre üzerinde deneyip bildiririm. Emeğinize sağlık.
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

overlok

@crazy ; devreyi denedim. LED yerine röle kullanıyorum çıkışlarda. Çıkışlar low olmuyor. kodları 4 sensöre göre ekleme yaptım. Yanlış mı yaptım bilmiyorum tabi.
#define ledPin 2
#define ledPin1 3
#define ledPin2 4
#define ledPin3 5

#define trigPin 6
#define echoPin 7
#define trigPin1 8
#define echoPin1 9
#define trigPin2 10
#define echoPin2 11
#define trigPin3 12
#define echoPin3 13
long durationdistance;
long duration1distance1;
long duration2distance2;
long duration3distance3;

volatile unsigned int count 0count_1 0count_2 0count_3 0;
static 
int flag 0flag_1 0flag_2 0flag_3 0
ISR(TIMER1_COMPA_vect) {

  
count++;
  
count_1++;
  
count_2++;
  
count_3++;

}
void setup() {

  
pinMode(trigPinOUTPUT);
  
pinMode(echoPinINPUT);
  
pinMode(trigPin1OUTPUT);
  
pinMode(echoPin1INPUT);
  
pinMode(trigPin2OUTPUT);
  
pinMode(echoPin2INPUT);
  
pinMode(trigPin3OUTPUT);
  
pinMode(echoPin3INPUT);
  
pinMode(ledPinOUTPUT);
  
pinMode(ledPin1OUTPUT);
  
pinMode(ledPin2OUTPUT);
  
pinMode(ledPin3OUTPUT);
  
Serial.begin(57600);
}

void loop() {

  
cli();
  
TCCR1A 0;
  
TCCR1B 0;
  
TCNT1  0;
  
OCR1A 15624// 1 saniye
  
TCCR1B |= (<< WGM12);
  
TCCR1B |= (<< CS12)  | (<< CS10);
  
TIMSK1 |= (<< OCIE1A);
  
sei();

  
digitalWrite(trigPinLOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPinHIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPinLOW);
  
duration pulseIn(echoPinHIGH);
  
distance = (duration 2) / 29.1;

  
digitalWrite(trigPin1LOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPin1HIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPin1LOW);
  
duration1 pulseIn(echoPin1HIGH);
  
distance1 = (duration1 2) / 29.1;

  
digitalWrite(trigPin2LOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPin2HIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPin2LOW);
  
duration2 pulseIn(echoPin2HIGH);
  
distance2 = (duration2 2) / 29.1;

  
digitalWrite(trigPin3LOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPin3HIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPin3LOW);
  
duration3 pulseIn(echoPin3HIGH);
  
distance3 = (duration3 2) / 29.1;


  
/********************************************************************/

  
if (distance <= 60 && flag == )//mesafe 60cm altýnda ise 
  
{
    
digitalWrite(ledPinHIGH);//ledi yak
    
count 0;
    
flag 1;
  }
  if (
count 5)//5 saniye bekle
  
{
    
digitalWrite(ledPinLOW); //5 saniye sonra sondur
  
}
  if (
distance 60 && flag == 1)//mesafe 60cm fazla ise tekrar 60 cm altýna dustugunde 5 saniye ledi yakmak ýcýn
  
{
    
flag 0;
  }
  
/******************************************************************/

  
if (distance1 <= 60 && flag_1 == )
  {
    
digitalWriteledPin1HIGH);
    
count_1 0;
    
flag_1 1;
  }
  if (
count_1 5)//5 saniye bekle
  
{
    
digitalWriteledPin1LOW); //5 saniye sonra sondur
  
}
  if (
distance1 60 && flag_1 == 1)
  {
    
flag_1 0;
  }
/********************************************************************/

  
if (distance2 <= 60 && flag_2 == )
  {
    
digitalWriteledPin2HIGH);
    
count_2 0;
    
flag_2 1;
  }
  if (
count_2 5)//5 saniye bekle
  
{
    
digitalWriteledPin2LOW); //5 saniye sonra sondur
  
}
  if (
distance2 60 && flag_2 == 1)
  {
    
flag_2 0;
  }
  
/******************************************************************/
/********************************************************************/

  
if (distance3 <= 60 && flag_3 == )
  {
    
digitalWriteledPin3HIGH);
    
count_3 0;
    
flag_3 1;
  }
  if (
count_3 5)//5 saniye bekle
  
{
    
digitalWriteledPin3LOW); //5 saniye sonra sondur
  
}
  if (
distance3 60 && flag_3 == 1)
  {
    
flag_3 0;
  }
  
/******************************************************************/
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

crazy

Timer kurulumu void loop içine eklenmiş.
void setup'a almak gerekiyor.Kod eklerken olmuş sanırım#define ledPin 2
#define ledPin1 3
#define ledPin2 4
#define ledPin3 5

#define trigPin 6
#define echoPin 7
#define trigPin1 8
#define echoPin1 9
#define trigPin2 10
#define echoPin2 11
#define trigPin3 12
#define echoPin3 13
long durationdistance;
long duration1distance1;
long duration2distance2;
long duration3distance3;

volatile unsigned int count 0count_1 0count_2 0count_3 0;
static 
int flag 0flag_1 0flag_2 0flag_3 0
ISR(TIMER1_COMPA_vect) {

  
count++;
  
count_1++;
  
count_2++;
  
count_3++;

}
void setup() {

  
cli();
  
TCCR1A 0;
  
TCCR1B 0;
  
TCNT1  0;
  
OCR1A 15624// 1 saniye
  
TCCR1B |= (<< WGM12);
  
TCCR1B |= (<< CS12)  | (<< CS10);
  
TIMSK1 |= (<< OCIE1A);
  
sei();
  
pinMode(trigPinOUTPUT);
  
pinMode(echoPinINPUT);
  
pinMode(trigPin1OUTPUT);
  
pinMode(echoPin1INPUT);
  
pinMode(trigPin2OUTPUT);
  
pinMode(echoPin2INPUT);
  
pinMode(trigPin3OUTPUT);
  
pinMode(echoPin3INPUT);
  
pinMode(ledPinOUTPUT);
  
pinMode(ledPin1OUTPUT);
  
pinMode(ledPin2OUTPUT);
  
pinMode(ledPin3OUTPUT);
  
Serial.begin(57600);
}

void loop() {

  
digitalWrite(trigPinLOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPinHIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPinLOW);
  
duration pulseIn(echoPinHIGH);
  
distance = (duration 2) / 29.1;

  
digitalWrite(trigPin1LOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPin1HIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPin1LOW);
  
duration1 pulseIn(echoPin1HIGH);
  
distance1 = (duration1 2) / 29.1;

  
digitalWrite(trigPin2LOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPin2HIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPin2LOW);
  
duration2 pulseIn(echoPin2HIGH);
  
distance2 = (duration2 2) / 29.1;

  
digitalWrite(trigPin3LOW);
  
delayMicroseconds(2);
  
digitalWrite(trigPin3HIGH);
  
delayMicroseconds(10);
  
digitalWrite(trigPin3LOW);
  
duration3 pulseIn(echoPin3HIGH);
  
distance3 = (duration3 2) / 29.1;


  
/********************************************************************/

  
if (distance <= 60 && flag == )//mesafe 60cm altýnda ise 
  
{
    
digitalWrite(ledPinHIGH);//ledi yak
    
count 0;
    
flag 1;
  }
  if (
count 5)//5 saniye bekle
  
{
    
digitalWrite(ledPinLOW); //5 saniye sonra sondur
  
}
  if (
distance 60 && flag == 1)//mesafe 60cm fazla ise tekrar 60 cm altýna dustugunde 5 saniye ledi yakmak ýcýn
  
{
    
flag 0;
  }
  
/******************************************************************/

  
if (distance1 <= 60 && flag_1 == )
  {
    
digitalWriteledPin1HIGH);
    
count_1 0;
    
flag_1 1;
  }
  if (
count_1 5)//5 saniye bekle
  
{
    
digitalWriteledPin1LOW); //5 saniye sonra sondur
  
}
  if (
distance1 60 && flag_1 == 1)
  {
    
flag_1 0;
  }
/********************************************************************/

  
if (distance2 <= 60 && flag_2 == )
  {
    
digitalWriteledPin2HIGH);
    
count_2 0;
    
flag_2 1;
  }
  if (
count_2 5)//5 saniye bekle
  
{
    
digitalWriteledPin2LOW); //5 saniye sonra sondur
  
}
  if (
distance2 60 && flag_2 == 1)
  {
    
flag_2 0;
  }
  
/******************************************************************/
/********************************************************************/

  
if (distance3 <= 60 && flag_3 == )
  {
    
digitalWriteledPin3HIGH);
    
count_3 0;
    
flag_3 1;
  }
  if (
count_3 5)//5 saniye bekle
  
{
    
digitalWriteledPin3LOW); //5 saniye sonra sondur
  
}
  if (
distance3 60 && flag_3 == 1)
  {
    
flag_3 0;
  }
  
/******************************************************************/