back to top

NRF24L01, LM35 ve Arduino ile Kablosuz Sıcaklık Uyarı Sistemi

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.

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:

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 = 0xE8E8F0F0E1 LL; //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 <SPI.h>  //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 = 0xE8E8F0F0E1 LL; //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.

Bazı arkadaşlar modülün tek başına çalışıp çalışmadığını nasıl test edebiliriz diye sordu. Bunun için de bir kod ekliyorum aşağıya. Arduino ve NRF24 modül bağlantılarını yaptıktan sonra aşağıdaki kodu Arduino’ya yükleyin.

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <printf.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]; // this must match dataToSend in the TX
bool newData = false;
void setup() {
  Serial.begin(9600);
  printf_begin();
  Serial.println("CheckConnection Starting");
  Serial.println();
  Serial.println("FIRST WITH THE DEFAULT ADDRESSES after power on");
  Serial.println(" Note that RF24 does NOT reset when Arduino resets - only when power is removed");
  Serial.println(" If the numbers are mostly 0x00 or 0xff it means that the Arduino is not");
  Serial.println(" communicating with the nRF24");
  Serial.println();
  radio.begin();
  radio.printDetails();
  Serial.println();
  Serial.println();
  Serial.println("AND NOW WITH ADDRESS AAAxR 0x41 41 41 78 52 ON P1");
  Serial.println(" and 250KBPS data rate");
  Serial.println();
  radio.openReadingPipe(1, thisSlaveAddress);
  radio.setDataRate(RF24_250KBPS);
  radio.printDetails();
  Serial.println();
  Serial.println();
}
void loop() {
}

Kodu çalıştırdıktan sonra seri portu açıyoruz. Çıkan numaralar çoğunlukla 0x00 ve 0xff ise Arduino modülle düzgün şekilde haberleşemiyor demektir.

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

Son Çıkan Yazılar

