Çözüldü Arduino zamanlayıcı olarak kullanma

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

YusufYlmz

Hectopat
Katılım
12 Temmuz 2020
Mesajlar
237
Çözümler
1
Merhaba Arduino Leonardo hakkında birkaç sorum olacak. Öncelikle Arduino'ya bir DC motor takmam gerekiyor ve bu motorun gün içinde 50 dakika çalışıp 10 dakika durması gerekiyor. 24 saat boyunca böyle çalışmalı. Bunu nasıl yapabilirim?

Bir diğer sorum, Arduino'yu zaman ayarlı Switch olarak kullanabilir miyim? Yani tek yapması gereken zamanı geldiğinde düğmeye basacak, sonra bırakacak gibi.
 
Son düzenleme:
Çözüm
Vay be ben de son sınıfım elektrik veya bilgisayar istiyorum, kazanacağız inşallah.

Hayırlısı olsun hocam, inşallah.

Hocam, bu sefer kodu gerçekten hallettim galiba içime de sindi.

Kod'u yüklerken kodda değiştirmeniz gereken yerler var, oraları zaten yorum satırıyla belli ettim nereleri değiştirebilir nereleri değiştiremezsiniz kod üzerinde belirteceğim.

Kod saat 4-23 arası çalışıyor saat 00.00 olduğunda röleyi kapatıyor 4-23 arası boyunca 15dk çalışıp 5dk duracak şekilde yazdım fakat siz çalışma ve bekleme süresini ayarlayabileceksiniz.

Hatta çalışma saat aralığını da galiba ayarlanabilir yapabilirim.

Son düzeltmeleri yapayım kodu paylaşacağım.

C++:
#define ROLE 9 // röle pinini ayarlayabilirsiniz.

boolean role_tipi = 1; // eğer devre tersine çalışıyor ise değeri 0 yapın.

byte saat = 13; // saati ayarlayabilirsiniz (09 değil 9 şeklinde girin)

byte dakika = 7; // dakikayı ayarlayabilirsiniz (06 değil 6 şeklinde girin)

byte saniye; // ayarlamanıza gerek yok.

byte calisma = 15; // xdk çalışma süresi (dakika cinsinden yazınız) [MAKS DEĞER 255]
byte bekleme = 5; //xdk bekleme süresi (dakika cinsinden yazınız) [MAKS DEĞER 255]

byte baslangic = 4; // başlangıç saatini ayarlayabilirsiniz.
byte bitis = 24; // bitiş saatini ayarlayabilirsiniz (gece yarısı için 24 yazın)

long cals = (calisma * 60); // xdk çalışma süresi (dk saniye cinsine çevrilir) otomatik değişir.
long bekl = (bekleme * 60); // xdk bekleme süresi (dk saniye cinsine çevrilir) otomatik değişir.

void watch() // saat kodu burayı değiştirmeyin!
{
 saniye++;
 delay(1000);

 if (saniye == 60)
 {
 dakika++;
 saniye = 0;
 }
 else if (dakika == 60)
 {
 saat++;
 dakika = 0;
 saniye = 0;
 }
 else if (saat == 24)
 {
 saat = 0;
 dakika = 0;
 saniye = 0;
 }
}

void setup()
{
 pinMode(ROLE, OUTPUT);

}

void loop()
{
 watch(); // saatin çalıştığı watch fonksiyonunu çağırıyoruz ve saat işlemeye başlıyor.

 if (saat >= baslangic && saat < bitis) // başlangıç saati gelince çalışp bitiş saatinde durduran bunu yaparken 15dk çalışıp 5dk duran kod.
 {
 for (int a = 0; a < cals; a++)
 {
 digitalWrite(ROLE, role_tipi);
 watch();
 if (!(saat >= baslangic && saat < bitis)) // eğer çalışma saatleri dışındaysa döngüden çık.
 break;
 }

 for (int b = 0; b < bekl; b++)
 {
 digitalWrite(ROLE, !(role_tipi));
 watch();
 if (!(saat >= baslangic && saat < bitis)) // eğer çalışma saatleri dışındaysa döngüden çık.
 break;
 }
 }

 else // çalışma saatleri dışında röleyi kapatan kod.
 {
 digitalWrite(ROLE, !(role_tipi));
 }

}

