Çözüldü Arduino Uno'da 2 işlem nasıl aynı anda yaptırılır?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

zPookie

Centipat
Katılım
13 Nisan 2024
Mesajlar
94
Daha fazla  
Sistem Özellikleri
RTX 4050 6 GB
Intel Core I7-13700H
32 GB RAM
1TB SSD
Cinsiyet
Erkek
Meslek
Öğrenci
CS2'deki C4'ün aynısını yapıyorum, şu anki amacım:

Sarı LED belli aralıklarla yanıp söncek.
Aynı zamanda;
LCD ekranda keypadden şifre girmesini isteyecek.

Sorun şu ki LED yanıp sönüyor şifre girme kısmı gelince LED'i beklemeye alıyor ve şifre girmemi bekliyor. Ben ikisini de aynı anda yapmasını bekliyorum. Bunu nasıl düzeltebilirim?

Şuan ki kodum şu şekilde :

CSS:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

#define Bomb_Buzzer 2
#define Defuse_Buzzer 10

#define Red_Led 11
#define Yellow_Led 12

const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[ROWS] = {9, 8, 7, 6};   // R1, R2, R3, R4
byte colPins[COLS] = {5, 4, 3};      // C1, C2, C3

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();

  pinMode(Bomb_Buzzer, OUTPUT);
  pinMode(Defuse_Buzzer, OUTPUT);
  pinMode(Red_Led, OUTPUT);
  pinMode(Yellow_Led, OUTPUT);

  digitalWrite(Bomb_Buzzer, LOW);
  digitalWrite(Defuse_Buzzer, LOW);
  digitalWrite(Red_Led, LOW);
  digitalWrite(Yellow_Led, LOW);
}

void loop() {
  digitalWrite(Yellow_Led, 1); delay(300); digitalWrite(Yellow_Led, 0); delay(650);
  baslangic();
}

void baslangic() {
  String girilenSifre = "";
  String dogruSifre = "7355608";
  int yildizSayisi = 7;

  // İlk başta 7 tane * göster
  lcd.clear();
  for (int i = 0; i < yildizSayisi; i++) {
    lcd.setCursor(i, 0);
    lcd.print("*");
  }

  while (girilenSifre.length() < 7) {
    char tus = keypad.getKey();

    if (tus != NO_KEY && tus >= '0' && tus <= '9') {
      girilenSifre += tus;

      // Ekranda yazdırma işlemi: sağdan sola kayacak
      for (int i = 0; i < yildizSayisi; i++) {
        lcd.setCursor(i, 0);
        if (i < yildizSayisi - girilenSifre.length()) {
          lcd.print("*");
        } else {
          lcd.print(girilenSifre[i - (yildizSayisi - girilenSifre.length())]);
        }
      }
      delay(200);  // Giriş tuşu sonrası biraz bekleme
    }
  }

 
  delay(500);
 
  if (girilenSifre == dogruSifre) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Bomba Kuruluyor");
  } else {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Yanlis Sifre!");
    delay(1500);
  }
}
 
Çözüm
Tek çekirdek üzerinde çalıştığından dolayı gerçek paralel işlem bu tarz bir yerde mümkün değil.

Bu tarz denetleyici üzerinde çalışmalarda paralel işlem yapmak, elindeki çok büyük zaman diliminin çok küçük yerlerinde iki farklı işlemin için kontrol yaparak ve iki işlem için zaman atamaları yapılarak yapılıyor. Bu tarz yapılarda kontrol zorlaştığından dolayı FreeRTOS veya benzeri planlayıcılar kullanılıyor.

Genel geçer bilgiyi kenara bırakacak olursak, istediğin şeyi basit olarak LED işlemini bir Timer Interrupt içerisinde çalıştırırken şifre kısmını ana döngünde tutarak yapabilirsin.

Ek olarak delay kullandığın bir döngü ile birden çok işlemi aynı anda yapabilmen mümkün değil. Bir işlem için yüzlerce milisaniye denetleyici bekletirken paralel işlem yapmayı bekleyemezsin. Interrupt mantığından biraz daha ilerisine bakmak istersen millis bazlı bekleme yollarını incelemeni öneririm. Tüm kodu hiçbir bekleme olmadan ama beklemelerin hepsini belirli bir sayaç tetiklenecek şekilde şekillendirdiğinde paralel işlem mantığına yakın bir çözüm elde etmiş oluyorsun. Bunun bir üst seviyesi de FreeRTOS vs. kullanmak oluyor.
Tek çekirdek üzerinde çalıştığından dolayı gerçek paralel işlem bu tarz bir yerde mümkün değil.

Bu tarz denetleyici üzerinde çalışmalarda paralel işlem yapmak, elindeki çok büyük zaman diliminin çok küçük yerlerinde iki farklı işlemin için kontrol yaparak ve iki işlem için zaman atamaları yapılarak yapılıyor. Bu tarz yapılarda kontrol zorlaştığından dolayı FreeRTOS veya benzeri planlayıcılar kullanılıyor.

Genel geçer bilgiyi kenara bırakacak olursak, istediğin şeyi basit olarak LED işlemini bir Timer Interrupt içerisinde çalıştırırken şifre kısmını ana döngünde tutarak yapabilirsin.

Ek olarak delay kullandığın bir döngü ile birden çok işlemi aynı anda yapabilmen mümkün değil. Bir işlem için yüzlerce milisaniye denetleyici bekletirken paralel işlem yapmayı bekleyemezsin. Interrupt mantığından biraz daha ilerisine bakmak istersen millis bazlı bekleme yollarını incelemeni öneririm. Tüm kodu hiçbir bekleme olmadan ama beklemelerin hepsini belirli bir sayaç tetiklenecek şekilde şekillendirdiğinde paralel işlem mantığına yakın bir çözüm elde etmiş oluyorsun. Bunun bir üst seviyesi de FreeRTOS vs. kullanmak oluyor.
 
Çözüm
Cevabın için teşekkürler, kafamda ki soruların çoğu çözüldü şimdi. Bu tarz konularda biraz acemiyim, nasıl olacağını anlatıp kodu düzenleyip veya senin açından daha kolay olması için örnek bir şekilde gösterebilir misin?
 

Technopat Haberler

Yeni konular

Geri
Yukarı