Buton ile led yakma

writersoul

Yeni Üye
Gümüş Üye
7 Haz 2019
21
11
3
Ankara
Cinsiyet
Erkek
S1 butonuna kaç kez basılırsa S2 butonuna basıldığında o kadar ledin yanıp sönmesini istiyorum ama bir türlü beceremedim. Yazdığım kodu aşağıda paylaştım. nerede hata yaptığımı söyleyebilir misiniz?




int S1=9; //S1 butonu 9 nolu pine pull up bağlı
int S2=8; //S2 butonu 8 nolu pine pull upbağlı
int led1=13; //led1 13 nolu pine bağlı
int S1buton_oku;
int S2buton_oku;

int sayac=0;
int i;


void setup() {
pinMode(S1,INPUT);
pinMode(led1,OUTPUT);
pinMode(S2,INPUT);
}

void loop() {

//tS1 pin9'a pull up olarak bağlı olduğu için butona basılı değilken sürekli olarak HIGH durumundadır.
//basıldığı zaman LOW olur ve o zaman basılmış olarak işlem yapar.
//if(buton_durumu) demek if(buton_durumu==HIGH) demektir.
//if(!buton_durumu) demek if(buton_durumu eşitdeğil HIGH) demektir.Bu durumda;

S1buton_oku=digitalRead(S1);
if(S1buton_oku==LOW) //yani buton_durumu HIGH değilse yani pull up bağlantı için butona basılmışsa
{sayac=sayac+1;}




//butona basılı olduğu sürece döngüden çıkılmayacak...
while(S1buton_oku==LOW) //S1 butonuna basılı ise
{
delay(10);
S1buton_oku=digitalRead(S1);

}
//bir glich olmaması için butona basılı değilken de döngüden çılılmayacak..
while(S1buton_oku==HIGH) //S1 butonuna basılı değil ise
{
delay(10);
S1buton_oku=digitalRead(S1);

}
S2buton_oku=digitalRead(S2);
if (S2buton_oku==LOW)
{

for(i=0;i=sayac;i++)
{
digitalWrite(led1,HIGH);
delay(500);
digitalWrite(led1,LOW);
delay(500);
sayac=0;
}
}

while(S2buton_oku==LOW) //S2 butonuna basılı ise
{
delay(10);
S2buton_oku=digitalRead(S2);
}
}
 

Seelenkind

Yeni Üye
Platin Üye
3 May 2020
26
21
3
Almanya
www.hilmi-soenmez.com
İsim
Hilmi Sönmez
Cinsiyet
Erkek
Böyle çalışması gerek . Burada Buton 1 ve Buton 2, 5V ile digital pinler arasında pulldown ile bağlanmıştır. Yani butona basınca +5V direnc üzerinden GND ile bağlı olduğundan pin 8 ve pin 9 a High sinyal düzgün gidecektir.

// #define kullanarak sabit ve sadece 1 kez kullanılacak değerler için değişken kullanmayıp bellekten tasarruf ediyoruz
// compiler define ile belirlenen geçici değişkenlerin yerine direkt rakamları yazacaktır
// #define B1 8 kullanınca compiler kodu derlerken pinMode(8,INPUT) olarak karta programlayacaktır

#define B1 8
#define B2 9
#define LED 10

byte counter = 0;

void setup()
{
pinMode(B1, INPUT);
pinMode(B2, INPUT);
pinMode(LED, OUTPUT);

}

void loop()
{
if (digitalRead(B1) == HIGH) // Buton 1 basilimi ?
{
delay(150); // buton basili komutunu 150 ms saniye sonra tekrar et ve hala basili ise algila
if (digitalRead(B1) == HIGH) counter++; // Buton 1 basili ise sayaci 1 artir
}

if (digitalRead(B2) == HIGH)
{
delay(150);
if (digitalRead(B2) == HIGH)
{
for (byte i = 0; i < counter; i++)
{
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
}
counter = 0;
}
}
}

1589283483503.png
 
Son düzenleme:
  • Beğen
Tepkiler: writersoul

birkan

Aktif Üye
Paylaşım Ekibi
16 Tem 2019
191
44
113
istanbul
Cinsiyet
Erkek
int leri tek tek arttıracaksan sayac=sayac+1; gerek yok sayac++; bi artırır sayac--; bi eksiltir.

int S1=9; int S2=8; int led1=13; int sayac=0;

void setup() {
pinMode(S1,INPUT_PULLUP);
pinMode(led1,OUTPUT);
pinMode(S2,INPUT_PULLUP);
}
void loop() {
if (digitalRead(S1) == LOW ) { if (sayac<=0) { sayac = 0; } sayac++; delay(200); }
if (digitalRead(S2) == LOW ) { while(sayac>0) { digitalWrite(led1,HIGH); delay(300); digitalWrite(led1,LOW); delay(300); sayac--; } }
}
 
  • Beğen
Tepkiler: writersoul

writersoul

Yeni Üye
Gümüş Üye
7 Haz 2019
21
11
3
Ankara
Cinsiyet
Erkek
yukarıdaki her iki kodu da denedim.ikisi de çalışıyor ancak butona basma süresindeki /delay(150) ve delay(200)/ değerleri aşıldığında yani butona yeterince hızlı basılmadığında sayaç fazla sayıyor.Bunu önlemek için başka sitede bulduğum ve yukarıda paylaştığım kodda
while döngüsü kullanılmış.
 

