Arduino 2 buton(sensor) ile 2 Lamba kontrolü

freeb0y

Üye
Katılım
5 Mar 2009
Mesajlar
3
Puanları
1
Yaş
35
Merhabalar , arduino kodlama konusunda acemiyim.
Yapmak istediğim ;
bir kapalı alana giriş yapıldığında kapalı alana başkası girmesin içeri dolu diye kırmızı ışık yakmak bunu 1 sensör ile kendim yapabildim ama kırmızı ışık yanarken içeriye başka birileri girince iş karmaşıklaşıyor 2 kişi girdiğinde bu sefer içeride 2 kişi olduğunda yeşil ışık yanıyor içerisi boşmuş gibi bundan dolayı 2 sensör kullanmaya karar verdim.
Sensörler ile yön tayini ve içerideki kişi sayısını sayıp sayaç 0 dan büyük ise kırmızı ışık sayaç 0 ise yeşil ışık yakmak istiyorum.

Kırmızı ışık yanarken içeriye birisi girdiğinde ışık yeşile dönmemesi için 2 tane sensör kullanacağım sensörlerden 1. den geçtikten sonra 2. den de geçilince kırmızı ışık yanmaya devam edecek.Bu durum bir sayıcı ile saydırılacak sayıcı değeri 0 dan büyük ise kırmızı yanacak.
Kırmızı ışık yanarken içeriden dışarıya çıkarken önce 2. sensörden sonra 1. sensörden geçince sayıcı değeri düşecek ve içerideki kişi sayısı 0 olunca yeşil ışık yanacak.
 
Senin devre durumun rotary encoderlerin aynısı o yüzden aşağıdaki kodu kullanabilirsin. OutputA ve B yerine sensörleri yaz counter değişkeniyle de ışığını kontrol et.

Kod:
 #define outputA 6
 #define outputB 7

 int counter = 0;
 int aState;
 int aLastState; 

 void setup() {
   pinMode (outputA,INPUT);
   pinMode (outputB,INPUT);
  
   Serial.begin (9600);
   // Reads the initial state of the outputA
   aLastState = digitalRead(outputA);   
 }

 void loop() {
   aState = digitalRead(outputA); // Reads the "current" state of the outputA
   // If the previous and the current state of the outputA are different, that means a Pulse has occured
   if (aState != aLastState){     
     // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
     if (digitalRead(outputB) != aState) {
       counter ++;
     } else {
       counter --;
     }
     Serial.print("Position: ");
     Serial.println(counter);
   }
   aLastState = aState; // Updates the previous state of the outputA with the current state
 }
 
Senin devre durumun rotary encoderlerin aynısı o yüzden aşağıdaki kodu kullanabilirsin. OutputA ve B yerine sensörleri yaz counter değişkeniyle de ışığını kontrol et.

Kod:
#define outputA 6
#define outputB 7

int counter = 0;
int aState;
int aLastState;

void setup() {
   pinMode (outputA,INPUT);
   pinMode (outputB,INPUT);

   Serial.begin (9600);
   // Reads the initial state of the outputA
   aLastState = digitalRead(outputA); 
}

void loop() {
   aState = digitalRead(outputA); // Reads the "current" state of the outputA
   // If the previous and the current state of the outputA are different, that means a Pulse has occured
   if (aState != aLastState){   
     // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
     if (digitalRead(outputB) != aState) {
       counter ++;
     } else {
       counter --;
     }
     Serial.print("Position: ");
     Serial.println(counter);
   }
   aLastState = aState; // Updates the previous state of the outputA with the current state
}
Elinize sağlık. Kod her zamanki gibi yine güzel olmuş. :D
 
Senin devre durumun rotary encoderlerin aynısı o yüzden aşağıdaki kodu kullanabilirsin. OutputA ve B yerine sensörleri yaz counter değişkeniyle de ışığını kontrol et.

Kod:
#define outputA 6
#define outputB 7

int counter = 0;
int aState;
int aLastState;

void setup() {
   pinMode (outputA,INPUT);
   pinMode (outputB,INPUT);
 
   Serial.begin (9600);
   // Reads the initial state of the outputA
   aLastState = digitalRead(outputA);  
}

void loop() {
   aState = digitalRead(outputA); // Reads the "current" state of the outputA
   // If the previous and the current state of the outputA are different, that means a Pulse has occured
   if (aState != aLastState){    
     // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
     if (digitalRead(outputB) != aState) {
       counter ++;
     } else {
       counter --;
     }
     Serial.print("Position: ");
     Serial.println(counter);
   }
   aLastState = aState; // Updates the previous state of the outputA with the current state
}
Çok teşekkür ederim şimdi butonlarla test ettim çok hızlı çalıştığı için gecikmeye ihtiyacım var sensörler arasında biraz mesafe olacağı için bunu nasıl yapabilirim.
 
Bu kod sağlıklı olmaz. Sensörleri yakın bile koysan insan encoder gibi yürümez hata olur. Sensorleri ayrık koymak en iyisi
 
Son düzenleme:
counter++; veya counter--;
yapmadan önce insan geçeceği kadar bir delay ekleyebilirsin mesela delay(1000);
 
counter++; veya counter--;
yapmadan önce insan geçeceği kadar bir delay ekleyebilirsin mesela delay(1000);
koddaki sıkıntı sayaç değerini tanımaktan çok sersörlerin ardı ardına okuma hızının çok yakın olması fiziksel olarak mümkün olmuyor o kadar hızla 2 sensörün okuması
 
Kod:
aState = digitalRead(outputA);

bundan sonra delay ekleyebilirsiniz. Hocam birşeyi geciktirmek en kolay şeydir hangi işlemden önce gecikmesini istiyorsan oraya bi delay koyarsın.
 
Merhaba bir değişken atayıp içerideki maks insan miktarı yazıp if else fonksiyonu ile ışığın kırmızı yada yeşil yanmasını sağlamanız olmaz mı hocam?
 

Forum istatistikleri

Konular
128,126
Mesajlar
915,254
Kullanıcılar
449,841
Son üye
nazoyata

Yeni konular

Geri
Üst