Hocam, kodun üst tarafında "ayarlayabilirsiniz" yazan yerleri ayarlayabilirsiniz.

Kodu birkaç dk denedim ve düzgünce çalıştı kodu deneyip geri dönüş sağlayın.

Kodu yüklemeden önce saat ve dakikayı ayarlayın saniye kısmını ayarlamanıza gerek yok tavsiyem dakikayı 1dk ileri yapın.
Hayırlısı olsun hocam, inşallah.

Hocam, bu sefer kodu gerçekten hallettim galiba içime de sindi.

Kod'u yüklerken kodda değiştirmeniz gereken yerler var, oraları zaten yorum satırıyla belli ettim nereleri değiştirebilir nereleri değiştiremezsiniz kod üzerinde belirteceğim.

Kod saat 4-23 arası çalışıyor saat 00.00 olduğunda röleyi kapatıyor 4-23 arası boyunca 15dk çalışıp 5dk duracak şekilde yazdım fakat siz çalışma ve bekleme süresini ayarlayabileceksiniz.

Hatta çalışma saat aralığını da galiba ayarlanabilir yapabilirim.

Son düzeltmeleri yapayım kodu paylaşacağım.

C++:
#define ROLE 9 // röle pinini ayarlayabilirsiniz.

boolean role_tipi = 1; // eğer devre tersine çalışıyor ise değeri 0 yapın.

byte saat = 13; // saati ayarlayabilirsiniz (09 değil 9 şeklinde girin)

byte dakika = 7; // dakikayı ayarlayabilirsiniz (06 değil 6 şeklinde girin)

byte saniye; // ayarlamanıza gerek yok.

byte calisma = 15; // xdk çalışma süresi (dakika cinsinden yazınız) [MAKS DEĞER 255]
byte bekleme = 5; //xdk bekleme süresi (dakika cinsinden yazınız) [MAKS DEĞER 255]

byte baslangic = 4; // başlangıç saatini ayarlayabilirsiniz.
byte bitis = 24; // bitiş saatini ayarlayabilirsiniz (gece yarısı için 24 yazın)

long cals = (calisma * 60); // xdk çalışma süresi (dk saniye cinsine çevrilir) otomatik değişir.
long bekl = (bekleme * 60); // xdk bekleme süresi (dk saniye cinsine çevrilir) otomatik değişir.

void watch() // saat kodu burayı değiştirmeyin!
{
 saniye++;
 delay(1000);

 if (saniye == 60)
 {
 dakika++;
 saniye = 0;
 }
 else if (dakika == 60)
 {
 saat++;
 dakika = 0;
 saniye = 0;
 }
 else if (saat == 24)
 {
 saat = 0;
 dakika = 0;
 saniye = 0;
 }
}

void setup()
{
 pinMode(ROLE, OUTPUT);

}

void loop()
{
 watch(); // saatin çalıştığı watch fonksiyonunu çağırıyoruz ve saat işlemeye başlıyor.

 if (saat >= baslangic && saat < bitis) // başlangıç saati gelince çalışp bitiş saatinde durduran bunu yaparken 15dk çalışıp 5dk duran kod.
 {
 for (int a = 0; a < cals; a++)
 {
 digitalWrite(ROLE, role_tipi);
 watch();
 if (!(saat >= baslangic && saat < bitis)) // eğer çalışma saatleri dışındaysa döngüden çık.
 break;
 }

 for (int b = 0; b < bekl; b++)
 {
 digitalWrite(ROLE, !(role_tipi));
 watch();
 if (!(saat >= baslangic && saat < bitis)) // eğer çalışma saatleri dışındaysa döngüden çık.
 break;
 }
 }

 else // çalışma saatleri dışında röleyi kapatan kod.
 {
 digitalWrite(ROLE, !(role_tipi));
 }

}

Hocam, kodun üst tarafında "ayarlayabilirsiniz" yazan yerleri ayarlayabilirsiniz.

Kodu birkaç dk denedim ve düzgünce çalıştı kodu deneyip geri dönüş sağlayın.

