433Mhz RF alıcı-verici ile Hava istasyonu

Arduino ile tanıştıktan sonra hep aklımda kablosuz olarak bir bilginin aktarılması vardı. tabiki çalışmalara başlamam uzun sürmedi. Bu RF alıcı verici modülünden edindim ve başladım işe koyulmaya. Projemizde iki adet arduino mevcut bunlardan birini alıcı diğerini ise verici olarak ayarladım.

Tabi projeye başladıktan sonra onlarca problemle karşılaştım bunlardan birisi ise aktarılan değerin DATA dan STRİNG değerine çevrilmesiydi , bu çevirimi yapmadığımdan dolayı sadece sıcaklık basınç değerini LCD de görebiliyor ama bir türlü ölçülen değerlere göre arduinoyu kontrol edemiyordum. Bunun için gerekli tüm adımları anlatayım ki sizde amerikayı tekrar keşfetmek için uğraşmayın :))

 

Projemizde Kullanılan modül aşağıdaki gibidir.

433mhz-transmitter-and-receiver-kit-arduino-project-b38b2e59-800x800

Projemizde 

Verici için

  • 433MHz verici modülü
  • BMP180 basınç sensörü
  • DHT11 ısı nem sensörü
  • Herhangi bir arduino modeli

Alıcı için 

  • 433Mhz alıcı modülü
  • 20×4 LCD
  • Herhangi bir arduino modeli

Not: Projenizde nelerin kontrol edileceğine siz karar vererek istediğiniz diğer eklentileri yapabilirsiniz.

Projenin resimleri eklemek istiyorum . Alıcı için arduino Nano kullandım ki programlamasında direk USB girişinden faydalanarak projenin geliştrilmesinde kolaylık olsun, Ama aynısını verici için diyemeyeceğim arduinoyu STANDALONE modda kullandım. Bağlantı şemasını en yakın zamanda paylaşacağım.

havaistasyonu1 havaistasyonu3 havaistasyonu4 havaistasyonu5  havaistasyonu7 havaistasyonu2

Programımız

Verici İçin


//Including Libs
#include <Adafruit_BMP085.h>
#include "DHT.h"
#include <VirtualWire.h>
#include <Wire.h> //Pressure sensor

//Defining Pins
#define DHTPIN 11 
#define DHTTYPE DHT11
#define BMP085_ADDRESS 0x68  // I2C address of BMP085 //Pressure sensor
DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP085 bmp;

//Seting up
void setup()
{
     Wire.begin();
     if (!bmp.begin()) {
	Serial.println("Could not find a valid BMP085 sensor, check wiring!");
	while (1) {}
  }
  //For Debug
  Serial.begin(9600);
  Serial.println("Setup");

  dht.begin();
  //Pressure sensor
  // Setup transmit pin
  vw_set_tx_pin(12); 
  vw_setup(2000); //

  //For Debug
  Serial.println("Start Pressure");
}

//Main Loop
void loop()
{
  Serial.println("\n");
 float h = dht.readHumidity();
  float t = dht.readTemperature();
float derece = bmp.readTemperature();
float yukseklik = bmp.readAltitude(101500);
  //First Sensor
  //Humidity
 

  //Send Data #H is for Humidity
  SendData("#H"+ ((String)h));



  //Seccond Sensor
  //Temp (Baro Pressure)
  //Send Data #C is for Celcious
  SendData("#C"+(String(derece,2)));



  //Same seccond Sensor, next output
  //Baro Pressure
float basinc = bmp.readPressure();
  
  //Send Data #P is for pressure
  SendData("#P"+(String(basinc/100,2)));


  //Wait for Next Loop
  delay(5000);
}

void SendData(String Data)
{
  //Debug
  Serial.println("-->"+ Data + "<-- ");

  //Making char Array of String
  const char* rawdata = Data.c_str();

  digitalWrite(13, true); // Flash a light to show transmitting
  vw_send((uint8_t *)rawdata, strlen(rawdata)); //Send Data
  vw_wait_tx(); // Wait until the whole message is gone
  digitalWrite(13, false);
}



 

Alıcı için

// receiver.pde
//
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $
#include <VirtualWire.h>
#include <stdio.h>
#include <string.h>
#include <LiquidCrystal.h>

double Temp;

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //LCD Pins
byte temprature[8] = //icon for termometer
{
    B00100,
    B01010,
    B01010,
    B01110,
    B01110,
    B11111,
    B11111,
    B01110
};

