Arduino kod çalışmıyor

Emir2507

Decapat
Katılım
25 Nisan 2020
Mesajlar
66
Merhaba. Arduino'da bir proje yapmak istedim. Amaç = RTC modülündeki saat bilgisi 16x2 LCD ekranda yazmalı. Daha sonra hareket sensörü hareket algıladığında sayım yapmalı, bunları yaptım. Sonra birkaç ekleme yapmak istedim. Hareket algıladığında ve LDR sensörü belli bir değerin altını gösterdiğinde röleye sinyal gitsin bir de sayaca +1 yapmasını istedim. Kodları yazdım ama bir türlü çalışmadı hata nedir? Cevaplarınızı bekliyorum. İyi günler.

Not: Hareket algılandığında 2 saniye bekleme vermemin sebebi hareket sensörü minimum 3 saniye boyunca locik 1 verir bunu yapmazsam her hareket algıladığında +3 verir. Sorunu bekleterek çözdüm.

Kodlar =

#Include <Wire.h>
#Include "RTClib.h"
#Include <LiquidCrystal.h>
LiquidCrystal LCD(8, 7, 6, 5, 4, 3);
RTC_DS1307 rtc;
İnt buton = 2;
İnt hareket= 9;
İnt sayac;
İnt LDR = a0;
İnt role = 12;

Char daysoftheweek[7][12] = {"paz", "pzt", "sal", "car", "per", "C'um", "cmt"};

Void setup () {

Pinmode(buton, ınput);
Pinmode(hareket, ınput);
Pinmode(13, output);
Pinmode(ldr, ınput);
Pinmode(role, output);

Wire.begin();
RTC.begin();
LCD. Begin(16, 2);
If (! RTC.isrunning()) {
LCD. Println("rtc calismiyor");
}
For(int a=0; a<3; a++){
LCD. Print("bekleyiniz.");
Delay(500);
lcd.clear();
LCD. Print("bekleyiniz.");
Delay(500);
lcd.clear();
LCD. Print("bekleyiniz...");
Delay(500);
lcd.clear();
}
LCD. Setcursor(0, 0);
LCD. Print("proje...");
LCD. Setcursor(0, 1);
LCD. Print("...Bir");
Delay (2000);
lcd.clear();
}

Void loop () {
Digitalwrite(13, Low);
If(digitalread(buton)==0){

Datetime Now = RTC.now();
LCD. Setcursor(0, 0);
lcd.print(now.day(), DEC);
LCD. Print('/');
lcd.print(now.month(), DEC);
LCD. Print('/');
lcd.print(now.year(), DEC);
LCD. Print(' ');
LCD. Print(" ");
LCD. Print(daysoftheweek[now.dayOfTheWeek()]);
LCD. Setcursor(0, 1);
If (now.hour()<10)
LCD. Print('0');
lcd.print(now.hour(), DEC);
LCD. Print(':');
If (now.minute()<10)
LCD. Print('0');
lcd.print(now.minute(), DEC);
LCD. Print(':');
If (now.second()<10)
LCD. Print('0');
lcd.print(now.second(), DEC);
Delay(100);
lcd.clear();

}

If(digitalread(buton)==1){

LCD. Print("hareket = ");
LCD. Print(sayac);
LCD. Setcursor(6, 1);
LCD. Print("ldr = ");
LCD. Print(ldr);
lcd.home();

}

Else if(analogread(ldr)<35 && digitalread(hareket)==1){
Delay(2000);
Sayac=sayac+1;
Digitalwrite(role, High);
Delay(6000);
Digitalwrite(role, Low);

}

Else if(digitalread(hareket)==1){
Delay(2000);
Sayac=sayac+1;
}

LDR = analogread(a0);

}
 
Son düzenleme:
Tam olarak nasıl bir sıkıntı oluyor? Tepki mi vermiyor? Emin değilim ama delay yüzünden olabilir. Önceki konuda da belirtmiştim. Onun yerine milis kullanabilirsiniz. Onu da kısaca açıklayayım.

Arduino çalışmaya başladığı andan itibaren milis fonksiyonu da beraberinde çalışır. Zaman milisaniye cinsinden tutulur. Tabii bir sınırı var, bir süre sonra başa dönüyor ancak bayağı bir gün olması lazım. Siz bekleme yapmak istediğinizde iki zaman farkını alarak bunu gerçekleştirebilirsiniz.

Örneğin şöyle bir yapı içindeki kodları 2 saniyede bir çalıştıracaktır:
C:
unsigned long simdi;
unsigned long oncesi;

    ...

simdi = milis();

