LDR İçin Kesme Oluşturmak

Gokrtl

Gökhan Kartal (TeknoDay)
Staff member
Katılım
27 Şubat 2019
Mesajlar
11,228
Yaklaşan yıl dönümümüz için eşime bir hediye alacağım.
Hediyenin içine Arduino + DFPlayer ikilsi ile bir müzik yerleştireceğim.
Planıma göre Hediyenin kapağı açıldığında LDR'nin değeri yükselecek ve DFPlayerdeki müzik çalmaya başlayacak.
Aşağıdaki kod ile bunu başardım ama sorun şu ki; kutunun kapağı kapatılırsa LDR'nin değeri düşünce müziğin susması gerek.
Bunun içinde bir kesme tanımlamak istedim ama netten baktığım videolar kesmelerin dijital pinden tanımlandığı yönünde.
LDR yi analog okuduğum için kesmeyi nasıl yapacağımı bilemedim.

C++:
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
int LDR = 0;
void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
 
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
 
  myDFPlayer.volume(23);  //Set volume value. From 0 to 30
  //myDFPlayer.play(1);  //Play the first mp3
}

void loop()
{
  static unsigned long timer = millis();
 
  if (millis() - timer > 3000) {
    timer = millis();
    //myDFPlayer.next();  //Play next mp3 every 3 second.
  }
 
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
  LDR = analogRead(A5);
  Serial.println(LDR);
  if(LDR >= 350){
    myDFPlayer.play(1);  //Play the first mp3
    delay(60000);
  }
}
 
2 transistör 1 direnç 1 pot ile istediğin aralıkta çalışacak dijital (1-0)sinyale dönüştürülür pot değeri
 
TimerOne Kütüphanesi ile zaman kesmesi yapmaya çalıştım ama çalışmadı.
delay içindeki 1dk lık beklemeyi mi aşamıyor nedir?

C++:
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include "TimerOne.h"

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
int LDR = 0;
void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
 
  Timer1.initialize(1000000);
  Timer1.attachInterrupt(LDRKES);
 
 
  myDFPlayer.volume(5);  //Set volume value. From 0 to 30 23 yap
}
void LDRKES(){
  if (LDR < 300){
  LDR = 0;
  }
}
void loop()
{
  static unsigned long timer = millis();
 
  if (millis() - timer > 3000) {
    timer = millis();
    //myDFPlayer.next();  //Play next mp3 every 3 second.
  }
 
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
  LDR = analogRead(A5);
  Serial.println(LDR);
  if(LDR >= 350){
    myDFPlayer.play(1);  //Play the first mp3
    delay(60000);
  }
}
 
Ben olsam delay 60000 i kaldırırdım. Orada millis ile kontrol sağlardım. Ldr değeri düştüğünde de müzik duracaktır heralde.
 
Arduino kesmeleri hakkında bir bilgim yok fakat bir çok işlemcide adc kesmeleri bulunuyor. İlk yöntem olarak buna bakabilirsiniz End of conversion yani çevrim bittikten sonra kesme veren bir interrupt olabilir.
Diğer aklıma gelen yöntem ise iki pini bir birine bağlayıp ldr azaldığında output olan çıkıştan input olan çıkışa interrupt verdirebilirsiniz çok dolambaçlı oldu buda :D
 
Ben olsam delay 60000 i kaldırırdım. Orada millis ile kontrol sağlardım. Ldr değeri düştüğünde de müzik duracaktır heralde.
Sen ol bakıyım nasıl yapıyorsun? :katil2:
Kod yapısı birazcık değişik. Tamamını koymadım kalabalık yapmasın diye. Aşağıda bir swich case yapısı var. LDR değeri düştüğünde serial monitöre time out yazdırıyor. Bir yandan da LDR okuduğundan hoparlörden kesik kesik cızzzt cızzzt ses veriyor.

Arduino kesmeleri hakkında bir bilgim yok fakat bir çok işlemcide adc kesmeleri bulunuyor. İlk yöntem olarak buna bakabilirsiniz End of conversion yani çevrim bittikten sonra kesme veren bir interrupt olabilir.
Diğer aklıma gelen yöntem ise iki pini bir birine bağlayıp ldr azaldığında output olan çıkıştan input olan çıkışa interrupt verdirebilirsiniz çok dolambaçlı oldu buda :D
Kesmelere tam hakim değilim. Kafam basmıyor vallahi. :)
 
