Arduino ile yapabileceklerimi ilk öğrendiğimde aklıma direk “ Alkışla Yanan Lamba” projesi geldi. Tembellikten olduğunu düşünüyorsunuz ama yanılıyorsunuz. Benim iki tane küçük kızım var. Evimiz biraz eski olduğundan lamba prizleri onların erişemeyeceği boyutta. Evde banyoya ne zaman girseler ışığı yakmak için çamaşır sepetine tırmanıyorlardı J Eğer banyoya alkışla yanan bir lamba koyarsam bu sorunu çözeceğimi düşünüyordum ama Nasıl?
İlk olarak Makers Türkiye’de Hakan Kaya hocamızdan Arduio temel eğitim dersleri aldım. Ders bitiminde proje kafamda şekillenmişti. Fakat birçok eksik malzeme ve yazılım için gereken kodlar hatta birazda elektrik bilgisi lazımdı.
Malzemeleri internette araştırıp en uygun siteden temin ettim:
1 adet Arduino Uno
1 adet tekli role
1 adet Protoshield ( yer kaplamasın diye tercih ettim)
1 adet ses sensörü
1 prizli lamba
1 adet pil yuvası
Jumper kablolar
Daha sonra gelen malzemelerle biraz internet araştırma yaparak ve Hakan Hoca ile yaptığımız 1 saatlik proje görüşmesi sonrasında devreyi oluşturdum.
RÖLE
Elimde bulunan birbirine bağlı şekildeki lamba ve prizinin kablosunu ikiye ayırdım. İçinden iki kablo çıktı. Bir kablo prizden direkt lambaya gitti. Diğer prizden geleni Rölenin ilk girişine, Lambadan geleni ise ikinci girişine taktım. Röle gelen 220V luk elektriği arduinoya 5V olarak çevirmeye yarıyordu. Ayrıca açma kapama düğmesi mantığında çalışıyordu. Komutla elektriği veriyor sonra tekrar kesiyordu. Rölenin çalışıp çalışmadığını görmek için ayrıca denedim. ( bknz https://www.projehocam.com/arduino-role-uygulamasi/ ve http://blog.ikizoglu.com/2018/02/arduino-role-kullanimi/ ). Rölenin bağlantılarını yaparken çok dikkatli olmakta fayda var.
Rölenin diğer çıkışında bulunan girişleri şu şekilde bağladım.
VCC – Ardiunoda 5V
GND – Ardiunoda GND
IN – 5. Digital pine
SES SENSÖRÜ – MİKROFON
Benim elimde bulunan ses sensoru 4 çıkışlıydı. Nasıl çalıştığını anlamak için ayrıca denedim. ( bknz https://www.robimek.com/arduino-ile-mikrofon-modulu-kullanimi/ ve https://maker.robotistan.com/arduino-ile-ses-sensor-modulu/ ) Ses sensoru ortamdaki ses düzeyini ölçüyordu. Üzerindeki potansiyometre ile düşük ya da yüksek ses seviyesi şiddeti ayarlanabiliyordu. Ama benim ilk aldığım ses sensörünün üzerindeki potansiyometre sürekli döndüğünden verim alamadım ve sabit olan ile değiştirdim. Ses sensörünü ise şu şekilde bağladım:
VCC – Ardiunoda 5V
GND – Ardiunoda GND
OUT – 4. Digital pine
KODLAR
Tüm devreyi kurduktan sonra kodlarımı Ardiuno’ya yükledim. Kodları yazarken ki mantık, ses sensörünün alkış sesini diğer ortamdaki seslerden ayırt edebiliyor olmasıydı.
Algoritma ise Sensör ortamdaki sesi dinleyecek gürültü var ise bunun ilk gürültü mü ikinci gürültü mü olduğuna karar verecek. İlk gürültüyse tekrar dinlemeye koyulacak ve iki alkış arasındaki zaman aralığını ölçecek. ( iki alkış arasındaki süre ortalama 400 müş) İlk gürültü değilse sayacı artırıp tekrar dinleyemeye koyulacak. İkinci gürültü ve ilk gürültü arasındaki zaman aralığı kodumuzu uyuyorsa röleyi çalıştıracak. (Kodlarda meraklımaymum web sitesinden yararlandım.)
int ses_sensoru = 4;
int role = 5;
int alkis = 0;
long algilama_araligi_baslangic = 0;
long algilama_araligi = 0;
boolean isik_durumu = false;
void setup() {
pinMode(ses_sensoru, INPUT);
pinMode(role, OUTPUT);
}
void loop() {
int sensor_durumu = digitalRead(ses_sensoru);
if (sensor_durumu == 0)
{
if (alkis == 0)
{
algilama_araligi_baslangic = algilama_araligi = millis();
alkis++;
}
else if (alkis > 0 && millis()-algilama_araligi >= 50)
{
algilama_araligi = millis();
alkis++;
}
}
if (millis()-algilama_araligi_baslangic >= 400)
{
if (alkis == 2)
{
if (!isik_durumu)
{
isik_durumu = true;
digitalWrite(role, HIGH);
}
else if (isik_durumu)
{
isik_durumu = false;
digitalWrite(role, LOW);
}
}
alkis = 0;
}
}
ÇALIŞTIRMAK
Devreyi kurduktan , kodları yazıp Ardiuno’ya yükledikten sonra Ardiuonoya güç sağlaması için 9V luk pil taktım. Alkış sesinin şiddetini ayarlamak için ses sensörünün üzerindeki potansiyometreyi ayarladım. Ardından lambamım prizini prize soktum. İki alkışla düzeneğim çalıştı. Fakat çocuklara denetince kodların çok da istediğime uygun olmadığını gördüm. Çünkü çocuklar alkışı düzgün yapamıyordu. Ne kadar uğraştıysam da mikrofonun üstündeki potansiyometre hassaslığı en düşük ayara getiremiyordu. Daha hassas bir koda ihtiyacım vardı. Yani sadece ses duyunca yanacak. Ben de projeyi baştan düzenledim.
SES SENSÖRÜ – MİKROFON
Dört çıkışlı ses sensörümü direkt ardiunoyaya sırasıyla A0-A1-A2-A3 e bağladım
A0 – A0
A1- GND
A2- VCC
A3-DO
RÖLE
OUT – 13.PİNE
GND-GND
VCC-5V
KODLAR
int micPin = A0; // pin that the mic is attached to
int gndPin = A1;
int powerPin = A2;
int micValue1 = 0;
int micValue2 = 0; // the Microphone value
int led1 = 13;
boolean lightOn = false;
void setup() {
pinMode(led1, OUTPUT);
pinMode(powerPin, OUTPUT);
pinMode(gndPin, OUTPUT);
pinMode(micPin, INPUT);
digitalWrite(gndPin,LOW);
delay(500);
digitalWrite(powerPin,HIGH);
Serial.begin(9600); //for test the input value initialize serial
}
void loop() {
micValue1 = analogRead(micPin); // read pin value
Serial.println(micValue1);
delay(1);
micValue2 = analogRead(micPin);
Serial.println(micValue2);
if (micValue1-micValue2 > 2||micValue2-micValue1 > 2){
lightOn = !lightOn;
delay(100);
digitalWrite(led1, lightOn);
}
}
merhaba ikinci kod’da tek alkış ile yanıyor ben ise iki alkış olsun istiyorum kodun hangi kısmını değiştirmem gerek yardımcı olur musunuz ?
İlk kod sizin için daha uygun. İkinci kod da sadece ses olması yeterli
if (alkis == 2)
{
if (!isik_durumu)
{
isik_durumu = true;
digitalWrite(role, HIGH);
}
else if (isik_durumu)
{
isik_durumu = false;
digitalWrite(role, LOW);
}
}