if (simdi - oncesi >= 2000) {
    //Çalıştırılacak olan kodlar
    oncesi = simdi;
}
Burada gördüğünüz üzere sürekli olarak iki ölçüm zamanı arasında 2000 milisaniyenin (yani 2 saniyenin) geçip geçmediği kontrol ediliyor. Peki neden delay yerine bunu kullanmamız daha iyi? Bunun için delayin yapısını bilmemiz lazım.

Delay fonksiyonu çalıştığı anda kod o noktada duruyor ve belirtilen süre kadar bekliyor. Biliyorsunuz ki loop fonksiyonu sürekli olarak çalışıyor. Delay bir noktada devreye girdiği anda o noktada kod durup bekliyor, bu nedenle diğer kodlar çalışmıyor. Bu şekilde kullandığınızda ise eğer yeterli zaman geçmemişse, mikrodenetleyici if döngüsünü geçip diğer kodları çalıştırıyor, if döngüsüne tekrar geliyor, şart sağlanmamışsa tekrar geçiyor, sağlandıysa döngünün içine giriyor. Bu sayede diğer kodlarla problem yaşamıyoruz.

Tüm delay fonksiyonlarını bu şekilde bir yapıyla güncellemeyi deneyin. Olmazsa bildirin tekrardan, bir daha inceleyelim.

Düzenleme: Değişken adlarına dikkat edin. Her döngü için aynı isimleri kullanmayın.
 
Tam olarak nasıl bir sıkıntı oluyor? Tepki mi vermiyor? Emin değilim ama delay yüzünden olabilir. Önceki konuda da belirtmiştim. Onun yerine milis kullanabilirsiniz. Onu da kısaca açıklayayım.

Arduino çalışmaya başladığı andan itibaren milis fonksiyonu da beraberinde çalışır. Zaman milisaniye cinsinden tutulur. Tabii bir sınırı var, bir süre sonra başa dönüyor ancak bayağı bir gün olması lazım. Siz bekleme yapmak istediğinizde iki zaman farkını alarak bunu gerçekleştirebilirsiniz.

Örneğin şöyle bir yapı içindeki kodları 2 saniyede bir çalıştıracaktır:
C:
unsigned long simdi;
unsigned long oncesi;

    ...

simdi = milis();

if (simdi - oncesi >= 2000) {
    //Çalıştırılacak olan kodlar
    oncesi = simdi;
}
Burada gördüğünüz üzere sürekli olarak iki ölçüm zamanı arasında 2000 milisaniyenin (yani 2 saniyenin) geçip geçmediği kontrol ediliyor. Peki neden delay yerine bunu kullanmamız daha iyi? Bunun için delayin yapısını bilmemiz lazım.

Delay fonksiyonu çalıştığı anda kod o noktada duruyor ve belirtilen süre kadar bekliyor. Biliyorsunuz ki loop fonksiyonu sürekli olarak çalışıyor. Delay bir noktada devreye girdiği anda o noktada kod durup bekliyor, bu nedenle diğer kodlar çalışmıyor. Bu şekilde kullandığınızda ise eğer yeterli zaman geçmemişse, mikrodenetleyici if döngüsünü geçip diğer kodları çalıştırıyor, if döngüsüne tekrar geliyor, şart sağlanmamışsa tekrar geçiyor, sağlandıysa döngünün içine giriyor. Bu sayede diğer kodlarla problem yaşamıyoruz.

Tüm delay fonksiyonlarını bu şekilde bir yapıyla güncellemeyi deneyin. Olmazsa bildirin tekrardan, bir daha inceleyelim.

Düzenleme: Değişken adlarına dikkat edin. Her döngü için aynı isimleri kullanmayın.

Bunu yukarıdaki kodlara nasıl uyarlayacağım. İlk defa gördüğüm bir teknik
Tam olarak nasıl bir sıkıntı oluyor? Tepki mi vermiyor? Emin değilim ama delay yüzünden olabilir. Önceki konuda da belirtmiştim. Onun yerine milis kullanabilirsiniz. Onu da kısaca açıklayayım.

Arduino çalışmaya başladığı andan itibaren milis fonksiyonu da beraberinde çalışır. Zaman milisaniye cinsinden tutulur. Tabii bir sınırı var, bir süre sonra başa dönüyor ancak bayağı bir gün olması lazım. Siz bekleme yapmak istediğinizde iki zaman farkını alarak bunu gerçekleştirebilirsiniz.

Örneğin şöyle bir yapı içindeki kodları 2 saniyede bir çalıştıracaktır:
C:
unsigned long simdi;
unsigned long oncesi;

    ...

