Arduino İnput Süresi Belirleme

Katılım
12 Mar 2017
Mesajlar
252
Puanları
1
Yaş
48
Merhaba Aşağıdaki gibi tek buton ile led yakıp söndürüyorum. Fakat kuru kontak ile giriş uygularken parazitleri de giriş kabul ediyor. örneğin 100ms altındaki butona basmayı kabul etmesin istiyorum. Bunu nasıl yapabilirim?

Kod:
#define butonPin 7
#define ledPin 13
int deger;
int simdiki,onceki;
void setup() {
pinMode(butonPin, INPUT);
pinMode(ledPin, OUTPUT);
deger = LOW;
onceki = LOW;
}
void loop() {
simdiki = digitalRead(butonPin);
if (onceki == HIGH && simdiki == LOW)
{
deger = digitalRead(ledPin);
if (deger == HIGH)
{ digitalWrite(ledPin, LOW);
}
else {
digitalWrite(ledPin, HIGH);
}
}
onceki = simdiki;
}
 
Aşağıdaki örnekte, millis() fonksiyonu kullanılarak butonun basılı kalma süresi hesaplanır ve bu süre 100 milisaniyeden azsa işlem yapılmaz:

#define butonPin 7
#define ledPin 13

int deger;
int simdiki, onceki;
unsigned long basmaZamani = 0; // Butonun basıldığı zamanı saklamak için değişken
const unsigned long minBasmaSuresi = 100; // Minimum basma süresi (milisaniye cinsinden)

void setup() {
pinMode(butonPin, INPUT);
pinMode(ledPin, OUTPUT);
deger = LOW;
onceki = LOW;
}

void loop() {
simdiki = digitalRead(butonPin);

// Buton basıldığında
if (onceki == HIGH && simdiki == LOW) {
// Butonun basılı kalma süresini hesapla
unsigned long basmaSure = millis() - basmaZamani;

// Eğer basma süresi belirlenen minimum süreden uzunsa
if (basmaSure >= minBasmaSuresi) {
deger = digitalRead(ledPin);
if (deger == HIGH) {
digitalWrite(ledPin, LOW);
} else {
digitalWrite(ledPin, HIGH);
}
}
}

// Buton durumunu güncelle
onceki = simdiki;

// Butonun basıldığı zamanı güncelle
if (simdiki == HIGH) {
basmaZamani = millis();
}
}

Bu kod parazit girişlerini engeller ve yalnızca belirli bir süre boyunca basılı kaldığında işlem yapar.
 
Hocam Teşekkür ederim ama hiç çalışmadı bu sefer.
Bunu deneyabilirmisiniz,

#define butonPin 7
#define ledPin 13

int deger;
int simdiki, onceki;
unsigned long basmaZamani = 0; // Butonun basıldığı zamanı saklamak için değişken
const unsigned long minBasmaSuresi = 100; // Minimum basma süresi (milisaniye cinsinden)

void setup() {
pinMode(butonPin, INPUT);
pinMode(ledPin, OUTPUT);
deger = LOW;
onceki = LOW;
}

void loop() {
simdiki = digitalRead(butonPin);

// Buton basıldığında
if (onceki == HIGH && simdiki == LOW) {
// Butonun basılı kalma süresini hesapla
unsigned long basmaSure = millis() - basmaZamani;

// Eğer basma süresi belirlenen minimum süreden uzunsa
if (basmaSure >= minBasmaSuresi) {
deger = digitalRead(ledPin);
if (deger == HIGH) {
digitalWrite(ledPin, LOW);
} else {
digitalWrite(ledPin, HIGH);
}
}
}

// Buton durumunu güncelle
onceki = simdiki;

// Butonun basıldığı zamanı güncelle
if (simdiki == HIGH) {
basmaZamani = millis();
}
}
 
Basıldığını algıladığınız anda bir değişkeni
bir artırın ve kontrol edin. Belli bir değeri
aşınca butonu basılmış sayınız. Ana döngüyü
de örneğin 1ms olarak ayarlayın.
Sizin düşüncenize göre değişken 99 olunca
butona basılmış olacaktır.
 
Basıldığını algıladığınız anda bir değişkeni
bir artırın ve kontrol edin. Belli bir değeri
aşınca butonu basılmış sayınız. Ana döngüyü
de örneğin 1ms olarak ayarlayın.
Sizin düşüncenize göre değişken 99 olunca
butona basılmış olacaktır.
Sanırım. AG Mehmet beyin de yapmak istediği buydu. ama çalıştıramadım maalesef.
 
Böyle bir kod buldum dene istersen. debounceDelay değerini değiştirerek ne kadar süre içindeki dalgalanmayı göz ardı edeceğini değiştirebilirsin.

Kaynak : https://www.circuitbasics.com/how-to-use-switch-debouncing-on-the-arduino/

C++:
int inputPin = 7;
int counter = 0;
int buttonState = 0;
int lastButtonState = 0;

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

void setup() {
  pinMode(inputPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  currentButtonState = digitalRead(inputPin);

  if (currentButtonState != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (currentButtonState != buttonState) {
      buttonState = currentButtonState;
      if (buttonState == LOW) {
        counter++;
        Serial.println(counter);
      }
    }
  }
  lastButtonState = currentButtonState;
}
 

Forum istatistikleri

Konular
129,832
Mesajlar
930,564
Kullanıcılar
452,656
Son üye
kontrolkalemi355

Yeni konular

Geri
Üst