nrf24l01 ve Arduino ile Sera Projesi (nRF24L01 Modülüne Giriş #4)
Gelişen teknoloji ile birlikte tarımda, teknoloji temelli yöntemlerin kullanımı artmıştır. Artan nüfus ve tüketim miktarı meyve ve sebze üretiminde sera kullanımını da beraberinde getirmiştir. Sensörler, otomasyon sistemleri ve veri iletimi gibi IoT unsurları, sera tarımından alınan verimi arttırmakta, maliyeti azaltmakta ve çiftçilerimizin sorunlarına da çözümler sunmaktadır.
Bu projemizde 2 adet nRF24L01 haberleşme modülü, 2 adet Arduino Nano, 2 adet nRF – Nano Geliştirme Kiti, 1 adet 128×64 Oled Ekran, 1 adet DC Motor(3- 5V), 1 adet Buzzer, 1 adet PIR Sensör, 1 adet BME280 (ısı, sıcaklık, basınç, nem) sensörü kullanılmıştır.
nRF – Nano Geliştirme Kiti ile Devre Bağlantısını Oluşturma
Alıcı
Alıcı tarafı, yani merkez kısmını oluştururken, 1 adet 128×64 Oled Ekran ve 1 adet Buzzer kullanılmıştır. Oled ekran bağlantısı yapılırken GND pinini GND’ ye, VCC pinini 5 V’a, SCL pinini Analog giriş 5’e (A5), SDA pinini Analog giriş 4’e (A4) bağlıyoruz. Buzzerın “+” bacağını Arduino Nanonun D4 hattına, ” –“ bacağını ise GND hattına bağlıyoruz. Buzzerın bağlantısı için ilave kablolama yapmayıp, geliştirme kitimizin yardımcı pinlerini kullanıyoruz.
Verici
Verici taraf, yani sera kısmı oluşturulurken 1 adet PIR(Hareket Sensörü), 1 adet BME280 sıcaklık ve nem sensörü ve 1 adet DC Motor kullanılmıştır. BME280 sensörünü bağlarken, VCC pinini +5 V’a, GND’yi GND pinine, SCL pinini analog pin 5’e (A5), SDA pinini analog pin 4’e (A4) bağlıyoruz. DC motorun, motor sürücü devresi olmadığı için arduinodan 3 adet dijital çıkış alınır ve ortak bir kanalda toplanır. Daha sonra bu ortak kanal motorun artı olarak belirlediğimiz bacağına bağlanır, diğer bacağına ise geliştirme kitindeki GND bağlanır. PIR sensöründe 3 adet pin girişi vardır ve bunlar: GND, VCC ve DATA pinleridir. VCC pini 5V’a, GND pini GND’ye, DATA pini ise D4 hattına bağlanır.
PIR,DC Motor ve BME280 sensörünün bağlantısı için, küçük bir baskı devre tasarımı yapılıp, PCB üretilmiştir. Baskı devre kullanmadan, geliştirme kitinin yardımcı pinleri ile de bağlantı yapmak mümkündür.
Sera Uygulamamızın Amacı
Sera projemiz şu 3 görevi yerine getirmektedir.
1-)Sıcaklık ve nem değerleri sürekli olarak merkeze iletilecek. Oled Ekranda anlık olarak veriler görüntülenecek.
2-)Serada PIR sensörü ile bir hareket algılandığında merkez kısımda buzzer ötecek ve ekrana bir uyarı mesajı yazdırılacak.
3-)Seradaki sıcaklık 30°C’nin altındaysa merkez kısımdaki ekranda “Sera Serin” bilgisi yer alacak. Sıcaklık 30°C’nin üzerine çıkarsa motora bağlı pervane çalışmaya başlayıp serayı soğutacak. Merkez tarafımızdaki ekranda ise “Fan Aktif” mesajı yazacak. Sıcaklık tekrardan 30°C’nin altına indiğinde fan duracak.
Uygulamada Kullanılan Diğer Yardımcı Devre Elemanları
Kodlar
Verici-Sera
Nrf24 ve bme280 sensörleri için Gerekli kütüphaneleri ekliyoruz.Adafruit_BME280 sensörünü tanımlıyoruz. kablosuz adında nesne oluşturuyoruz, parantez içine kitimizin CE VE CSN pinleri 9 ve 10 numaralı dijital pine bağlı olduğundan 9 ve 10 yazıyoruz. Veri gönderimi için kullanılacak adresimizi tanımlıyoruz. Değişkenler tanımlanıyor. Seri iletişimi ve SPI haberleşmesini başlattık. Gönderim adresini ayarladık.BME280 sensörünü başlatıyoruz, sensör 0x76 adresinde ise devam ediyoruz. Sensör bulunamadıysa döngüde kalır. DC motor için, motor sürücü devresi kullanmadık. Bu nedenle arduinomuzdan 3 adet dijital pini çıkış olarak alıyoruz. PIR hareket sensörümüz nanomuza veri girişi yapacak. Bu nedenle pinmodu input seçiyoruz. Sensörden sıcaklık ve nem değerlerini okuyoruz. PIR hareket sensöründen değeri okuyoruz. Nrf24 ile sıcaklık, nem ve hareket değerlerini gönderiyoruz. Eğer sıcaklık 30 derece ve üzerindeyse DC motorun çalışmasını değilse durmasını tanımlıyoruz.
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
Adafruit_BME280 sensor;
RF24 kablosuz(9, 10);
const byte adres[] = "arkis";
float sicaklik;
float nem;
int hareket;
void setup()
{
Serial.begin(9600);
SPI.begin();
kablosuz.begin();
kablosuz.openWritingPipe(adres);
if (!sensor.begin(0x76))
{ Serial.print("BME280 SENSÖR BULUNAMADI");
while (1); }
pinMode(6, OUTPUT);//Motor sürücü devresi
pinMode(7, OUTPUT);//kullanmadığımız için 3 adet çıkış aldık
pinMode(8, OUTPUT);//ortak bir kanalda topladık
pinMode(4, INPUT);//PIR
}
void loop()
{
sicaklik=sensor.readTemperature();//sıcaklık değeri
nem=sensor.readHumidity();//nem değeri
hareket= digitalRead(4);// hareket değeri
kablosuz.write(&sicaklik,sizeof(sicaklik));
kablosuz.write(&nem,sizeof(nem));
kablosuz.write(&hareket,sizeof(hareket));
if ( sicaklik >= 30)
{
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
else
{
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
delay(1000);
}
Alıcı-Merkez
Nrf24 le ilgili gerekli kütüphaneleri ekliyoruz. OLED ekranının adresi ve boyutlarını tanımlanıyoruz. kablosuz adında nesne oluşturuyoruz ve diğer değişkenlerimizi tanımlıyoruz. Oled ekranı başlattık, ekranı temizledik, metin boyutu ve metin rengini girdik. open readingpipe ile bir okuma hattı oluşturuyoruz. Start listening ile dinlemeyi başlatıyoruz. Buzzer için 4 numaralı dijital pini çıkış olarak ayarladık. available() komutu verinin alıcıya ulaşıp ulaşmadığını kontrol ediyor. Veri geliyorsa kablosuz.read() ile verileri okuyoruz. if döngümüzün içine girip hareket algılandığında buzzerın 1 saniye ötmesini sağlıyoruz. oled ekranda da dikkat uyarı mesajını yazdırıyoruz. Hareket algılanmadığında, ekranda sıcaklık ve nem değerlerini yazdırıyoruz. Tekrardan bir if bloğu açıp sıcaklık 30 °C’nin üzerine çıktığında ekranda “fan aktif” yazılmasını, 30 °C’nin altına düştüğünde “sera serin” yazılmasını sağlıyoruz.
//---ALICI-MERKEZ---//
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Adafruit_SSD1306.h>
#define OLED_Address 0x3C
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 oled (1);
RF24 kablosuz(9, 10);
const byte adres[] = "arkis";
float sicaklik;
float nem;
int hareket;
void setup()
{
Serial.begin(9600);
SPI.begin();
kablosuz.begin();
oled.begin(SSD1306_SWITCHCAPVCC, OLED_Address);
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(WHITE);
kablosuz.openReadingPipe(0, adres);
kablosuz.startListening();
pinMode(4,OUTPUT);//buzzer
}
void loop()
{
if (kablosuz.available())
{
kablosuz.read(&sicaklik, sizeof(sicaklik));
kablosuz.read(&nem, sizeof(nem));
kablosuz.read(&hareket, sizeof(hareket));
if (hareket == HIGH)
{
digitalWrite(4,HIGH);
delay(1000);
digitalWrite(4,LOW);
oled.clearDisplay();
oled.setTextSize(2);
oled.setCursor(0,0);
oled.println("!! DIKKAT UYARI !! ");
oled.print(hareket);
oled.display();
delay(500);
}
else
{
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(0,0);
oled.print("Sicaklik = ");
oled.print(sicaklik);
oled.print(" C");
oled.setCursor(0,10);//SÜTUN, SATIR
oled.print("Nem = ");
oled.print(nem);
oled.print(" %");
oled.display();
delay(500);
if ((sicaklik) >= 30)
{
oled.setCursor(10,20);
oled.print("==> FAN AKTIF <==");
oled.display();
delay(500);
}
else
{
oled.setCursor(9,20);
oled.print("==> SERA SERIN <==");
oled.display();
delay(250);
}
}
}
}