Arduino arabanın LED devresi yanıp sönerken araba çalışmıyor

ArdaWien

Decapat
Katılım
8 Ekim 2022
Mesajlar
26
Merhaba Arduino arabamda sağ sinyal ve sol sinyal yapmak istiyorum. Lakin Y tuşuna (LED için Bluetooth'tan gelen komut) bastığımda 1 kere yanıp sönüyor. Ben Y tuşuna bastığımda diğer tuşlarda çalışsın araba ileri giderken de geri giderken de LED yanıp sonsun ta ki ben tekrar Y tusuna basana kadar. Kodu kendim de yazdım delay fonksiyonu ile çalışmadı, ChatGPT'ye yazdırdım yine olmadı her zaman ya 1 kere yanıp sonuyor ya da araba çalışmıyor LED yanıp sönerken. Yardımcı olabilir misiniz?
Kodlar:

Kod:
// L298N Bağlantısı
const int in1 = 7;
const int in2 = 12;
const int enA = 9;

const int in3 = 11;
const int in4 = 10;
const int enB = 3;

int state; // Bluetooth'tan gelen komut
int vSpeed = 255; // Varsayılan hız

bool ledModuAktif = false; // LED yanıp sönme açık mı?
unsigned long previousMillis = 0;
const long interval = 750;
bool ledState = LOW;

void setup() {
 pinMode(in1, OUTPUT);
 pinMode(in2, OUTPUT);
 pinMode(enA, OUTPUT);

 pinMode(in3, OUTPUT);
 pinMode(in4, OUTPUT);
 pinMode(enB, OUTPUT);

 pinMode(4, OUTPUT); // Sağ Sarı LED

 Serial.begin(9600); // Bluetooth için seri haberleşme
}

void loop() {
 if (Serial.available() > 0) {
 char gelenKomut = Serial.read();

 if (gelenKomut == 'Y') {
 // Y tuşuna basıldığında LED yanıp sönme durumunu kontrol et
 ledModuAktif = !ledModuAktif; // Durumu değiştir
 if (!ledModuAktif) {
 digitalWrite(4, LOW); // Y'ye tekrar basıldığında LED'i kapat
 }
 } else {
 state = gelenKomut; // Sadece diğer komutları oku
 }
 }

 // LED yanıp sönme kontrolü
 if (ledModuAktif) {
 unsigned long currentMillis = millis();
 if (currentMillis - previousMillis >= interval) {
 previousMillis = currentMillis;
 ledState = !ledState;
 digitalWrite(4, ledState);
 }
 }

 // --- Motor kontrolleri ---
 // Hız seviyeleri
 if (state == '0') vSpeed = 0;
 else if (state == '1') vSpeed = 100;
 else if (state == '2') vSpeed = 180;
 else if (state == '3') vSpeed = 200;
 else if (state == '4') vSpeed = 255;

 // İleri
 if (state == 'F') {
 analogWrite(enA, vSpeed);
 analogWrite(enB, vSpeed);
 digitalWrite(in1, HIGH);
 digitalWrite(in2, LOW);
 digitalWrite(in3, HIGH);
 digitalWrite(in4, LOW);
 }
 // Geri
 else if (state == 'B') {
 analogWrite(enA, vSpeed);
 analogWrite(enB, vSpeed);
 digitalWrite(in1, LOW);
 digitalWrite(in2, HIGH);
 digitalWrite(in3, LOW);
 digitalWrite(in4, HIGH);
 }
 // Sol
 else if (state == 'L') {
 analogWrite(enA, vSpeed);
 analogWrite(enB, vSpeed);
 digitalWrite(in1, LOW);
 digitalWrite(in2, HIGH);
 digitalWrite(in3, HIGH);
 digitalWrite(in4, LOW);
 }
 // Sağ
 else if (state == 'R') {
 analogWrite(enA, vSpeed);
 analogWrite(enB, vSpeed);
 digitalWrite(in1, HIGH);
 digitalWrite(in2, LOW);
 digitalWrite(in3, LOW);
 digitalWrite(in4, HIGH);
 }
 // Durdur
 else if (state == 'S') {
 analogWrite(enA, 0);
 analogWrite(enB, 0);
 digitalWrite(in1, LOW);
 digitalWrite(in2, LOW);
 digitalWrite(in3, LOW);
 digitalWrite(in4, LOW);
 }
}
 
Çünkü loopun en başındaki seri port kontrolü yüzünden bu kod sadece bir mesaj geldiğinde bir kere çalışır. O if (Serial.available() > 0) 'in dışında bir kod yazarsan sürekli çalışır veya içerdeki millis kodunu da dışarı koyarsan çalışır muhtemelen. (delay kullanırsan ana döngüyü geciktireceği için komutları gecikmeli alırsın o yüzden mümkün olduğununca delay kullanma).
 
Çünkü loopun en başındaki seri port kontrolü yüzünden bu kod sadece bir mesaj geldiğinde bir kere çalışır. O if (Serial.available() > 0) 'in dışında bir kod yazarsan sürekli çalışır veya içerdeki millis kodunu da dışarı koyarsan çalışır muhtemelen. (delay kullanırsan ana döngüyü geciktireceği için komutları gecikmeli alırsın o yüzden mümkün olduğununca delay kullanma).
Sinyal için değişken kullanması daha iyi olur. signalOn gibi. loopun başına if (signalOn){}else{} koyar çalışır. Ama sanırım tek sorunu bu değil.
 

Technopat Haberler

Yeni konular

Geri
Yukarı