Attiny13a İle Açma Kapama Butonu + Buzzer (230V Anahtarlama)

Ben yazılımla yapmayı tercih ediyorum çünkü deterministik oluyor ve parametreleri ayarlayarak en düşük tepki süresi elde edebiliyorsun
Bunu devre tarafına bir trimpot koyarak da ayarlayabilirz değil mi?
 
Bunu devre tarafına bir trimpot koyarak da ayarlayabilirz değil mi?

Yazılımla yapınca harici hardware'e gerek yok. Yazılım çözümü, kod doğru çalıştıktan sonra %100 garantilidir. Ama hardware debounce devreleri konusunda tam emin değilim. %100 garantili debounce yapıyorlar mı yapmıyorlar mı? Debounce amaçlı özel entegreler de var, bu da bana sanki diğer devrelerin bazı durumlarda doğru çalışmayabileceği izlenimini veriyor.

Aslında bir hardware debounce devresini kurup üşenmeden 1000 kere butona basacaksın :D Eğer MCU 1000 tane buton basımı sayarsa artık o devreye güvenebilirsin.
 
Kod:
typedef struct
{
   int port;
   int count;
   int prev;
   int curr;
   int status;

} BUTTON;

/* kac tane buton isleyecegiz */
#define NUM_BUTTONS 5

/* kac kere ayni buton durumunu gorunce butonun stabil hale geldi
* diyecegiz */
#define DEBOUNCE_THR 3

static BUTTON buttons[NUM_BUTTONS];

void process_buttons(void)
{
   for (unsigned int i = 0; i < NUM_BUTTONS; ++i)
   {
      BUTTON* b = &buttons[i];

      b->prev = b->curr;
      b->curr = read_button_status(b->port);

      if (b->curr == b->prev)
      {
         ++b->count;

         if (b->count >= DEBOUNCE_THR)
         {
            b->count = 0;
            b->status = b->curr;
         }
      }
      else
      {
         b->count = 0;
      }
   }
}
Alışık olmadığım bir kodlama ile yazılmış. Anlayamadım.
 
Buradaki kod benim alışık olduğum şekilde yazılmış.
Sanırım "debounceDelay" değişkenine atanan değer de buton zamanını ayarlıyor.

C:
// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2;    // the number of the pushbutton pin
const int ledPin = 13;      // the number of the LED pin

// Variables will change:
int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // set initial LED state
  digitalWrite(ledPin, ledState);
}

void loop() {
  // read the state of the switch into a local variable:
  int reading = digitalRead(buttonPin);

  // check to see if you just pressed the button
  // (i.e. the input went from LOW to HIGH), and you've waited long enough
  // since the last press to ignore any noise:

  // If the switch changed, due to noise or pressing:
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }

  // set the LED:
  digitalWrite(ledPin, ledState);

  // save the reading. Next time through the loop, it'll be the lastButtonState:
  lastButtonState = reading;
}
 
Doğru mantık kurdum mu diye sormuştum.
Yani devre tarafında trimpot düğmeye basma hassasiyetinin ayar işini üstlenir mi?

Ben de burada neyi anlamaya çalıştığını anlamadım :) Yazılımla debounce'da trimpot koymanın bir faydası olmaz, hiçbir şeyi de ayarlamaz.
 
Buradaki kod benim alışık olduğum şekilde yazılmış.

Anladığın koda göre ilerleyebilirsin. Benim yazdığım kod çok sayıda butonu debounce edebiliyor, aradaki en önemli fark bu.
 
Ben de burada neyi anlamaya çalıştığını anlamadım :) Yazılımla debounce'da trimpot koymanın bir faydası olmaz, hiçbir şeyi de ayarlamaz.
Yazılım içinde butona basma süresini misal 50ms ayarlıyoruz ya, ben onun karşılığını donanım kısmında bulmaya çalıştım ama yemedi ellaham :D
 
Yazılımla yapınca bir buton kontrol peryodu belirliyorsun. Mesela 10 ms de bir okuyorsun buton durumunu. Peş peşe örneğin 4 defa butonu aynı durumda gördüysen butonun debounce edilmiş durumunun bu olduğunu kabul ediyorsun.
 
Algoritmayı anladıysan mevcut kodlara hiç bakmadan sıfırdan yaz debounce kodunu. Bu C programlama konusununda güzel bir tecrübe olur.
 
