Arduino Toprak Nem Ölçüm ve Otomatik Sulama Sistemi

0
7430
Arduino Toprak Nem Ölçüm ve Otomatik Sulama Sistemi
Arduino Toprak Nem Ölçüm ve Otomatik Sulama Sistemi

Arduino Toprak Nem Ölçüm ve Otomatik Sulama Sistemi

Bahçede/tarlada olan biten her şeyi internet üzerinden öğrenmenin zamanı geldi. Arduino’ya direk olarak bağlı olan wifi, nem ve sıcaklık sensörleri ile projemizi gerçekleştireceğiz. Bu işler için en uygun internet sayfası ise https:// www.carriots.com/ adresidir. Böylece verileri işleyip geri dönüş alabileceğiz. Eğer nem belirli bir eşiğin altına düşerse e-posta veya SMS ile uyarılacağız.

Kullanılan Malzemeler

  • Bir adet Arduino Uno kartı,
  • Bir adet CC3000 çipi (kablosuz ağ çipi),
  • Bir adet sıcaklık ve nem sensörü (SHT10).

Tasarım

Bilgileri internetten öğrenmek için Carriots sitesine üye olacağız.

Hesap oluşturduktan sonra toprağı kontrol edebilmek için gerekli olan sensör seçimi yapılmalı. Bunun için “Device Management” bölümüne gelip, toprak sensörümüz olan SoilSensor‘u oluşturacağız. New butonuna basın ve sensörü oluşturun. Sensörün bilgileri aşağıdaki gibidir. Bilgileri tamamladıktan sonra

Create diyerek oluşturma işini tamamlayın.

  • Name: SoilSensor,
  • Time Zone: Şehriniz,
  • Type ve Sensör: Other,
  • Data Stream Frequency ve Status Stream Frequeny:

Son olarak API anahtarımızı bilmemiz gerekir, anahtara My Settings/My Account bölümünden ulaşabilirsiniz.

İnternet kısmını bitirdikten sonra devrenin hazırlanışına geçelim.

Arduino Toprak Nem Ölçüm ve Otomatik Sulama Sistemi
Arduino Toprak Nem Ölçüm ve Otomatik Sulama Sistemi

Projemizin internet ile bağlantı kuracağını söylemiştik. Bunun için gerekli olan CC3000 çipini Aruino Uno kartı ile bağlayalım. Çip üzerinde 12 bağlantı noktası bulunur. Alttaki üçü GND, TXD, RXD topraklama ve seri haberleşme pinleri. Sağdaki 9 pin üstten alta doğru IRQ, VBAT, CS, MOSI, MISO, CLK, VIN, 3V3 ve GND uçlarıdır.

Toprak sensörünün içinde 4 kablo vardır. Bu kabloların hepsini de kart ile bağlıyoruz.

Arduino Toprak Nem Ölçüm ve Otomatik Sulama Sistemi
Arduino Toprak Nem Ölçüm ve Otomatik Sulama Sistemi

Kodlama

Kodlamaya başlamadan önce CC3000 ve Sensirion kütüphanelerini aşağıdaki adreslerden indirip, bilgisayarınızdaki Arduino kütüphanesine “libraries” klasörüne yapıştırınız. Kod bloğu açıksa, kapatıp tekrar açınız.

CC300 Kütüphanesi: https://github.com/adafruit/Adafruit_CC3000_Library

Sensirion kütüphanesi:   http://playground.arduino.cc/uploads/Code/Sensirion_ 10Dec2010.zip

Şimdi Carriots bulut hizmetine veri göndermek için her şey hazırdır. Arduino’ya bu işi web sitesi üzerinden yaptığımızı ve bir API koduna sahip olduğumuzu söyleyeceğiz.

// eklenecek kütüphaneler

#include <Adafruit_CC3000.h>

#include <ccspi.h>

#include <SPI.h>

#include <string.h>

#include "utility/debug.h"

#include "DHT.h"

#include<stdlib.h>

#include <Sensirion.h>



// cc3000 çipinin pinleri

#define ADAFRUIT_CC3000_IRQ   3

#define ADAFRUIT_CC3000_VBAT  5

#define ADAFRUIT_CC3000_CS    10



// toprak sensörünün pinleri

const uint8_t dataPin  =  6;

const uint8_t clockPin =  7;



// toprak sensörünün değişkenleri

float t;  // sıcaklık için

float h;  // nem için

float dewpoint;



// toprak sensörü oluşturuluyor

Sensirion soilSensor = Sensirion(dataPin, clockPin);



// cc3000 örneklemesi yapılıyor

Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, 

ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT, SPI_CLOCK_DIV2); 

// you can change this clock speed

                                

// WLAN parametreleri

#define WLAN_SSID       "yourSSID"

#define WLAN_PASS       "yourPassword"

// güvenlik için WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2

#define WLAN_SECURITY   WLAN_SEC_WPA2



// Carriots pparametreleri