Kodu yüklemeden önce saat ve dakikayı ayarlayın saniye kısmını ayarlamanıza gerek yok tavsiyem dakikayı 1dk ileri yapın.

Cidden bayağı uğraşmışsın hocam çok sağ ol. Evde değilim birkaç saate deneyip geri dönüş yapacağım.
 
Cidden bayağı uğraşmışsın hocam çok sağ ol. Evde değilim birkaç saate deneyip geri dönüş yapacağım.

Ne demek hocam, her zaman!

@K.Makise bu kütüphaneyi kullanmayı denediniz mi? Bu arada yazdığınız kod mantıklı görünüyor, kütüphaneyi kullanmaktan daha kolay muhtemelen. :D

Hocam, araştırırken bu kütüphaneyi gördüm fakat doğru düzgün kullanımını anlatan bir kaynak bulamadım çoğunu da anlamadım zaten.

Ben de zaman kaybı olmasın dedim, kendim yazdım.

Evet o kütüphaneyi kullanmaktan daha kolay gerçekten :D
 
Eğer röle ters süreyle çalışıyor ise kodda değişiklik yapın.

Ben seri monitörden test ettim bayağı hocam sorun yoktu ama uzun kullanımda nasıl olur bilmiyorum.

24 saat çalıştıramam erinirim :D
 
Eğer röle ters süreyle çalışıyor ise kodda değişiklik yapın.

Ben seri monitörden test ettim bayağı hocam sorun yoktu ama uzun kullanımda nasıl olur bilmiyorum.

24 saat çalıştıramam erinirim :D

Birkaç durumu denedim hiç sıkıntı çıkmadı. Muhtemelen uzun sürelide sıkıntı çıkarmaz. Ama şu dakikayı saniyeye çevirme olayını yapamadım örneğin 27 saniye yazmak istesem (1 * 27); mi yazmam gerekiyor yoksa başka türlü mü?
 
Birkaç durumu denedim hiç sıkıntı çıkmadı. Muhtemelen uzun sürelide sıkıntı çıkarmaz. Ama şu dakikayı saniyeye çevirme olayını yapamadım örneğin 27 saniye yazmak istesem (1 * 27); mi yazmam gerekiyor yoksa başka türlü mü?

Hocam, oradaki dk yı saniyeye çevirmek için bir kod.

27 saniye yazmak için, 27/60=0.276 yazmanız lazım ama bu da işe yaramayacaktır çünkü long veri tipi tam sayı destekler.

27 saniye yazmak için, cals ve bekl fonksiyonlarına yazmanız gerekir (calisma*60) yerine 27 yazın mesela aynı şekilde bekl içinde aynısını böyle yaparsanız 27 saniye çalışır 27 saniye durur eğer kodun orijinalini yedeklerseniz ki zaten burada var.

Kodda değişiklik yapabilirsiniz eğer kodu bozarsanız buradaki orijinal kodu kullanırsınız.

Eğer neden 27'yi 60'a böldüğümüzü anlamadıysanız şu yüzden: Cals ve bekl değişkeninde calisma ve bekleme değişkenlerinden gelen dakika bilgisi 60 ile çarpılarak saniyeye çevriliyor 15dk 900 saniye yapıyor bu değer for döngüsünün kaç kere döneceğini belirliyor.

For döngüsünün içinde saat fonksiyonu var bu da her 1 saniyede saniye değişkenini arttırıyor yani for döngüsü saniyede 1 kere çalışmış oluyor bu da 900 saniye yapıyor yani 15dakika.

Ne kadar anlatabildim bilmiyorum, koddaki for döngüleri bu çalışma prensibini kullanıyor.

Neden delay fonksiyonunu kullanmadığımı merak ediyor olabilirsiniz çünkü delay fonksiyonu çalışırken diğer hiçbir komut çalışmaz yani saat fonksiyonu çalışmayacaktı bu da saatin geri kalmasına ve istenen zamanda durmasına engel olacaktı hatta neredeyse hiç durmayacaktı.
 
Son düzenleme:
Hocam, oradaki dk yı saniyeye çevirmek için bir kod.

