Buton ile dizi oluşturma arduino

efeyaso

Üye
Katılım
21 Şub 2023
Mesajlar
6
Puanları
1
Yaş
42
merhaba,
hobi olarak ilgilendiğim arduino kodlama ile alakalı olarak aşağıdaki uygulamayı formdan yardım alarak yaptım ancak geliştirmek adına yapmaya çalıştığım sayaç sıfırlama işlemini yapamıyorum.

1. butona basıldığı kadar ilk led için sayaç tutuyorum
2. butona basıldığı kadar 2. led için sayaç tutuyorum
3. butona basıldığı kadar 3. led için sayaç tutuyorum
3. butona basıldığı zaman bu sayaçlar çalışıyor, ledler yanıyor ve sayaçlar sıfırlanıyor.
yani şu oluyor;
3. butona 3 kez bastım, 1. butona 3 kez bastım, 2. butona 2 kez bastım, 1. butona tekrar 1 kez bastım.

uygulamayı yüklediğimde 1. led 3 kez, 2. led 2 kez, 3. led 3 kez yanıyor.


ancak şunu yapmak için sayacı kod satırları arasında sıfırladığımda tamamen sıfırlanıyor yada hiç sıfırlanmıyor.

ama ben kod yüklendikten sonra ledlerin butona bastığım sırada yanmasını istiyorum.
3. led 3 kez, 1. led 3 kez, 2. led 2 kez, sonra 1. led tekrar 1 kez yansız istiyorum.
butona basınca oluşturduğum boş bir diziye buton sırasına göre dizi oluşturmayı denedim onu da beceremedim. eeprom ile yapmayı denedim nasıl yapılacağını anlayamadım.
yardımcı olabilir misiniz?
 
Kartın gücü kesildiğinde yada resetlendiğinde değerlerin saklı kalmasını istiyorsan eeprom haricinde birşey işini çözmeyecektir.
Arduino EEPROM kitaplığı işleri kolaylaştırmak için eepromnu bir dizi gibi kullanılmasını sağlayan bir tarz geliştirmiştir. Harici bir fonksiyon kullanmadan sadece EEPROM[] anahtar kelimesini kullanarak eepromu bir dizi gibi hem okumayı hem yazmayı sağlamıştır. Aşağıdaki örneği kendi projene uyarlayabilirsin.

C++:
#include <EEPROM.h>

void setup(){

    unsigned char buton1 = 3,buton2 = 2,buton3 = 1;
    EEPROM[0] = buton1; //EEPROM'a kaydet
    EEPROM[1] = buton2; //EEPROM'a kaydet
    EEPROM[2] = buton3; //EEPROM'a kaydet
    
  Serial.begin(115200);
  //EEPROM'dan oku ekrana yazdır
  Serial.println("Buton1: "+(String)EEPROM[0]+" Buton2: "+(String)EEPROM[1]+" Buton3: "+(String)EEPROM[2]);
    
}

void loop(){}
 
Kartın gücü kesildiğinde yada resetlendiğinde değerlerin saklı kalmasını istiyorsan eeprom haricinde birşey işini çözmeyecektir.
Arduino EEPROM kitaplığı işleri kolaylaştırmak için eepromnu bir dizi gibi kullanılmasını sağlayan bir tarz geliştirmiştir. Harici bir fonksiyon kullanmadan sadece EEPROM[] anahtar kelimesini kullanarak eepromu bir dizi gibi hem okumayı hem yazmayı sağlamıştır. Aşağıdaki örneği kendi projene uyarlayabilirsin.

C++:
#include <EEPROM.h>

void setup(){

    unsigned char buton1 = 3,buton2 = 2,buton3 = 1;
    EEPROM[0] = buton1; //EEPROM'a kaydet
    EEPROM[1] = buton2; //EEPROM'a kaydet
    EEPROM[2] = buton3; //EEPROM'a kaydet
 
  Serial.begin(115200);
  //EEPROM'dan oku ekrana yazdır
  Serial.println("Buton1: "+(String)EEPROM[0]+" Buton2: "+(String)EEPROM[1]+" Buton3: "+(String)EEPROM[2]);
 
}

