Arduino ve Visual Basic İle Rf Üzerinden Sıcaklık Nem Ölçümü

13 523

Arduino ile 433mhz rf kullanarak visual basic ile yapacağımız programda sıcaklık ve nem değerlerini anlık olarak ekranda görebileceğiz.Projemizde önce sıcaklık ve nem ölçümü ile başlayalım daha sonra visual basic ile arayüz programımızı yapalım.Rf Üzerinden Sıcaklık Nem Ölçümü projemize başlıyoruz.

Malzemeler:

  1. 2 Adet Arduino ( model farketmez nano yeterli olacaktır.)
  2. 433 Mhz Rf Modül ( Bu projede 433 Mhz kullandık.Farklı frekanslardaki modülleri de kullanabilirsiniz)
  3. Sıcaklık Nem Ölçer Modül

Elektronik Kısım:

Verici Devresi:

Verici devresi ile sıcaklık ve nem değerleri alıcı devresine gönderilecek.

Devrenin pin bağlantıları:

Tx sinyal pin >> Arduino Dijital 3.pin

Sıcaklık-Nem Sensör Data Pin >> Arduino Dijital 2.pin

Alıcı Devresi:

Alıcı devremiz vericiden gelen dataları alarak bilgisayara aktaracak.

Devre Bağlantıları:

Rx sinyal pin >> Arduino Dijital 11.pin

Alıcı ve verici devremizi tamamladık.Şimdi visual basic ile arayüz programımızı yazmaya başlayalım.

Visual Basic Arayüz Programı:

Formun tasarımını aşağıdaki gibi yapabilirsiniz.

Formumuz İçin Gerekli Araçlar:

  1. 3 Adet Buton
  2. 2 Adet Combobox
  3. 2 Adet Progressbar
  4. 11 Adet Label
  5. 2 Adet Picturebox
  6. 1 Adet SerialPort
  7. 1 Adet Timer

Formun Yazılım Kısmı:

  • Sistem kütüphanelerini ekleyelim.
Imports System
Imports System.ComponentModel
Imports System.Threading
Imports System.IO.Ports
  • SerialPort nesnemizi tanımlayalım.
Dim myPort As Array 'port ismi tanımlama
Delegate Sub SetTextCallback(ByVal
 
<pre>1</pre>
 
As String)
  • Formun Load Kısmına tanımlamalarımızı yapalım.
 myPort = IO.Ports.SerialPort.GetPortNames()
ComboBox2.Items.Add(9600)
ComboBox2.Items.Add(19200)
ComboBox2.Items.Add(38400)
ComboBox2.Items.Add(57600)
ComboBox2.Items.Add(115200)
For i = 0 To UBound(myPort)
ComboBox1.Items.Add(myPort(i))
Next
ComboBox1.Text = ComboBox1.Items.Item(0)
ComboBox2.Text = ComboBox2.Items.Item(0)
Button2.Enabled = False
  • Veri almamız için porta bağlanmamızı sağlayacak butonumuza gerekli tanımlamaları yapalım.
Timer1.Start()
SerialPort1.PortName = ComboBox1.Text
SerialPort1.BaudRate = ComboBox2.Text
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.DataBits = 8
SerialPort1.Open()
Label10.Text = "Sensöre Bağlanıldı"
Button1.Enabled = False
Button2.Enabled = True
TextBox4.ForeColor = Color.Green
Label11.Text = "Veri Alınıyor..."
  • Veri alımını durdurmak için bağlantıyı kes butonumuza gerekli tanımlamaları yapalım.
Timer1.Stop()
SerialPort1.Close()
Button1.Enabled = True
Button2.Enabled = False
TextBox3.ForeColor = Color.Red
Label10.Text = "Bağlantı Kesildi."
Label11.Text = "Veri Durduruldu."
  • Portu seçmemiz için comboboxların birine tanımlamamızı yapalım.
If SerialPort1.IsOpen = False Then
SerialPort1.PortName = ComboBox1.Text
Else
MsgBox("Port açıkken değiştirilemez", vbCritical)
End If
  • Baud rate değerini seçmemiz için gerekli tanımlamamızı yapalım.
