Arduino 2 buton ile reset atma

Wilot

Yeni Üye
Katılım
27 Mayıs 2024
Mesajlar
3
Merhabalar, projem ile ilgili sona kalan tek bir sıkıntım var bir çok şey denedim başka forunlarda sordum fakat burası gibi direkt bu konular ğzerine bir forum olmadığı için çözebilmiş değilim. Yapmak istediğim projede 3 adet butonum var ve bu butonların hepsinin kendine özel modları var. Bu butonlardan 1 ve 3. butona aynı anda 3 veya 5 basılı tutulduğu zaman arduinoyu resetlemek istiyorum. Resetlemeyi pin üzerinden optokuplöre çıkış verip optokuplörün diğer ucundan da arduino RESET pini ile GND pininin bağlantısını kontrol etmiş olmayı düşünüyorum. Örnek kod vermem gerekirse aşşağıya şuanki haline (basılı tutması yok sadece butonlar ve modlar var) benzer bir kod yazıyorum.



Kod:
void setup()
    {
        pinMode(buton1,INPUT);
        pinMode(buton2,INPUT);
        pinMode(buton3,INPUT);
        pinMode(resetPin,OUTPUT);
    }
    
void mod1()
{
//Mod işlevleri
}

void mod2()
{
//Mod işlevleri
}

void mod3()
{
//Mod işlevleri
}

void mod_wait()
{
//Bekleme Halindeki çalışacak olan standart mod
}

int buton1_state;
int buton2_state;
int buton3_state;

void loop()
    
    buton1_state = digitalRead(buton1);
    buton2_state = digitalRead(buton2);
    buton3_state = digitalRead(buton3);
    
    {
        if (buton1_state ==1)
        {
            mod1();
        }
        
        else if (buton2_state == 1)
        {
            mod2();
        }
        
        else if (buton3_state == 1)
        {
            mod3();
        }
        
        else
        {
            mod_wait();
        }
    }
 
Basılı tutulmak gibi belli bir sürenin sözkonusu olduğu durumlarda bir çeşit timer yapısı kullanman lazım. Mesela aşağıdaki gibi bir kod yazarsan, bu kodun 1 ms de bir çalıştığını garantilersin (tabi kodun kendisi 1 ms den az tutuyorsa). Şimdi buna göre algoritmayı geliştirebilirsin. İki buton basılı ise bir değişkene mevcut millis() değerini yazarsın. Sonra da güncel millis() ile kaydedilen arasındaki fark belli bir süreye eşit veya fazla ise, bu butonlar o kadar süre basılı kalmıştır. Bir algoritma oluştur ve buraya kodu yaz.

C++:
static unsigned long timer;

void setup()
{
  timer = millis();
}

void loop()
{
  if (millis() != timer)
  {
    timer = millis();

    // buradaki kod 1 ms de bir cagrilir
  }
}
 
Basılı tutulmak gibi belli bir sürenin sözkonusu olduğu durumlarda bir çeşit timer yapısı kullanman lazım. Mesela aşağıdaki gibi bir kod yazarsan, bu kodun 1 ms de bir çalıştığını garantilersin (tabi kodun kendisi 1 ms den az tutuyorsa). Şimdi buna göre algoritmayı geliştirebilirsin. İki buton basılı ise bir değişkene mevcut millis() değerini yazarsın. Sonra da güncel millis() ile kaydedilen arasındaki fark belli bir süreye eşit veya fazla ise, bu butonlar o kadar süre basılı kalmıştır. Bir algoritma oluştur ve buraya kodu yaz.

C++:
static unsigned long timer;

void setup()
{
  timer = millis();
}

void loop()
{
  if (millis() != timer)
  {
    timer = millis();

    // buradaki kod 1 ms de bir cagrilir
  }
}
Merhabalar, millis kullanmam gerektiğini vs biliyorum fakat 3saniyenin altında farklı 3 saniyenin üzerinde farklıbir işlev vermeyi başaramadım maalesef
 
Merhabalar, projem ile ilgili sona kalan tek bir sıkıntım var bir çok şey denedim başka forunlarda sordum fakat burası gibi direkt bu konular ğzerine bir forum olmadığı için çözebilmiş değilim. Yapmak istediğim projede 3 adet butonum var ve bu butonların hepsinin kendine özel modları var. Bu butonlardan 1 ve 3. butona aynı anda 3 veya 5 basılı tutulduğu zaman arduinoyu resetlemek istiyorum. Resetlemeyi pin üzerinden optokuplöre çıkış verip optokuplörün diğer ucundan da arduino RESET pini ile GND pininin bağlantısını kontrol etmiş olmayı düşünüyorum. Örnek kod vermem gerekirse aşşağıya şuanki haline (basılı tutması yok sadece butonlar ve modlar var) benzer bir kod yazıyorum.