27 saniye yazmak için, 27/60=0.276 yazmanız lazım ama bu da işe yaramayacaktır çünkü long veri tipi tam sayı destekler.

27 saniye yazmak için, cals ve bekl fonksiyonlarına yazmanız gerekir (calisma*60) yerine 27 yazın mesela aynı şekilde bekl içinde aynısını böyle yaparsanız 27 saniye çalışır 27 saniye durur eğer kodun orijinalini yedeklerseniz ki zaten burada var.

Kodda değişiklik yapabilirsiniz eğer kodu bozarsanız buradaki orijinal kodu kullanırsınız.

Eğer neden 27'yi 60'a böldüğümüzü anlamadıysanız şu yüzden: Cals ve bekl değişkeninde calisma ve bekleme değişkenlerinden gelen dakika bilgisi 60 ile çarpılarak saniyeye çevriliyor 15dk 900 saniye yapıyor bu değer for döngüsünün kaç kere döneceğini belirliyor.

For döngüsünün içinde saat fonksiyonu var bu da her 1 saniyede saniye değişkenini arttırıyor yani for döngüsü saniyede 1 kere çalışmış oluyor bu da 900 saniye yapıyor yani 15dakika.

Ne kadar anlatabildim bilmiyorum, koddaki for döngüleri bu çalışma prensibini kullanıyor.

Neden delay fonksiyonunu kullanmadığımı merak ediyor olabilirsiniz çünkü delay fonksiyonu çalışırken diğer hiçbir komut çalışmaz yani saat fonksiyonu çalışmayacaktı bu da saatin geri kalmasına ve istenen zamanda durmasına engel olacaktı hatta neredeyse hiç durmayacaktı.
Anladım hocam güzel anlattınız. Kod konusunda öğreneceğimiz şeyler var sizden :D Belki olur da 3D modele falan ihtiyacınız olur o zaman söyleyebilirsiniz ben de orada yardımcı olabilirim.
 
Hocam, öğrendiğim her şeyi YouTube'dan robo90'nın Arduino kursu ile öğrendim mükemmel anlatıyor Ömer abi tavsiye ederim.

Hatta bazı videoların açıklama kısmında uygulamalı eğitimler de var. Onları yaparak daha kolay öğreniyorsunuz.

Önce kod yazmanın temelini öğretiyor sonra Arduino'nun yapısını, pinlerini, komutlarını öğretiyor. Başlamadan önce sadece LED yakıp söndürmekten öteye gidemiyordum şimdi ise her türlü projeyi askari düzeyde yapabilirim.

Bazı parçaların ve kütüphanelerin nasıl kullanıldığını öğrensem yeter.
 
Hocam, öğrendiğim her şeyi YouTube'dan robo90'nın Arduino kursu ile öğrendim mükemmel anlatıyor Ömer abi tavsiye ederim.

Hatta bazı videoların açıklama kısmında uygulamalı eğitimler de var. Onları yaparak daha kolay öğreniyorsunuz.

Önce kod yazmanın temelini öğretiyor sonra Arduino'nun yapısını, pinlerini, komutlarını öğretiyor. Başlamadan önce sadece LED yakıp söndürmekten öteye gidemiyordum şimdi ise her türlü projeyi askari düzeyde yapabilirim.

Bazı parçaların ve kütüphanelerin nasıl kullanıldığını öğrensem yeter.

Mutlaka bakacağım ilerleyen zamanda. Ben de bir ara Yazılım Teknolojileri Akademisi diye bir kanal vardı oradan form öğreniyordum. Orayı da tavsiye edebilirim C# öğrenmek isterseniz.
 
Son düzenleyen: Moderatör:
Mutlaka bakacağım ilerleyen zamanda. Ben de bir ara Yazılım Teknolojileri Akademisi diye bir kanal vardı oradan form öğreniyordum. Orayı da tavsiye edebilirim C# öğrenmek isterseniz.

Evet düşünüyorum C dillerinden en az birini öğrenmeyi ama ilk Python öğrenmeyi ve Haluk Tatar'ın İngilizce kursuna başlamayı düşünüyorum.

Tavsiyeniz için teşekkürler!
 

Technopat Haberler

Geri
Yukarı