Yazılım ile yapmak istiyorsanız röleyi kaldırın, arduinonun bir bacağını bu işe adayın ve de şaseye gidip gitmediğini yazılım ile kontrol edin. Bu arada kutu kapağı açıldığında LDR nin omaj değeri düşer, kapanınca karanlıkta omaj yükselir dizaynı ona göre yapmak gerekir diye düşünüyorum.
 
Yazılım ile yapmak istiyorsanız röleyi kaldırın, arduinonun bir bacağını bu işe adayın ve de şaseye gidip gitmediğini yazılım ile kontrol edin. Bu arada kutu kapağı açıldığında LDR nin omaj değeri düşer, kapanınca karanlıkta omaj yükselir dizaynı ona göre yapmak gerekir diye düşünüyorum.
Tamamdır. Bunu deneyeceğim.
 
Muhtemelen biliyorsundur gerçi ama dfplayer tek başına da çalışıyor. Ldr veya daha kolayı reed röle mıknatıs gibi birkaç bileşenle halledilebilir aslında.
 
Muhtemelen biliyorsundur gerçi ama dfplayer tek başına da çalışıyor. Ldr veya daha kolayı reed röle mıknatıs gibi birkaç bileşenle halledilebilir aslında.
işte ben o bir kaç bileşen ile uğraşmayayım dedim ama görünüşe göre uğraşacağım. :)
 
Kesmelerin amacı esas iş yapılırken diğer işi yapıp geri dönmek veya diğer işte devam etmek demektir. Bence burada kesme kullanacak bir durum yok. Bu cihazdan milyon tane üreteceksen ona göre işlemciyi uyku moduna sokmak isteyebilirsin. O zaman kesme kullanılabilir.

LDR belli bir değer aralığının üstünde çalışacak o değerin altında duracak. Ama o değeri iyi ayarlamak gerek. Tam o değerlerde gezinen ADC değerin varsa müzik kesik kesik çalacaktır. Adc bitlerini 1 veya 2 bit sağa kaydırarak oynak değerleri atabilirsin.

Hediyeyi verdiğin ortamda o anki değişkenler (ışığın zayıf olması gibi) planın bozulmasına neden olabilir. Bu nedenle LDR iyi bir seçim olmayabilir. Müzik kutularında genelde bir sınır anahtarı olur. Kapak açıldığında anahtar devreyi tamamlar.

İllaki LDR olacaksa da iki tane olur. Birincisi kutu dışında ikincisi kutu içinde. Kutu içindeki değerle dışındakini karşılaştırırsan daha stabil bir çalışma elde edilebilirsin.
 
LDR yerine kapağın altına takılacak manyetik bir switch ya da IR mesafe sensörü daha kullanışlı olabilir.
Pil ile çalıştıracaksanız bir öneri de sensörü arduino ile kontrol etmek yerine bu switche bağlı bir mosfet ile sisteme enerji vermek (latch circuit) olabilir.


Fikir vermek titreşim sensörüyle yapılan açısından şu örnek işinize yarayabilir:
 
Mesela şöyle bir manyetik anahtar, bir küçük mıknatıs ve yukarıdaki gibi bir latch devresi ve bir pil ile yapabilirsiniz.



Bunların hepsini bir yazıcıdan basacağınız bir kutuya yerleştirip portatif birşey de yapabilirsiniz. Sadece küçük bir mıknatısı hediye kutusunun kapağına takarsınız.
 
Tümünü değerlendireceğim.
 
Aslında düşündüm de latch devresine de ihtiyacınız yok.
Sadece manyetik röle, pil ve mıknatısla arduino ve dfrobot'u besleseniz?
Kapak açılınca sisteme enrji gider, müzük çalar, kapanınca sistemin beslemesi kesilmiş olur.
 
Anladım. naçizane tecrübelerime göre konu kadınlar olunca günün sonunda kutudaki mekanizma değil içindeki galip gelecektir. :D
Orası öyle tabi ama ilk intiba diye bir şey var. "Al hediye" dersen iki gün sonra unutulup nankörlük edebilirler. Ama kutuyu açınca duygulu bir müzik çalmaya başlarsa bunu unutmayacaklardır. :D
 
Kodun yazılışına bakarsak myDFPlayer.play() fonksiyonu bloke olan bir fonksiyon değil gibi duruyor. Arkasına kocaman bir delay konmuş, herhalde orada dosyanın tamamlanması bekleniyor. Bu durumda özel birşey yapmaya gerek yok. Bir kere play çağrıldıktan sonra, programda sen dijital veya analog girişleri döngü içerisinde kontrol edebilirsin. Kesmeye gerek yok yani.
 

Forum istatistikleri

Konular
5,887
Mesajlar
100,466
Üyeler
2,493
Son üye
cym247

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top