#define WEBSITE  "api.carriots.com"

#define API_KEY "yourApiKey"

#define DEVICE  "yourDeviceName@yourUserName"



uint32_t ip;



void setup(void)

{

  // başlatma işlemleri

  Serial.begin(115200);

  

  Serial.println(F("\nBaslatiliyorrr..."));

  if (!cc3000.begin())

  {

    Serial.println(F("Baslatilamadi.Kablolari kontrol edin..."));

    while(1);

  }

 

}



void loop(void)

{

  // WiFi ağına bağlanıldıığında

  cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY);

  Serial.println(F("Baglanildi!"));

  

  /* DHCP tarafından cevap verildiğinde  */

  Serial.println(F("DHCP cevap verdi"));

  while (!cc3000.checkDHCP())

  {

    delay(100);

  }  

 

  // IP işlemleri

  ip = 0;

  Serial.print(WEBSITE); Serial.print(F(" -> "));

  while (ip == 0) {

    if (! cc3000.getHostByName(WEBSITE, &ip)) {

      Serial.println(F("IP cozulemedi!"));

    }

    delay(500);

  }

  cc3000.printIPdotsRev(ip);

  

  // Veriler siteden alınır.

  soilSensor.measure(&t, &h, &dewpoint);

 

  // sayısal veriler metinlere dönüştürülür

  String temperature = doubleToString(t,2);

  String humidity = doubleToString(h,2);

 

  // veriler JSON için hazırlanır

  int length = 0;



String data = "{\"protocol\":\"v2\",\"device\":\""+String(DEVICE)+"\",\"at\":\"now\",\"data\"

:{\"Temperature\":"+String(temperature)+",\"Humidity\":"+String(humidity)+"}}";

  

  length = data.length();

  Serial.print("veri uzunlugu");

  Serial.println(length);

  Serial.println();

  

  // bilgiler yazdırılır

  Serial.println("POST /streams HTTP/1.1");

  Serial.println("Host: api.carriots.com");

  Serial.println("Accept: application/json");

  Serial.println("User-Agent: Arduino-Carriots");

  Serial.println("Content-Type: application/json");

  Serial.println("carriots.apikey: " + String(API_KEY));

  Serial.println("Content-Length: " + String(length));

  Serial.print("Connection: close");

  Serial.println();

  Serial.println(data);

  

  // istek gönderilir

  Adafruit_CC3000_Client client = cc3000.connectTCP(ip, 80);

  if (client.connected()) {

    Serial.println("Connected!");

    client.println("POST /streams HTTP/1.1");

    client.println("Host: api.carriots.com");

    client.println("Accept: application/json");

    client.println("User-Agent: Arduino-Carriots");

    client.println("Content-Type: application/json");

    client.println("carriots.apikey: " + String(API_KEY));

    client.println("Content-Length: " + String(length));

    client.println("Connection: close");

    client.println();

    

    client.println(data);

    

  } else {

    Serial.println(F("baglanti hatasi"));    

    return;

  }

  

  Serial.println(F("-------------------------------------"));

  while (client.connected()) {

    while (client.available()) {

      char c = client.read();

      Serial.print(c);

    }

  }

  client.close();

  Serial.println(F("-------------------------------------"));

  

  Serial.println(F("\n\nbaglanilamadi"));

  cc3000.disconnect();

  

  // güncelleme için 10 saniye beklenir

  delay(10000);

   

}



// veriler arası dobule-string dönüşüm

String doubleToString(float input,int decimalPlaces){

  if(decimalPlaces!=0){

    String string = String((int)(input*pow(10,decimalPlaces)));

      if(abs(input)<1){

        if(input>0)

          string = "0"+string;

        else if(input<0)

          string = string.substring(0,1)+"0"+string.substring(1);

      }

      return string.substring(0,string.length()-decimalPlaces)+"."+string.substring(

string.length()-decimalPlaces);

    }

  else {

    return String((int)input);

  }

}

SHT10 Sensörünün test kodları aşağıdaki gibidir.

// kütüphane eklenmesi

#include <Sensirion.h>



// Sensor pinleri

const uint8_t dataPin  =  6;

const uint8_t clockPin =  7;



// sıcaklık ve nem değişkenleri

float temperature; //sıcaklık

float humidity;    //newm

float dewpoint;



// sensör örneği oluşturuluyor

Sensirion soilSensor = Sensirion(dataPin, clockPin);



void setup()

{

  Serial.begin(115200);

}



void loop()

{

  // ölçüm yapma

  soilSensor.measure(&temperature, &humidity, &dewpoint);



  //  ve sonuçları yazdırma

  Serial.print("Temperature: ");

  Serial.print(temperature);

  Serial.print(" C, Humidity: ");

  Serial.print(humidity);

  Serial.print(" %");

  Serial.println("");

  

  // yeni ölçümden önce 10 ms bekleme

  delay(100);  

}

 

CEVAP VER

Please enter your comment!
Please enter your name here