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