Hmm şimdi baktım da senin eklediğin koddaki algoritma farklı. Orada buton durumunda bir değişim görürse, 50 ms bekliyor ve ondan sonra butonun durumunu okuyor. Buradaki varsayım, buton bounce olayının yarattığı değişimlerin 50 ms lik süre içerisinde artık oturacağı ve bu süre sonunda butonun oturmuş durumunun okunacağı.

İki algoritmanın performans olarak farkını bilmiyorum, muhtemelen bir fark yoktur.
 
Algoritmayı anladıysan mevcut kodlara hiç bakmadan sıfırdan yaz debounce kodunu. Bu C programlama konusununda güzel bir tecrübe olur.
Satır satır okuyunca anlıyorum ama sıfırdan yazacak kadar ezberleyebiyorum. Bu ancak bir kaç denemeden sonra kodu kullana kullana oturur bende.
 
Debounce kodlarını ekleyerek birinci mesajdaki kodları düzenledim. void loop sonundaki 250ms'lik delay'ın debounceDelay süresini etkileyeceğini düşünüyorum. O 250ms'lik delayı buton durum her an kontrol edilmesin, arada küçük bir zaman farkı olsun diye eklemiştim.
 
Dün yaptığım on-off devresine bu gün kodları yükleyip test etmek istedim ama fişi 220 ye takar takmaz buzzer sürekli ötüyor, led sürekli yanıyor ve çıkışta sürekli aktif. Butona basmama rağmen de hiç tepki vermiyor.
Son şema ve kullandığım kodlar aşağıdadır. Var mı bir fikri olan?

buton_şema.png


C++:
#define faz 4
#define buzzer 1
#define led 5

const int buttonPin = 3;
int buttonState;             
int lastButtonState = LOW;

unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

int on_off =1;
unsigned long simdikiZaman, eskiZaman = 0;

void setup() {
  pinMode(faz, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(led ,OUTPUT);
  pinMode(buttonPin, INPUT);
 
  digitalWrite(faz, LOW);
  digitalWrite(led, LOW);
  digitalWrite(buzzer, LOW);
}

void loop() {
  /////// BUTON DEBOUNCE KODLARI /////////////////
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;

      if (buttonState == HIGH) {
        if (on_off == 0) {
          digitalWrite(buzzer, HIGH);
          delay(100);
          digitalWrite(buzzer, LOW);
          delay(100);
          digitalWrite(buzzer, HIGH);
          delay(100);
          digitalWrite(buzzer, LOW);
          delay(100);
          digitalWrite(buzzer, HIGH);
          delay(1500);
          digitalWrite(buzzer, LOW);
          digitalWrite(led, HIGH);
          digitalWrite(faz, HIGH);
          on_off = 1;
        } else if (on_off == 1) {
          digitalWrite(buzzer, HIGH);
          delay(2000);
          digitalWrite(buzzer, LOW);
          digitalWrite(led, LOW);
          digitalWrite(faz, LOW);
          on_off = 0;
        }
      }
    }
  }
  ///////////////////////////////////////////
}
 
ATTiny bozuk herhalde. Önce tek başına çalıştır onu LED'yi blink ettir.
 
ATTiny bozuk herhalde. Önce tek başına çalıştır onu LED'yi blink ettir.
Abi ilk denemem de çalışmayınca kodu mu yükleyemedim acaba diye blink testi yaptım. Ledi normal yakıp söndürüyor.
 
O zaman R17 nin sağını ayır sonra da mikroişlemci tarafını test et. Herşey normal çalışıyorsa yüksek voltaj kısmına odaklanabilirsin.
 
O zaman R17 nin sağını ayır sonra da mikroişlemci tarafını test et. Herşey normal çalışıyorsa yüksek voltaj kısmına odaklanabilirsin.
Abi R17 yi ayırmanın nedenini anlamadım.
Yani bu bana nasıl bir avantaj sağlayacak onu anlayamadım. Mevcut durumda mikroişlemcinin tüm pinleri high kalıyormuş gibi görünüyor. R17 yi ayırsam bu durum değişir mi diyorsun?
 
Bir sistemi bölüm bölüm ayağa kaldırmak lazım. Önce mikroişlemci kısmını full çalışır hale getireceksin. Bunu yaparken yüksek voltaj kısmını ayırıyorsun.
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,950
Mesajlar
118,738
Üyeler
2,822
Son üye
lalemasall

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