Sayıcı sorunu

Oğuzhan

Yeni üye
Katılım
23 Tem 2019
Mesajlar
12
Tepkime puanı
4
Puanları
3
Konum
Gaziantep
Merhaba;
0 ile 23 arasında buton ile artırma ve eksiltme işlemi yapıyorum. sayi=constrain(sayi,0,23); komutu ile sınır koymama rağmen sayı -1 ile 24 arasında sayma yapıyor.
sayi=constrain(sayi,1,22); komutunu bu şekilde yazınca 0 ile 23 arasında sayıyor ancak 0 ve 23 sayılarında işlem yapmıyor.Bu sorunu nasıl çözebilirim ?
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
98
Tepkime puanı
18
Puanları
8
Konum
istanbul
ben şu şekilde kullanıyorum.

if (digitalRead(button) == HIGH ) { sayi++; if (sayi > 23 ) { sayi = 0; } } // artırma buttonu
if (digitalRead(button2) == HIGH ) { sayi--; if (sayi < 0 ) { sayi = 23; } } // eksiltme buttonu
 

Oğuzhan

Yeni üye
Katılım
23 Tem 2019
Mesajlar
12
Tepkime puanı
4
Puanları
3
Konum
Gaziantep
Cevabınız için teşekkürler;
Aynı komutları bende denedim ancak sonuç aynı.
Yine -1 ile 24 arasında sayıyor.
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
98
Tepkime puanı
18
Puanları
8
Konum
istanbul
onun nedeni button a koruma koymanız gerekiyor hızlı bastığı için oluyor tahminimce.

if (digitalRead(button) == HIGH ) { sayi++; if (sayi > 23 ) { sayi = 0; } delay(200); } // artırma buttonu
if (digitalRead(button2) == HIGH ) { sayi--; if (sayi < 0 ) { sayi = 23; } delay(200); } // eksiltme buttonu
 

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
36
Tepkime puanı
7
Puanları
8
Konum
Bursa
"sayi" başka bir kesme içinde falan kullanılırsa o şekilde kullanım risk teşkil eder çünkü çok kısa süre de olsa sınır dışına çıkıyor. Aşağıdaki gibi yaparak bu riski bertaraf edebilirsin.

if(sayi != 23)
++sayi;
...
if(sayi != 0)
--sayi;
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
98
Tepkime puanı
18
Puanları
8
Konum
istanbul
"sayi" başka bir kesme içinde falan kullanılırsa o şekilde kullanım risk teşkil eder çünkü çok kısa süre de olsa sınır dışına çıkıyor. Aşağıdaki gibi yaparak bu riski bertaraf edebilirsin.

if(sayi != 23)
++sayi;
...
if(sayi != 0)
--sayi;

arduino da delay vermessen bazı durumlarda low level işlemez :) serial okurken bile delay vermek zorunda kalırsın maalesef ... ve delay varsa risk yoktur
 
Son düzenleme:

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
36
Tepkime puanı
7
Puanları
8
Konum
Bursa
if (digitalRead(button) == HIGH ) {
sayi++; <-- 24 oldu
if (sayi > 23 ) { <-- Kesme geldi!
sayi = 0;
}
delay(200);
}

Yukarıda işaretlediğim yerde kesme gelirse risk var demektir. delay olup olmaması önemli değil. Zaten delay iyi bişey değil. 1 saniyelik delay 16 milyon cpu çevrimini boşa harcamak demek.
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
98
Tepkime puanı
18
Puanları
8
Konum
istanbul
peki bir button un basılı tuttuğunuz süre sürekli basmasını veya tek basışınızda 5-6 kez basmasını nasıl engellersiniz ? kesme olmadan
 

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
36
Tepkime puanı
7
Puanları
8
Konum
Bursa
delay'ın bu konu ile bir alakası yok. Yukarıda bir riskten söz ettim ve çözümünü de verdim. Buna ilave olarak butonun peşpeşe basmasını engellemek için delay koyulabilir. O tamamen ayrı bir konu.
 

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
Merhaba;
0 ile 23 arasında buton ile artırma ve eksiltme işlemi yapıyorum. sayi=constrain(sayi,0,23); komutu ile sınır koymama rağmen sayı -1 ile 24 arasında sayma yapıyor.
sayi=constrain(sayi,1,22); komutunu bu şekilde yazınca 0 ile 23 arasında sayıyor ancak 0 ve 23 sayılarında işlem yapmıyor.Bu sorunu nasıl çözebilirim ?
Kullandığın veri tipinden kaynaklı muhtemelen Byte yapıp deneyebilir misin? Normal şartlarda çalışması gerekiyor.

