#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/adc.h"
#include "esp_adc_cal.h"
#include "driver/gpio.h"
// Konfigurasi TDS Sensor
#define TDS_PIN ADC1_CHANNEL_7 // GPIO 35 corresponds to ADC1_CHANNEL_7
#define VOLTAGE_REF 3.3 // Tegangan referensi ESP32 dalam Volt
#define ADC_RESOLUTION 4095 // Resolusi ADC 12-bit
#define TDS_FACTOR 0.5 // Faktor kalibrasi untuk konversi ke TDS
// Konfigurasi Temperature Sensor
#define TEMP_SENSOR_PIN ADC1_CHANNEL_6 // GPIO 34 corresponds to ADC1_CHANNEL_6
// Konfigurasi Flow Sensor
#define FLOW_SENSOR_PIN 4 // GPIO 4 corresponds to D2 pin (digital pin)
// Konfigurasi Turbidity Sensor
#define TURBIDITY_SENSOR_PIN ADC1_CHANNEL_5 // GPIO 34 (pin ADC) untuk turbidity sensor
// Konfigurasi Amoniak Sensor (misalnya sensor Amoniak breakout pada GPIO2)
#define AMMONIA_SENSOR_PIN ADC1_CHANNEL_2 // GPIO2 untuk membaca sensor amoniak
// Konfigurasi Relay dan LED
#define RELAY_PIN GPIO_NUM_13 // GPIO13 untuk pin IN pada relay
#define LED_PIN GPIO_NUM_2 // GPIO2 untuk mengontrol LED
// Variabel untuk menghitung aliran
volatile int flow_count = 0; // Menghitung pulsa dari flow sensor
float flow_rate = 0.0; // Kecepatan aliran (liter per menit)
// Faktor kalibrasi untuk sensor amoniak (harus disesuaikan dengan sensor yang digunakan)
#define AMMONIA_CALIBRATION_FACTOR 0.1 // Faktor kalibrasi amoniak (ppm per volt)
// Faktor kalibrasi untuk sensor turbidity (NTU per volt)
#define TURBIDITY_CALIBRATION_FACTOR 100.0 // Asumsi nilai turbidity dalam NTU per volt
// Fungsi untuk mengontrol relay
void control_relay(bool state) {
gpio_set_level(RELAY_PIN, state); // Mengatur level pada pin relay
gpio_set_level(LED_PIN, state); // Sinkronkan dengan LED
if (state) {
printf("Pump Aktif\n");
} else {
printf("Pump Tidak Aktif\n");
}
}
// Interrupt service routine untuk menghitung pulsa
void IRAM_ATTR flow_isr() {
flow_count++; // Setiap pulsa dari flow sensor dihitung
}
void app_main() {
// Konfigurasi ADC untuk TDS sensor
adc1_config_width(ADC_WIDTH_BIT_12); // Resolusi ADC 12-bit
adc1_config_channel_atten(TDS_PIN, ADC_ATTEN_DB_11); // Rentang tegangan hingga 3.6V
adc1_config_channel_atten(TEMP_SENSOR_PIN, ADC_ATTEN_DB_11); // Rentang tegangan hingga 3.6V
adc1_config_channel_atten(TURBIDITY_SENSOR_PIN, ADC_ATTEN_DB_11); // Rentang tegangan untuk turbidity sensor
adc1_config_channel_atten(AMMONIA_SENSOR_PIN, ADC_ATTEN_DB_11); // Rentang tegangan untuk sensor amoniak
// Konfigurasi GPIO untuk flow sensor
gpio_set_direction(FLOW_SENSOR_PIN, GPIO_MODE_INPUT); // Set FLOW_SENSOR_PIN sebagai input
gpio_set_intr_type(FLOW_SENSOR_PIN, GPIO_INTR_POSEDGE); // Interrupt pada tepi positif pulsa (fluktuasi HIGH)
// Konfigurasi GPIO untuk relay dan LED
gpio_set_direction(RELAY_PIN, GPIO_MODE_OUTPUT); // Relay sebagai output
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT); // LED sebagai output
// Register interrupt handler untuk flow sensor
gpio_install_isr_service(ESP_INTR_FLAG_LEVEL1); // Daftarkan layanan ISR
gpio_isr_handler_add(FLOW_SENSOR_PIN, flow_isr, NULL); // Set ISR handler
printf("TDS, Temperature, Flow, Turbidity, and Ammonia Sensor Reading Started...\n");
while (true) {
// === TDS Sensor Reading ===
int tds_raw_value = adc1_get_raw(TDS_PIN); // Baca nilai ADC untuk TDS
float tds_voltage = tds_raw_value * (VOLTAGE_REF / ADC_RESOLUTION); // Konversi ke tegangan
float tds_value = TDS_FACTOR * tds_voltage * 1000; // Konversi ke nilai TDS (ppm)
printf("TDS Value: %.2f ppm\n", tds_value);
// === Temperature Sensor Reading ===
int temp_raw_value = adc1_get_raw(TEMP_SENSOR_PIN); // Baca nilai ADC untuk suhu
float temp_voltage = temp_raw_value * (VOLTAGE_REF / ADC_RESOLUTION); // Konversi ke tegangan
float temperature = (temp_voltage - 0.5) * 100.0; // Konversi ke Celcius (contoh untuk sensor LM35)
printf("Temperature: %.2f °C\n", temperature);
// === Flow Sensor Reading ===
flow_rate = (flow_count / 7.5); // Hitung aliran (flow rate) berdasarkan pulsa
printf("Flow Rate: %.2f L/min\n", flow_rate);
// Reset penghitung aliran setiap detik
flow_count = 0;
// === Kontrol Relay dan LED Berdasarkan Flow Rate ===
if (flow_rate == 0) {
printf("Flow Rate is 0, turning ON Relay and LED...\n");
control_relay(true); // Hidupkan relay dan LED
} else {
printf("Flow Rate is above 0, turning OFF Relay and LED...\n");
control_relay(false); // Matikan relay dan LED
}
// === Turbidity Sensor Reading ===
int turbidity_raw_value = adc1_get_raw(TURBIDITY_SENSOR_PIN); // Baca nilai ADC untuk turbidity sensor
float turbidity_voltage = turbidity_raw_value * (VOLTAGE_REF / ADC_RESOLUTION); // Konversi ke tegangan
float turbidity_value = turbidity_voltage * TURBIDITY_CALIBRATION_FACTOR; // Konversi ke NTU
printf("Turbidity Value: %.2f NTU\n", turbidity_value);
// === Amoniak Sensor Reading ===
int ammonia_raw_value = adc1_get_raw(AMMONIA_SENSOR_PIN); // Baca nilai ADC untuk sensor amoniak
float ammonia_voltage = ammonia_raw_value * (VOLTAGE_REF / ADC_RESOLUTION); // Konversi ke tegangan
float ammonia_value = ammonia_voltage * AMMONIA_CALIBRATION_FACTOR; // Konversi ke ppm
printf("Ammonia Value: %.2f ppm\n", ammonia_value);
// === Kontrol Relay Berdasarkan Amoniak ===
if (ammonia_value == 0) {
control_relay(true); // Hidupkan relay (Pump Aktif)
} else {
control_relay(false); // Matikan relay (Pump Tidak Aktif)
}
// Delay sebelum pembaruan berikutnya
vTaskDelay(2000 / portTICK_PERIOD_MS); // Delay 2 detik
}
}