46 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.

  2. Hocam merhaba. Bir adet mega ve Nano modelim var. Ne denediysem beceremedim. Arduino nun haberleşme modülü ile iletişim kurup kurmadığını nasıl test edebilirim. ( Test kodları ve sizin verdiğiniz linkteki kütüphaneyi ekledm. Mega nın pin diyagramına bakıp MOSI, MISO, SCK ve 9 ve 10 numaralı pinleri kullandım. 10 Numaralı pin i Çıkış olarak ta denedim. ) NRF24L01 PNA+LNA modeli mevcut. Harici güç kaynağı ile de kullandığıda olumsuz sonuç aldım. Modülün arızalı olup olmadığını nasıl test edebilirim. Teşekkürler. 🙂

    • Merhaba. Test kodunu çalıştırıp denediniz mi? Verdiğim test kodunu Arduino’ya yükleyip sadece NRF24 ve Arduino bağlantılarını yapın. Seri portta Veri Alındı ​​Mesajı n görüyorsanız haberleşiyor demektir. Bu mesaj, yaklaşık bir saniye aralıklarla yazdırılmalıdır. Yani Veri alında mesaj 1, veri alındı mesaj 2 şeklinde 10’a kadar devam ediyorsa ekranda çıkan mesaj, düzgün haberleşiyor demektir. Ama sadece veri alındı yazıyorsa seri şekilde, o zaman bir sorun var.

      Bunun dışında modülü tek başına test etmek için yine NRF24 ve Arduino bağlantılarını yapın. Bunun için gerekli olan kodu yazının sonuna ekliyorum, bakabilirsiniz.

    • Evet Zeki Bey. Projede kullandığımız NRF24L01 modülleri birbirleriyle kablosuz olarak haberleşebiliyorlar ve harici antenli modellerinin menzilleri 1 kilometreye çıkabiliyor. Modülleri kablosuz olarak haberleştirmek; sensör, buzzer ve ledi bazı spesifikasyonlar belirterek kullanmak isteyeceksiniz. Bunun için de Arduino’lara ihtiyacınız olacak.

  3. Kondansatörü resimde nrd modülüne lehim yapıp mi kullandınız yaparken kondansatör lehimledende breadboard üzerinden baglanti yapıp kullanılabilir mi lehim şart mi

  4. Birde arduino için kondansatör şart değil demissiniz kullanmasak olur mu arduinoda pimlerin bağlantısı farklı mi peki direk verdiniz semadaki bağlantıyı ardino unita uygulasak olur mu

    • Merhaba, kondansatörü gücü stabil tutmak adına ekliyoruz. Kullanılmadığında problem olabiliyor, bu yüzden NRF24L01 modüllerin VCC – GND pinleri arasına kondansatör eklemek modülün doğru çalışması adına önemli olabiliyor. Kondansatörsüz olmadan çalışmasında bir problem olmadığını düşünüyorsanız eklemeden devam edebilirsiniz.

  5. Alıcı verici kodlarını yükledikten sonra nasıl haberleşiyor tam anlamadim kodları arduinoyalara yükledikten sonra kablosuz haberlesme ya arduinolarin usb kabloları ha eşleşirken bilgisayara bağlı olacak mi

  6. Arduinonun usb kablosunu takmadan haberlesme sağlanır mi?bide sadece seri ekranında sadece değerler yaziyo doğru mu haberlestigini nasıl anlayacağızdergerler yaziyosa haberlesiyo demek mi oluyo bide bazdır çok ses cikariyo yangın alarmı gibi bu da doğrumu

  7. Arduinonun usb kablosunu takmadan haberlesme sağlanır mi?bide sadece seri ekranında sadece değerler yaziyo doğru mu haberlestigini nasıl anlayacağızdergerler yaziyosa haberlesiyo demek mi oluyo bide buzzer çok ses cikariyo yangın alarmı gibi bu da doğrumu

  8. Alıcı kısımda serial ekranda sadece
    “SimpleRx Baslatiliyor” bu yazıyor başka birşey yazmıyor

    verici kısmında ise
    ” Data Gonderildi Message 0 Verici basarisiz oldu”
    ” Data Gonderildi Message 0 Verici basarisiz oldu”
    ” Data Gonderildi Message 0 Verici basarisiz oldu”
    ” Data Gonderildi Message 0 Verici basarisiz oldu”
    böyle devam ediyor.
    BU SORUNLA KARŞILAŞAN VE ÇÖZEN VARSA YARDIMCI OLURSA ÇOK SEVİNİRİM

  9. Merhaba; nrf ile joystick kontrollü servo motor kullanmaya çalışıyorum. Çalışmada sıkıntı yok ama vericinin enerjisini kestiğimde, alıcı verilen son komutta kalıyor. Mesela joystick’i sağa çevirdim servo motor döndü o halde iken vericinin enerjisini kestiğimde servo o açıda kalıyor. Önüne nasıl geçebilirim bu durumun?

    —VERİCİ KODU—

    #include
    #include
    #include

    #include
    #include “RF24.h”
    int msg[1];
    //SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 7//CE -> 8
    RF24 radio(8,7);
    const uint64_t pipe = 0xE8E8F0F0E1LL;
    int potpin = 0;
    int val;
    void setup(void){
    radio.begin();
    radio.openWritingPipe(pipe);
    }
    void loop(void){
    val = analogRead(potpin);
    val = map(val, 15, 724, 55, 90);
    msg[0] = val;
    radio.write(msg, 1);
    }

    —ALICI KODU—

    #include
    #include
    #include

    #include
    #include
    #include “RF24.h”
    Servo myservo;
    //SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 7//CE -> 8
    RF24 radio(8,7);
    const uint64_t pipe = 0xE8E8F0F0E1LL;
    int msg[1];
    void setup()
    {
    myservo.attach(9);
    radio.begin();
    radio.openReadingPipe(1,pipe);
    radio.startListening();
    }
    void loop()
    {
    if (radio.available()){
    bool done = false;
    while (!done){
    done = radio.read(msg, 1);
    myservo.write (msg[0]);

    }
    }
    }

  10. Gelen datanın belirlediğimiz değerden düşük olduğunda buzzerın ötmesi için
    İf( data[0] < threshold) yapsak yetermi
    Yani 5 derecenin altına düştüğünde buzzer ötmeli 5 derecenin üzerinde ses çıkarmamalı

  11. MERHABA TEST PROGRAMINI ÇALISTIRDIM SIRASIYLAS 1-9 ARASI SAYIYOR ANCAK ALICI PROGRAMINDA VERİ ALINDI ÇOK HIZLI BIR SEKILDE AKIP GİDİYOR.
    KONDANSATÖR EKLEDİM. BAĞLANTILARI KONTROL ETTİM DAHA SONRA BASKA BIR NRF BAĞLADIM ANCAK SORUN DEVAM EDIYOR.

  12. Ahmet’in de dediği gibi devre yanlış. NRF24L01 artı bacağını 3.3V bağlanması gerekir. Şemada 5V gösteriyor. NRF24L01 modülünü yakarsınız. Lütfen şemayı düzeltin yada kaldırın.

  13. merhaba;
    yapmak istediğim evimde oda sıcaklığını 5 adet verici kurup 1 adet alıcı ekranından nasıl diğer ortam sıcaklıklarını okuyabilirim?

  14. Merhaba elimde bir nano bir uno var nrf leri ne denediysem deneyim birbirleriyle iletişim kurmuyorlar başka kodlar demedim olmadı yardımcı olabilir misiniz

  15. Bende 2.4ghz küçük drone kumandası var bu kumandayı verici nrf modülünü de alıcı olarak ayarlayıp uzaktan kumandalı araba yapmak istiyorum. Ama bu kumandadan gelen verileri nrf ile nasıl okuyacağımı bilmiyorum. Yardımcı olur musunuz?

    • “https://downloads.arduino.cc/libraries/github.com/TMRh20/RF24-1.3.11.zip” adresinden gerekli kütüphaneyi indirip, “https://maker.robotistan.com/arduino-kutuphane-ekleme/” adresine bakarak kurulumu yapabilirsiniz.

  16. Merhaba
    iki adet nrf24l01 ile veri alışverişi sağlıyorum. ancak veri alışverişi bir müddet sağlıyor daha sonra duruyor. sebebi ne olabilir. bunu iki adet cc1101 ile de denedim. onda da aynı sorun var. yardımcı olur musunuz.

  17. nrf24l01 ile sorunsuz bilgiyi aynı anda gönderip alabiliyorum fakat kumanda menzilden cıktığı zamandaki,durumuda düşünmek lazım alıcı en son ne yaptırdıysam onu yapmaya devam ediyor.bağlantının koptugunu ardunıoya nasıl anlatabilirim

  18. Merhaba, ekranda sürekli 50 değeri çıkıyor, buzzer ve led hiç çalışmıyor. Devrede bir sorun yok. Test kodlarını da denedik , modüller arası haberleşmede de sıkıntı yok. Nasıl bir çözüm bulabiliriz ?

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz