Arduino: buton/sensör ile sayaç yaparak led yakma

Başlatan overlok, 29 Ocak 2017, 18:06:10

overlok

Selamlar arkadaşlar;
Başlık için kusura bakmayın nasıl yazacağımı bilemedim.
Sorum şu:
Devrede birer adet Ir sensör, buton ve led var. Sensörden giriş alınca led sürekli yanacak, butona örneğin 5 kere basınca led sönecek. Bunu nasıl yapabilirim?
Yazmaya çalıştığım kod:
int butonPin = 9;  // Butonu bağladığımız Pini 5 olarak ayarladık.
int ledPin =  8;     // Ledi bağladığımız Pini 8 olarak ayarladık.
int butondurum = 0; // Butonun durumunu atadığımız bir değişken tanımladık.
int sensorPin = 10;
int sensordurum = 0;
int sayac=0;
   void setup() 
   {
        pinMode(ledPin, OUTPUT);     // Led çıkış olarak ayarlandı. 
        pinMode(butonPin, INPUT);     // Buton giriş olarak ayarlandı.
        pinMode(sensorPin, INPUT);     // sensor giriş olarak ayarlandı.
   }
   void loop()
  {   
    butondurum = digitalRead(butonPin); // Buton pininden dijital okuma işlemi
         sensordurum = digitalRead(sensorPin); // sensör pininden dijital okuma işlemi
   if (sensordurum == HIGH){  // sensör aktif ise durumu
        
        digitalWrite(ledPin, HIGH);  // Ledi yak .
  
    if (butondurum == HIGH){
      delay (5);
        sayac++;
          while(1);
            if (sayac=5);
               digitalWrite(ledPin, LOW); // Ledi söndür.
                  sayac=0;
  }
 }
}

Hanımların dikkatine, overlok makinesi ayağınıza geldi!

Cemre.

#1
            if (sayac=5);
               digitalWrite(ledPin, LOW); // Ledi söndür.
                  sayac=0;


şurada bir syntax problemi var herhalde. {} parantezler mi unutulmuş?

bir de while(1) yazmışsınız program bu satırda çakılır zaten... herhalde while(butondurum == HIGH) yazmak istediniz....

sadogan


Cemre.

Syntax çalışmayı ihmal etmemek gerekiyor sanırım.

overlok

Düzeltmeleri yaptım ama durum aynı. Led yanıyor sensörden bilgiyi alınca ama söndüremiyorum.

int butonPin = 9;  // Butonu bağladığımız Pini 5 olarak ayarladık.
int ledPin =  8;     // Ledi bağladığımız Pini 8 olarak ayarladık.
int butondurum = 0; // Butonun durumunu atadığımız bir değişken tanımladık.
int sensorPin = 10;
int sensordurum = 0;
int sayac = 0;
   void setup() 
   {
        pinMode(ledPin, OUTPUT);     // Led çıkış olarak ayarlandı. 
        pinMode(butonPin, INPUT);     // Buton giriş olarak ayarlandı.
        pinMode(sensorPin, INPUT);     // sensor giriş olarak ayarlandı.
   }
   void loop()
  {   
    butondurum = digitalRead(butonPin); // Buton pininden dijital okuma işlemi
    sensordurum = digitalRead(sensorPin); // sensör pininden dijital okuma işlemi
   
   if (sensordurum == LOW){  // sensör aktif ise durumu
        
        digitalWrite(ledPin, HIGH);  // Ledi yak .
  
    if (butondurum == HIGH){
      
      delay (5);
        sayac++;
        while(butondurum == HIGH);
          
            if (sayac==5){
               digitalWrite(ledPin, LOW); // Ledi söndür.
                  sayac==0;
   }
  }
 }
}
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

Cemre.

#5
sayac==0;

Hocam syntax ile ilgili ciddi sorunlar var sanırım.
IDE nasıl hata vermiyor?

Bir de, sensor durumunu kontrol eden if blogu ile buton durumunu kontrol eden if bloğu iç içe mi olmalı? Orada bir sorun var herhalde...

overlok

Evet normalde parantezleri hep unutuyorum hata veriyor ama kodları ilk yüklediğim şekilde hata vermedi. Düzelttim gene hata vermiyor.
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

Cemre.

Alıntı yapılan: overlok - 29 Ocak 2017, 19:02:27
Evet normalde parantezleri hep unutuyorum hata veriyor ama kodları ilk yüklediğim şekilde hata vermedi. Düzelttim gene hata vermiyor.

if(xxx); burada hata verecek birşey yok.

if(xxx) digitalWrite(xx); gibi bir yazım da söz konusu çünkü. Tek satır işletilir bu şekilde.

O yüzden diyorum syntax çalışmak lazım diye.

mg1980

Arduino'dan konu açılmışken müsaadenizle bir soru sorayım:
Arduino Uno'ya yeni program yüklediğimde EEPROM'da kayıtlı veriler silinmiyor nedendir acaba ? Bunun usulü mü böyle ?

overlok

Mesela butona 5 kere basınca led yansın diyorum, sadece o şekil deniyorum olmuyor. Yanlış nerede anlayamadım. Çıldıracam  :) :)
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

Yuunus


Cemre.

Son halini bir paylaşın isterseniz...

Bir de bu IR sensörden nasıl bir sinyal geliyor buna da bakmak lazım. Orada sıkıntınız olmasın?

overlok

#12
Alıntı yapılan: digiman - 29 Ocak 2017, 22:16:42
while'a takilip kaliyorsun sanirim.
Evet while'da takılıyormuşum. Buton arkını önlemek için koymuştum o kodu ama yanlış yapmışım anlaşılan.

@Cemre. Hocam, Ir sensörden low sinyali geliyor. Son hali şu şekilde. Çalışıyor ama sanki arada buton atlama yapıyor.

const int sensorPin = 10; //Sensör bağladığımız Pini 10 olarak ayarladık.
const int butonPin = 9;  // Butonu bağladığımız Pini 9 olarak ayarladık.
int ledPin =  8;     // Ledi bağladığımız Pini 8 olarak ayarladık.
int butondurum = 0; // Butonun durumunu atadığımız bir değişken tanımladık.
int sensordurum = 0; // Sensör durumunu atadığımız bir değişken tanımladık.
int sayac = 0;
   void setup() 
   {
        pinMode(ledPin, OUTPUT);     // Led çıkış olarak ayarlandı. 
        pinMode(butonPin, INPUT);     // Buton giriş olarak ayarlandı.
        pinMode(sensorPin, INPUT);     // sensor giriş olarak ayarlandı.
   }
   void loop()
  {   
   //sayac==0;
    butondurum = digitalRead(butonPin); // Buton pininden dijital okuma işlemi
    sensordurum = digitalRead(sensorPin); // sensör pininden dijital okuma işlemi
   if (sensordurum == LOW){  // sensör aktif ise durumu
   digitalWrite(ledPin,HIGH);
   }
   if (butondurum == HIGH){  // buton aktif ise durumu
        delay(150);
        sayac = sayac+1;
        if(sayac==6){			// saymac 6 ise ledi yak
        digitalWrite(ledPin,LOW);
        sayac=0;			// ve tekrar için saymacı sıfırla
      }
    
   }
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

Cemre.

while(digitalRead(butonPin));

Şeklinde kullanılırsa sorun düzelecektir sanıyorum. Arduino'ya bu kadar aşina değilim maalesef farketmemişim.

Yuunus

illede while kullanman gerekiyorsa break ile isin bitince cikarsin.