if koşulunda delay komutu kullanımı
  • Merhabalar

    RC522 Rfid kart modülü ile açılıp kapanan, kapı kilidi projesi üzerinde çalışıyorum.

    Projenin mekanik aksamını tamamladım, fakat arduino kodlama kısmında ufak bir sorun ile karşılaştım.

    Projede iki adet rfid kart kullanacağım bunlardan birisi kapıyı kilitlerken, diğeri kapıyı açacak.

    l293d motor shield vasıtası ile dc motoru ileri ve geri döndürmek suretiyle kapı açılıp kapanacak, kartlardan birisini okuttuğumda motor dönmeye başlıyor diğer kartı okuttuğumda ise motor diğer yöne doğru dönüyor buraya kadar her şey tam olarak istediğim gibi fakat motorları durduramıyorum en son hangi kartı okuttuysam o yönde dönmeye devam ediyor.

    Benim istediğim şey kartı okutunca 5 saniye dönsün sonra dursun fakat bir türlü beceremedim

    yazdığım if dizininden örnek vermem gerekirse

    ******************************************************************************

    if (rfid == kart1)

    {

    motoryon.run(BACKWARD);

    Serial.println("Kapi Kapaniyor");

    delay(5000);


    }
    ***************************************************************************

    yukarıdaki şekildeyken motor kart okunduktan 5 saniye sonra dönmeye başlıyor


    aşağıdaki gibi bir değişiklik yaptığımda ise motor dönmeye başlamadan durma komutunu kullanıyor.

    ///////////////////////////////////////////////////////////////////////////

    if (rfid == kart1)

    {

    motoryon.run(BACKWARD);

    Serial.println("Kapi Kapaniyor");

    delay(5000);

    motoryon.run(RELEASE);

    }
    ////////////////////////////////////////////////////////////////////////

    Bu durumda ben ne yapmalıyım ki motor 5 saniye çalıştıktan sonra dursun? Nerede hata yapıyor olabilirim acaba?

    Şimdiden yardımlarınız için teşekkürler.
  • if komutlarından sonra else eklemeniz lazım.
  • Cevap icin tesekkurler fakat else komutu if teki şartın sağlanmadığı durumlar için geçerli degil mi?

    Bu proje icin konuşursak boyle bir durum söz konusu olmayacak iki kart var ve ikiside if teki şartları sağlayan kartlar olacaklar. Kartlardan birisi motoru bir yöne öbürü diğer yöne çeviricek yani yanlış kart okutulması gibi bir durum yok kartı okutucam ve motor 5 saniye suresince dönecek ve sonrasinda başka müdahale yapmaya gerek kalmadan duracak. Fakat nerde hata yaptiysam bunu bir türlü sağlayamadım delay komutu işe yaramiyor daha doğrusu yarıyor ama sıralı bir şekilde yapmıyor işlemleri sanki if ten sonraki süslü parantezin içindeki her şeyi aynı anda yapmaya çalışıyor program.

    (bu arada şuan işteyim herhangibir şey deneyemiyorum işten çıkınca deneyeceğim önerilerinizi)
  • motor komutlarını if in altında delay yerine bir for döngüsünde çalıştırmayı deneyabilirsin bence
  • başlık yanlış olmuş, if döndü değildir. koşul ifadesidir
  • Başlığı düzelttim. Peki şimdi sorunuma bir çözüm önerin var mı? ☺
  • If içerisine konsol çıktısı alın acaba girip çıkıyor mu yoksa hiç mi girmiyor.Bazen böyle sıkıntılar oluyor, if sonrası else{} şeklinde ekleyerekte bir deneme yapabilirsiniz.
  • sen kodun tamamını buraya at. söylediğinden şunu anlıyorum. if içinde verdiğin komutlar. if bloğunun dışında başka bir komut geldiğinde aktif hale geliyor. tabi ki bu bir tahmin. kodların tamamını görmek lazım.

  • Tamamdır şuan işteyim aksam atıcam kodun tamamını.
  • Kodlar bu şekildeyken yani if koşulunun olduğu yerde "motoryon.run(RELEASE);" kodu yazılı haldeyken kartı okutunca motor hiç çalışmıyor.

    "motoryon.run(RELEASE);" kodunu kaldırdığımızda ise motor 5 saniye sonra hiç durmamak üzere çalışmaya başlıyor



    ***********************************************************************

    #include < SPI.h>
    #include < MFRC522.h>
    #include < EEPROM.h>
    #include < AFMotor.h>

    #define RST_PIN A4
    #define SS_PIN A5



    MFRC522 mfrc522(SS_PIN, RST_PIN);

    String lastRfid = "";
    String kart1 = "";
    String kart2 = "";

    MFRC522::MIFARE_Key key;



    AF_DCMotor motoryon(2);

    void setup()
    {
    Serial.begin(9600);
    SPI.begin();
    mfrc522.PCD_Init();

    Serial.println("KART OKUNMAYA HAZIR");
    Serial.println("--------------------------");
    Serial.println();

    readEEPROM();
    motoryon.setSpeed(255);

    motoryon.run(RELEASE);
    }

    void loop()
    {

    if ( ! mfrc522.PICC_IsNewCardPresent())
    {
    return;
    }
    if ( ! mfrc522.PICC_ReadCardSerial())
    {
    return;
    }

    String rfid = "";
    for (byte i = 0; i < mfrc522.uid.size; i++)
    {
    rfid += mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ";
    rfid += String(mfrc522.uid.uidByte[i], HEX);
    }

    rfid.trim();
    rfid.toUpperCase();

    if (rfid == lastRfid)
    return;
    lastRfid = rfid;

    Serial.print("Kart 1: ");
    Serial.println(kart1);
    Serial.print("Kart 2: ");
    Serial.println(kart2);
    Serial.print("Okunan: ");
    Serial.println(rfid);
    Serial.println();

    if (rfid == kart1)
    {

    motoryon.run(BACKWARD);

    Serial.println("Kapi Kapaniyor");

    delay(5000);

    motoryon.run(RELEASE);

    }


    if (rfid == kart2)
    {
    motoryon.run(FORWARD);

    delay(5000);

    Serial.println("Kapi Aciliyor");

    motoryon.run(RELEASE);

    }
    }
    void readEEPROM()
    {

    for (int i = 0 ; i < 4 ; i++)
    {
    kart1 += EEPROM.read(i) < 0x10 ? " 0" : " ";
    kart1 += String(EEPROM.read(i), HEX);
    }

    for (int i = 4 ; i < 8 ; i++)
    {
    kart2 += EEPROM.read(i) < 0x10 ? " 0" : " ";
    kart2 += String(EEPROM.read(i), HEX);
    }

    kart1.trim();
    kart1.toUpperCase();
    kart2.trim();
    kart2.toUpperCase();
    }

    *********************************************************************************

    Yardımlarınız için şimdiden teşekkürler.
  • seri monitörde çıkan yazıları görebilirmiyiz
  • aşağıdaki gibi ikinci if koşuluna "else" koymayı dene


    if (rfid == kart1)
    {
    motoryon.run(BACKWARD);
    Serial.println("Kapi Kapaniyor");
    delay(5000);
    motoryon.run(RELEASE);
    }
    else if (rfid == kart2)
    {
    motoryon.run(FORWARD);
    delay(5000);
    Serial.println("Kapi Aciliyor");
    motoryon.run(RELEASE);
    }
  • rfid değişkenine kart okutulana kadar bişey atanmıyor gibi gördüm ben

    motora yön verdikten sonra rfid değişkenine '' atamayı deneyin
    mesela

    if (rfid == kart2)
    {
    motoryon.run(FORWARD);

    delay(5000);

    Serial.println("Kapi Aciliyor");

    motoryon.run(RELEASE);
    rfid="";

    }
    }
  • Sanırım rfid modülüm bozuldu artık kartları bile okumuyor.
    Tekrar bir modül temin edene kadar konuyu askıya almak zorundayım.
    yardımlarınız için hepinize teşekkürler, modülü alınca konuyu tekrar hortlatıcam.
  • Arkadaşlar tekrar merhaba. Nihayet vakit bulup rfid modülünü temin ettim.

    Önerilerinizden, if koşulunun altına motorun dönme zamanını ayarlamak için nasıl bir for döngüsü yazıcağımı tam olarak kurgulayamadım biraz daha açarsanız
    onu da denemek istiyorum.

    Dediğiniz diğer yöntemleri denedim fakat herhangi bir çözüme ulaşamadım.

    Azda olsa modüllerin ne yapmaya çalıştığını anlamak için kodda şöyle bir değişiklik yaptım

    **************************************************************************
    if (rfid == kart1)

    {
    Serial.println("1. kart");
    motor.run(FORWARD);

    delay(7000);

    motor.run(BACKWARD);

    delay(500);

    motor.run(RELEASE);

    delay(1000);

    motor.run(FORWARD);

    delay(300);

    rfid="";
    }

    *********************************************************************
    bu şekilde bir değişiklik yaptığımda şunları gözlemledim:

    1- Seri haberleşmede "1. kart" yazısı kartı okuttuğum gibi ekrana geliyor.

    2- Yazdığım motor.run komutlarından sadece en alta yazılan çalışıyor üsttekilerin herhangi bir işlevi olmuyor. (Kodu değiştirerek tekrar tekrar denedim.)

    3- Delay kodlarından hangisi en uzunsa o çalışıyor

    Mesela üstteki örneği ele alırsak kartı okuttuğumda "1. kart" yazısı anında ekranda beliriyor 7 saniye sonra da motor en altta yazan (FORWARD) yönünde dönmeye başlıyor.

    Bir de şöyle bir şey denedim

    RFID modülünü tamamen projeden söküp a isminde bir değişken oluşturdum ve bu değişkenin 5'e eşit olup olmadığı durumlarda motorun hareketlerini inceledim.

    ***********************************************************************
    {

    if(a==5)
    {
    motor.run(FORWARD);

    motor.setSpeed(200);
    delay(5000);

    motor.setSpeed(100);
    delay(3000);

    motor.run(BACKWARD);

    motor.setSpeed(255);
    delay(7000);

    motor.setSpeed(50);
    delay(3000);

    motor.run(RELEASE);
    delay(5000);
    }
    }
    ************************************************************************

    Bu şekilde yaptığımda hiç bir sorun olmadan kodları sırasıyla gerçekleştirdi.

    Sanırım sorun RFID modülü ile adafruit motor modülü arasındaki bir uyuşmazlıktan yada rfid kodlarındaki bir hatadan kaynaklanıyor. Tekrar yardımlarınızı bekliyorum.

    Teşekkürler


Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.