Herkese selam,

Bu yazıda NRF24L01 modülünü kullanarak kablosuz uyarı sisteminin nasıl yapılacağını öğreneceğiz. Bunun, başlangıç seviyesi için ideal bir proje olduğunu düşünüyorum.

Projemizde kablosuz haberleşmede sıkça kullanılan modüllerden NRF24L01 kablosuz iletişim modülünü kullanacağız. Bu modülün kullanımı oldukça kolay olduğu gibi, menzili de gayet iyi. Aynı zamanda fiyatı da uygun olduğu için siz de projelerinizde rahatlıkla kullanabilirsiniz. Modül 2.4GHz frekansında kablosuz haberleşme yapmanıza imkan sağlar ve düşük güç tüketimine sahiptir.

Modülün pcb ve harici antenli modeli de mevcut. Pcb modellerde menzil 250 metre iken harici antenli modelinde menzil 1000 metreye kadar çıkabiliyor. Modülü projenize göre çift yönlü haberleşme yaptırmak için hem verici hem de alıcı olarak kullanabilirsiniz. 1 modül 126 modüle kadar bağlanabiliyor.

Projemizde modül için 2 adet kütüphane kullanıyoruz. Modül SPI arabirimini destekliyor. SPI kütüphanesi Arduino IDE’si ile birlikte geliyor fakat modül için kullanacağımız RF24 kütüphanesini bizim eklememiz gerekiyor. Bu projeyi yaparken daha öncekilerde kullandığım RF24 kütüphanesinin eski Maniacbug versiyonundaki bazı sorunları çözen bir kütüphane olan TMRh20 versiyonunu kullandım. İlgili kütüphaneyi buradan indirebilirsiniz. Bu yazıyı okumadan önce RF24 kütüphanesini indirip yüklediyseniz kütüphaneyi silip TMRh20 versiyonunu indirmeniz mantıklı olacaktır. Demo programların çoğu çalıştırılırken ManiacBug versiyonunda sorunlar çıkmaktadır. Kütüphaneyi indirdikten sonra winrar dosyası içindeki her şeyi C:\Program Files\Arduino\Library dosyası içerisine atıyoruz. Kütüphaneleri ekledikten sonra devreyi kurup, arduinolara kod yükleyebiliriz.

Gerekli Malzemeler:

Arduino, NRF24L01 ve LM35 ile Sıcaklık Uyarı Sistemi Devresi Fotoğrafı
NRF24L01 ve LM35 ile Sıcaklık Uyarı Sistemi

Not: Modüller arası haberleşmeyi sağlayamadıysanız ve diğer aşamaları düzgün bir şekilde yaptığınıza inanıyorsanız haberleşmenin sorunsuz bir şekilde sağlanabilmesi için yukarıdaki fotoğrafta gördüğünüz şekilde her iki modülün de VCC ve GND pinleri arasına 3.3 uF ile 10 uF arası değerde kondansatör yerleştiriniz. NRF24 modülünü çalıştıramayanlar için daha önce bir videomuzda bu konuya değinmiştik: https://youtu.be/oxjZ4GaAbhs?t=1102

DEVRE ŞEMALARI

Transmitter (Verici) Devresi

NRF24L01 ve LM35 ile Kablosuz Uyarı Sisteminin Transmitter (Verici) Devresinin Fritzing İllüstrasyonu
Transmitter (Verici) Devresi

 

Receiver (Alıcı) Devresi

NRF24L01 ve LM35 ile Kablosuz Uyarı Sisteminin Receiver (Alıcı) Devresinin Fritzing İllüstrasyonu
Receiver (Alıcı) Devresi

 

KAYNAK KODLAR VE AÇIKLAMALARI

Transmitter (Verici) Kodları

#include <SPI.h>    //nRF24L01 ile haberleşmek için standart SPI kütüphanesini ekliyoruz.
#include "RF24.h"   //nRF24L01'in ana kütüphanesini ekliyoruz.
#include "nRF24L01.h"

const int lm35Pin = 0; //Sensörün bağlandığı pini tanımlıyoruz.

int data[1];           //Data isminde bir dizi tanımlıyoruz ve gönderilecek datayı belirtiyoruz.

RF24 radio(9,10);     //RF24 kütüphanesinin kullanacağı CE ve CSN pinlerini tanımlıyoruz.

const uint64_t pipe = 0xE8E8F0F0E1LL; //Alıcıyla iletişim için bir pipe adresi tanımlıyoruz.

