Delay- Milis dönüşümü hakkında

Ozan Avcı

Yeni üye
Katılım
26 Eyl 2019
Mesajlar
4
Tepkime puanı
0
Puanları
1
Konum
İstanbul
Merhabalar,

Basit bir programım var. Şöyle çalışıyor. Bir digital sinyal kaynağından arduinoya giriş yapıyorum. Sinyal geldikten sonra 4 sn boyunca başka bir sinyal gelsede algılamamasını ve saydığı sinyal sayısını ekranda yazmasını istiyorum. Aynı zamanda sinyal geldikten sonra 4 saniye boyunca 2 digital çıkışada çıkış izni vermesini istiyorum. Basitçe program şöyle;


#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int etiket = 10; const int led = 13; const int smart = 12; int buttonState = 0; int sayac = 0;

void setup() {
pinMode(etiket , INPUT);
pinMode(led , OUTPUT);
pinMode(smart , OUTPUT);
lcd.init(); lcd.backlight();lcd.setCursor(0,0); lcd.print(" GORSEL HATA ");
}
void loop() {

buttonState= digitalRead(etiket);

if ( buttonState== HIGH){ digitalWrite(led , HIGH) ; sayac++ ; digitalWrite(smart , HIGH); lcd.setCursor(8,1);lcd.print(sayac); delay(4000); }

else{digitalWrite(led , LOW);digitalWrite(smart , LOW); } ;

delay(1); // delay in between reads for stability

}

Yukarıdaki program işimi görüyor fakat delay kullanımlarında kronik olarak görüldüğü üzere arada arduinoda takılmalar/donmalar oluyor. reset atmadan düzelmiyor. Yada sonda kullanılan delay kullanımından dolayı 1 milisaniyede olsa denk gelip sinyali okumamazlık yapabiliyor. Bunu gidermek için milis fonksiyonunun kullanılması gerektiğini okudum. Birçok denemesini de yaptım fakat istediğim yukarıda yazılı olan programın yaptırdığını yaptıramadım. Yardımlarınızı rica ederim :)
 

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
39
Tepkime puanı
9
Puanları
8
Konum
Bursa
Geçen bir arkadaş test yapmıştı. 4 mikrosaniyeden daha kısa darbeler digitalRead ile yakalanamayabilir.

Oradaki delay(1) tamamen gereksiz, silebilirsin. Diğer delay ise herhangi bir takılmaya yol açmaz. millis gözle görülür bir fark yaratmaz burada. Ben sadece koda ufak bir dokunuş yapayım.

while (!digitalRead(etiket));
digitalWrite(led, HIGH);
digitalWrite(smart, HIGH);
lcd.setCursor(8,1);
lcd.print(++sayac);
delay(4000);

byte durum = digitalRead(etiket);
digitalWrite(led, durum);
digitalWrite(smart, durum);
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
108
Tepkime puanı
19
Puanları
18
Konum
istanbul
sürekli okunması gereken input veya kaynak varsa işlemlerinde delay kullanmamalısın

delay yerine millis ile 4 saniyelik periyod lar halinde kontrol yapabilirsin

Kod:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int etiket = 10;
const int led = 13;
const int smart = 12;
int sayac = 0;
int gecikme = 4000; // 4 saniyelik gecikme süresi
unsigned long zaman; // kontrol edeceğimiz süremiz

void setup() {
pinMode(etiket , INPUT);
pinMode(led , OUTPUT);
pinMode(smart , OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(" GORSEL HATA ");
}
void loop() {
unsigned long newtime = millis();  //zamanı newtime olarak kaydet
if ( digitalRead(etiket) == HIGH) { // eğer etiket pin i high olduysa
  sayac++ ;
  digitalWrite(led , HIGH); // led pin i high
  digitalWrite(smart , HIGH);  // smart pin i high
  lcd.setCursor(8,1);
  lcd.print(sayac);
  zaman = millis(); //şimdiki zamanı kaydet // her basışta 4s lik süre yeniden başlar
  }
if ( (newtime - zaman) > gecikme ) {   // eğer 4s geçtiyse
digitalWrite(led , LOW); digitalWrite(smart , LOW); //led ve smart pin i low
}
}
 
Üst