Arduino Nano ve 4 ultrasonik sensör kullanmak

Başlatan overlok, 25 Kasım 2018, 10: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(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
}

void loop() {
 long duration, distance;
 digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;

  if (distance < 60 ){
    digitalWrite (ledPin, HIGH);
  } 
  else {
    digitalWrite (ledPin, LOW);
  }
 long duration1, distance1;
 digitalWrite(trigPin1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin1, LOW);
  duration1 = pulseIn(echoPin1, HIGH);
  distance1 = (duration1/2) / 29.1;

if (distance1 < 60 ){
    digitalWrite (ledPin1, HIGH);
} 
else {
    digitalWrite (ledPin1, LOW);
}
long duration2, distance2;
 digitalWrite(trigPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin2, LOW);
  duration2 = pulseIn(echoPin2, HIGH);
  distance2 = (duration2/2) / 29.1;

if (distance2 < 60 ){
    digitalWrite (ledPin2, HIGH);
} 
else {
    digitalWrite (ledPin2, LOW);
}
long duration3, distance3;
 digitalWrite(trigPin3, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin3, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin3, LOW);
  duration3 = pulseIn(echoPin3, HIGH);
  distance3 = (duration3/2) / 29.1;

if (distance3 < 60 ){
    digitalWrite (ledPin3, HIGH);
} 
else {
    digitalWrite (ledPin3, LOW);

}}
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, 18: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

#8
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 duration, distance;
long duration1, distance1;
long duration2, distance2;
long duration3, distance3;

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

  count++;
  count_1++;

}
void setup() {

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  Serial.begin(57600);
}

void loop() {

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

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) / 29.1;

  digitalWrite(trigPin1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin1, LOW);
  duration1 = pulseIn(echoPin1, HIGH);
  distance1 = (duration1 / 2) / 29.1;

  digitalWrite(trigPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin2, LOW);
  duration2 = pulseIn(echoPin2, HIGH);
  distance2 = (duration2 / 2) / 29.1;

  digitalWrite(trigPin3, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin3, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin3, LOW);
  duration3 = pulseIn(echoPin3, HIGH);
  distance3 = (duration3 / 2) / 29.1;


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

  if (distance <= 60 && flag == 0 )//mesafe 60cm altında ise 
  {
    digitalWrite(ledPin, HIGH);//ledi yak
    count = 0;
    flag = 1;
  }
  if (count > 5)//5 saniye bekle
  {
    digitalWrite(ledPin, LOW); //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 == 0 )
  {
    digitalWrite( ledPin1, HIGH);
    count_1 = 0;
    flag_1 = 1;
  }
  if (count_1 > 5)//5 saniye bekle
  {
    digitalWrite( ledPin1, LOW); //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 duration, distance;
long duration1, distance1;
long duration2, distance2;
long duration3, distance3;

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

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

}
void setup() {

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  Serial.begin(57600);
}

void loop() {

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

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) / 29.1;

  digitalWrite(trigPin1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin1, LOW);
  duration1 = pulseIn(echoPin1, HIGH);
  distance1 = (duration1 / 2) / 29.1;

  digitalWrite(trigPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin2, LOW);
  duration2 = pulseIn(echoPin2, HIGH);
  distance2 = (duration2 / 2) / 29.1;

  digitalWrite(trigPin3, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin3, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin3, LOW);
  duration3 = pulseIn(echoPin3, HIGH);
  distance3 = (duration3 / 2) / 29.1;


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

  if (distance <= 60 && flag == 0 )//mesafe 60cm altýnda ise 
  {
    digitalWrite(ledPin, HIGH);//ledi yak
    count = 0;
    flag = 1;
  }
  if (count > 5)//5 saniye bekle
  {
    digitalWrite(ledPin, LOW); //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 == 0 )
  {
    digitalWrite( ledPin1, HIGH);
    count_1 = 0;
    flag_1 = 1;
  }
  if (count_1 > 5)//5 saniye bekle
  {
    digitalWrite( ledPin1, LOW); //5 saniye sonra sondur
  }
  if (distance1 > 60 && flag_1 == 1)
  {
    flag_1 = 0;
  }
/********************************************************************/

  if (distance2 <= 60 && flag_2 == 0 )
  {
    digitalWrite( ledPin2, HIGH);
    count_2 = 0;
    flag_2 = 1;
  }
  if (count_2 > 5)//5 saniye bekle
  {
    digitalWrite( ledPin2, LOW); //5 saniye sonra sondur
  }
  if (distance2 > 60 && flag_2 == 1)
  {
    flag_2 = 0;
  }
  /******************************************************************/
/********************************************************************/

  if (distance3 <= 60 && flag_3 == 0 )
  {
    digitalWrite( ledPin3, HIGH);
    count_3 = 0;
    flag_3 = 1;
  }
  if (count_3 > 5)//5 saniye bekle
  {
    digitalWrite( ledPin3, LOW); //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 duration, distance;
long duration1, distance1;
long duration2, distance2;
long duration3, distance3;

volatile unsigned int count = 0, count_1 = 0, count_2 = 0, count_3 = 0;
static int flag = 0, flag_1 = 0, flag_2 = 0, flag_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 |= (1 << WGM12);
  TCCR1B |= (1 << CS12)  | (1 << CS10);
  TIMSK1 |= (1 << OCIE1A);
  sei();
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  Serial.begin(57600);
}

void loop() {

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) / 29.1;

  digitalWrite(trigPin1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin1, LOW);
  duration1 = pulseIn(echoPin1, HIGH);
  distance1 = (duration1 / 2) / 29.1;

  digitalWrite(trigPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin2, LOW);
  duration2 = pulseIn(echoPin2, HIGH);
  distance2 = (duration2 / 2) / 29.1;

  digitalWrite(trigPin3, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin3, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin3, LOW);
  duration3 = pulseIn(echoPin3, HIGH);
  distance3 = (duration3 / 2) / 29.1;


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

  if (distance <= 60 && flag == 0 )//mesafe 60cm altýnda ise 
  {
    digitalWrite(ledPin, HIGH);//ledi yak
    count = 0;
    flag = 1;
  }
  if (count > 5)//5 saniye bekle
  {
    digitalWrite(ledPin, LOW); //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 == 0 )
  {
    digitalWrite( ledPin1, HIGH);
    count_1 = 0;
    flag_1 = 1;
  }
  if (count_1 > 5)//5 saniye bekle
  {
    digitalWrite( ledPin1, LOW); //5 saniye sonra sondur
  }
  if (distance1 > 60 && flag_1 == 1)
  {
    flag_1 = 0;
  }
/********************************************************************/

  if (distance2 <= 60 && flag_2 == 0 )
  {
    digitalWrite( ledPin2, HIGH);
    count_2 = 0;
    flag_2 = 1;
  }
  if (count_2 > 5)//5 saniye bekle
  {
    digitalWrite( ledPin2, LOW); //5 saniye sonra sondur
  }
  if (distance2 > 60 && flag_2 == 1)
  {
    flag_2 = 0;
  }
  /******************************************************************/
/********************************************************************/

  if (distance3 <= 60 && flag_3 == 0 )
  {
    digitalWrite( ledPin3, HIGH);
    count_3 = 0;
    flag_3 = 1;
  }
  if (count_3 > 5)//5 saniye bekle
  {
    digitalWrite( ledPin3, LOW); //5 saniye sonra sondur
  }
  if (distance3 > 60 && flag_3 == 1)
  {
    flag_3 = 0;
  }
  /******************************************************************/
}