writersoul

Yeni Üye
Gümüş Üye
7 Haz 2019
21
11
3
Ankara
Cinsiyet
Erkek
int leri tek tek arttıracaksan sayac=sayac+1; gerek yok sayac++; bi artırır sayac--; bi eksiltir.

int S1=9; int S2=8; int led1=13; int sayac=0;

void setup() {
pinMode(S1,INPUT_PULLUP);
pinMode(led1,OUTPUT);
pinMode(S2,INPUT_PULLUP);
}
void loop() {
if (digitalRead(S1) == LOW ) { if (sayac<=0) { sayac = 0; } sayac++; delay(200); }
if (digitalRead(S2) == LOW ) { while(sayac>0) { digitalWrite(led1,HIGH); delay(300); digitalWrite(led1,LOW); delay(300); sayac--; } }
}

pinMode(S2,INPUT_PULLUP); burada sadece INPUT yazsaydık bir şey değişir miydi? INPUT_PULLUP kullanımı ayrıca bir özellik katıyor mu?
 

writersoul

Yeni Üye
Gümüş Üye
7 Haz 2019
21
11
3
Ankara
Cinsiyet
Erkek
Böyle çalışması gerek . Burada Buton 1 ve Buton 2, 5V ile digital pinler arasında pulldown ile bağlanmıştır. Yani butona basınca +5V direnc üzerinden GND ile bağlı olduğundan pin 8 ve pin 9 a High sinyal düzgün gidecektir.

// #define kullanarak sabit ve sadece 1 kez kullanılacak değerler için değişken kullanmayıp bellekten tasarruf ediyoruz
// compiler define ile belirlenen geçici değişkenlerin yerine direkt rakamları yazacaktır
// #define B1 8 kullanınca compiler kodu derlerken pinMode(8,INPUT) olarak karta programlayacaktır

#define B1 8
#define B2 9
#define LED 10

byte counter = 0;

void setup()
{
pinMode(B1, INPUT);
pinMode(B2, INPUT);
pinMode(LED, OUTPUT);

}

void loop()
{
if (digitalRead(B1) == HIGH) // Buton 1 basilimi ?
{
delay(150); // buton basili komutunu 150 ms saniye sonra tekrar et ve hala basili ise algila
if (digitalRead(B1) == HIGH) counter++; // Buton 1 basili ise sayaci 1 artir
}

if (digitalRead(B2) == HIGH)
{
delay(150);
if (digitalRead(B2) == HIGH)
{
for (byte i = 0; i < counter; i++)
{
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
}
counter = 0;
}
}
}

Ekli dosyayı görüntüle 243
Öğrenme aşamasında olan arkadaşlara bilgi olması düşüncesiyle paylaşıyorum;

butonlar eğer pull up bağlanmışsa buton okumaları
böyle
if (!digitalRead(B1) == HIGH)
yada böyle
if (digitalRead(B1) == LOW)
yapılmalı....
 

birkan

Aktif Üye
Paylaşım Ekibi
16 Tem 2019
191
44
113
istanbul
Cinsiyet
Erkek
buttonu + dan okuyacaksan input - den okuyacaksan input_pullup

yazılımda mecburi bir durum yoktur isteyen LOW la isteyen HIGH la algılatır isteyen !digitalRead ile tersler


buttona koruma koyabilirsin

int guard=0;
int S1=9; int S2=8; int led1=13; int sayac=0;

void setup() {
pinMode(S1,INPUT_PULLUP);
pinMode(led1,OUTPUT);
pinMode(S2,INPUT_PULLUP);
}
void loop() {
if (digitalRead(S1) == HIGH) { guard = 1; }
if (digitalRead(S1) == LOW && guard==1 ) { if (sayac<=0) { sayac = 0; } sayac++; guard=0; } // buttondan elini çekmediğin sürece tekrarlamaz
if (digitalRead(S2) == LOW ) { while(sayac>0) { digitalWrite(led1,HIGH); delay(300); digitalWrite(led1,LOW); delay(300); sayac--; } }
}
 
  • Beğen
Tepkiler: writersoul

Robotikforum.net Nedir?

  • Robotikforum.net 2020 yılında kurulup yayın hayatına başlayan ve Türkiye’de robotik kodlama alanının gelişimine katkıda bulunmak için bu alan ile ilgilenen bireylerin bir birleri ile yardımlaşmaları ve fikir danışmalarını sağlayarak daha iyi öğrenmek için her bir bireyin bilgisini ve tecrübesini alarak kendini geliştirebileceği ve sorularına cevap bulabileceği bir platform olarak kurulmuştur.

Bilgilendirme!!!

İçerik sağlayıcı paylaşım sitelerinden biri olan www.robotikforum.net Adresimizde T.C.K 20.ci Madde ve 5651 Sayılı Kanun'un 4.cü maddesinin (2).ci fıkrasına göre TÜM ÜYELERİMİZ yaptıkları paylaşımlardan sorumludur.

Sayfamızı beğendin mi?