void setup(void) {
Serial.begin(9600);          //Gönderilen datayı okumak için seri iletişimi başlatıyoruz.
pinMode (lm35Pin, INPUT);    //Sensörü input olarak tanımlıyoruz.
radio.begin();               //nRF24 iletişimini başlatıyoruz.
radio.openWritingPipe(pipe); //Programın data göndereceği alıcının adresini ayarlıyoruz.

}

void loop(void) {
data [0] = analogRead(lm35Pin);  //Data paketindeki data sensörden okunsun.
Serial.println(data [0]);        //Okunan data[0] seri monitörde görüntülenebilsin.
radio.write(data, sizeof(data)); //Data paketindeki tüm data nRF24L modülüyle transfer edilecek.
}

Receiver (Alıcı) Kodları

#include        //nRF24L01 ile haberleşmek için SPI kütüphanesini ekliyoruz.
#include "RF24.h"      //nRF24L01'in ana kütüphanesi.
#include "nRF24L01.h"

#define buzzerPin 2   //Gelen datayla aktive edilecek olan komponentlerin pinlerini tanımlıyoruz.
#define threshold 90  //LM35 kullanılarak eşik değer tanımlıyoruz.

int led1 = 4;         //Ledin pinini tanımlıyoruz.

int data[1];          //Data isminde bir dizi tanımlıyoruz ve gönderilecek datayı belirtiyoruz.


RF24 radio (9,10);   //nRF24L modülünün CE ve CSN pinlerini tanımlıyoruz.


const uint64_t pipe = 0xE8E8F0F0E1LL;  //Verici ile iletişim için pipe adresini tanımlıyoruz.

void setup() {
  pinMode(led1, OUTPUT);          //Ledi output olarak tanımlıyoruz.
  Serial.begin(9600);             //Seri iletişimi başlatıyoruz.
  radio.begin();                  //nRF24 iletişimini başlatıyoruz.
  radio.openReadingPipe(1, pipe); //Programın data göndereceği alıcının adresini ayarlıyoruz.
  radio.startListening();

}

void loop() {
  if (radio.available () ) {         //Eğer iletişim uygunsa
    radio.read(data, sizeof(data));  //Gelen datayı oku
    Serial.println(data[0]);         //Gelen datayı seri monitörde göster.

    if(data[0] > threshold) {       //Eğer gelen data eşik değerden yüksekse
      tone(buzzerPin, 440);         //Buzzer'ı aktive et.
      digitalWrite (led1, HIGH);    //Ledi aktive et.
      delay(400);
      noTone(buzzerPin);
      digitalWrite(led1, LOW);
      delay(50);
    }
    else {                        //Gelen data eşik değere ulaşmıyorsa
      noTone (buzzerPin);         //Buzzer aktif değil.
      digitalWrite(led1, LOW);    //Led aktif değil.
    }
  }
    }

 

Devreyi çalıştırmakta zorluk çekenler için:

  • NRF24, Arduino ile iletişim kurmak için SPI kullandığı için Arduino’nun 13,12 ve 11. pinlerini (SCK, MISO ve MOSI) kullanmalıdır. Demo amaçlar için CSN ve CE pinlerini Arduino’nun 10 ve 9. pinlerine bağlamak daha kolay olacaktır. Böylece modülün geri kalan 5 pini de Arduino’da 9 ve 13. pinler arasında olacaktır. Arduino UNO kullanırken modülün CSN ve CE pinleri için 9 ve 10’dan farklı pinler kullanıyorsanız pin 10’u OUTPUT olarak ayarlamak zorundasınız ki UNO SPI master olarak davranabilsin.
  • Geri kalan her şeyi doğru yaptığınızı düşünüyorsanız modüllerin VCC ve GND pinleri arasına 10 uF değerinde kondansatör yerleştiriniz. Kondansatör güç ünitesini modüle göre stabilize eder. Deneyimlerime göre kondansatör özellikle Atmega328’de gerekli oluyor. UNO ve Mega’da gerekli olmasa da diğer adımları takip ettiğinize inanıyorsanız kondansatör yerleştirmek faydalı olacaktır.
  • Bazı durumlarda Arduino’ya yeni program yüklendikten sonra NRF24 resetlenmiyor. Bu da programın düzgün çalışmasına engel olabilir. Durumun bu olduğunu düşünüyorsanız Arduino’yu USB’den ayırın ve tekrar bağlayın.
  • Bütün adımları doğru yaptığınızı düşünüyorsanız ve yine de sistemi çalıştıramadıysanız Arduino ve NRF24L01 modülünün sağlıklı haberleşip haberleşmediğini test etmeniz gerekiyor. Aşağıdaki program çifti, alıcıdan vericiye “N iletisi” gönderir ve burada N, 0’dan 9’a kadar artan bir sayıdır. Böylece ardışık mesajların gönderilip alındığını görebilirsiniz.