void loop(){}[/CO
[/QUOTE]
tekrar merhaba,
benim yazdığım kod satırı aşağıdaki şekilde. (2 led ve bunlara bağlı butonlar için ekledim)
kod satırı çalışıyor ancak dediğim gibi, buton (1.buton) a 1 kere, buton2(2. butona)1 kere ve tekrar buton (1.buton) a 1 kere bastığımda 1. buton 2 kere çalışıp sonrasında 2. buton çalışıyor. yani butonlara bastığım sırada ledleri yakmıyor. for döngüsünden kaynaklı olduğunu biliyorum. döngüleri sıra ile çalıştırıyor sonra sayaçları sıfırlıyor. bu kod satılarında eeprom da yer göstermeden (çünkü kaç defa butonlara basılacağını bilmiyoruz, belki birer kere belki farklı sırada toplamda 100 kere basılacak) nasıl dizi oluşturacağım. çünkü dizi elaman sayısını bilmiyorum.
int buton = 12;
int buton2 = 11;
int buton3= 13;
int led1 = 3;
int led2= 4;
int sayac = 0;
int sayac2 = 0;
int butondurumu = 0;
int butondurumu2 = 0;
int butondurumu3 = 0;

void setup() {
pinMode(buton, INPUT);
pinMode(buton2, INPUT);
pinMode(buton3, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
}

void loop() {
butondurumu = digitalRead(buton);
butondurumu2 = digitalRead(buton2);
butondurumu3 = digitalRead(buton3);
if (butondurumu == HIGH) {
while(butondurumu == HIGH) butondurumu = digitalRead(buton);
sayac ++;
}
if (butondurumu2 == HIGH) {
while(butondurumu2 == HIGH) butondurumu = digitalRead(buton2);
sayac2 ++;
}
if (butondurumu3 == HIGH) {
while (butondurumu3 == HIGH) butondurumu3 = digitalRead(buton3);
for(int x=0 ; x<sayac; x++){
digitalWrite(led1,HIGH);
delay(200);
digitalWrite(led1,LOW);
delay(200);
}
for(int x=0 ; x<sayac2; x++){
digitalWrite(led2,HIGH);
delay(200);
digitalWrite(led2,LOW);
delay(200);
}
sayac=0;
sayac2=0;
}

}
 
Son düzenleme:
Anladığım kadarıyla ilk iki butona basıldığında basılma sırasıyla basılma sayılarını kaydedip üçüncü butona basıldığında bu kaydı kullanarak ledleri yakıp söndürmek istiyorsun. Öncelikle şunu söyleyim mikrokontrolörlerin ramleri sınırlı olduğu için dinamik büyüyen değişkenler tehlikelidir. Belirli bir büyüklükten sonra kilitlenecektir. Sabit büyüklükteki dizileri kullanman derleyici kontrolü sayesinde böyle bir tehlike olduğunda seni kurtaracaktır. Sorunun cevabına gelirsek biraz değişik bir yaklaşımla dinamik olarak büyüyebilen String kitaplığından faydalanabilirsin. Yani her butona basıldığında Stringe bir harf ekleyebilir üçüncü butona basıldığında bu harfleri sırayla kontrol ederek ilgili ledi yakabilirsin. Tekrar söylüyorum sınırlı değişken kullanmak senin için daha iyi olacaktır. Şimdilik senin kodunun değiştirilmiş hali işini görecektir.

C++:
#include <Arduino.h>
int buton = 12;
int buton2 = 11;
int buton3= 13;
int led1 = 3;
int led2= 4;
int butondurumu = 0;
int butondurumu2 = 0;
int butondurumu3 = 0;
String led_sirasi = "";

void setup() {
    pinMode(buton, INPUT);
    pinMode(buton2, INPUT);
    pinMode(buton3, INPUT);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
}

void loop() {
    butondurumu = digitalRead(buton);
    butondurumu2 = digitalRead(buton2);
    butondurumu3 = digitalRead(buton3);

    if (butondurumu == HIGH) {
        while(butondurumu == HIGH) butondurumu = digitalRead(buton);
        led_sirasi += '1';
    }
    if (butondurumu2 == HIGH) {
        while(butondurumu2 == HIGH) butondurumu = digitalRead(buton2);
        led_sirasi += '2';
    }
    if (butondurumu3 == HIGH) {
        while (butondurumu3 == HIGH) butondurumu3 = digitalRead(buton3);
        for(int i=0;i<led_sirasi.length();i++){
            if(led_sirasi[i] == '1'){
                digitalWrite(led1,HIGH);
                delay(200);
                digitalWrite(led1,LOW);
                }
            else if(led_sirasi[i] == '2'){
                digitalWrite(led2,HIGH);
                delay(200);
                digitalWrite(led2,LOW);
            }   
        }
        led_sirasi = "";
    }
    
}
 
Son düzenleme:
Anladığım kadarıyla ilk iki butona basıldığında basılma sırasıyla basılma sayılarını kaydedip üçüncü butona basıldığında bu kaydı kullanarak ledleri yakıp söndürmek istiyorsun. Öncelikle şunu söyleyim mikrokontrolörlerin ramleri sınırlı olduğu için dinamik büyüyen değişkenler tehlikelidir. Belirli bir büyüklükten sonra kilitlenecektir. Sabit büyüklükteki dizileri kullanman derleyici kontrolü sayesinde böyle bir tehlike olduğunda seni kurtaracaktır. Sorunun cevabına gelirsek biraz değişik bir yaklaşımla dinamik olarak büyüyebilen String kitaplığından faydalanabilirsin. Yani her butona basıldığında Stringe bir harf ekleyebilir üçüncü butona basıldığında bu harfleri sırayla kontrol ederek ilgili ledi yakabilirsin. Tekrar söylüyorum sınırlı değişken kullanmak senin için daha iyi olacaktır. Şimdilik senin kodunun değiştirilmiş hali işini görecektir.

C++:
#include <Arduino.h>
int buton = 12;
int buton2 = 11;
int buton3= 13;
int led1 = 3;
int led2= 4;
int butondurumu = 0;
int butondurumu2 = 0;
int butondurumu3 = 0;
String led_sirasi = "";

void setup() {
    pinMode(buton, INPUT);
    pinMode(buton2, INPUT);
    pinMode(buton3, INPUT);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
}

void loop() {
    butondurumu = digitalRead(buton);
    butondurumu2 = digitalRead(buton2);
    butondurumu3 = digitalRead(buton3);

    if (butondurumu == HIGH) {
        while(butondurumu == HIGH) butondurumu = digitalRead(buton);
        led_sirasi += '1';
    }
    if (butondurumu2 == HIGH) {
        while(butondurumu2 == HIGH) butondurumu = digitalRead(buton2);
        led_sirasi += '2';
    }
    if (butondurumu3 == HIGH) {
        while (butondurumu3 == HIGH) butondurumu3 = digitalRead(buton3);
        for(int i=0;i<led_sirasi.length();i++){
            if(led_sirasi[i] == '1'){
                digitalWrite(led1,HIGH);
                delay(200);
                digitalWrite(led1,LOW);
                }
            else if(led_sirasi[i] == '2'){
                digitalWrite(led2,HIGH);
                delay(200);
                digitalWrite(led2,LOW);
            }  
        }
        led_sirasi = "";
    }
   
}
teşekkür ederim hemen deniyorum. ve sonuçlar sizlerle de paylaşacağım.
 
Anladığım kadarıyla ilk iki butona basıldığında basılma sırasıyla basılma sayılarını kaydedip üçüncü butona basıldığında bu kaydı kullanarak ledleri yakıp söndürmek istiyorsun. Öncelikle şunu söyleyim mikrokontrolörlerin ramleri sınırlı olduğu için dinamik büyüyen değişkenler tehlikelidir. Belirli bir büyüklükten sonra kilitlenecektir. Sabit büyüklükteki dizileri kullanman derleyici kontrolü sayesinde böyle bir tehlike olduğunda seni kurtaracaktır. Sorunun cevabına gelirsek biraz değişik bir yaklaşımla dinamik olarak büyüyebilen String kitaplığından faydalanabilirsin. Yani her butona basıldığında Stringe bir harf ekleyebilir üçüncü butona basıldığında bu harfleri sırayla kontrol ederek ilgili ledi yakabilirsin. Tekrar söylüyorum sınırlı değişken kullanmak senin için daha iyi olacaktır. Şimdilik senin kodunun değiştirilmiş hali işini görecektir.

C++:
#include <Arduino.h>
int buton = 12;
int buton2 = 11;
int buton3= 13;
int led1 = 3;
int led2= 4;
int butondurumu = 0;
int butondurumu2 = 0;
int butondurumu3 = 0;
String led_sirasi = "";

void setup() {
    pinMode(buton, INPUT);
    pinMode(buton2, INPUT);
    pinMode(buton3, INPUT);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
}

void loop() {
    butondurumu = digitalRead(buton);
    butondurumu2 = digitalRead(buton2);
    butondurumu3 = digitalRead(buton3);

    if (butondurumu == HIGH) {
        while(butondurumu == HIGH) butondurumu = digitalRead(buton);
        led_sirasi += '1';
    }
    if (butondurumu2 == HIGH) {
        while(butondurumu2 == HIGH) butondurumu = digitalRead(buton2);
        led_sirasi += '2';
    }
    if (butondurumu3 == HIGH) {
        while (butondurumu3 == HIGH) butondurumu3 = digitalRead(buton3);
        for(int i=0;i<led_sirasi.length();i++){
            if(led_sirasi[i] == '1'){
                digitalWrite(led1,HIGH);
                delay(200);
                digitalWrite(led1,LOW);
                }
            else if(led_sirasi[i] == '2'){
                digitalWrite(led2,HIGH);
                delay(200);
                digitalWrite(led2,LOW);
            }  
        }
        led_sirasi = "";
    }
   
}
tekrar merhaba,
olmadı maalesef :( sürekli olarak ilk led yanıp sönüyor. hemde hiç durmadan. sonsuz döngüye alıyor program kendisini. arduinoyu resetleyerek çıkabiliyorum :(
 
Bu senin yaptığın buton satırındaki debouncingden kaynaklanıyor. Kodu güncelledim,deneyebilirsin tekrar.. Simülatörde çalıştı. Eğer gereğinden fazla yanıp sönüyorsa delay(10) satırlarındaki sayıyı artır. Eğer buton hareketlerini terminalde görmek istiyorsan en baştaki #define HATA_AYIKLAMA satırını aktifleştir. Bir de 3 numaralı butonu 10 numaralı pine taşı.

C++:
//#define HATA_AYIKLAMA
#ifdef HATA_AYIKLAMA
#define GOSTER(x) Serial.println(x)
#else
#define GOSTER(x)
#endif
int buton = 12;
int buton2 = 11;
int buton3= 10;
int led1 = 3;
int led2= 4;
//int butondurumu = 0;
//int butondurumu2 = 0;
//int butondurumu3 = 0;
String led_sirasi = "";
void setup() {
    pinMode(buton, INPUT);
    pinMode(buton2, INPUT);
    pinMode(buton3, INPUT);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    Serial.begin(115200);
    GOSTER("Basliyor");
}
void loop() {
    //butondurumu = digitalRead(buton);
    //butondurumu2 = digitalRead(buton2);
    //butondurumu3 = digitalRead(buton3);
    if (digitalRead(buton)) {
        while(digitalRead(buton))delay(10);
        led_sirasi += '1';
         GOSTER(led_sirasi);
    }
    if (digitalRead(buton2)) {
        while(digitalRead(buton2)) delay(10);
        led_sirasi += '2';
        GOSTER(led_sirasi);
    }
    if (digitalRead(buton3)) {
        while (digitalRead(buton3)) delay(3);
        for(unsigned int i=0;i<led_sirasi.length();i++){
            if(led_sirasi[i] == '1'){
                digitalWrite(led1,HIGH);
                delay(200);
                digitalWrite(led1,LOW);
                GOSTER(led_sirasi[i]);
                }
            else if(led_sirasi[i] == '2'){
                digitalWrite(led2,HIGH);
                delay(200);
                digitalWrite(led2,LOW);
                GOSTER(led_sirasi[i]);
            }
        }
        led_sirasi = "";
    }
 
}
 
Son düzenleme:
Bu senin yaptığın buton satırındaki debouncingden kaynaklanıyor. Kodu güncelledim,deneyebilirsin tekrar.. Simülatörde çalıştı. Eğer gereğinden fazla yanıp sönüyorsa delay(10) satırlarındaki sayıyı artır. Eğer buton hareketlerini terminalde görmek istiyorsan en baştaki #define HATA_AYIKLAMA satırını aktifleştir.

C++:
//#define HATA_AYIKLAMA
#ifdef HATA_AYIKLAMA
#define GOSTER(x) Serial.println(x)
#else
#define GOSTER(x)
#endif
int buton = 12;
int buton2 = 11;
int buton3= 10;
int led1 = 3;
int led2= 4;
//int butondurumu = 0;
//int butondurumu2 = 0;
//int butondurumu3 = 0;
String led_sirasi = "";
void setup() {
    pinMode(buton, INPUT);
    pinMode(buton2, INPUT);
    pinMode(buton3, INPUT);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    Serial.begin(115200);
    GOSTER("Basliyor");
}
void loop() {
    //butondurumu = digitalRead(buton);
    //butondurumu2 = digitalRead(buton2);
    //butondurumu3 = digitalRead(buton3);
    if (digitalRead(buton)) {
        while(digitalRead(buton))delay(10);
        led_sirasi += '1';
         GOSTER(led_sirasi);
    }
    if (digitalRead(buton2)) {
        while(digitalRead(buton2)) delay(10);
        led_sirasi += '2';
        GOSTER(led_sirasi);
    }
    if (digitalRead(buton3)) {
        while (digitalRead(buton3)) delay(3);
        for(int i=0;i<led_sirasi.length();i++){
            if(led_sirasi[i] == '1'){
                digitalWrite(led1,HIGH);
                delay(200);
                digitalWrite(led1,LOW);
                GOSTER(led_sirasi[i]);
                }
            else if(led_sirasi[i] == '2'){
                digitalWrite(led2,HIGH);
                delay(200);
                digitalWrite(led2,LOW);
                GOSTER(led_sirasi[i]);
            }
        }
        led_sirasi = "";
    }
 
}
merhaaba
tamamdır. sorunu buldum. dizi içerisine eleman ekleme işini while döngüsü içine alınca sonsuz döngü yapıyor. while kontrolünün üzerine, if deyimlerinin içine yazınca çalışıyor. çok teşekkür ederim. sayenizde çözülmüş oldu.
 

Forum istatistikleri

Konular
128,405
Mesajlar
917,328
Kullanıcılar
450,310
Son üye
amele01

Yeni konular

Geri
Üst