Kod:
void setup()
    {
        pinMode(buton1,INPUT);
        pinMode(buton2,INPUT);
        pinMode(buton3,INPUT);
        pinMode(resetPin,OUTPUT);
    }
   
void mod1()
{
//Mod işlevleri
}

void mod2()
{
//Mod işlevleri
}

void mod3()
{
//Mod işlevleri
}

void mod_wait()
{
//Bekleme Halindeki çalışacak olan standart mod
}

int buton1_state;
int buton2_state;
int buton3_state;

void loop()
   
    buton1_state = digitalRead(buton1);
    buton2_state = digitalRead(buton2);
    buton3_state = digitalRead(buton3);
   
    {
        if (buton1_state ==1)
        {
            mod1();
        }
       
        else if (buton2_state == 1)
        {
            mod2();
        }
       
        else if (buton3_state == 1)
        {
            mod3();
        }
       
        else
        {
            mod_wait();
        }
    }

Paylaştığın kod milis fonksiyonunu içermiyor.


Merhabalar, millis kullanmam gerektiğini vs biliyorum fakat 3saniyenin altında farklı 3 saniyenin üzerinde farklıbir işlev vermeyi başaramadım maalesef

Bunu yazdığına göre nasıl kullanacağını bildiğini varsayarak aşağıdaki gibi bir çözümün işini göreceğini düşünüyorum. Gerekli değişkenleri loop öncesi tanımlaman gerekiyor. Bir de tek buton için çalışır.

C++:
void loop()
{
    donanimButonDurumu = digitalRead(hangiButon);
    if (donanimButonDurumu == LOW && sonButonDurumu == HIGH)
    {
        butonaBasilmaZamani = millis();
    }
    else if (donanimButonDurumu == HIGH && sonButonDurumu == LOW)
    {
        unsigned long basilmaSuresi = millis() - butonaBasilmaZamani;
        if (basilmaSuresi < shortPressDuration)
        {
            kisaBasmaFonskiyonu();
        }
        else
        {
            uzunBasmaFonskiyonu();
        }
    }
    sonButonDurumu = donanimButonDurumu;
}
 
Paylaştığın kod milis fonksiyonunu içermiyor.




Bunu yazdığına göre nasıl kullanacağını bildiğini varsayarak aşağıdaki gibi bir çözümün işini göreceğini düşünüyorum. Gerekli değişkenleri loop öncesi tanımlaman gerekiyor. Bir de tek buton için çalışır.

C++:
void loop()
{
    donanimButonDurumu = digitalRead(hangiButon);
    if (donanimButonDurumu == LOW && sonButonDurumu == HIGH)
    {
        butonaBasilmaZamani = millis();
    }
    else if (donanimButonDurumu == HIGH && sonButonDurumu == LOW)
    {
        unsigned long basilmaSuresi = millis() - butonaBasilmaZamani;
        if (basilmaSuresi < shortPressDuration)
        {
            kisaBasmaFonskiyonu();
        }
        else
        {
            uzunBasmaFonskiyonu();
        }
    }
    sonButonDurumu = donanimButonDurumu;
}
Evet tek butonla yapabiliyorum fakat bunu iki butona aynı anda basılı tutunca resetlemesi için bir yol yok mu? Halka açık bir yerde müşterilerin kullanacağı bir sistem olduğu için tek butona uzun süre basılı tutup bilmeden yanlışlıkla resetleyenler olabilir. O yüzden iki buton ile yapmam gerekli.
 
Enerjisiz iken bir/bir kaç butona basılı tutun ve
enerji verin. Ana döngüden önce başka bir fonksiyona
yönlendirin ve resetleme işlemini yapın.
En kolayı bence böyle olur. Ayrıca bilen-bilmeyen
resetleyemez, İlla enerji kesilir ve butona basılı tutarken
enerji verince resetlenir.
 
Cipin, kendi I/O pini ile resetlenebileceginden emin olman lazim. Gecmiste PIC'in ilk serisi islemcilerle bu islemi yapmaya kalktigimda reset pini I/O pin uzerinden low yapildigi anda reset islemi baslayip I/O pinini out moddan cikartiyor fakat min Reset Low suresi olusmadigindan islemci tanimsiz bir durumda kaliyordu.

Cozum olarak palsi uzatan bir eklenti yapmak zorunda kalmistim.
 
Son düzenleme:

Forum istatistikleri

Konular
6,209
Mesajlar
105,814
Üyeler
2,583
Son üye
Efe Ali Bozkurt

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top