Test için Transmitter (Verici) Kodu

// SimpleTx - Transmitter (Verici)

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN 9
#define CSN_PIN 10

const byte slaveAddress[5] = {'R','x','A','A','A'};

RF24 radio(CE_PIN, CSN_PIN); // Radio olusturuyoruz.

char dataToSend[10] = "Message 0";
char txNum = '0';

unsigned long currentMillis;
unsigned long prevMillis;
unsigned long txIntervalMillis = 1000; // Birer saniye aralıklarla mesaj gonder.

void setup() {

Serial.begin(9600);

Serial.println("SimpleTx Baslatiliyor");

radio.begin();
radio.setDataRate( RF24_250KBPS );
radio.setRetries(3,5); // delay, count
radio.openWritingPipe(slaveAddress);
}

//====================

void loop() {
currentMillis = millis();
if (currentMillis - prevMillis >= txIntervalMillis) {
send();
prevMillis = millis();
}
}

//====================

void send() {

bool rslt;
rslt = radio.write( &dataToSend, sizeof(dataToSend) );
// Daima, boyut bayt sayisi olarak verildigi icin sizeof() ogesini kullanin.
// Ornegin; dataToSend (gonderilecek olan veri) tam sayiysa sizeof() saglikli bir sekilde 2'ye 
donecektir.

Serial.print("Data Gonderildi ");
Serial.print(dataToSend);
if (rslt) {
Serial.println(" Onay Alindi");
updateMessage();
}
else {
Serial.println(" Verici basarisiz oldu");
}
}

//================

void updateMessage() {
// Boylece yeni datanin gonderildigini gorebileceksiniz.
txNum += 1;
if (txNum > '9') {
txNum = '0';
}
dataToSend[8] = txNum;
}

Test için Receiver (Alıcı) Kodu

// SimpleRx - Receiver (Alici)
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN 9
#define CSN_PIN 10

const byte thisSlaveAddress[5] = {'R', 'x', 'A', 'A', 'A'};

RF24 radio(CE_PIN, CSN_PIN);

char dataReceived[10]; // Burasi vericideki dataToSend ile eslesmelidir.
bool newData = false;

//===========

void setup() {

Serial.begin(9600);

Serial.println("SimpleRx Baslatiliyor");
radio.begin();
radio.setDataRate( RF24_250KBPS );
radio.openReadingPipe(1, thisSlaveAddress);
radio.startListening();
}

//=============

void loop() {
getData();
showData();
}

//==============

void getData() {
if ( radio.available() ) {
radio.read( &dataReceived, sizeof(dataReceived) );
newData = true;
}
}

void showData() {
if (newData == true) {
Serial.print("Veri alindi ");
Serial.println(dataReceived);
newData = false;
}
}

Kodlar düzgün bir şekilde çalışırken, SimpleRx (Alıcı) programı; n, 0 ile 9 arasında değişen bir sayı olmak üzere “Veri Alındı ​​Mesajı n” göstermelidir. Bu, yaklaşık bir saniye aralıklarla yazdırılmalıdır.

Gördüğünüz tek şey “Veri alındı” ifadesiyse ve bu ifade çok daha hızlı bir şekilde tekrarlanıyorsa bir sorun var demektir. Büyük olasılıkla Arduino, nRF24 ile doğru şekilde iletişim kurmuyor.

Umarım sizler için faydalı bi paylaşım olmuştur. Sonraki projelerde görüşmek üzere. 🙂

4 Yorumlar

  1. İyi günler uzun zamandır nrf24L01 modülüyle ilgili kaynak bulmakta zorlanıyordum paylaşımınız için teşekkürler,sıcaklık değeri seri portta okunuyor fakat buzzer ve ledde bir hareket olmuyor neyi yanlış yapıyor olabilirim

    • Merhaba. Bütün adımları doğru yaptığınızı düşünüyorsanız Arduino ve NRF24L01 modülünün sağlıklı haberleşip haberleşmediğini test etmekte fayda var. Yukarıdaki devre şemalarına bakarak, Arduino ve NRF24 modülünün bağlantılarını yapıp test kodlarını Arduinolara yüklemeniz gerekiyor. Bunun için yazının sonuna test için transmitter (alıcı) – receiver (verici) kodlarını ve açıklamalarını ekledim, bakabilirsiniz.

CEVAP VER

Please enter your comment!
Please enter your name here