Çok yoğun çalışan veya her gün okula giden insanlarız. Çok sevdiğimiz orkidemizi zamanında sulamayı unutabiliyoruz.
Bu nedenle bu projeyi geliştirmeye karar verdim. Bu projede adım adım Raspberry Pi kiti PicoBricks kullanarak IoT destekli, akıllı bitki pot'umuzu yapmayı sizlere göstereceğim. Hadi başlayalım.
Öncelikle akıllı çiçek saksınızı yapmaya başlamadan önce bitkinizin hangi sıklıkla sulanması gerektiğini öğrenmelisiniz. Bitkinizi az sulayıp kurutmak veya çok sulayıp öldürmek istemezsiniz değil mi? :) Ben de öyle düşünmüştüm.
Akıllı saksının özellikleri
- Anlık olarak toprağın nem ve sıcaklık ölçümünü gerçekleştiriyor.
- Ölçülen nem bilgileri OLED ekrana yazdırılıyor.
- 12x adressable led'de topraktaki nem seviyesine göre ışık yanıyor.
- Topraktaki nem miktarı ayarladığınız seviyenin altına düşerse akıllı saksı otomatik olarak sulama yapıyor.
Wiring Diagram
Gerekli Compoponentler
- Bir plat pot
- Raspberry Pi
- Pompa
- Su borusu
- Sıcaklık ve Nem Sensörü
- 12x Adressable Led
- OLED Screen
Hepsi bu kadar. Üstelik eğer PicoBricks IoT kitine sahipseniz sıcaklık ve nem sensörüne ve OLED screen'e, Raspberry Pi Pico W'ya ve pompa'ya sahipsiniz demektir. Tek yapmanız gereken bir saksı ve led almanız.
Adım adım Smart Bitki Saksısı Nasıl Yapılır?
Şimdi sizlere adım adım tüm işlemleri anlatacağım merak etmeyin.
Adım 1: Tüm Malzemeleri Hazırlayın
Yukarıda yazdığımız malzemelerin hepsini aldıktan sonra bitkinize uygun toprağı saksınıza dökün ve toprağa bitkinizi yerleştirin. Nasıl yapacağınızı bilmiyorsanız şu rehber size yardımcı olabilir:
Halka LED'inizi saksınızın ortasına saksınızı yerleştirin.
Toprağa sıcaklık ve nem sensörünü daldırın.
Sıcaklık ve nem sensörünü Raspberry Pi'ınıza kablo ile bağlayın.
Nasıl yapılacağını bilmiyorsanız şu rehberi inceleyebilirsiniz:
How to connect Temperature sensor to Raspberry Pi?
Eğer PicoBricks'e sahipseniz kablo ve lehim ile uğraşmanıza gerek yok. :)
Adım 2: Kodları Raspberry Pi'a Yükleyin
Aşağıda bu proje için gerekli kodları bulabilirsiniz.
Thonny IDE ve Arduino C'ya uygun kodları verdik. Hangisi sizin için daha uygunsa onu kullanabilirsiniz.
Eğer bir PicoBricks'e sahipseniz ve PicoBricks'inize nasıl kod yüklenir bilmiyorsanız şu sayfamızı ziyaret edebilirsiniz:
BricksIDE Kodları
Python Kodları
from time import sleep
from machine import PWM
from machine import Pin
from machine import ADC
from picobricks import WS2812
from machine import I2C
from picobricks import SSD1306_I2C
import math
import machine
import time
motor_1 = PWM(Pin(21))
motor_1.freq(50)
motor_1.duty_u16(0)
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=200000)
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)
import math
adc_28 = machine.ADC(28)
while True:
motor_1.duty_u16(0 * 650)
ws2812 = WS2812((12), brightness = 1)
ws2812.pixels_fill(((0), (0), (0)))
ws2812.pixels_show()
oled.fill(0)
oled.text("{}".format("Soil Moisture "), 10, 0)
oled.text("{}".format("Value"), 45, 10)
soilMoistureValue = round(round( adc_28.read_u16() - 0 ) * ( 100 - 0 ) / ( 65535 - 0 ) + 0)
ledState = round(round( soilMoistureValue - 0 ) * ( 12 - 0 ) / ( 100 - 0 ) + 0)
print(ledState)
oled.text("{}".format(soilMoistureValue), 55, 30)
oled.show()
if ledState == (0):
ws2812 = WS2812((1), brightness = 1)
ws2812.pixels_fill(((255), (0), (0)))
ws2812.pixels_show()
motor_1.duty_u16(100 * 650)
time.sleep((1))
if ledState <= (4):
ws2812 = WS2812(ledState, brightness = 1)
ws2812.pixels_fill(((255), (0), (0)))
ws2812.pixels_show()
motor_1.duty_u16(100 * 650)
time.sleep((1))
if ledState > (4) and ledState <= (8):
ws2812 = WS2812(ledState, brightness = 1)
ws2812.pixels_fill(((0), (0), (255)))
ws2812.pixels_show()
motor_1.duty_u16(100 * 650)
time.sleep((0.5))
if ledState > (10) and ledState <= (16):
ws2812 = WS2812(ledState, brightness = 1)
ws2812.pixels_fill(((0), (255), (0)))
ws2812.pixels_show()
motor_1.duty_u16(0 * 650)
if ledState > (8) and ledState <= (12):
ws2812 = WS2812(ledState, brightness = 1)
ws2812.pixels_fill(((255), (0), (0)))
ws2812.pixels_show()
motor_1.duty_u16(0 * 650)
time.sleep((1))
Arduino C Kodları
#include
#include "ACROBOTIC_SSD1306.h"
#include
#define PIN 6
#define NUMPIXELS 25
#define SMO_SENSOR 28
#define PUMP_MOTOR 21
Adafruit_NeoPixel ring(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int ledState;
int soilMoistureValue;
void setup() {
Wire.begin();
oled.init();
oled.clearDisplay();
ring.begin();
ring.show();
ring.setBrightness(50);
pinMode(SMO_SENSOR,INPUT);
pinMode(PUMP_MOTOR, OUTPUT);
}
void loop() {
digitalWrite(PUMP_MOTOR, LOW);
oled.setTextXY(0, 1);
oled.putString("Soil Moisture");
oled.setTextXY(1, 4);
oled.putString("Value");
soilMoistureValue = round(map(analogRead(SMO_SENSOR), 0, 1023, 0, 100));
ledState = round(map(soilMoistureValue, 0, 100, 0, 25));
Serial.println(ledState);
oled.setTextXY(3,5);
oled.putString(String(soilMoistureValue));
if (ledState == 0) {
ring.setPixelColor(1, 255, 0, 0, 0);
ring.show();
digitalWrite(PUMP_MOTOR, HIGH);
delay(1000);
}
if (ledState <= 5) {
ring.setPixelColor(ledState, 255, 0, 0, 0);
ring.show();
digitalWrite(PUMP_MOTOR, HIGH);
delay(1000);
}
if (ledState > 5 && ledState <= 10) {
ring.setPixelColor(ledState, 0, 0, 255, 0);
ring.show();
digitalWrite(PUMP_MOTOR, HIGH);
delay(500);
}
if (ledState > 10 && ledState <= 16) {
ring.setPixelColor(ledState, 0, 255, 0, 0);
ring.show();
digitalWrite(PUMP_MOTOR, LOW);
}
if (ledState > 16 && ledState <= 25) {
ring.setPixelColor(ledState, 255, 0, 0, 0);
ring.show();
digitalWrite(PUMP_MOTOR, LOW);
}
delay(300);
}