Teşekkürler,
Ali
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
98
Tepkime puanı
18
Puanları
8
Konum
istanbul
@alio1984 ordaki konu byte veya int değilde button algılamasının çok hızlı olması button input olarak algıladığında koruma koymazsan en hızlı şekilde bas çek bile yapsan 4-5 algılama yapıyor onada şu şekilde koruma koyabilirsin

int guard;
void setup() {
pinMode(9, INPUT);
}
void loop() {
if (digitalRead(9) == LOW) { guard = 0; }
if (digitalRead(9) == HIGH && guard == 0) { guard = 1; komutun(); } // bu şekilde 1 kere basar button low a düşmediği sürecede başka işlem yapmaz

}
 

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
Ben bunu delay ile yapıyordum, bu daha iyiymiş not alıyorum. Güzel çözüm.

Teşekkürler,
Ali
 

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
36
Tepkime puanı
7
Puanları
8
Konum
Bursa
Girişte parazit varsa o komut yine peşpeşe çalışır maalesef. Bunu engellemenin tek yolu delay, ya da girişe parazitleri emecek bir kapasitör koymak.
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
98
Tepkime puanı
18
Puanları
8
Konum
istanbul
// şimdi parazit ve direnç koyma sorunu ortadan kalkar

int guard;
void setup() {
pinMode(9, INPUT_PULLUP);
}
void loop() {
if (digitalRead(9) == HIGH) { guard = 0; }
if (digitalRead(9) == LOW && guard == 0) { guard = 1; komutun(); } // bu şekilde 1 kere basar button high olmadığı sürecede başka işlem yapmaz

}
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
98
Tepkime puanı
18
Puanları
8
Konum
istanbul
iyide zaten arduino nun girişinde dc-dc converter mevcut hiç bir şekilde input_pullup ta parazit sorunu çıkmaz

tüm projelerimde input_pullup kullandım bi kere bile sorun yaşamadım.

sizin gönderdiğiniz sadece işlemci ile denenen dc girişlere kondansatör uygulanmamış bi durum
 

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
Parazitin oluşma ihtimali var doğru, anahtar çek bırak da her zaman bir ark vardır. Kapasitesine göre bu ark görülebilir veya görülemez. ( kapasitor + direnç ) offset bastırıcı muhteşem ikili.

Peki analog veri için nasıl bir filtre kullanıyorsunuz? Evde kullanılıyorsanız belki sorun oluşturmaz peki sanayide kullanıyorsanız eğer, o zaman işler değişir. Ferrit nüve veya RLC filtre veya başka ?

Teşekkürler,
Ali
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
98
Tepkime puanı
18
Puanları
8
Konum
istanbul
arduino da sanayi tipi işler zor :) Türkiye'de bi çok kişi heveslenip sanayi tipi işleri ucuza kurtarmak için bu işlere girişmiş hüsrana uğramıştır.
zaten elektronik anlamda bilgisi az olan kişiler arduino ile uğraşıyor. işin içine parazit girdiği zaman proje rafa kaldırılıyor.

en kolay yollar
arduino için kutu (dış parazitlerden korumak için)
optocoupler ( in-out için motor vb etkilmez )
devre tasarımında ethernet vb sinyallerini devreden ayırmak kısa kablo ile pinlere bağlamak (mosi miso vb )
dc converter (elektrikte parazitimiz minimuma düşer)
devrenin bi yüzünü komple topraklama
devrede sinyal hatlarınız varsa düz değil yılan desenli yapmak (mosi-miso-scl-sda-usart)
tabiki vazgeçilmez seramik kondansatör
 
Üst