If SerialPort1.IsOpen = False Then
SerialPort1.BaudRate = ComboBox2.Text
Else
MsgBox("Port açıkken değiştirilemez", vbCritical)
End If
  • Son olarak serialden veri almamızı sağlayacak timer kısmına gerekli tanımlamamızı yapalım.
 Dim str As String
str = "1"
SerialPort1.Write(str)
 
Dim receiveddata As Integer = SerialPort1.ReadLine() 'serial portu okuma ve datayı yazdırma
Label7.Text = receiveddata
If receiveddata < 0 Then
ProgressBar1.Value = -receiveddata
 
Else
ProgressBar1.Value = receiveddata
 
End If
 
System.Threading.Thread.Sleep(500)
Dim receiveddata2 As Integer = SerialPort1.ReadLine()
Label8.Text = receiveddata2
 
ProgressBar2.Value = receiveddata2
 
System.Threading.Thread.Sleep(500)

Visual Basic İle Programımızı yazdık.Şimdi Arduino Yazılımına geçebiliriz.

 

Arduino Yazılımı:

Verici Yazılımı:

// Yazılım Geliştirme By ROBİMEK - 2015</pre>
 
#include <VirtualWire.h>
#include <dht11.h> // dht11 kütüphanesini ekliyoruz.
#define DHT11PIN 2 // DHT11PIN olarak Dijital 2'yi belirliyoruz.
 
dht11 DHT11;
char msg[6];
 
void setup() {
 
 vw_setup(2400);
 vw_set_tx_pin(3);
 
}
 
void loop() {
 int chk = DHT11.read(DHT11PIN);
 int sicaklik =DHT11.temperature;
 int nem = DHT11.humidity;
 sprintf(msg, "%d,%d", sicaklik, nem);
 
 vw_send((uint8_t *)msg, strlen(msg));
 
 vw_wait_tx();
 delay(1000);
 
}

Alıcı Yazılımı:

// Yazılım Geliştirme By ROBİMEK - 2015
#include <VirtualWire.h>
int sicaklik;
int nem;
 
int i;
 
char x;
char StringReceived[6];
void setup(){
 
Serial.begin(115200);
 
vw_set_rx_pin(11);
vw_setup(2400);
vw_rx_start();
 
}
 
void loop(){
 
if(Serial.available()>0)
x=Serial.read();
 
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if(x=='1')
{
if( vw_get_message(buf, &buflen) )
 
{
for (i = 0; i < buflen; i++)
 
{
StringReceived[i] = char(buf[i]);
}
sscanf(StringReceived, "%d,%d",&sicaklik, &nem);
Serial.println(sicaklik);
delay(500);
Serial.println(nem);
delay(500);
memset( StringReceived, 0, sizeof( StringReceived));
}
 
}
}

Projenin videosunda hc-05 ile hc-06 bluetooth modülleri haberleştirerek sıcaklık ve nem ölçümünü yaptık.İki bluetooth un nasıl haberleştiğini de yakın zamanda yayınlayacağım.Diğer bir yöntem de bilgisayarınıza  arduinoya bağlı bluetooth modülünü tanıtarak haberleştirmeyi sağlayabilirsiniz.

Buradan hc-05 ile hc-06 haberleşmesine bakabilirsiniz. >> hc-05 ile hc-06 haberleşmesi

Bluetooth ile haberleşme arduino kodunu aşağıdaki linkten indirebilirsiniz.

Bluetooth sıcaklık nem ölçümü

Rf ile haberleşmesi videosunu ilerleyen günlerde yayınlayacağım.

Yazılımda 500 milisaniye gecikme ile veri alımı gerçekleşiyor.

Bu değeri değiştirecekseniz formun timer kısmındaki System.Threading.Thread.Sleep(500) değerini de değiştirmelisiniz.Aksi halde yanlış değerler alırsınız.

Visual basic ve arduino yazılımını aşağıdaki linkten indirebilirsiniz.

SICAKLIK NEM KONTROL

 