simdi = milis();

if (simdi - oncesi >= 2000) {
    //Çalıştırılacak olan kodlar
    oncesi = simdi;
}
Burada gördüğünüz üzere sürekli olarak iki ölçüm zamanı arasında 2000 milisaniyenin (yani 2 saniyenin) geçip geçmediği kontrol ediliyor. Peki neden delay yerine bunu kullanmamız daha iyi? Bunun için delayin yapısını bilmemiz lazım.

Delay fonksiyonu çalıştığı anda kod o noktada duruyor ve belirtilen süre kadar bekliyor. Biliyorsunuz ki loop fonksiyonu sürekli olarak çalışıyor. Delay bir noktada devreye girdiği anda o noktada kod durup bekliyor, bu nedenle diğer kodlar çalışmıyor. Bu şekilde kullandığınızda ise eğer yeterli zaman geçmemişse, mikrodenetleyici if döngüsünü geçip diğer kodları çalıştırıyor, if döngüsüne tekrar geliyor, şart sağlanmamışsa tekrar geçiyor, sağlandıysa döngünün içine giriyor. Bu sayede diğer kodlarla problem yaşamıyoruz.

Tüm delay fonksiyonlarını bu şekilde bir yapıyla güncellemeyi deneyin. Olmazsa bildirin tekrardan, bir daha inceleyelim.

Düzenleme: Değişken adlarına dikkat edin. Her döngü için aynı isimleri kullanmayın.


Sizinle kişisel olarak konuşabileceğimiz bir sosyal medya var mı ? Sanıyorum sizden öğreneceğim çok bilgi var
 
Son düzenleme:
Bunu yukarıdaki kodlara nasıl uyarlayacağım? İlk defa gördüğüm bir teknik.
Çalıştırılacak kodlar diye belirttiğim kısma o kadar sürede bir çalışmasını istediğiniz kodları yazacaksınız. Bir video bırakayım, izlerseniz daha iyi kavrayabilirsiniz; benim Arduino'ya başladığım kanaldır aynı zamanda; değeri büyüktür bende. 🙂 Yine olmazsa ben yarın kodla ilgilenmeye çalışırım.

Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
 
Çalıştırılacak kodlar diye belirttiğim kısma o kadar sürede bir çalışmasını istediğiniz kodları yazacaksınız. Bir video bırakayım, izlerseniz daha iyi kavrayabilirsiniz; benim Arduino'ya başladığım kanaldır aynı zamanda; değeri büyüktür bende. 🙂 Yine olmazsa ben yarın kodla ilgilenmeye çalışırım.

Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

Teşekkür ederim. Sosyal medya hesabınız var ise oradan konuşalım
Bunu yukarıdaki kodlara nasıl uyarlayacağım. İlk defa gördüğüm bir teknik



Sizinle kişisel olarak konuşabileceğimiz bir sosyal medya var mı ? Sanıyorum sizden öğreneceğim çok bilgi var

