Buton ile 3 Saniye LED Çalıştırma.

Başlatan veliusta, 31 Mayıs 2014, 04:15:20

veliusta

void setup()
{
  pinMode(2, INPUT); // button
  pinMode(3, INPUT); // button
  pinMode(4, INPUT); // button
  pinMode(7, OUTPUT); // LED
  pinMode(8, OUTPUT); // LED
  pinMode(9, OUTPUT); // LED
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
}

int pinState1 = HIGH;
int pinState2 = HIGH;
int pinState3 = HIGH;

void loop()
{
  int newState1 = digitalRead(2);
  if (pinState1 != newState1) // button state differs from last recorded state?
  {
    pinState1 = newState1;
    if (pinState1 == LOW) // button newly pressed?
      delay(3000);
    digitalWrite(7, pinState1); // set LED HIGH if button LOW and vice versa
  }
  
  int newState2 = digitalRead(3);
  if (pinState2 != newState2) // button state differs from last recorded state?
  {
    pinState2 = newState2;
    if (pinState2 == LOW) // button newly pressed?
      delay(3000);
    digitalWrite(8, pinState2); // set LED HIGH if button LOW and vice versa
  }
  
  int newState3 = digitalRead(4);
  if (pinState3 != newState3) // button state differs from last recorded state?
  {
    pinState3 = newState3;
    if (pinState3 == LOW) // button newly pressed?
      delay(3000);
    digitalWrite(9, pinState3); // set LED HIGH if button LOW and vice versa
  }
}


Yukarıdaki kodları çalışıyor fakat;

Herhangi bi butona bastığımda 3sn geçmeden diğer işlemleri yapmıyor.
Bu nasıl olacak?

1.Butona bastığımda 1.LED 3sn HIGH sonra LOW.
2.Butona bastığımda 2.LED 3sn HIGH sonra LOW.
3.Butona bastığımda 3.LED 3sn HIGH sonra LOW.

Klein

Başka bir başlıkta sorduğun soruya verdiğim yanıtı  analiz edersen,  sorunun cevabını bulacaksın.

veliusta

Böyle birşey buldum.
    int pinButton = 2;
    int Relay = 7;
    int stateRelay = LOW;
    int stateButton;
    int previous = LOW;
    long time = 0;
    long debounce = 0;
    int stayON = 1000; //stay on for 5000 ms
     
    void setup() {
    pinMode(pinButton, INPUT);
    pinMode(Relay, OUTPUT);
    }
     
    void loop() {
    stateButton = digitalRead(pinButton);
    if(stateButton == HIGH && previous == LOW && millis() - time > debounce) {
    if(stateRelay == HIGH){
    digitalWrite(Relay, LOW);
    } else {
    digitalWrite(Relay, HIGH);
    delay(stayON);
    digitalWrite(Relay, LOW);
    }
    time = millis();
    }
    previous == stateButton;
    }


KaynaK: http://www.electroschematics.com/8975/arduino-control-relay/

veliusta

#3
@Klein, hocam orada sanırım sayıcı olarak kullanmışsın. Sayıcı ile zaman ayarı nasıl olacak. Bekleme süresi kullanmak zorunda değilmiyiz? Tam anlayamadım ne yaptığını.



Devre şeması yukarıda, Nasıl olacak arkadaşlar fikir vermeniz yeterli.

Örnek olarak: 3 Adet Paralel Ters Zaman Rölesi (Merdiven otomatiği) gibi düşünebilirsiniz. 1.Butona bastım. 1.Led 10000msn.  10000msn geçmeden (Süre bitmeden) 2. veya 3. Butona bastığımda da program çalışmaya devam edecek.

Kabil ATICI

programını kendin yazarsın, sadece mantık olarak,
3 tane  zaman sayaç olacak örneğin
  SAY1, SAY2, SAY3
butona bastığın zaman basılan butonda  30 ile yüklenecek...ve ilgili LED high konumunda olacak.
buton bölümü için
int newState1 = digitalRead(2);
  if (pinState1 != newState1) // button state differs from last recorded state?
  {
    pinState1 = newState1;
    if (pinState1 == LOW) // button newly pressed?
    digitalWrite(7, LOW); // set LED HIGH if button LOW and vice versa
  SAY1=30;
  }

diğerleri bunun gibi...
loop  çevriminin en sonuna
//değerlendirme bölümü.
//Burada önceki işlemlerden kaynaklanan gecikmeler göz önüne alınmamaktadır.
delay(100);
if (SAY1 != 0)
{
SAY1=SAY1-1
}
else
{
digitalWrite(7, HIGH);
}
if (SAY2 != 0)
{
SAY2=SAY2-1
}
else
{
digitalWrite(8,
HIGH);
}
if (SAY3 != 0)
{
SAY3=SAY3-1
}
else
{
digitalWrite(9,
HIGH);
}
ambar7

