Arduıno nano'da çalışan kodlamaya iç ve dış kesme eklemeyi başaramadım

yldrm byzt

Üye
Katılım
28 Ara 2019
Mesajlar
86
Puanları
1
Kod:
#include <RCSwitch.h> //Uzaktan kumanda için kullandığımız kütüphane 433Mhz...
#include <SimpleSDAudio.h>
int counter = 0;
int vericikodu;

unsigned long int num;
RCSwitch mySwitch = RCSwitch();

#define CS 4

void setup()
{
  Serial.begin(9600);
  mySwitch.enableReceive(0);
  if (!SdPlay.init(SSDA_MODE_HALFRATE | SSDA_MODE_MONO | SSDA_MODE_AUTOWORKER)) {
    while (1);
  }
 SdPlay.setSDCSPin(4);
  pinMode(2, INPUT);
 
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
 
     digitalWrite(A1,LOW); //A
     digitalWrite(A2,LOW); //C
     digitalWrite(A3,LOW); //E
}
void loop()
{
  mySwitch.disableReceive();
  mySwitch.enableReceive(0);
  if (mySwitch.available())
  {
    num = mySwitch.getReceivedValue();
    Serial.println("vericikodu;" + String(num));

    switch (num)
    {
 
 // BİR NOLU KUMANDA
case 12718372: //K1
 
     digitalWrite(A1,HIGH); //1.LEDİ YAK
 
     SdPlay.setFile("o1.wav");
        SdPlay.play();
        delay(6000);
 
     digitalWrite(A1,LOW); //2.LEDİ SÖNDÜR
 
    break;
 
     // İKİ NOLU KUMANDA
     case 12325156: //K2
 
     digitalWrite(A2,HIGH); //2.LEDİ YAK
 
    SdPlay.setFile("o2.wav");
        SdPlay.play();
        delay(6000);
 
     digitalWrite(A2,LOW); //2.LED SÖNDÜR
 
     break;
 
     // ÜÇ NOLU KUMANDA
     case 13555684: //K3
 
     digitalWrite(A3,HIGH); //3.LEDİ YAK
 
     SdPlay.setFile("o3.wav");
        SdPlay.play();
        delay(6000);
 
     digitalWrite(A3,LOW); //3.LED SÖNDÜR
 
     break;
 
 
     default:
        break;
 
    }

    mySwitch.resetAvailable();
    mySwitch.enableReceive(0);
  }
}


Yukarıda 3 adet rf kumandanın herhangi birinden, herhangi bir zamanda, gelen sinyal ile tetiklenip kaç nolu kumandanın butonuna basılmışsa o numaralı ledi yakan ve mini sd playerden ses çaldıran bir kodlamam var.

Kumandanın butonu basılı tutuldukça 6'şar saniyelik döngüler halinde bu led yanıyor ve kısa müzik çalıyor.

Kumanda butonuna basma sonlandırılınca led sönüyor ve arduıno nano yeni bir tetiklemeye kadar beklemeye geçiyor.

Kumandaların hangisine ne zaman basılacağı belli değil.

Yani arduıno günün büyük bir kısmını sadece beklemede geçirebilir.

Arduıno beklemede iken ölçtüm, 16mA akım harcıyor.

Beklemede iken harcanan bu akımı nasıl azaltabilirim diye araştırma yapınca karşıma Interrupt-Kesmeler konusu çıktı.

İlave olarak ilgili kütüphaneler olan
#include <avr/sleep.h>;

#include <avr/power.h>; bilgisayarıma indirdim.

Birkaç örnek inceleyip uygulamak istedim ama yukarıdaki kodlamaya iç ve dış kesme satırlarını nereye ve nasıl ekleyeceğimi ve hangi satırların çıkarılması gerektiğini bilemedim. Denemelerde hep hata verdi.

Benim amacım arduıno beklemede iken uyku modunda olsun, 16mA yerine çok daha az akım harcasın. Ama digital 2 tetikleme pinine kumandaların herhangi birinden sinyal geldiğinde uyansın, ilgili ledi yakıp müziği çalsın. Sinyal kesilince tekrar uyku moduna geçsin.

Konuya hakim ustalar yardımcı olurlar mı acaba? Şimdiden teşekkürler.

NOT:
1.Alıcı durumundaki arduıno nano ve bağlı komponentler, (ledler, mini sdplayer, hoparlör, rf modül) 18650 lityum pil (voltaj yükseltici modül marifeti ile) DC 5v ile beslenmektedir.

2. RF alıcı kütüphanesi olan RCSwitch.h gereği tetikleme pini d2’dir .
 