Bunları da beğenebilirsin

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

13 Yorum

  1. ms

    iyi çalışmalar ben anlayamadım yazının başında rf alıcı verici ile başlanıyo sonra bluetooth modül kullanılıyo iletişim nasıl sağlanıyor bluetoothla mı rf modülle mi

    1. Sezgin GÜL

      Proje kodları rf modüle göre. Fakat videoda bluetooth ile yaptığımı çekmiştim. Yani iki sistemle de yapabilirsiniz İkisinin de kodu projede mevcut.

  2. ERDEM

    yaptım sonun mega kullanmıştım bmp180i a5 ve a4 pinlerine bağladığımda değer alamadım mega nın kendi scl sda pinlerini kullanınca oldu

  3. ERDEM

    kodu yazamadım bi yardımcı olurmusunuz bmp 180 i eklediğimde değerler donuyor

  4. ERDEM

    IS VE NEM DEĞERLERİNİ EKRAN YAZDIRDIM SONUNDA AMA BASINÇ DEĞERİNİ OKUYUP BİR DEĞİŞKENE ATAYAMIYORUM NASIL BİR KOD KULLANMAM LAZIM

      1. ERDEM

        verici kısmına bmp180 i ekleyemiyorum bu şekilde yapıyorum ancak hata veriyor

        #include //Load the library
        #include // dht11 kütüphanesini ekliyoruz.
        #include // Basınç Sensör kütüphanesi
        #include // I2C kütüphanesi
        #define DHT11PIN 2 // DHT11PIN olarak Dijital 2’yi belirliyoruz.

        SFE_BMP180 pressure; //sensör adı tanımlama

        dht11 DHT11;

        char msg[6];

        void setup()
        {
        vw_set_tx_pin(12); // Sets pin D12 as the TX pin
        vw_setup(2000); // Bits per sec

        }

        void loop() {

        int chk = DHT11.read(DHT11PIN);
        int sicaklik =DHT11.temperature;
        int nem = DHT11.humidity;
        int basinc = getPressure();

        sprintf(msg, “%d,%d,%d”, sicaklik, nem , basinc);

        vw_send((uint8_t *)msg, strlen(msg));

        vw_wait_tx();
        delay(200);

        }

  5. ERDEM

    dediklerinizi yaptım ancak ekrana yazdıramıyorum yardımcı olabilirmisiniz

  6. ERDEM

    bu kodu derleyemiyorum DHT.H KÜTÜPHANESİNDE sıkıntı var gibi kütüphaneleri ekledim yinede derlenmiyor
    //Including Libs
    #include
    #include “DHT.h”
    #include
    #include //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);
    }

  7. ERDEM

    merhaba arduino ile dht11 ve bmp180 sensörlerini kullanarak rf ile lcd ekrana sıcaklık basınç ve nem değerlerini yazdırmam lazım çok uğraştım ancak olmadı yardımcı olabilirmisiniz?

    1. Sezgin GÜL

      bmp180 örnek kodu buradan bakabilirsin. http://www.robimek.com/bmp180-basinc-sensoru-kullanimi/
      Bu projedeki koda ekle. sprintf(msg, “%d,%d”, sicaklik, nem); bu kısımda bir tane daha karakter aç basınç değeri için. Örnek olarak;
      sprintf(msg, “%d,%d,%d”, sicaklik, nem,basinc); bu şekilde vericiye entegre et.
      Aynı şekilde alıcıda da;
      sscanf(StringReceived, “%d,%d”,&sicaklik, &nem); buradaki kısmı
      sscanf(StringReceived, “%d,%d,%d”,&sicaklik, &nem, &basinc );
      bu şekilde yapabilirsin. tabi bu eklediklerimi de tanımlaman gerekiyor.

      1. ERDEM

        2×16 lcd kullanarak rf üzerinden ekrana yazdırmam lazım kod ekleyebilirseniz çok sevinirim

        1. Sezgin GÜL

          lcd kütüphanesindeki yazdırma fonksiyonlarına bakıp yapabilirsiniz.