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;
}
}
}
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....
f (sayac=5); f (sayac==5); olmalı
Syntax çalışmayı ihmal etmemek gerekiyor sanırım.
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;
}
}
}
}
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...
Evet normalde parantezleri hep unutuyorum hata veriyor ama kodları ilk yüklediğim şekilde hata vermedi. Düzelttim gene hata vermiyor.
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.
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 ?
Mesela butona 5 kere basınca led yansın diyorum, sadece o şekil deniyorum olmuyor. Yanlış nerede anlayamadım. Çıldıracam :) :)
while'a takilip kaliyorsun sanirim.
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?
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
}
}
while(digitalRead(butonPin));
Şeklinde kullanılırsa sorun düzelecektir sanıyorum. Arduino'ya bu kadar aşina değilim maalesef farketmemişim.
illede while kullanman gerekiyorsa break ile isin bitince cikarsin.
@mg1980aslı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.
@overlokYazdığı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;
}
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?
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)
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.
@Kabil ATICI ,
@mehmet Açıklamalar için teşekkür ediyorum.
Ö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
}
}
Bu kod parçası doğru olur mu?
if (ledPin,HIGH) && (butondurum == HIGH){
if(ledPin==HIGH) &&......
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.
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).......
@mg1980 Hocam teşekkürler bu kod çalıştı. Şimdilik sorun yok gibi.
if(digitalRead(ledpin)==HIGH && butondurum==HIGH)