Elektronik / Embedded / Mobil Cihazlar
Arduino Irremote İle İlgili Hata İçin Yardım
Arduino Irremote İle İlgili Hata İçin Yardım
-
Merhaba arkadaşlar kuzenim okul için bir arduino projesi geliştiriyor trafik ışıkları uygulaması ama hatayla karşılaşıyormuş ben de pek anlamadığım için müritlerden bilen vardır diye konu açayım dedim.
bana yazdığı bu şekilde nasıl bir yol izleyebiliriz?
-----------------
Trafik sinyalizasyonunda kızılötesi kumanda kullanıyorum ama interrupt komutu istediğim gibi çalışmıyor . Normal akistan istenen duruma geçiş yapmıyor ama farklı sonuçlar alıyorum
Trafik sinyalizasyonu bir kavşakta normal seyirinde giderken kızılötesi kumanda yardımıyla normal akışı geçiş önceliği olan araçlar için değiştiriyorum. Gelen araç için ışık yeşil yanması hedeflenirken diğer yön için kırmızı olması isteniyor . Ama kumandaya basıldığında bütün ışıklar yanıyor ve sönmüyor .
kod aşağıda arkadaşlar
#include <IRremote.h> //kütüphane indirme adresi: https://github.com/z3t0/Arduino-IRremote int RECV_PIN = 2; // IR alıcısı giriş portu IRrecv irrecv(RECV_PIN); decode_results results; void setup() { //1. yol pinMode(3,OUTPUT); //1. yol yeşil pinMode(4,OUTPUT); //1. yol sarı pinMode(5,OUTPUT); //1. yol kırmızı //2.yol pinMode(6,OUTPUT);//2. yol yeşil pinMode(7,OUTPUT); //2. yol sarı pinMode(9,OUTPUT);//2. yol kırmızı Serial.begin(9600); irrecv.enableIRIn(); // Alış başlıyor Serial.println("KODLAR:"); pinMode(RECV_PIN, INPUT_PULLUP); IrReceiver.begin(RECV_PIN); attachInterrupt(digitalPinToInterrupt(2), denetle, FALLING); } void ikinciyol(){ digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(9, LOW); delay(5000); digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, HIGH); digitalWrite(9, LOW); delay(3000); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(9, HIGH); delay(5000); } void birinciyol(){ digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(9, HIGH); delay(5000); digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, HIGH); digitalWrite(9, LOW); delay(3000); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(9, LOW); delay(5000); } void denetle(){ if (irrecv.decode(&results)) { Serial.print("HEX> "); Serial.println(results.value, HEX); // Gelen veri hexadecimal (16'lık) tabanda yazılır if(results.value==0xFFA25D){ Serial.println("1. yol için basıldı"); birinciyol(); } else if(results.value==0xFF629D){ Serial.println("2. yol için basıldı "); ikinciyol(); } else if(results.value==0xFFE21D){ Serial.println("3. yol için basıldı"); birinciyol(); } else if(results.value==0xFF22DD){ Serial.println("4. yol için basıldı "); ikinciyol(); } else irrecv.resume(); } } void loop() { Serial.println("trafik normalden devam ediyor "); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(9, HIGH); delay(5000); digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, HIGH); digitalWrite(9, LOW); delay(3000); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(9, LOW); delay(5000); }
-
109. satırda "else" için parantez açılmamış.
-
BiUyeOlamadim bunu yazdı
109. satırda "else" için parantez açılmamış.
Parantez kume içine almaya yarar.One line conditionlarda kume parantezi kullanmana gerek yoktur.
end tarafından 25/May/22 17:22 tarihinde düzenlenmiştir -
Hocam burada loop() fonksiyonu içerisinde ve diğer fonksiyonların içerisinde delay() fonksiyonu kullanılmış. delay() fonksiyonu ile bekleme yaparsan arduino daki bütün işlemler durur, yani asenkron değildir. Arduino daki bütün işlemler beklediği için diğer kodlar da sağlıklı çalışmaz.
Bunun için delay() kullanmadan bekleme yapman lazım. millis() kullanabilirsin bunun yerine.
https://forum.arduino.cc/t/interrupt-with-delay/455056/2
-
denemedim ama şu şekilde bir deneyebilir mi ?
birde üst mesajdaki arkadaşın dediği gibi delay kullanmasın. bekleme esnasında kumandadan tuşlara bassa da çalışmayacak tepki vermeyecek. millis ile değiştirsin delay verdiği kısımları.
#include //kütüphane indirme adresi: https://github.com/z3t0/Arduino-IRremote int RECV_PIN = 2; // IR alıcısı giriş portu IRrecv irrecv(RECV_PIN); decode_results results; void setup() { //1. yol pinMode(3,OUTPUT); //1. yol yeşil pinMode(4,OUTPUT); //1. yol sarı pinMode(5,OUTPUT); //1. yol kırmızı //2.yol pinMode(6,OUTPUT);//2. yol yeşil pinMode(7,OUTPUT); //2. yol sarı pinMode(9,OUTPUT);//2. yol kırmızı Serial.begin(9600); irrecv.enableIRIn(); // Alış başlıyor Serial.println("KODLAR:"); pinMode(RECV_PIN, INPUT_PULLUP); IrReceiver.begin(RECV_PIN); } void loop() { denetle(); normal(); } void normal() { Serial.println("trafik normalden devam ediyor "); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(9, HIGH); delay(5000); digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, HIGH); digitalWrite(9, LOW); delay(3000); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(9, LOW); delay(5000); } void ikinciyol(){ digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(9, LOW); delay(5000); digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, HIGH); digitalWrite(9, LOW); delay(3000); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(9, HIGH); delay(5000); } void birinciyol(){ digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(9, HIGH); delay(5000); digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, HIGH); digitalWrite(9, LOW); delay(3000); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(9, LOW); delay(5000); } void denetle(){ if (irrecv.decode(&results)) { Serial.print("HEX> "); Serial.println(results.value, HEX); // Gelen veri hexadecimal (16'lık) tabanda yazılır if(results.value==0xFFA25D){ Serial.println("1. yol için basıldı"); birinciyol(); } else if(results.value==0xFF629D){ Serial.println("2. yol için basıldı "); ikinciyol(); } else if(results.value==0xFFE21D){ Serial.println("3. yol için basıldı"); birinciyol(); } else if(results.value==0xFF22DD){ Serial.println("4. yol için basıldı "); ikinciyol(); } else normal(); irrecv.resume(); } }
-
Hocam denetle ve loop içindekileri yer değiştir... Şartların en sonunda normalakışı çağır...
-
teşekkürler arkadaşlar cevaplar için iletiyorum hepsini kendisine.
-
Herkese merhaba, dostum buna benzer bir proje yapmıştım ama ben manyetik butonla yapmıştım bir fikir verebilir sana.
Kod aşağıda nasıl çalıştığına dair video da bu linkte: https://s6.dosya.tc/server7/txqui2/Trafik_isigi.mp4.html
// << Coded by İbrahim Yılmaz >> 19.01.2020
byte kirmizi13 = 13; // 4. satırdan 25.satıra kadar değişkenlere isim atadım
byte kirmizi12 = 12;
byte kirmizi11 = 11;
byte kirmizi10 = 10;
byte yesil9 = 9;
byte yesil8 = 8;
byte yesil7 = 7;
byte yesil6 = 6;
byte mavi5 = 5;
byte mavi4 = 4;
byte mavi3 = 3;
byte mavi2 = 2;
byte Reset = A0;
byte Yol_1 = A1;
byte Yol_2 = A2;
byte Yol_3 = A3;
byte Yol_4 = A4;
int sayici;
int say1;
int say2;
int say3;
int say4;
void yol1() // 1 numaralı yoldan ambulans sinyali geldiğinde bu döngü devreye girip resetleme yapana kadar çalışır.
{while(digitalRead(Reset) != HIGH)
{
if(say1 >= 0 && say1 <=2000)
{
digitalWrite(yesil9,HIGH);
digitalWrite(yesil8,LOW);
digitalWrite(yesil7,LOW);
digitalWrite(yesil6,LOW);
digitalWrite(kirmizi13,LOW);
digitalWrite(kirmizi12,HIGH);
digitalWrite(kirmizi11,HIGH);
digitalWrite(kirmizi10,HIGH);
if(say1 >= 0 && say1 <= 1000)
{
digitalWrite(mavi5,HIGH);
}
if(say1 >= 1000 && say1 <= 2000)
{
digitalWrite(mavi5,LOW);
}
digitalWrite(mavi4,LOW);
digitalWrite(mavi3,LOW);
digitalWrite(mavi2,LOW);
digitalRead(Reset);
}
delay(10);
say1=say1+10;
if(say1 >= 2001)
{
say1=0;
}
}
}
void yol2()// 2 numaralı yoldan ambulans sinyali geldiğinde bu döngü devreye girip resetleme yapana kadar çalışır.
{
while(digitalRead(Reset) != HIGH)
{
if(say2 >= 0 && say2 <=2000)
{
digitalWrite(yesil9,LOW);
digitalWrite(yesil8,HIGH);
digitalWrite(yesil7,LOW);
digitalWrite(yesil6,LOW);
digitalWrite(kirmizi13,HIGH);
digitalWrite(kirmizi12,LOW);
digitalWrite(kirmizi11,HIGH);
digitalWrite(kirmizi10,HIGH);if(say2 >= 0 && say2 <= 1000)
{
digitalWrite(mavi4,HIGH);
}
if(say2 >= 1000 && say2 <= 2000)
{
digitalWrite(mavi4,LOW);
}
digitalWrite(mavi5,LOW);
digitalWrite(mavi3,LOW);
digitalWrite(mavi2,LOW);
}
delay(10);
say2=say2+10;
if(say2 >= 2001)
{
say2=0;
}
}
}
void yol3()// 3 numaralı yoldan ambulans sinyali geldiğinde bu döngü devreye girip resetleme yapana kadar çalışır.
{
while(digitalRead(Reset) != HIGH)
{
if(say3 >= 0 && say3 <=2000)
{
digitalWrite(yesil9,LOW);
digitalWrite(yesil8,LOW);
digitalWrite(yesil7,HIGH);
digitalWrite(yesil6,LOW);
digitalWrite(kirmizi13,HIGH);
digitalWrite(kirmizi12,HIGH);
digitalWrite(kirmizi11,LOW);
digitalWrite(kirmizi10,HIGH);
if(say3 >= 0 && say3 <= 1000)
{
digitalWrite(mavi3,HIGH);
}
if(say3 >= 1000 && say3 <= 2000)
{
digitalWrite(mavi3,LOW);
}
digitalWrite(mavi5,LOW);
digitalWrite(mavi4,LOW);
digitalWrite(mavi2,LOW);
}
delay(10);
say3=say3+10;
if(say3 >= 2001)
{
say3=0;
}
}
}
void yol4()// 4 numaralı yoldan ambulans sinyali geldiğinde bu döngü devreye girip resetleme yapana kadar çalışır.
{
while(digitalRead(Reset) != HIGH)
{
if(say4 >= 0 && say4 <=2000)
{
digitalWrite(yesil9,LOW);
digitalWrite(yesil8,LOW);
digitalWrite(yesil7,LOW);
digitalWrite(yesil6,HIGH);
digitalWrite(kirmizi13,HIGH);
digitalWrite(kirmizi12,HIGH);
digitalWrite(kirmizi11,HIGH);
digitalWrite(kirmizi10,LOW);if(say4 >= 0 && say4 <= 1000)
{
digitalWrite(mavi2,HIGH);
}
if(say4 >= 1000 && say4 <= 2000)
{
digitalWrite(mavi2,LOW);
}
digitalWrite(mavi5,LOW);
digitalWrite(mavi4,LOW);
digitalWrite(mavi3,LOW);
}
delay(10);
say4=say4+10;
if(say4 >= 2000)
{
say4=0;
}
}
}
void setup()
{
pinMode(kirmizi13,OUTPUT);
pinMode(kirmizi12,OUTPUT);
pinMode(kirmizi11,OUTPUT);
pinMode(kirmizi10,OUTPUT);
pinMode(yesil9,OUTPUT);
pinMode(yesil8,OUTPUT);
pinMode(yesil7,OUTPUT);
pinMode(yesil6,OUTPUT);
pinMode(mavi5,OUTPUT);
pinMode(mavi4,OUTPUT);
pinMode(mavi3,OUTPUT);
pinMode(mavi2,OUTPUT);
pinMode(Reset,INPUT);
pinMode(Yol_1,INPUT);
pinMode(Yol_2,INPUT);
pinMode(Yol_3,INPUT);
pinMode(Yol_4,INPUT);}
void loop() // Ana döngümüz burasıdır ambulans sinyali gelmediği sürece buradaki döngü çalışacaktır.
{
if(sayici >= 0 && sayici <=5000)
{
digitalWrite(yesil9,HIGH);
digitalWrite(yesil8,LOW);
digitalWrite(yesil7,LOW);
digitalWrite(yesil6,LOW);
digitalWrite(kirmizi13,LOW);
digitalWrite(kirmizi12,HIGH);
digitalWrite(kirmizi11,HIGH);
digitalWrite(kirmizi10,HIGH);
digitalWrite(mavi5,LOW);
digitalWrite(mavi4,LOW);
digitalWrite(mavi3,LOW);
digitalWrite(mavi2,LOW);
} //ilk döngü tamamlanıyor.
if(sayici >= 5001 && sayici <=10000)
{
digitalWrite(yesil9,LOW);
digitalWrite(yesil8,HIGH);
digitalWrite(yesil7,LOW);
digitalWrite(yesil6,LOW);
digitalWrite(kirmizi13,HIGH);
digitalWrite(kirmizi12,LOW);
digitalWrite(kirmizi11,HIGH);
digitalWrite(kirmizi10,HIGH);
digitalWrite(mavi5,LOW);
digitalWrite(mavi4,LOW);
digitalWrite(mavi3,LOW);
digitalWrite(mavi2,LOW);
} //ikinci döngü tamamlanıyor.if(sayici >= 10001 && sayici <=15000)
{
digitalWrite(yesil9,LOW);
digitalWrite(yesil8,LOW);
digitalWrite(yesil7,HIGH);
digitalWrite(yesil6,LOW);
digitalWrite(kirmizi13,HIGH);
digitalWrite(kirmizi12,HIGH);
digitalWrite(kirmizi11,LOW);
digitalWrite(kirmizi10,HIGH);
digitalWrite(mavi5,LOW);
digitalWrite(mavi4,LOW);
digitalWrite(mavi3,LOW);
digitalWrite(mavi2,LOW);
} //üçüncü döngü tamamlanıyor.
if(sayici >= 15001 && sayici <=20000)
{
digitalWrite(yesil9,LOW);
digitalWrite(yesil8,LOW);
digitalWrite(yesil7,LOW);
digitalWrite(yesil6,HIGH);
digitalWrite(kirmizi13,HIGH);
digitalWrite(kirmizi12,HIGH);
digitalWrite(kirmizi11,HIGH);
digitalWrite(kirmizi10,LOW);
digitalWrite(mavi5,LOW);
digitalWrite(mavi4,LOW);
digitalWrite(mavi3,LOW);
digitalWrite(mavi2,LOW);
}
delay(10);
sayici=sayici+10;
if(sayici >= 20001)
{
sayici = 0;
}
if(digitalRead(Yol_1)==HIGH) // 1 numaralı yoldan sinyal gelince 1 numaralı döngüye gider.
{
yol1();
}
if(digitalRead(Yol_2)==HIGH) // 2 numaralı yoldan sinyal gelince 2 numaralı döngüye gider.
{
yol2();
}
if(digitalRead(Yol_3)==HIGH) // 3 numaralı yoldan sinyal gelince 3 numaralı döngüye gider.
{
yol3();
}
if(digitalRead(Yol_4)==HIGH) // 4 numaralı yoldan sinyal gelince 4 numaralı döngüye gider.
{
yol4();
}
}