Araştırma yaptım ama benim projeme uyarlayamadım. Sanırım çözüm milis fakat beceremedim :(
Çalıştırılacak kodlar diye belirttiğim kısma o kadar sürede bir çalışmasını istediğiniz kodları yazacaksınız. Bir video bırakayım, izlerseniz daha iyi kavrayabilirsiniz; benim Arduino'ya başladığım kanaldır aynı zamanda; değeri büyüktür bende. 🙂 Yine olmazsa ben yarın kodla ilgilenmeye çalışırım.

Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.


Yapamadım
 
Son düzenleme:
Teşekkür ederim. Sosyal medya hesabınız var ise oradan konuşalım.
Technopat Sosyal'de üyelerin özel paylaşım vb. gibi nedenler olmadıkça buranın dışından yardımlaşma yapması istenmiyor. Hem böylece ileride sıkıntı yaşayan başka arkadaşlar da yararlanabiliyorlar.

Araştırma yaptım ama benim projeme uyarlayamadım. Sanırım çözüm milis fakat beceremedim. :(
Yapamadım.
Şimdi bir örnek hazırladım. Sizin yazdığınız şöyle bir kısım var:
C:
...
    Delay(2000);
    Sayac=sayac+1;
    Digitalwrite(role, High);
    Delay(6000);
    Digitalwrite(role, Low);

Burayı şu şekilde güncelledim:
C:
    unsigned long simdi;
    unsigned long oncesi = 0;
    simdi = milis();
    boolean durum;

        ...

        Delay(2000);
        Sayac=sayac+1;
        if (simdi - oncesi >= 6000) {
            durum = LOW;
            oncesi = simdi;
        }
        else {
            durum = HIGH;
        }
    Digitalwrite(role, durum);
Dikkat ederseniz koda giriş yaptıktan sonra sürekli olarak iki zaman arasındaki farkı ölçüyor. Fark henüz dolmadıysa else tarafına girip değişkene "HIGH" değerini veriyor. Eğer zaman dolmuşsa değişkene "LOW" değerini verip öncesi ile sonrası olarak geçen zaman değerlerini eşitleyip aradaki farkı tekrardan 0 yapıyor. Bu şekilde delay'in sebep olduğu problemi çözmüş oluyoruz.

Bu yöntem sürekli çalışacak loopta geçerli ancak sizin kodunuzda bir if else içinde kaldığından önceki zaman çok geride kalabilir, sıkıntı çıkabilir. Bunu da bir bool ile else if'e ilk girişi tespit ederek çözebiliriz. Bunu diğer delay fonksiyonları için de uyarlayabilirsiniz. Baştaki setup içindekilere gerek yok, zaten bir kere çalışacaklar. Bu konuda da çok cömert olmamak gerek çünkü sıfırlanma süresini uzatmak için unsigned long kullanıyoruz. Onu da abartmamak gerek.

Kusura bakmayın, hızlı geri dönüş yapamayabiliyorum. Müsait olsam daha fazla uğraşmaya çalışırdım. Olmazsa yine bakarız. 🙂
 
Kodda değişiklilik yapmadan sadece hareket ve ldr belli bir değer altında ise röleyi aç kodunda hareket şartını silince yani sadece ldr değerini kullandığımda kod çalışıyor. Ama ben hem hareket hemde ldr değeri onaylanırsa roleyi yakmadını istiyorum sorun tam olarak burda. Birde ekran saat dekmesinde iken hareket algılandığında ekran bom boş oluyor sonra geri geliyor.
Denedim ama olmadı.:(
Technopat Sosyal'de üyelerin özel paylaşım vb. gibi nedenler olmadıkça buranın dışından yardımlaşma yapması istenmiyor. Hem böylece ileride sıkıntı yaşayan başka arkadaşlar da yararlanabiliyorlar.


Şimdi bir örnek hazırladım. Sizin yazdığınız şöyle bir kısım var:
C:
...
    Delay(2000);
    Sayac=sayac+1;
    Digitalwrite(role, High);
    Delay(6000);
    Digitalwrite(role, Low);

Burayı şu şekilde güncelledim:
C:
    unsigned long simdi;
    unsigned long oncesi = 0;
    simdi = milis();
    boolean durum;

        ...

        Delay(2000);
        Sayac=sayac+1;
        if (simdi - oncesi >= 6000) {
            durum = LOW;
            oncesi = simdi;
        }
        else {
            durum = HIGH;
        }
    Digitalwrite(role, durum);
Dikkat ederseniz koda giriş yaptıktan sonra sürekli olarak iki zaman arasındaki farkı ölçüyor. Fark henüz dolmadıysa else tarafına girip değişkene "HIGH" değerini veriyor. Eğer zaman dolmuşsa değişkene "LOW" değerini verip öncesi ile sonrası olarak geçen zaman değerlerini eşitleyip aradaki farkı tekrardan 0 yapıyor. Bu şekilde delay'in sebep olduğu problemi çözmüş oluyoruz.

Bu yöntem sürekli çalışacak loopta geçerli ancak sizin kodunuzda bir if else içinde kaldığından önceki zaman çok geride kalabilir, sıkıntı çıkabilir. Bunu da bir bool ile else if'e ilk girişi tespit ederek çözebiliriz. Bunu diğer delay fonksiyonları için de uyarlayabilirsiniz. Baştaki setup içindekilere gerek yok, zaten bir kere çalışacaklar. Bu konuda da çok cömert olmamak gerek çünkü sıfırlanma süresini uzatmak için unsigned long kullanıyoruz. Onu da abartmamak gerek.

Kusura bakmayın, hızlı geri dönüş yapamayabiliyorum. Müsait olsam daha fazla uğraşmaya çalışırdım. Olmazsa yine bakarız. 🙂

Denedim ama olmadı :(
Sanki röleli if döngüsünü umursamıyor. Es geçiyor sadece onun altındaki hareket algılarsan ekranda 1 arttır çalışıyor şaka gibi. Kafayı yicem. Bağlantıda ve aygıtlarda bir sıkıntı yok tek tek denedim
 
Son düzenleme:
Uyarı! Bu konu 6 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı