Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: overlok - 29 Ocak 2017, 18:06:10

Başlık: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: overlok - 29 Ocak 2017, 18:06:10
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;
  }
}
}

Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: Cemre. - 29 Ocak 2017, 18:18:52
            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....
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: sadogan - 29 Ocak 2017, 18:28:09
f (sayac=5); f (sayac==5); olmalı
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: Cemre. - 29 Ocak 2017, 18:33:48
Syntax çalışmayı ihmal etmemek gerekiyor sanırım.
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: overlok - 29 Ocak 2017, 18:44:45
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;
   }
  }
}
}
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: Cemre. - 29 Ocak 2017, 18:54:05
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...
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: 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.
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: Cemre. - 29 Ocak 2017, 19:22:34
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.
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: mg1980 - 29 Ocak 2017, 20:34:07
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 ?
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: overlok - 29 Ocak 2017, 22:08:11
Mesela butona 5 kere basınca led yansın diyorum, sadece o şekil deniyorum olmuyor. Yanlış nerede anlayamadım. Çıldıracam  :) :)
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: Yuunus - 29 Ocak 2017, 22:16:42
while'a takilip kaliyorsun sanirim.
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: Cemre. - 29 Ocak 2017, 22:25:22
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?
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: overlok - 29 Ocak 2017, 22:38:06
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
      }
   
   }
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: Cemre. - 29 Ocak 2017, 22:45:16
while(digitalRead(butonPin));

Şeklinde kullanılırsa sorun düzelecektir sanıyorum. Arduino'ya bu kadar aşina değilim maalesef farketmemişim.
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: Yuunus - 29 Ocak 2017, 23:43:36
illede while kullanman gerekiyorsa break ile isin bitince cikarsin.
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: Kabil ATICI - 30 Ocak 2017, 00:09:28
@mg1980
aslında olay ATMEGA bootloader yüklerken ne yapılacağı ile ilgili. Sözünü ettiğiniz olay eeprom koruma bitinin seçilip seçilmemesi ile ilgili. Büyük olasılıkla eeprom program yazılırken korunsun biti aktiflenmediği için program yükleme esnasında siliniyor, yani korunmuyor.

@overlok
Yazdığınız koda bakarak butonun vcc ile pin arasına bağlı görünüyor.  Buton basılma durumunu delay ile kontrol ediyorsun, burada kendine elinin ve butonun hızına güveniyorsun. Buna göre biraz uzun süre butona basılı kalsan 5 tane sayma işini halledecek.

Onun için butonun bırakıldığını da kontrol etmelisin. Yani butonu bastın, bırakılana kadar  tekrar bastı mı diye kontrol etmesin.
Bunu ya while ile yapabilirsin, ya da if komutuna ek bir değişken ile birlikte.
while komutu ile kullanımı sorunu, while döngüsü içinde iken durum değişene kadar program döngü içinde kalır.

if döngüsünde iken buton durumu değişene kadar program diğer işlerine de devam edebilir. (değişkenler bölümüne int butondurum1=LOW;satırına unutma.)
  if (butondurum == HIGH)
{
  if (butondurum1 == LOW)
    {
      butondurum1 = HIGH;
      //buton basıldı işlemleri..
    }
  }
  else
  {
    if (butondurum1 == HIGH)
      butondurum1 = LOW;
  }
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: mg1980 - 30 Ocak 2017, 00:23:25
Hocam koruma olsa benim de yazamamam gerekmez mi? Yazıyorum so nra programda değişiklik yapıp yüklediğimde kayıtlar duruyor.255 görmek gerek miyor mu?
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: Kabil ATICI - 30 Ocak 2017, 01:07:23
sözünü ettiğimiz yazma koruması değil zaten.Örneğin Atmega328p veri kağıdında Fuse High Byte içine yer alan EEPROM verilerinin silinmeye karşı korunması.
ATMEL işlemci içindeki EEPROM koruması her programlama esnasında EEPROM verisini yazmadan korumak için, (asm kodu olarak SPM için), yoksa LPM kod koruması (kullanıcının veri yazmasına) elbette yok. Bu sigorta ayarı harici programlayıcılar kullanılarak bootloader  veya başka bir programın yüklemesi esnasında ayarlanan bir sigorta bitidir.