veliusta

ambar hocam teşekkürler :) Yaptım Çalışıyor.

Kodlara bir göz atarmısın? Doğru mu yapmışım?

int BUTON1 = 2;  // 1.Buton Pin
int BUTON2 = 3;  // 2.Buton Pin
int BUTON3 = 4;  // 3.Buton Pin
int LED1 = 5;    // 1.LED Pin
int LED2 = 6;    // 2.LED Pin
int LED3 = 7;    // 3.LED Pin
int SAY1;
int SAY2;
int SAY3;
int YENIKONUM1;
int YENIKONUM2;
int YENIKONUM3;
int PINDURUMU1;
int PINDURUMU2;
int PINDURUMU3;

void setup(){
  pinMode(BUTON1, INPUT);
  pinMode(BUTON2, INPUT);
  pinMode(BUTON3, INPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);    
}

void loop(){
YENIKONUM1 = digitalRead(BUTON1);
 if(PINDURUMU1 != YENIKONUM1)    //Pin DURUM Yeni KONUM'a Eşit Değil ise
   {
     PINDURUMU1 = YENIKONUM1;
      if(PINDURUMU1 == HIGH)     // BURASI HIGH OLURSA KEYDOWN olunca Başlıyor Çalışmaya. LOW OLURSA KEYUP olunca Başlıyor Çalışmaya DOĞRU MU?
      {
       digitalWrite(LED1, HIGH); // SEN BURASINI LOW Yapmışsın ben HIGH Yaptım..    
       SAY1=30;
      }
   }
   
YENIKONUM2 = digitalRead(BUTON2);
 if(PINDURUMU2 != YENIKONUM2)
   {
     PINDURUMU2 = YENIKONUM2;
      if(PINDURUMU2 == HIGH)     // BURASI HIGH OLURSA KEYDOWN olunca Başlıyor Çalışmaya. LOW OLURSA KEYUP olunca Başlıyor Çalışmaya DOĞRU MU?
      {
       digitalWrite(LED2, HIGH); // SEN BURASINI LOW Yapmışsın ben HIGH Yaptım..    
       SAY2=30;
      }
   }
  
YENIKONUM3 = digitalRead(BUTON3);
 if(PINDURUMU3 != YENIKONUM3)
   {
     PINDURUMU3 = YENIKONUM3;
      if(PINDURUMU3 == HIGH)     // BURASI HIGH OLURSA KEYDOWN olunca Başlıyor Çalışmaya. LOW OLURSA KEYUP olunca Başlıyor Çalışmaya DOĞRU MU?
      {
       digitalWrite(LED3, HIGH); // SEN BURASINI LOW Yapmışsın ben HIGH Yaptım..    
       SAY3=30;
      }
   }
   
delay(100);

  if(SAY1 != 0)
   {
     SAY1=SAY1-1;
   }
  else
   {
     digitalWrite(LED1, LOW); // SEN BURASINI HIGH Yapmışsın ben LOW Yaptım..    
   }
   
  if(SAY2 != 0)
   {
     SAY2=SAY2-1;
   }
  else
   {
     digitalWrite(LED2, LOW);  // SEN BURASINI HIGH Yapmışsın ben LOW Yaptım..   
   }
   
   if(SAY3 != 0)
   {
     SAY3=SAY3-1;
   }
  else
   {
     digitalWrite(LED3, LOW); // SEN BURASINI HIGH Yapmışsın ben LOW Yaptım..
   }
}

Kabil ATICI

Tamam.

Çıkışları ters yapıyor olmamın sebebi, ATMEL işlemcilerde akımı dışarı akıtma (yukarıdaki şemada olduğu gibi) kapasitesi sınırlıdır. Ama akımı içeri  akıtma kapasitesi (LED'in bir ucu Vcc'de olma durumunda) daha  yüksektir. Bu nedenle LED'ler daha yüksek parlaklıkta ışık vermesini sağlar.
ambar7

veliusta

Pin başına 40mA diyor. Sınırı zorlamıyorum ki ?

Led' ten 25mA, 
Buton'dan 0,5mA geçiyor. (Buton'a basıldığında ne kadar geçer bilmiyorum)

http://arduino.cc/en/Main/arduinoBoardUno

Kabil ATICI

40mA olayından emin değilim. 40mA altında Vcc ve GND bacakları arasında 200mA diyor. Yani 5 tane bacaktan 40mA çektik işlemcinin çekeceği akımı çektik.

Ben aklını karıştırmayayım, sen bildiğin gibi devam et.
ambar7