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

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
sayın AG Mehmet,
Çok teşekkür ederim. Önerilerinizi bu gece kodlamama eklemlendirmeye çalışacağım. Mehmet bey'in yukarıdaki d2 pininin hem kesme, hem kod gönderme olarak gönderilmesi nedeniyle veri kaçırma konusu benim açımdan bir çözümlense de ondan sonra uğraşayım diyorum.
Zira ben arduıno yazılımlarında çok zayıfım. Doğaçlama bir şeyler yapmaya çalışıyorum.
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.
mehmet bey, ben diğer iletiye cevap yazarken siz aynı konuyu yazmışsınız çoktan.
Pişti olmuşuz...
 
Son düzenleme:
önerilerinizi bu gece kodlamama eklemlendirmeye çalışacağım

Düzeltilmiş kodunuzun tamamı:

#include <RCSwitch.h>
#include <SimpleSDAudio.h>

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

#define CS 4

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

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);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);

attachInterrupt(digitalPinToInterrupt(2), wakeUp, RISING);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
}

void loop()
{
sleep_disable();

mySwitch.disableReceive();
mySwitch.enableReceive(0);

if (mySwitch.available())
{
num = mySwitch.getReceivedValue();
Serial.println("vericikodu;" + String(num));

switch (num)
{
case 12718372: //K1
digitalWrite(A1, HIGH);
SdPlay.setFile("o1.wav");
SdPlay.play();
delay(6000);
digitalWrite(A1, LOW);
break;

case 12325156: //K2
digitalWrite(A2, HIGH);
SdPlay.setFile("o2.wav");
SdPlay.play();
delay(6000);
digitalWrite(A2, LOW);
break;

case 13555684: //K3
digitalWrite(A3, HIGH);
SdPlay.setFile("o3.wav");
SdPlay.play();
delay(6000);
digitalWrite(A3, LOW);
break;

default:
break;
}

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

sleep_mode();
}

Bu kod, Arduino'nun büyük bir kısmını uyku modunda geçirecek ve yalnızca pin 2'de bir kesme algılandığında uyanacaktır. Kesme işlemi tamamlandıktan sonra tekrar uyku moduna geçecektir.
 
Düzeltilmiş kodunuzun tamamı:

#include <RCSwitch.h>
#include <SimpleSDAudio.h>

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

#define CS 4

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

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);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);

attachInterrupt(digitalPinToInterrupt(2), wakeUp, RISING);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
}

void loop()
{
sleep_disable();

mySwitch.disableReceive();
mySwitch.enableReceive(0);

if (mySwitch.available())
{
num = mySwitch.getReceivedValue();
Serial.println("vericikodu;" + String(num));

switch (num)
{
case 12718372: //K1
digitalWrite(A1, HIGH);
SdPlay.setFile("o1.wav");
SdPlay.play();
delay(6000);
digitalWrite(A1, LOW);
break;

case 12325156: //K2
digitalWrite(A2, HIGH);
SdPlay.setFile("o2.wav");
SdPlay.play();
delay(6000);
digitalWrite(A2, LOW);
break;

case 13555684: //K3
digitalWrite(A3, HIGH);
SdPlay.setFile("o3.wav");
SdPlay.play();
delay(6000);
digitalWrite(A3, LOW);
break;

default:
break;
}

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

sleep_mode();
}

Bu kod, Arduino'nun büyük bir kısmını uyku modunda geçirecek ve yalnızca pin 2'de bir kesme algılandığında uyanacaktır. Kesme işlemi tamamlandıktan sonra tekrar uyku moduna geçecektir.

mehmet.bey ve AG Mehmet

ustalarım çok teşekkür ederim​

Eve gidince heyecanla kodu yükleyip kumandalara basacağım.
Çalışıp çalışmadığını burada paylaşacağım.
Ve asıl amacım olan pil dayanıklılık süresinin sonucunu almam biraz uzun sürebilir.
Çünkü kesmesiz kodlamada bana 16 saat yeten 18650 lityum pilim ne kadar dayanacak?
saat dakika tutup sonucu bekleyeceğim. Onu da paylaşacağım.
Sağ olun, var olun efendim.

 
Sayın AG Mehmet,
Önce rf alıcı modülün data pininden paralel iki hat alıp birini d2 pinine, diğerini de d3 pinine bağladım.
Ve yukarıda paylaştığınız koda
#include <avr/sleep.h>;
#include <avr/power.h>;
kütüphanelerini ekleyerek yükledim. Sorun olmadan yükleme tamamlandı. Ancak;
a) Hiç bir kumandaya basmadan boşta iken hoparlörden sürekli şekilde kısa aralıklı cızırtı gürültü sesi geldi, bir-iki dakika sonra bu ses kesildi.
b)Kumandaya basılıp basılı şekilde tutunca sd player müzik çalmadığı gibi cızırtı ton değiştirerek sürekli hale geldi ve led yanmadı. basmayı bırakınca bu cızırtı bitti ve boş halin kesintili cızırtısına geri döndü.
Bir yerde yanlış yapmış mıyım diye tekrar kontrol ettim yine aynı.
Donanımsal bir kablo vb. gibi bır sıkıntı mı var diye kesmesiz eski kodu geri yükledim. Led yandı müzik çaldı. İlk izlenimlerim bunlar. Görüşlerinize iletiyorum.