Son düzenleme:
sayın mehmet.bey, alıcı modül bu.
 
Son düzenleme:
Vericinin göndereceği bilgileri kontrol
edebiliyor musunuz?
Eğer verileri siz yolluyorsanız; alıcı mcuyu
uyandırmak için bazı kodlar yollarsınız.
Bir kaç saniye sonra da asıl veri yollanır.
 
Vericinin göndereceği bilgileri kontrol
edebiliyor musunuz?
Eğer verileri siz yolluyorsanız; alıcı mcuyu
uyandırmak için bazı kodlar yollarsınız.
Bir kaç saniye sonra da asıl veri yollanır.
mehmet bey,
her kumandanın kendine ait ürettiği kod numarası sinyalle alıcı modüle geliyor. modül d2 pinine bu kodu gönderince eşitleme olursa işlemi gerçekleştiriyor. Bu durumda yabancı bir kumandadan sinyal gelirse tetikleme olmuyor.
yani kumanda sadece tetikliyor. başka bir bilgi aktarımı yok.
 
1. loop() fonksiyonunuzdaki mySwitch.available() şartını kaldırın.

2. Pin 2'ye bir sinyal alındığında tetiklenecek bir ISR ekleyin. Bu, Arduinonun uykudan uyanmasını sağlar.

KOD:
void wakeUp() {
// Sadece Arduinoyu uyandırmamız gerektiği için boş bir fonksiyon
}

3. setup() fonksiyonunuzda, Arduinoyu uyku moduna geçirmek için yapılandırmaları yapın ve kesmeyi (interrupt) ekleyin:

KOD:
attachInterrupt(digitalPinToInterrupt(2), wakeUp, RISING);
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Uyku modunu güç kapalıya ayarla
sleep_enable(); // Uyku modunu etkinleştir

4. Switch case'lerinizden sonra, Arduinoyu uyku moduna geçirin:

KOD:
sleep_mode(); // Uyku moduna girin

5. Uyandığında uyku modunu devre dışı bırakın:

loop() fonksiyonunun başına bu satırı ekleyin:

KOD
sleep_disable();


6. Eğer güç tüketimini daha da azaltmak istiyorsanız, kullanılmayan bileşenleri devre dışı bırakabilirsiniz. Örneğin, ADC'yi ve analog karşılaştırıcıyı (Komparatör) devre dışı bırakabilirsiniz:

KOD:
power_adc_disable();
power_all_disable();
Bu kodu setup() fonksiyonunun başına ekleyin.

Bu değişikliklerle, Arduino çoğu zaman uyuyacak ve yalnızca pin 2'de bir kesme alındığında uyanacaktır. Kesme işlemi tamamlandıktan sonra tekrar uyku moduna geçecektir.

Kolay gelsin
 
Hem uyanıp hem de veri kaçırmadan
nasıl değerlendirecek?

Zira, D2 pinine sadece kesme sinyali
gelmiyor, direk vericinin gönderdiği kod
geliyor.

İlla güç tasarrufu işlemi yapacaksanız;
Watchdog ile uyandırıp ara-sıra "Veri var mı?"
diye kontrol edeceksiniz. Sonra yeniden
uyutacaksınız.
 
Hem uyanıp hem de veri kaçırmadan
nasıl değerlendirecek?

Zira, D2 pinine sadece kesme sinyali
gelmiyor, direk vericinin gönderdiği kod
geliyor.

İlla güç tasarrufu işlemi yapacaksanız;
Watchdog ile uyandırıp ara-sıra "Veri var mı?"
diye kontrol edeceksiniz. Sonra yeniden
uyutacaksınız.
Bu durumu ben de düşündüğüm için rf modülün kütüphanesi gereği d2 pinine bağlı olduğunu not düşerek belirtmiştim.
Bu kesme pinleri nano'da sadece 2 adet pinlerinden birisi ile yapılabiliyormuş. bunlar d2 ve d3 pinleri imiş.
Acaba ben kesme pini olarak d3 ü tercih etsem yukarıda bahsettiğiniz duruma (veri kaçırmadan) bir çözüm olabilir mi?
 
D2 ve D3 aynı özellikte. İlgili mcunun INT0
ve INT1 pinleri bunlar.
Belki vericinin iki kere aynı kodu yollama
seçeneği/özelliği varsa, ikincide veriyi belki
yakalayabilir.
 

Forum istatistikleri

Konular
129,664
Mesajlar
928,871
Kullanıcılar
452,354
Son üye
brkcmn

Yeni konular

Geri
Üst