206 lines
5.6 KiB
C++
206 lines
5.6 KiB
C++
#include <Wire.h>
|
|
#include <LiquidCrystal_I2C.h>
|
|
#include <OneWire.h>
|
|
#include <DallasTemperature.h>
|
|
#include <EEPROM.h>
|
|
#include <DHT.h>
|
|
|
|
// Inisialisasi LCD dengan alamat I2C 0x27, 16 kolom dan 2 baris
|
|
LiquidCrystal_I2C lcd(0x27, 16, 2);
|
|
|
|
// Data wire pin (D4 pada ESP8266)
|
|
const int ONE_WIRE_BUS = 2;
|
|
|
|
// Pin sensor pH (D6 pada ESP8266)
|
|
const int PH_SENSOR_PIN = 12;
|
|
|
|
// Pin relay untuk mengendalikan pompa (D5 pada ESP8266)
|
|
const int RELAY_PIN = 14;
|
|
|
|
// Pin sensor TDS (A0 pada ESP8266)
|
|
const int TdsSensorPin = A0;
|
|
|
|
// Pin sensor DHT (D0 pada ESP8266)
|
|
#define DHTPIN 13
|
|
#define DHTTYPE DHT11
|
|
|
|
#define VREF 3.3 // Tegangan referensi pada ADC
|
|
#define SCOUNT 30 // Jumlah sampel
|
|
|
|
int analogBuffer[SCOUNT]; // Menyimpan nilai analog dalam array, dibaca dari ADC
|
|
int analogBufferTemp[SCOUNT];
|
|
int analogBufferIndex = 0;
|
|
int copyIndex = 0;
|
|
|
|
float averageVoltage = 0;
|
|
float tdsValue = 0;
|
|
float temperatureDS18B20 = 25; // Nilai suhu asumsi, bisa diganti dengan pembacaan sensor suhu aktual
|
|
|
|
// Batas pH yang dianggap kurang nutrisi (sesuaikan dengan kebutuhan tanaman)
|
|
const float PH_THRESHOLD = 5.5;
|
|
|
|
// Setup oneWire instance untuk berkomunikasi dengan sensor
|
|
OneWire oneWire(ONE_WIRE_BUS);
|
|
|
|
// Setup DallasTemperature library
|
|
DallasTemperature sensors(&oneWire);
|
|
|
|
// Setup DHT sensor
|
|
DHT dht(DHTPIN, DHTTYPE);
|
|
|
|
unsigned long previousMillis = 0;
|
|
const long interval = 2000; // Interval waktu antar tampilan (2 detik)
|
|
bool showFirstScreen = true; // Penanda untuk tampilan pertama
|
|
|
|
void setup() {
|
|
// Inisialisasi Serial Monitor
|
|
Serial.begin(115200);
|
|
|
|
// Inisialisasi LCD
|
|
lcd.init();
|
|
lcd.backlight();
|
|
|
|
// Menampilkan pesan awal di LCD
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("Inisialisasi...");
|
|
delay(2000); // Tampilkan pesan awal selama 2 detik
|
|
lcd.clear();
|
|
|
|
// Inisialisasi sensor suhu DS18B20
|
|
sensors.begin();
|
|
|
|
// Inisialisasi sensor DHT
|
|
dht.begin();
|
|
|
|
// Inisialisasi pin relay sebagai output
|
|
pinMode(RELAY_PIN, OUTPUT);
|
|
digitalWrite(RELAY_PIN, LOW); // Matikan relay (pompa) saat memulai
|
|
|
|
// Inisialisasi pin sensor pH sebagai input
|
|
pinMode(PH_SENSOR_PIN, INPUT);
|
|
}
|
|
|
|
void loop() {
|
|
unsigned long currentMillis = millis();
|
|
|
|
if (currentMillis - previousMillis >= interval) {
|
|
previousMillis = currentMillis;
|
|
showFirstScreen = !showFirstScreen; // Ganti tampilan setiap 2 detik
|
|
}
|
|
|
|
// Membaca suhu dari sensor DS18B20
|
|
sensors.requestTemperatures();
|
|
float temperatureDS18B20 = sensors.getTempCByIndex(0);
|
|
|
|
// Membaca nilai dari sensor pH
|
|
int phValue = digitalRead(PH_SENSOR_PIN);
|
|
float pH = (phValue == HIGH) ? 7.0 : 4.0; // Konversi sederhana nilai digitalRead ke pH
|
|
|
|
// Membaca nilai dari sensor TDS
|
|
static unsigned long analogSampleTimepoint = millis();
|
|
if (millis() - analogSampleTimepoint > 10U) {
|
|
analogSampleTimepoint = millis();
|
|
analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin);
|
|
analogBufferIndex++;
|
|
if (analogBufferIndex == SCOUNT) {
|
|
analogBufferIndex = 0;
|
|
}
|
|
}
|
|
|
|
static unsigned long printTimepoint = millis();
|
|
if (millis() - printTimepoint > 10U) {
|
|
printTimepoint = millis();
|
|
for (copyIndex = 0; copyIndex < SCOUNT; copyIndex++) {
|
|
analogBufferTemp[copyIndex] = analogBuffer[copyIndex];
|
|
}
|
|
averageVoltage = getMedianNum(analogBufferTemp, SCOUNT) * (float)VREF / 1024.0;
|
|
tdsValue = (133.42 * averageVoltage * averageVoltage * averageVoltage - 255.86 * averageVoltage * averageVoltage + 857.39 * averageVoltage) * 0.5; // Rumus nilai TDS
|
|
|
|
// Logika untuk mengendalikan relay berdasarkan nilai TDS
|
|
if (tdsValue < 100) {
|
|
// TDS rendah, hidupkan relay (pompa) untuk menambahkan nutrisi
|
|
digitalWrite(RELAY_PIN, LOW);
|
|
Serial.println("Pompa ON - Menambahkan nutrisi");
|
|
} else {
|
|
// TDS dalam rentang ideal atau tinggi, matikan relay (pompa)
|
|
digitalWrite(RELAY_PIN, HIGH);
|
|
Serial.println("Pompa OFF - Nutrisi cukup atau TDS tinggi");
|
|
}
|
|
}
|
|
|
|
// Membaca nilai dari sensor DHT
|
|
float temperatureDHT = dht.readTemperature();
|
|
float humidityDHT = dht.readHumidity();
|
|
|
|
// Menampilkan informasi di LCD berdasarkan tampilan yang dipilih
|
|
lcd.clear();
|
|
if (showFirstScreen) {
|
|
// Tampilan pertama: pH dan TDS
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("pH: ");
|
|
lcd.print(pH);
|
|
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("TDS: ");
|
|
lcd.print(tdsValue);
|
|
lcd.print("ppm");
|
|
} else {
|
|
// Tampilan kedua: suhu DS18B20, suhu DHT, dan kelembapan DHT
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("Suhu Air: ");
|
|
lcd.print(temperatureDS18B20);
|
|
lcd.print("C");
|
|
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("DHT: ");
|
|
lcd.print(temperatureDHT);
|
|
lcd.print("C ");
|
|
lcd.print(humidityDHT);
|
|
lcd.print("%");
|
|
}
|
|
|
|
// Menampilkan informasi pada Serial Monitor
|
|
Serial.print("Suhu DS18B20: ");
|
|
Serial.print(temperatureDS18B20);
|
|
Serial.println(" C");
|
|
|
|
Serial.print("Suhu DHT: ");
|
|
Serial.print(temperatureDHT);
|
|
Serial.println(" C");
|
|
|
|
Serial.print("Kelembapan DHT: ");
|
|
Serial.print(humidityDHT);
|
|
Serial.println(" %");
|
|
|
|
Serial.print("pH: ");
|
|
Serial.println(pH);
|
|
|
|
Serial.print("TDS Value: ");
|
|
Serial.print(tdsValue);
|
|
Serial.println(" ppm");
|
|
|
|
delay(1000); // Delay untuk pembacaan sensor
|
|
}
|
|
|
|
int getMedianNum(int bArray[], int iFilterLen) {
|
|
int bTab[iFilterLen];
|
|
for (byte i = 0; i < iFilterLen; i++)
|
|
bTab[i] = bArray[i];
|
|
int i, j, bTemp;
|
|
for (j = 0; j < iFilterLen - 1; j++) {
|
|
for (i = 0; i < iFilterLen - j - 1; i++) {
|
|
if (bTab[i] > bTab[i + 1]) {
|
|
bTemp = bTab[i];
|
|
bTab[i] = bTab[i + 1];
|
|
bTab[i + 1] = bTemp;
|
|
}
|
|
}
|
|
}
|
|
if ((iFilterLen & 1) > 0) {
|
|
bTemp = bTab[(iFilterLen - 1) / 2];
|
|
} else {
|
|
bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
|
|
}
|
|
return bTemp;
|
|
}
|