Not: Saat 23:00 de nanoyu resetlediğimde boşta iken yukarıda bahsettiğim kısa aralıklı cızırtı hiç gelmiyor artık. sessizlik hakim.
Ama butona basılınca led yanmıyor, hoparlörden müzik yerine sadece buton basılı tutuldukça aralıksız bir cızırtı gelmesi durumu devam ediyor.
 
Son düzenleme:
hoparlörden müzik yerine sadece buton basılı tutuldukça aralıksız bir cızırtı gelmesi
Hoparlörü nasıl bağladınız? (şema ile)

Adım adım ilerlemek gerekiyor.
Önce kodu bütün olarak test edin, tamamını çalıştıramadıysanız kodu kısmen çalıştırarak denemek için :

1. Arduino IDE'yi bilgisayarınızda açın.

2. Yeni Bir Dosya Oluşturun:
Yeni bir proje başlatmak için "File" > "New" (Dosya > Yeni) seçeneğini kullanarak yeni bir dosya oluşturun.

3. Verilen Kodu parçalara ayırarak kopyalayın:
Kodları, ilgili bölümler halinde kopyalayın.
Mesela: #include kısmını, ardından void setup(), void loop(), vb. şeklinde kopyalayarak yapıştırın.

4. Arduino kartınızı bilgisayarınıza bağlayın.

5. Arduino Modelinizi ve Portunuzu Seçin:
"Tools" > "Board" (Araçlar > Kart) ve "Tools" > "Port" (Araçlar > Port) menülerinden Arduino modelinizi seçin.
Hangi portta bağlı olduğunu belirtin.

6. Parça kodları her seferinde 1 kod olarak Arduino'ya yükleyin (daha sonra bütününü yüklersiniz):
"Sketch" > "Upload" (Döküman > Yükle) seçeneğini kullanarak kodu Arduino kartınıza yükleyin.

7. Arduino kartınızı devre dışı bırakmak için, bilgisayarınızdan Arduino kartını çıkarın veya RESET düğmesine basarak kartı sıfırlayın.
Daha sonra, uyku modunda beklerken giriş pinine buton ve direnç üzerinden 5V sinyal gönderin.
Arduino'nun uyanması ve belirli LED'in yanması ve ses çalması gerekir.


8. Arduino IDE'nin altındaki seri monitör penceresini açarak surumu izleyin.
Eğer her şey düzgün çalışıyorsa, burada hata mesajları görmemeniz gerekir.
 
Hoparlörü nasıl bağladınız? (şema ile)
1697289558832.jpeg

Bu şemayı aklım erdiğince paint ile düzenledim. Becerebildiysem bağlantıların tamamı bu şekilde.
Hoparlör +'sı sdkartplayer kütüphanesi gereği D9'a bağlı.
 
Son düzenleme:
Hoparlör mü bağladınız yoksa buzzer mı? Direncini ölçün, omajı düşükse, ekteki videoyu izleyin.


arduino_speaker.png
 
Son düzenleme:
Hoparlör mü bağladınız yoksa buzzer mı? Direncini ölçün, omajı düşükse, ekteki videoyu izleyin.
sayın AG Mehmet,
mini hoparlör bağlı.
buzzer değil.
aynı düzeneğe kesme'siz kodu tekrar yüklediğimde her şey sorunsuz çalışıyor.
hoparlör sd karta yüklediğim müziği çalıyor ve led yanıyor.
yani donanımsal bir hata olsa idi kesme'siz kodda da müzik çalmazdı diye düşünüyorum.
 
sayın AG Mehmet,
mini hoparlör bağlı.
buzzer değil.
aynı düzeneğe kesme'siz kodu tekrar yüklediğimde her şey sorunsuz çalışıyor.
hoparlör sd karta yüklediğim müziği çalıyor ve led yanıyor.
yani donanımsal bir hata olsa idi kesme'siz kodda da müzik çalmazdı diye düşünüyorum.
Araya böyle bir devre kullanmak daha doğru, bunu sonra halledebilirsiniz..
Asıl kodun çalışması önemli.
Öncelikle "seri monitör" pencersinden kodun çalışıp çalışmadığına bakın, hata mesajı varmı?
 
Asıl kodun çalışması önemli.
Öncelikle "seri monitör" pencersinden kodun çalışıp çalışmadığına bakın, hata mesajı varmı?
seri port ekranında kesme'siz kodlamada her kumandanın kendine özgü kod nosu kumanda butonuna basılınca yazılıyor.
ama kesme'li kod yüklenince seri port ekranında herhangi bir şey yazmıyor.
sadece hoparlörde basılma süresince devam eden cızırtı geliyor.
kesme'li kod da rahatlıkla yükleniyor ve hata vermiyor, ama çalışmıyor.
bence kumandanın butonuna basılı oldukça gelen sürekli cızırtı, rf modülün görevini yaptığına işaret.
 
Son düzenleme:

Forum istatistikleri

Konular
130,122
Mesajlar
933,324
Kullanıcılar
453,196
Son üye
ustabey

Yeni konular

Geri
Üst