Topraksız Tarım Otomasyonu
Bu Blog, akvaponik/hidroponik veya su kalitesiyle ilgili projeleriniz için ucuz bir EC ve PH ölçer aynı zamanda 4 buton ile menü kontrolü yapabildiğimiz, 4 rölesi olan 2si zaman biri ec biri ph'a göre tetiklenen bir projeyi nasıl yapılacağını göreceğiz.
Malzemeler;
- I2C Modüllü lcd ekran 4x20
- Direnç (500ohm-1kohm)
- 2li pcb klamens
- DS3231 (veya muadili)
- Ph sensörü
- 4 adet push button
- DS18B20 Sıcaklık Sensörü
- Arduino nano
- 4lü röle modülü
Kütüphaneler;
Kütüphane kurulumu ve malzemeler tamam olduguna göre kodu yükleyebiliriz. Kalibrasyon menü tuşlarından ulaşılabilir. röle atamaları menü tuşundan yapılabilir. daha fazla püf noktalar kod içinde mevcuttur. Bu projenin kaynak olarak ele aldığı sayfalarıda inceleyebilirsiniz.
bir sorunla karşılaşırsanız iletişime geçmekten çekinmeyiniz.
bir sorunla karşılaşırsanız iletişime geçmekten çekinmeyiniz.
Kod;
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//-----------------EC Değişkenleri-----------------------
float CalibrationEC = 1.4; //Kalibrasyon çözeltisinin EC değeri s / cm'dir
float PPMconversion = 0.64; // ppm değişken sabiti EU
float TemperatureCoef = 0.019; //Sıcaklık telafi oranı
int R1 = 500;
int Ra = 25; //iç direnç
int ECPin = A0;
int ECPower = A1;
#define ONE_WIRE_BUS 10 // sıcaklık probu tanımlaması
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float Temperature = 0;
float EC = 0;
float EC25 = 0;
float EC25r = 1.20;
int ppm = 0;
float raw = 0;
float Vin = 5;
float Vdrop = 0;
float Rc = 0;
float K = 1.40;
int i = 0;
float buf = 0;
int eckk = 0;
//-----------------------PH DEGİSKENLERİ--------------------
const int analogInPin = A3; //PH Sensör pin numarası
int sensorValue = 0;
unsigned long int avgValue;
float b;
int bf[10], temp;
float Kph = 24.00;
float phValue = 0.0;
float phr = 0.0;
//------------------------LCD-------------------------------
LiquidCrystal_I2C lcd(0x27, 20, 4);
//-----------------------Zaman------------------------------
RTC_DS1307 rtc;
word tmgn1 = 0; //NE KADARDA BİR AÇIK KALACAK
word tmgn2 = 0; //NE KADARDA BİR AÇIK KALACAK
word tmst1 = 0; //NE KADAR ACIK KALACAK RL
word tmst2 = 0; //NE KADAR ACIK KALACAK RL
word sycnow = 0;
word sycday = 0;
word sycnow1 = 0;
word sycday1 = 0;
word sycdk1 = 0;
word sycdk2 = 0;
word st1 = 0;
word st2 = 0;
byte kp1 = 0;
byte kp2 = 0;
word dk1 = 0;
word dk2 = 0;
//------------------------Buton ve Röle Giriş Çıkış---------
byte ok = 0; //D2
byte okd = 0;
byte m = 0; //D3
byte md = 0; //Menü değeri tutma
byte up = 0; //D4
byte down = 0; //D5
void setup() {
rtc.begin();
Serial.begin(9600);
lcd.begin();
lcd.backlight();
//----------------------------------EC SETUP---------------
pinMode(ECPin, INPUT);
pinMode(ECPower, OUTPUT);
R1 = (R1 + Ra);
sensors.begin(); // sıcaklık sensörü bassladi
//---------------------------------BUTON VE RÖLE SETUP-----
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
//----------------------------------EEPROM OKUNAN VERİ BÖLGESİ----
EEPROM.get(0, K); //ec kalibrasyonu hafızadan çağır.
EEPROM.get(50, Kph); //ph kalibrasyonu hafızadan çağır.
EEPROM.get(100, EC25r); //ec röle değişkenini hafızadan çağırır.
EEPROM.get(150, phr); //ph röle değişkenini hafızadan çağırır.
tmgn1 = EEPROM.read(200);
tmst1 = EEPROM.read(210);
tmgn2 = EEPROM.read(220);
tmst2 = EEPROM.read(230);
sycday = EEPROM.read(240); //gün sayıcı
sycday1 = EEPROM.read(250); //ay sayıcı
sycnow = EEPROM.read(260); //simdiki zaman kıyası
sycnow1 = EEPROM.read(270); //simdiki zaman kıyası
/*
Serial.print("Ec Kalibrasyon Degeri = ");
Serial.println(K);
Serial.print("pH Kalibrasyon Degeri = "); // EEPROMLARI OKU !!!
Serial.println(Kph);
Serial.print("Ec25r Degisken Degeri = ");
Serial.println(EC25r);
Serial.print("phr Degisken Degeri = ");
Serial.println(phr);
Serial.print("Zaman gun 1 Degeri = ");
Serial.println(tmgn1);
Serial.print("Zaman saat 1 Degeri = ");
Serial.println(tmst1);
Serial.print("Zaman gun 2 Degeri = ");
Serial.println(tmgn2);
Serial.print("Zaman saat 2 Degeri = ");
Serial.println(tmst2);
*/
}
void loop() {
DateTime now = rtc.now();
ok = digitalRead(2);
m = digitalRead(3);
up = digitalRead(4);
down = digitalRead(5);
//------------------------------------------------------------------------
if (m == LOW) {
if (md < 0) {
md = 3;
}
else if (md > 6) { //Menü basılınca sayaç...
md = 0;
}
else md += 1;
delay(500);
}
//---------------------------------------------------------------------------
switch (md) {
case 0:
anaMenu();
break;
case 1:
rl1();
tmsyc();
tmkrr();
break;
case 2:
rl2();
tmsyc();
tmkrr();
break;
case 3:
rl3();
tmsyc();
tmkrr();
break;
case 4:
rl4();
tmsyc();
tmkrr();
break;
case 5:
phk();
tmsyc();
tmkrr();
break;
case 6:
eck();
tmsyc();
tmkrr();
break;
}
}
void anaMenu() {
DateTime now = rtc.now();
lcd.setCursor(0, 0);
lcd.print(" Semruk ");
lcd.setCursor(0, 1);
lcd.print("EC:");
lcd.print(EC25);
lcd.setCursor(7, 1);
lcd.print(" PPM:");
lcd.print(ppm);
lcd.setCursor(0, 2);
lcd.print("PH:");
lcd.print(phValue);
lcd.setCursor(7, 2);
lcd.print(" SIC:");
lcd.print(Temperature, 1);
lcd.setCursor(0, 3);
lcd.print(" ");
lcd.print (now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(" ");
lcd.print(now.year(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.day(), DEC);
ec();
ph();
tmsyc();
tmkrr();
//---------------------------------rl1 kontrol--------------------------------
if (EC25 > EC25r) {
digitalWrite(6, HIGH);
delay(10);
}
else if (EC25 <= EC25r) {
digitalWrite(6, LOW);
delay(10);
}
//---------------------------------rl2 kontrol---------------------------------
else if (phValue > phr)
{
digitalWrite(7, HIGH);
delay(10);
}
else if (phValue <= phr ) {
digitalWrite(7, LOW);
delay(10);
}
//----------------------------------rl3 kontrol-----------------------------------
//delay(5000); //Yenileme hızı
}
void tmkrr() {
DateTime now = rtc.now();
if (sycday >= tmgn1) { //gün geldi
digitalWrite(8, HIGH); // röle aç
sycday = 0;
EEPROM.write(240, sycday);
kp1 = 1; // açık kalma süresini başlat
delay(10);
}
else if (kp1 == 1) {
if (sycdk1 >= tmst1) { //açık kalma süresi kontrol
digitalWrite(8, LOW); // açık kalma doldu ise kapat
kp1 = 0;
sycdk1 = 0;
delay(10);
}
else if (st1 != now.minute())
{
st1 = now.minute(); // açık kalma süresi hesaplama
sycdk1 = sycdk1 + 1;
delay(10);
}
}
//-------------------------------------------------------------------------------------------------
else if (sycday1 >= tmgn2) {
digitalWrite(9, HIGH);
sycday1 = 0;
EEPROM.write(250, sycday1);
kp2 = 1;
delay(10);
}
else if (kp2 == 1) {
if (sycdk2 >= tmst2) {
digitalWrite(9, LOW);
kp2 = 0;
sycdk2 = 0;
delay(10);
}
else if (st2 != now.minute())
{
st2 = now.minute();
sycdk2 = sycdk2 + 1;
delay(10);
}
}
}
void tmsyc() {
DateTime now = rtc.now();
if (sycnow != now.day()) {
sycnow = now.day(); //gün sayıcı
sycday = sycday + 1;
EEPROM.write(240, sycday);
delay(10);
EEPROM.write(260, sycnow);
delay(10);
}
else if (sycnow1 != now.day()) {
sycnow1 = now.day(); //ay sayıcı
sycday1 = sycday1 + 1;
EEPROM.write(250, sycday1);
delay(10);
EEPROM.write(270, sycnow1);
delay(10);
}
}
void rl1() {
ok = digitalRead(2);
m = digitalRead(3);
up = digitalRead(4);
down = digitalRead(5);
if (up == LOW) {
EC25r = EC25r + 0.1;//------------------------------ARTTIRMA
delay(100);
}
else if (down == LOW) {
EC25r = EC25r - 0.1;//------------------------------AZALTMA
delay(100);
}
else if (ok == LOW) {
EEPROM.put(100, EC25r);
lcd.setCursor(0, 3);
lcd.print(" DEGER KAYIT EDILDI ");
delay(3000);
}
lcd.setCursor(0, 0);
lcd.print(" EC ROLE ");
lcd.setCursor(0, 1);
lcd.print("--------------------");
lcd.setCursor(0, 2);
lcd.print(" EC=");
lcd.setCursor(8, 2);
lcd.print(EC25r);
lcd.print(" S/cm ");
lcd.setCursor(0, 3);
lcd.print(" OK BAS ");
}
void rl2() {
ok = digitalRead(2);
m = digitalRead(3);
up = digitalRead(4);
down = digitalRead(5);
if (up == LOW) {
phr = phr + 0.1;//------------------------------ARTTIRMA
delay(100);
}
else if (down == LOW) {
phr = phr - 0.1;//------------------------------AZALTMA
delay(100);
}
else if (ok == LOW) {
EEPROM.put(150, phr);
lcd.setCursor(0, 3);
lcd.print(" DEGER KAYIT EDILDI ");
delay(3000);
}
lcd.setCursor(0, 0);
lcd.print(" PH ROLE ");
lcd.setCursor(0, 1);
lcd.print("--------------------");
lcd.setCursor(0, 2);
lcd.print(" PH=");
lcd.setCursor(8, 2);
lcd.print(phr);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(" OK BAS ");
}
void rl3() {
ok = digitalRead(2);
m = digitalRead(3);
up = digitalRead(4);
down = digitalRead(5);
if (ok == LOW) {
okd = okd + 1 ;
delay(300);
}
else if (okd == 0) {
ok = digitalRead(2);
m = digitalRead(3);
up = digitalRead(4);
down = digitalRead(5);
if (up == LOW) {
tmgn1 = tmgn1 + 1;//------------------------------ARTTIRMA
delay(100);
}
else if (down == LOW) {
tmgn1 = tmgn1 - 1;//------------------------------AZALTMA
delay(100);
}
lcd.setCursor(0, 0);
lcd.print(" Zaman Role 1 ");
lcd.setCursor(0, 1);
lcd.print("-- Gun: ");
lcd.print(tmgn1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print(" Dk: ");
lcd.setCursor(9, 2);
lcd.print(tmst1);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(" OK BAS ");
}
else if (okd == 1) {
ok = digitalRead(2);
m = digitalRead(3);
up = digitalRead(4);
down = digitalRead(5);
if (up == LOW) {
tmst1 = tmst1 + 1;//------------------------------ARTTIRMA
delay(100);
}
else if (down == LOW) {
tmst1 = tmst1 - 1;//------------------------------AZALTMA
delay(100);
}
lcd.setCursor(0, 0);
lcd.print(" Zaman Role 1 ");
lcd.setCursor(0, 1);
lcd.print(" Gun: ");
lcd.print(tmgn1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("-- Dk: ");
lcd.setCursor(9, 2);
lcd.print(tmst1);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(" OK BAS ");
}
else if (okd >= 2) {
okd = 0;
EEPROM.write(200, tmgn1);
EEPROM.write(210, tmst1);
lcd.setCursor(0, 3);
lcd.print(" KAYIT EDILDI ");
delay(2000);
}
}
void rl4() {
ok = digitalRead(2);
m = digitalRead(3);
up = digitalRead(4);
down = digitalRead(5);
if (ok == LOW) {
okd = okd + 1 ;
delay(300);
}
else if (okd == 0) {
ok = digitalRead(2);
m = digitalRead(3);
up = digitalRead(4);
down = digitalRead(5);
if (up == LOW) {
tmgn2 = tmgn2 + 1;//------------------------------ARTTIRMA
delay(100);
}
else if (down == LOW) {
tmgn2 = tmgn2 - 1;//------------------------------AZALTMA
delay(100);
}
lcd.setCursor(0, 0);
lcd.print(" Zaman Role 2 ");
lcd.setCursor(0, 1);
lcd.print("-- Gun: ");
lcd.print(tmgn2);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print(" Dk: ");
lcd.setCursor(9, 2);
lcd.print(tmst2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(" OK BAS ");
}
else if (okd == 1) {
ok = digitalRead(2);
m = digitalRead(3);
up = digitalRead(4);
down = digitalRead(5);
if (up == LOW) {
tmst2 = tmst2 + 1;//------------------------------ARTTIRMA
delay(100);
}
else if (down == LOW) {
tmst2 = tmst2 - 1;//------------------------------AZALTMA
delay(100);
}
lcd.setCursor(0, 0);
lcd.print(" Zaman Role 2 ");
lcd.setCursor(0, 1);
lcd.print(" Gun: ");
lcd.print(tmgn2);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("-- Dk: ");
lcd.setCursor(9, 2);
lcd.print(tmst2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(" OK BAS ");
}
else if (okd >= 2) {
okd = 0;
EEPROM.write(220, tmgn2);
EEPROM.write(230, tmst2);
lcd.setCursor(0, 3);
lcd.print(" KAYIT EDILDI ");
delay(2000);
}
}
void ph() {
for (int i = 0; i < 10; i++)
{
bf[i] = analogRead(analogInPin); //10 TANE DEĞER OKU YAZ
delay(100);
}
for (int i = 0; i < 9; i++)
{
for (int j = i + 1; j < 10; j++)
{
if (bf[i] > bf[j])
{
temp = bf[i];
bf[i] = bf[j];
bf[j] = temp;
}
}
}
avgValue = 0;
for (int i = 2; i < 8; i++)
avgValue += bf[i];
float pHVol = (float)avgValue * 5.0 / 1024 / 6; //VOLTAJ HESABI
phValue = -5.70 * pHVol + Kph; //PH HESABI
/*Serial.print("pH Degeri = ");
Serial.println(phValue); */
delay(20);
}
void ec() {
sensors.requestTemperatures();
Temperature = sensors.getTempCByIndex(0);
digitalWrite(ECPower, HIGH);
raw = analogRead(ECPin);
raw = analogRead(ECPin);
digitalWrite(ECPower, LOW);
Vdrop = (Vin * raw) / 1024.0;
Rc = (Vdrop * R1) / (Vin - Vdrop);
Rc = Rc - Ra; //acounting for Digital Pin Resitance
EC = 1000 / (Rc * K);
EC25 = EC / (1 + TemperatureCoef * (Temperature - 25.0));
ppm = (EC25) * (PPMconversion * 1000);
}
//-------------------------------------------------PH KALİBRASYON BÖLGESİ--------------------------------
void phk() {
ok = digitalRead(2);
m = digitalRead(3);
up = digitalRead(4);
down = digitalRead(5);
lcd.setCursor(3, 0);
lcd.print("PH KALIBRASYON");
lcd.setCursor(0, 1);
lcd.print("--------------------");
lcd.setCursor(0, 2);
lcd.print(" PH=");
lcd.setCursor(8, 2);
lcd.print(phValue);
lcd.print(" pH ");
lcd.setCursor(1, 3);
lcd.print("Kaydetmek icin OK ");
if (up == LOW) {
Kph = Kph + 0.1;//------------------------------ARTTIRMA
delay(100);
}
else if (down == LOW) {
Kph = Kph - 0.1;//------------------------------AZALTMA
delay(100);
}
else if (ok == LOW) {
lcd.setCursor(0, 3);
lcd.print(" Kayit edildi. ");
EEPROM.put(50, Kph); //EEPROM KAYIT KPH
delay(100);
}
for (int i = 0; i < 10; i++)
{
bf[i] = analogRead(analogInPin); //10 TANE DEĞER OKU YAZ
delay(100);
}
for (int i = 0; i < 9; i++)
{
for (int j = i + 1; j < 10; j++)
{
if (bf[i] > bf[j])
{
temp = bf[i];
bf[i] = bf[j];
bf[j] = temp;
}
}
}
avgValue = 0;
for (int i = 2; i < 8; i++)
avgValue += bf[i];
float pHVol = (float)avgValue * 5.0 / 1024 / 6; //VOLTAJ HESABI
phValue = -5.70 * pHVol + Kph; //PH HESABI
/*Serial.print("pH Degeri = ");
Serial.println(phValue);
Serial.print("pH Kalibrasyon Degeri = ");
Serial.println(Kph); */
delay(20);
}
//-----------------------------------------------------EC KALİBRASYON BÖLGESİ--------------------------
void eck() {
int a = 0;
lcd.setCursor(3, 0);
lcd.print("EC KALIBRASYON");
lcd.setCursor(0, 1);
lcd.print("--------------------");
lcd.setCursor(0, 2);
lcd.print(" EC=");
lcd.setCursor(8, 2);
lcd.print(CalibrationEC);
lcd.print(" S/cm ");
lcd.setCursor(0, 3);
lcd.print(" K = ");
ok = digitalRead(2);
m = digitalRead(3);
up = digitalRead(4);
down = digitalRead(5);
if (up == LOW) {
CalibrationEC = CalibrationEC + 0.1;
lcd.setCursor(8, 2);
lcd.print(CalibrationEC); //------------------------------ARTTIRMA
lcd.print(" S/cm ");
delay(100);
}
else if (down == LOW) {
CalibrationEC = CalibrationEC - 0.1;
lcd.setCursor(8, 2);
lcd.print(CalibrationEC); //------------------------------AZALTMA
lcd.print(" S/cm ");
delay(100);
}
else if (ok == LOW) {
a = 1; //------------------------------ONAYLAMA
}
if (a == 1) {
lcd.setCursor(0, 1);
lcd.print(" Bekleyin... ");
i = 1;
buf = 0;
//*************************************Sıvının Direncini Tahmin Eder *******************
while (i <= 10)
{
digitalWrite(ECPower, HIGH);
raw = analogRead(ECPin);
raw = analogRead(ECPin);
digitalWrite(ECPower, LOW);
buf = buf + raw;
i++;
delay(5000);
}
raw = (buf / 10);
sensors.requestTemperatures();
Temperature = sensors.getTempCByIndex(0);
//*************************************Sıcaklık için Telafi Etme************************
EC = CalibrationEC * (1 + (TemperatureCoef * (Temperature - 25.0))) ;
//*************************************Kalibrasyon sıvısı ile ilgili K'yi hesaplar *****
Vdrop = (((Vin) * (raw)) / 1024.0);
Rc = (Vdrop * R1) / (Vin - Vdrop);
Rc = Rc - Ra;
K = 1000 / (Rc * EC);
Serial.print("Kalibrasyon Sivisi degeri: ");
Serial.print(CalibrationEC);
Serial.print(" S ");
Serial.print("Hücre Sabiti:");
Serial.print(K);
lcd.setCursor(8, 3);
lcd.print(K);
EEPROM.put(0, K);
lcd.setCursor(1, 1);
lcd.print("Degerler bellekte");
delay(5000);
lcd.setCursor(1, 1);
lcd.print(" ");
eckk = 0;
}
}
Yorumlar
Yorum Gönder
Düşüncelerini veya yorumlarını bizimle paylaş.