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.

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.

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);
}

















