#include <OneWire.h> //Memanggil library OneWire yang diperlukan sebagai dependensi library Dallas Temperature
#include <DallasTemperature.h> // Memanggil library Dallas Temperature
// Define pin analog sensor tegangan pv
#define ANALOG_IN_PIN_PV A0
//Bagian sensor tegangan PV
float adc_voltage_pv = 0.0;
float in_voltage_pv = 0.0;
int adc_value_pv = 0;
// Define pin analog sensor tegangan aki
#define ANALOG_IN_PIN_AKI A1
//Bagian sensor aki
float adc_voltage_aki = 0.0;
float in_voltage_aki = 0.0;
int adc_value_aki = 0;
//Nilai referensi sensor tegangan
float R1 = 30000.0; // resistor yang terpasang pada sensor (ohm)
float R2 = 7500.0; // resistor yang terpasang pada sensor (ohm)
float ref_voltage = 5.0; // tegangan referensi
//Bagian perhitungan Daya pada PV
float dayapadaaki = 0.0;
float dayapadapv = 0.0;
//Bagian Sensor Arus
float multiplier = 0.66; //Sensitifitas sensor ACS712 model 30A
float aruspv = 0.0;
float arusaki = 0.0;
float Sensoraruspvread = 0.0;
float Sensorarusakiread = 0.0;
//Bagian Sensor pH
const int ph_pin = A5;
float Po;
float PH_Step;
int nilai_analog_PH;
double TeganganPH;
//hasil Kalibrasi sensor pH
float PH4 = 3.19;
float PH7 = 2.56;
//Bagian Sensor Suhu DS18B20
#define ONE_WIRE_BUS A0 // Menempatkan PIN hasil pembacaan sensor DS18B20 pada PIN A0.
OneWire oneWire(ONE_WIRE_BUS); //Membuat variabel oneWire berdasarkan PIN yang telah didefinisikan
DallasTemperature sensor(&oneWire); //Membuat variabel untuk menyimpan hasil pengukuran
float suhuDS18B20; //deklarasi variable suhu DS18B20 dengan jenis data float
//Bagian Sensor MQ137
int gas_sensor = A0; //Pin sensor MQ137
float tegangansumber=5; // Tegangan yang diterima sensor dari arduino/catu daya eksternal
float rl=1; //Nilai resistor Rl pada sensor (Di ukur menggunakan AVOMETER)
double ppm;
//Bagian hasil kalibrasi sensor MQ137
float m = -0.9665; //Slope
float b = 0.94308; //Y-Intercept
float R0 = 5.89; //Resistansi sensor berdasarkan perhitungan kalibrasi sensor
//Bagian perhitungan waktu delay menggunakan millis()
unsigned int accValue; //Nilai millis sesungguhnya
unsigned int period = 5000; // Lama waktu on delay (5000ms = 5s)
unsigned int previousMillis;
unsigned int currentMillis;
//Define bagian Sensor MQ137
#define RL 10 //nilai RL =10 pada sensor
#define m -0.417 //hasil perhitungan gradien
#define b 0.425 //hasil perhitungan perpotongan
#define Ro 19 //hasil pengukuran RO
#define MQ_sensor A4 //definisi variabel pin
//Deffine bagian Relay 4-Channel
#define PIN_RELAY_1 3 // the Arduino pin, which connects to the IN1 pin of relay module
#define PIN_RELAY_2 4 // the Arduino pin, which connects to the IN2 pin of relay module
#define PIN_RELAY_3 5 // the Arduino pin, which connects to the IN3 pin of relay module
#define PIN_RELAY_4 6 // the Arduino pin, which connects to the IN4 pin of relay module
//Define bagian Relay
#define PIN_RELAY_AC 7 // the Arduino pin, which connects to the pin of relay AC module
//Define bagian relay catu daya
#define PINRELAYPV 8 // the Arduino pin, which connects to the IN4 pin of relay PV
#define PINRELAYAKI 9 // the Arduino pin, which connects to the IN4 pin of relay Aki
//Pengaturan kondisi relay aktif low
byte relayon = LOW;
byte relayoff = HIGH;
///////////////////////////////////////////////////////////////////
// Void sensor tegangan pv
void bacanilaiteganganpv()
{
// Read the Analog Input
adc_value_pv = analogRead(ANALOG_IN_PIN_PV);
// Determine voltage at ADC input
adc_voltage_pv = (adc_value_pv * ref_voltage) / 1024.0;
// Calculate voltage at divider input
in_voltage_pv = adc_voltage_pv / (R2/(R1+R2)) ;
// Print results to Serial Monitor to 2 decimal places
Serial.print("Tegangan pv : ");
Serial.print(in_voltage_pv, 2);
Serial.println(" Volt");
}
//Void sensor arus PV
void bacanilaiaruspv()
{
Sensoraruspvread = analogRead(A0)*(5.0 / 1024.0); //We read the sensor output
aruspv = (Sensoraruspvread-2.5)/multiplier;//Calculate the current value
//2.5 volt dari keluaran ACS712 itu sendiri ketika aktif tanpa input sehingga diperlukan -2.5 agar hasil pengukuruan hanya berasal dari input
Serial.print("Arus pv : ");
Serial.print(aruspv, 2);
Serial.print(" Ampere\n");
}
//Void perhitungan daya pada pv
void hitungdayapv()
{
dayapadapv = aruspv * in_voltage_pv;
Serial.print("Daya yang dimiliki pv: ");
Serial.print(dayapadapv, 2);
Serial.println(" Watt");
}
//Void catu daya pv on
void relaypvon()
{
digitalWrite(PINRELAYPV, relayon);
Serial.write("Catu daya pv aktif");
Serial.write("\n");
}
//void catu daya pv off
void relaypvoff()
{
digitalWrite(PINRELAYPV, relayoff);
Serial.write("Catu daya pv mati");
Serial.write("\n");
}
///////////////////////////////////////////////////////////////////
//Void sensor tegangan AKI
void bacanilaiteganganaki()
{
// Read the Analog Input
adc_value_aki = analogRead(ANALOG_IN_PIN_AKI);
// Determine voltage at ADC input
adc_voltage_aki = (adc_value_aki * ref_voltage) / 1024.0;
// Calculate voltage at divider input
in_voltage_aki = adc_voltage_aki / (R2/(R1+R2)) ;
// Print results to Serial Monitor to 2 decimal places
Serial.write("\n");
Serial.print("Tegangan aki = ");
Serial.print(in_voltage_aki, 2);
Serial.println(" Volt");
}
//Void sensor arus AKI
void bacanilaiarusaki()
{
Sensorarusakiread = analogRead(A1)*(5.0 / 1024.0); //We read the sensor output
arusaki = (Sensorarusakiread-2.5)/multiplier;//Calculate the current value
Serial.print("Arus aki : ");
Serial.print(arusaki,2);
Serial.print(" Ampere\n");
}
//Void perhitungan daya pada aki
void hitungdayaaki()
{
dayapadaaki = arusaki * in_voltage_aki;
Serial.print("Daya yang dimiliki aki: ");
Serial.print(dayapadaaki, 2);
Serial.println(" Watt");
}
//Void catu daya aki on
void relayakion()
{
if (accValue >= period)
{
accValue = period;
digitalWrite(PINRELAYAKI, relayon);
Serial.write("Catu daya aki aktif");
Serial.write("\n");
}
else
{
digitalWrite(PINRELAYAKI, relayoff);
Serial.write ("Catu daya aki mati");
Serial.write ("\n");
}
previousMillis = currentMillis;
}
///////////////////////////////////////////////////////////////////
//Void sensor ph
void bacanilaiph()
{
nilai_analog_PH = analogRead(ph_pin);
Serial.print("Nilai ADC pH: ");
Serial.println(nilai_analog_PH);
TeganganPH = 5 / 1024.0 * nilai_analog_PH;
Serial.print("TeganganPh: ");
Serial.println(TeganganPH, 3);
PH_Step = (PH4 - PH7) / 3;
Po = 7.00 + ((PH7 - TeganganPH) / PH_Step);
Serial.print("Nilai pH Cairan: ");
Serial.println(Po, 2);
}
//Void relay pompa
void relaypompaasamon()
{
digitalWrite(PIN_RELAY_2, relayon);
Serial.print("Aktuator pompa larutan asam aktif");
Serial.print("\n");
}
void relaypompaasamoff()
{
digitalWrite(PIN_RELAY_2, relayoff);
Serial.print("Aktuator pompa larutan asam mati");
Serial.print("\n");
}
void relaypompabasaon()
{
digitalWrite(PIN_RELAY_3, relayon);
Serial.print("Aktuator pompa larutan basa aktif");
Serial.print("\n");
}
void relaypompabasaoff()
{
digitalWrite(PIN_RELAY_3, relayoff);
Serial.print("Aktuator pompa larutan basa mati");
Serial.print("\n");
}
///////////////////////////////////////////////////////////////////
//Void sensor DS18B20
void bacanilaisuhu()
{
sensor.setResolution(9); // Sebelum melakukan pengukuran, atur resolusinya
sensor.requestTemperatures(); // Perintah konversi suhu
suhuDS18B20 = sensor.getTempCByIndex(0); //Membaca data suhu dari sensor #0 dan mengkonversikannya ke nilai Celsius
Serial.print("Suhu: ");
Serial.print(suhuDS18B20, 1); //Presisi 1 digit (satu angka dibelakang koma)
Serial.println(" Celsius");
delay(1000); //delay 1 detik (1000 miliseconds)
}
// Void relay kipas aktif
void relaykipasaktif()
{
digitalWrite(PIN_RELAY_1, relayon);
Serial.write("Kipas pendingin air aktif");
Serial.write("\n");
}
//Void relay pompa aktif
void relaypompaaktif()
{
digitalWrite(PIN_RELAY_4, relayon);
Serial.write("Pompa air aktif");
Serial.write("\n");
}
//Void relay kipas mati
void relaykipasmati()
{
digitalWrite(PIN_RELAY_1, relayoff);
Serial.write("Kipas pendingin air mati");
Serial.write("\n");
}
//Void relay pompa mati
void relaypompamati()
{
digitalWrite(PIN_RELAY_4, relayoff);
Serial.write("Pompa air mati");
Serial.write("\n");
}
///////////////////////////////////////////////////////////////////
//Void sensor MQ137
void bacanilaiamonia()
{
float sensor_volt; //Variable tegangan sensor MQ137
float RS_gas; //Variabel resistansi sensor
float ratio; //Variabel rasio resistansi sensor
float sensorValue = analogRead(gas_sensor); //Membaca nilai analog sensor
sensor_volt = sensorValue*(tegangansumber/1024.0); //Mengubah nilai analog sensor menjadi tegangan
RS_gas = ((tegangansumber*rl)/sensor_volt)-rl; //Mencari nilai RS pada udara
ratio = RS_gas/R0; // Menghitung rasio resistansi sensor
double ppm_log = (log10(ratio)-b)/m; //Formula perhitungan konsentrasi gas beredasarkan rasio yang terukur
double ppm = pow(10, ppm_log); //Konversi PPM ke skala log
Serial.print("Kadar amonia : ");
Serial.print(ppm);
Serial.print(" PPM\n");
}
//Void relay aerator aktif
void relayaeratoraktif()
{
digitalWrite(PIN_RELAY_AC, relayon);
Serial.write("Aerator aktif\n");
}
//Void relay aerator mati
void relayaeratormati()
{
digitalWrite(PIN_RELAY_AC, relayoff);
Serial.write("Aerator mati\n");
}
///////////////////////////////////////////////////////////////////
// Bagian Void Setup
void setup()
{
Serial.begin(9600);
pinMode(ph_pin, INPUT);
pinMode(gas_sensor, INPUT);
//Bagian Sensor Suhu DS128B20
sensor.begin(); //Menginisiasikan sensor One-Wire DS18B20
//Bagian Relay 4-Channel
pinMode(PIN_RELAY_1, OUTPUT);
pinMode(PIN_RELAY_2, OUTPUT);
pinMode(PIN_RELAY_3, OUTPUT);
pinMode(PIN_RELAY_4, OUTPUT);
//Bagian Relay AC
pinMode(PIN_RELAY_AC, OUTPUT);
//Bagian relay catu daya
pinMode(PINRELAYPV, OUTPUT);
pinMode(PINRELAYAKI, OUTPUT);
}
///////////////////////////////////////////////////////////////////
//Bagian Void Loop
void loop()
{
//Bagian sensor tegangan PV
bacanilaiteganganpv();
//Bagain sensor arus PV
bacanilaiaruspv();
//bagian perhitungan daya keluaran pv
hitungdayapv();
//Bagian kendali catu daya pv
if (dayapadapv >= 12.0) // akan aktif ketika daya pv 12 Watt
{
relaypvon();
}
else
{
relaypvoff();
}
//Bagian Sensor Tegangan Aki
bacanilaiteganganaki();
//Bagian Sensor Arus Aki
bacanilaiarusaki();
//Bagian Perhitungan Daya keluaran Baterai Aki
hitungdayaaki();
//Bagian kendali catu daya aki
currentMillis = millis();
if (dayapadaaki >= 12.0) // Ketika dayapv 12 watt , run timer on delay
{
accValue = accValue + currentMillis - previousMillis;
}
else
{
accValue = 0;
}
relayakion();
Serial.print("\n");
//Bagian sensor PH
bacanilaiph();
if (0<=Po && Po<=6.5)
{
relaypompaasamoff();
relaypompabasaon();
Serial.print("\n");
}
else if (8.5<=Po && Po<=14)
{
relaypompaasamon();
relaypompabasaoff();
Serial.print("\n");
}
else if (6,5<Po && Po<8,5)
{
relaypompaasamoff();
relaypompabasaoff();
Serial.print("\n");
}
//Bagian Sensor Suhu DS18B20
bacanilaisuhu();
if (suhuDS18B20 >= 30) //instruksi untuk mengaktifkan relay saat suhu lebih dari 30 derajat
{
relaykipasaktif();
relaypompaaktif();
Serial.write("\n");
}
else if (suhuDS18B20 < 28.0) //instruksi untuk mematikan relay saat suhu kurang dari 28 derajat
{
relaykipasmati();
relaypompamati();
Serial.write("\n");
}
//Bagian sensor gas MQ137
bacanilaiamonia();
if(ppm>=0,8)
{
relayaeratoraktif();
Serial.write("\n");
}
else
{
relayaeratormati();
Serial.write("\n");
}
}