byte waterDrop[8] = //icon for water droplet
{
    B00100,
    B00100,
    B01010,
    B01010,
    B10001,
    B10001,
    B10001,
    B01110,
};
int LCDpin =9;  //LCD backlight Pin
int Humid; // Value
#define pir A0 //Pin for the PIR input

//Varaible to store the recoverd values
String TempC; //Temp in C
String Vocht; //humidity
String Druk;  //pressure
int derece;
int nem;
int basinc;
void setup()
{
  Serial.begin(9600); // Debugging only
  Serial.println("setup");
  lcd.createChar(1,temprature);
  lcd.createChar(2,waterDrop);

  ////Setting pins for backlight
  pinMode(pir, INPUT);
  pinMode(LCDpin, OUTPUT);

  //LCD
  lcd.begin(20, 4); //Setting rows an colums

  lcd.setCursor(0, 0); //Set Cursor at begining
  lcd.print("####################"); //Drawing

  lcd.setCursor(0, 1); //Set cursor at next line
  lcd.print("#      HALIL       #"); //Drawim 

  lcd.setCursor(0, 2); //Set cursor at next line
  lcd.print("#    Akilli Ev     #"); //Drawim 

  lcd.setCursor(0, 3); //Set cursor at next line
  lcd.print("#######-V1.0-#######"); //Drawim 

  //Show on Screen, if this isnt called, screen would be empty
  lcd.display(); 

  //Set back color to full brightness
  digitalWrite(LCDpin,255);

  //Wait a seccond
  delay(1000);

  //For Receiving  Data
  // Initialise the IO and ISR
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);      // Bits per sec
  vw_rx_start();       // Start the receiver PLL running
}



void loop()
{
  //IF PIR sensor if HIGH, LCD backlight is on
  //The Sensitivity  and duration is adjusted ON the PIR
  digitalWrite(LCDpin, digitalRead(pir));

  ////Receiving  DATA
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  if (vw_get_message(buf, &buflen)) // Non-blocking
  {
    int i;
    digitalWrite(13, true);  //onboard LED ON 
    char Chars[buflen]; 
    for (i = 0; i < buflen; i++)
    {
      Chars[i]  = char(buf[i]); //from buffer to Char Arry
    }

    Serial.println(Chars); //Debug only
    Decode(Chars); //Send to deconder
    digitalWrite(13, false); //onboard LED OFF 
  }
}

void Decode(char* Raw)
{

  String Code = (String)Raw; //From Char Array to string
  if (Code.startsWith("#C")) //Looks if Code starts With #C
  {
    TempC = Code.substring(2,7); //get 2 to 7 char and put in int TempC string
    derece  = TempC.toInt() ;

}

  if (Code.startsWith("#H")) //Looks if Code starts With #H
  {
    Vocht = Code.substring(2,4);//get 2 to 4 char and put in int Vocht string
    nem  = Vocht.toInt() ;//convert it string to integer

}

  if (Code.startsWith("#P")) //Looks if Code starts With #P
  {
    Druk =  Code.substring(2,8);//get 2 to 8 char and put in int Druk string
    basinc  = Druk.toInt() ;
  
}

  SetScreen();  //Call Funtion
}

//Herbouw scherm
void SetScreen()
{

  lcd.clear(); //Cleas LCD
  lcd.begin(20, 4); //set screen res

  if (TempC != "")
  {
    lcd.setCursor(0, 0); //Set Cursos
//    lcd.print(((String)"  ISI = " + TempC + " C")); //Writes text with received value
    lcd.print(((String)"  ISI = "  + TempC + " C ")); //Writes text with received value
 lcd.write(1);
  }

  if (Vocht != "")
  {
    lcd.setCursor(0, 1); //Set Cursos
    lcd.print(((String)"    NEM = " + Vocht +  "% ")); //Writes text with received value
lcd.write(2);  
}

  if (Druk != "")
  {
    lcd.setCursor(0, 2); //Set Cursos
    lcd.print(((String)" BASINC = " + Druk +  " HPA"));//Writes text with received value
  }
  lcd.display();
if (derece < 15 ){ lcd.setCursor(0,3); lcd.print(" WEATHER IS COLD"); } else if (derece>35){
lcd.setCursor(0,3);
lcd.print("  WEATHER IS HOT");

}
if (basinc > 999 || basinc < 985 ){
lcd.setCursor(0,3);
lcd.print("WEATHER NOT SUITABLE");

}
}


Kütüphaneyi Buradan indirebilirsiniz

 

Comments are closed