Arduino nanoyu kodla resetleme
  • Merhaba arkadaşlar.Rfid modul kullanarak kapıyı açıb kapatıyorum. Sorun şu ki,bazı zamanlar arduino nano klitleniyor.Rfid kartları okumuyor. Arduinoya gelen güc kaynağını kapatıb yeniden açdığımda ve ya arduino nano üzerindeki reset buttonuna tıkladıkdan sonra normal haline dönüyor.Bunu önlemek için rfid-i her kart okuyub işlem yapdıkdan sonra arduinoyu kodla resetlemek istiyorum ki, beni kapının dışarısında burakmasın :). Bunu nasıl yapa bilirim? Bu klitlenme neden ola bilir? Röle modulu kendim tasarladım.
    Burdakı kı gibi

    https://www.google.az/search?q=arduino+relay+2n3904&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiImdesvu_TAhXCCiwKHf3hCz4Q_AUICigB&biw=1366&bih=662#imgrc=cmXohdXsPj1wMM:
  • Bi bakın işinize yarayabilir
  • nedense mantıklı çözümler sunan pek arkadaş bulamadım bu forumda.


    watchdogtimer işini görecektir.
    kitleniyorsa arkadaşların dediği gibi soft resetleyemezsin. kitlenen cihazın kod işlemesini nasıl bekleyebilirsiniz?!

    en basiti şudur dostum.
    #include avr/wdt.h>//watchdog timer eklenir.
    int sayi = 1;
    void setup()
    {
    wdt_enable(WDTO_4S);
    Serial.begin(9600);//4 saniyelik kitlenmeden sonra cihaz yeniden başlar anlamındadır.
    }

    void loop()
    {

    wdt_reset();
    sayi ++; //loop çevriminde 4 saniyede bir bu fonksiyona uğramazsa cihaz kendini resetler anlamındadır. kodunda çok delay varsa yani bir loop çevrimi 4 saniyeden fazla ise(-ki bu kötü bir programdır) cihaz zırt pırt kendini resetleyecektir.
    Serial.println (sayi);//böyle yaparsan durumu gözleyebilirsin.
    delay (5000); //delay (3000) yaparsan sayac 2 3 4 diye gittiğini göreceksin. yani loop çevrimin çalışır. fakat 5 saniye yaparsan gecikmeyi sürekli 2 2 2 diye saydığını görürsün. yani arduinon 'kesme' ile resetlenmiş olur.
    }
    not:
    max 8S olarak yazılabilir.
    yani wdt_enable(WDTO_8S);

  • watchdog timer guzel çözum bende not edeyım bunu.
  • max 8s demişsiniz ama Gsm modülü kullandığım projelerde gsme baglanti suresi loop dongusu 10sn veya daha fazla olabiliyor, ben garantiye alıp 50sn cevap almazsa resetlemesini istiyorum, o zaman ne yapıcaz? @wijippo
  • 10-50sn blok bekleme 1sn lik beklemelerle 10 ve 50lik loop yap içine wdt reseti koy
  • Cevapınız için teşekkür ediyorum. Kod da delay fazla ise kötü demişsiniz. Benim kodumun tamamı böyle. Aslında ben zaman kesmesi ile ledleri kontrol ediyorumda. Bu koda sizin yazdığınız örneyi nasıl kullaniyim?

    #include < SPI.h>
    #include < RFID.h>

    const byte led_red = 7;
    const byte led_green = 8;
    int opendoor = 6;
    int closedoor = 5;

    RFID rfid(10,9);

    byte kart_r[5]={.............................};
    byte kart_z[5]={.............................};
    byte kart_n[5]={.............................};
    byte kart_g[5]={.............................};

    boolean izin = false;
    boolean led_durumu = LOW;

    void setup(){

    Serial.begin(9600);
    SPI.begin();
    rfid.init();
    pinMode(led_red ,OUTPUT);
    pinMode(led_green,OUTPUT);
    pinMode(opendoor ,OUTPUT);
    pinMode(closedoor,OUTPUT);
    cli();
    TCNT1 = 0;
    TCCR1A = 0;
    TCCR1B = 0;
    OCR1A = 15624; // 7812
    TCCR1B |= (1 << WGM12);<br /> TCCR1B |= (1 << CS12) | (1 << CS10);<br /> TIMSK1 |= (1 << OCIE1A);<br /> sei();
    }

    ISR(TIMER1_COMPA_vect)
    {
    led_durumu = !led_durumu;
    digitalWrite(led_red, led_durumu);
    digitalWrite(led_green, !led_durumu);
    }

    void kartkontrol()
    {
    for(int i=0;i<5;i++)<br /> {
    if(rfid.serNum[i] == kart_r[i])
    {
    izin = true;
    }
    else if(rfid.serNum[i] == kart_z[i])
    {
    izin = true;
    }
    else if(rfid.serNum[i] == kart_n[i])
    {
    izin = true;
    }
    else if(rfid.serNum[i] == kart_g[i])
    {
    izin = true;
    }
    else
    {
    izin = false;
    }
    }
    }
    void loop()
    {
    digitalWrite(opendoor,LOW);
    digitalWrite(closedoor,LOW);
    if (rfid.isCard())
    {
    if (rfid.readCardSerial())
    {
    kartkontrol();
    if(izin)
    {
    digitalWrite(opendoor,HIGH);
    digitalWrite(closedoor,LOW);
    delay(3000);
    digitalWrite(opendoor,LOW);
    digitalWrite(closedoor,LOW);
    delay(1200);
    digitalWrite(closedoor,HIGH);
    delay(1000);
    izin = false;
    }
    else
    {
    digitalWrite(opendoor,LOW);
    digitalWrite(closedoor,LOW);
    }

    rfid.halt();

    }
    }
    delay(200);


    }

    Benim proqram böyle çalışıyor.
    Kartı okuduyorum kart dogru ise kapı açılıyor 3 saniye bekleyib sonra yeniden kapanıyor.
    İki tane röle kullanmağımın sebebi kapı açıb kapatan motora verilen gücün + - kontrol edilmesidir.

  • delay(3000) delay(1200) gibi rutinler yerine bu kadar beklemeden geçen ve bu zamanı dolmasında işlem yapan bir rutin yazın milis fonksiyonu ıle yapabilirsiniz. milis değerini saklayan milis-ilkzaman >3000 oldugunda bişeyler yap gibi rutinler işinizi görür. luzumsuz yere bloke etmemiş olursunuz programı
  • 8 saniyeden uzun süreler için WDT ilginç bir problem. biri bu konuda makale yazsa iyi olur. delay olayına gelince TimerFa kullanmanızı tavsiye ederim. milis-ilkzaman >3000 gibi işlemi kütüphane kendisi hallediyor. üstelik timer sıfırlanmasına dirençli tasarlanmış durumda.
  • @forcecul kapının açık kalması için 3 saniye bekletmeni anlarım ya da 1.2 saniye ilave başka bir iş beklemeni anlarım ama ne kadar çok delay kullanırsan o kadar ööööööööyle boş boş bekleme modunda bekletirsin mikrodenetleyicisi ki iş yapması istenen birşeyi böyle sağır kullanmak pek mantıklı değil. koduna dahil etmek için loop'un tepesine wdt_reset(); fonksiyonunu ekle. setupta da 8Sli olanı ekle. yükle çalıştır. sonra da deli gibi kart okut kassın kitlensin.

    şunu da unutma bir şeyler takılıryorsa programın iyi değildir. daha optimum yazmayı dene.

    not:
    atmega datasheet pdf içinde arama yaparsanız WDTimer'in ilgili registerleri(yazmaçları) kullanılarak da ayarlama yapılabilir. ve o datasheette de göreceksiniz 1001 ile en fazla 8S bekletilebilir. gerçi osilatör saykılını ayarlayarak bu süre uzatılabilir diye tahmin ediyorum fakat henüz bakmaya fırsatım olmadı.

    @fatihaslamaci datasheet'i inceleyip bakabilirsin. belki benim gözden kaçırdığım bir şey vardır.

  • @mertdemirel95 gsm modülünü hiç incelemedim ama 50 saniye delay olması gerçekten normal değil. her çevrimin 100 ms olur örneğin. sen bunu 500 defa kontrol edersin. hepsinde gsm iletişimin olumsuz ise if (sayac == 500) {while(1);} yazarsan wdt çalışacaktır ve cihazın hard resetlenecektir. ama dediğim gibi gsm modülün iletişime geçmek için 50 saniye zaman harcamıyordur. onu sürekli kontrol edip olumsuz ise olmadi_haci sayacini +1 arttırırsın. 500 ise while(1); yaparsın ki sonsuz döngüye girer ve loop içindeki wdt reset fonksiyonuna hiç uğramayacağı için 8S de olsa 16 ms'de olsa mutlaka arduinon resetlenecektir.

    not: wdt zaman aralığı
    16 32 64 125 250 500 1000 2000 4000 8000 ms'dir.
  • gsm modülünü bilemem ama web servisden cevap beklerken 1 dakika hatta 3 dakika da cevap gelme ihtimali var. bu gibi durumlarda kanal açıp uzun süren işlemleri ayrı bir kanalda çalıştırmak gerekir.
  • sen ethernet shieldi dinlerken isterse 1 hafta cevap gelmesin ama loop içinde o çevrim dönüyor.
    yani mühim olan loop başı ile sonu arasında 1 turu kaç milisaniyede yaptığı.
  • anladım, o zaman sorun yok
  • Hepinize teşekkür ediyorum. Sag olun

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.