Her ne kadar Arduino bootloader programını incelemedim, her program yüklemesinde eeprom'u silip silmediğine bakmak gerek. Tahminim silinmesi gerektiği yönünde, Arduino'yu yeni bir uygulama için kullanmanız gerekiyor, ve EEPROM verileri üzerinde kaldı, ne olacak?

Arduino programı içinde yer alan işlemci  için kullanın bootloader kodlamalarına bakılırsa, EEPROM ile işlem yapması mümkün görünüyor. Ama Arduino yazılımı EEPROM kodu üretmiyor ve yüklemiyor. Daha önceki paylaşımlarda bu konuşulmuştu. Bu nedenlerden dolayı EEPROM sıfırlaması yoluna gidilmiş olabilir. (Yakın zamanda bunu denemedim, sürekli gelişmekte olan bir program)
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: mehmet - 30 Ocak 2017, 01:15:00
Eeprom silinmesi olayını daha öncede yazmıştım:
Güçü yüksek psu kullanılıp enerji kesilince, çıkış
kondansatörü uzun süre yüklü kalıyor. Bu gerilim
mcu kritik çalışma gerilimi civarında fazlaca kalırsa
eeprom siliniyor.

Bunun için BrownOut kullanınız. Mümkün olan en
düşük gerilimde. Bu gerilime düşünce seviye mcu
resette kalacak ve bu gibi gariplikler oluşmayacaktır.
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: mg1980 - 30 Ocak 2017, 09:10:06
@Kabil ATICI ,@mehmet
Açıklamalar için teşekkür ediyorum.
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: overlok - 30 Ocak 2017, 09:30:43
Öncelike cevaplar için teşekkürler.

Kod bu haliyle çalışıyor ama sayaç işlemi ledin durumuna göre çalışmıyor. Yani ayrıca arka planda çalışır gibi çalışıyor. Led yanıksa sayma işleminin devrede olmasını nasıl sağlayabilirim? Yani led yanık değilse butona basılsa bile sayma işlemi gerçekleşmesin.

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;
        while(digitalRead(butonPin));
        if(sayac==6){ // saymac 6 ise ledi yak
        digitalWrite(ledPin,LOW);
        sayac=0; // ve tekrar için saymacı sıfırla
      }
   
   }
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: overlok - 30 Ocak 2017, 10:09:51
Bu kod parçası doğru olur mu?
if (ledPin,HIGH) && (butondurum == HIGH){
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: mg1980 - 30 Ocak 2017, 10:28:57
if(ledPin==HIGH) &&......
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: overlok - 30 Ocak 2017, 22:45:06
Bu işin mantığını çözemiyorum bir türlü. İki koşul sağlandığında bi alt komuta geçsin istiyorum. Yani led yanık değilken buton aktif olmasın, sayma işlemi başlamasın.

if (ledpin == HIGH) && (butondurum == HIGH)

Bu kodu ekliyorum, led hiç sönmüyor.
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: mg1980 - 30 Ocak 2017, 23:10:52
Ne istediğinizi tam anlamadım ama sadece yukarda yazdığınız kod ve devamını şu iki şekilde dener misiniz ;
if(ledpin==HIGH && butondurum==HIGH)....... veya

if(digitalRead(ledpin)==HIGH && butondurum==HIGH).......
Başlık: Ynt: Arduino: buton/sensör ile sayaç yaparak led yakma
Gönderen: overlok - 31 Ocak 2017, 00:04:15
@mg1980
Hocam teşekkürler bu kod çalıştı. Şimdilik sorun yok gibi.
if(digitalRead(ledpin)==HIGH && butondurum==HIGH)