From ea5ecf46caebc3a07aa0822f3b7fb2427342cff8 Mon Sep 17 00:00:00 2001 From: "M.Pinasih_Pamuncak" Date: Mon, 22 Jul 2024 12:06:50 +0700 Subject: [PATCH] Upload files to "/" --- tds.ino | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 tds.ino diff --git a/tds.ino b/tds.ino new file mode 100644 index 0000000..cefe0dc --- /dev/null +++ b/tds.ino @@ -0,0 +1,225 @@ +#include +#include +#include +#include +#include "Arduino.h" +#include +#include "ESP32MQTTClient.h" + +const char *ssid = "rasi"; +const char *pass = "12345678"; +char *server = "mqtt://broker.emqx.io:1883"; + + +#define TCAADDR 0x70 // Alamat multiplexer TCA9548A +#define LCD1_ADDR 0x27 // Alamat LCD pertama +#define LCD2_ADDR 0x26 // Alamat LCD kedua + +LiquidCrystal_I2C lcd1(LCD1_ADDR, 16, 2); +LiquidCrystal_I2C lcd2(LCD2_ADDR, 16, 2); + +const int col = 16; +const int row = 2; + +ESP32MQTTClient mqttClient; // all params are set later + +Servo myservo; // Create a servo object to control a servo +int servoPin = 26; + +float temperature = 25, tdsValue = 0; +const int sensorPh1 = 34; // Pin analog untuk membaca tegangan dari sensor pH 1 +const int sensorPh2 = 35; // Pin analog untuk membaca tegangan dari sensor pH 2 +float voltage1; +float pH1; +float voltage2; +float pH2; + +// Nilai-nilai kalibrasi untuk sensor pH 1 +float pH11 = 6.86; +float voltage11 = 3.06; +float pH21 = 9.18; +float voltage21 = 2.53; + +// Nilai-nilai kalibrasi untuk sensor pH 2 +float pH12 = 6.86; +float voltage12 = 2.53; +float pH22 = 9.18; +float voltage22 = 2.06; + +const int TdsSensorPin1 = 33; +const int TdsSensorPin2 = 32; + +float tdsValue1 = 0; +float tdsValue2 = 0; + +float analogToVolt(float adc) { + float voltase = 3.3; + float hasil = (adc * voltase) / 4095.0; + + return hasil; +} + +float getPersentaseAdc(int pin) { + int jumlah = 100; + float nilai = 0; + for (int i = 0; i < jumlah; i++) { + nilai += analogRead(pin); + } + + nilai = nilai / jumlah; + + return nilai; +} + +float nilaiTds1(float volt) { + if (volt > 0) { + float y = 68.902 * exp(1.1071 * volt); + return y; + } + + return 0; +} + +float nilaiTds2(float volt) { + if (volt > 0) { + float y = 71.413 * exp(1.3268 * volt); + return y; + } + + return 0; +} + +void setup() { + Serial.begin(115200); + Wire.begin(); + myservo.attach(servoPin); + lcd1.init(); + lcd1.backlight(); + lcd1.clear(); + lcd2.init(); + lcd2.backlight(); + lcd2.clear(); + + mqttClient.enableDebuggingMessages(); + + mqttClient.setURI(server); + mqttClient.enableLastWillMessage("lwt", "I am going offline"); + mqttClient.setKeepAlive(30); + WiFi.begin(ssid, pass); + mqttClient.loopStart(); + + pinMode(TdsSensorPin1, INPUT); + pinMode(TdsSensorPin2, INPUT); +} + +void loop() { + // Membaca tegangan dari sensor pH + int jumlahData = 100; + int total1 = 0; + int total2 = 0; + + for (int i = 0; i < jumlahData; i++) { + int nilai1 = analogRead(sensorPh1); // Membaca nilai analog dari sensor pH 1 + total1 += nilai1; // Menambahkan nilai ke total sensor pH 1 + int nilai2 = analogRead(sensorPh2); // Membaca nilai analog dari sensor pH 2 + total2 += nilai2; // Menambahkan nilai ke total sensor pH 2 + } + + float rataRata1 = (float)total1 / jumlahData; + float rataRata2 = (float)total2 / jumlahData; + + // Mengonversi nilai bacaan analog menjadi tegangan (dalam volt) + voltage1 = rataRata1 * (3.3 / 4095.0); // 3.3 adalah tegangan referensi pada ESP32 + voltage2 = rataRata2 * (3.3 / 4095.0); // 3.3 adalah tegangan referensi pada ESP32 + + Serial.println("Voltage pH 1: " + String(voltage1)); + Serial.println("Voltage pH 2: " + String(voltage2)); + + // Menggunakan persamaan linier untuk mengonversi tegangan menjadi pH untuk sensor pH 1 + float m1 = (pH21 - pH11) / (voltage21 - voltage11); // Mencari kemiringan (slope) m untuk sensor pH 1 + float c1 = pH11 - m1 * voltage11; // Mencari perpotongan dengan sumbu y (intercept) c untuk sensor pH 1 + pH1 = (voltage1 < 0.01) ? 0 : m1 * voltage1 + c1; // Menggunakan persamaan garis untuk menghitung nilai pH dari voltage1 + + // Menggunakan persamaan linier untuk mengonversi tegangan menjadi pH untuk sensor pH 2 + float m2 = (pH22 - pH12) / (voltage22 - voltage12); // Mencari kemiringan (slope) m untuk sensor pH 2 + float c2 = pH12 - m2 * voltage12; // Mencari perpotongan dengan sumbu y (intercept) c untuk sensor pH 2 + pH2 = (voltage2 < 0.01) ? 0 : m2 * voltage2 + c2; // Menggunakan persamaan garis untuk menghitung nilai pH dari voltage2 + + + float voltTds1 = analogToVolt(getPersentaseAdc(TdsSensorPin1)); + float voltTds2 = analogToVolt(getPersentaseAdc(TdsSensorPin2)); + tdsValue1 = nilaiTds1(voltTds1); + tdsValue2 = nilaiTds2(voltTds2); + + // Check TDS levels + if (tdsValue1 > 900) { + // Rotate servo (example rotation, adjust as per your servo specifications) + mqttClient.publish("servo", "1", 0, false); + myservo.write(0); // Rotate servo to 90 degrees position + delay(1000); // Wait for the servo to reach the position + } else { + // Servo back to initial position or stop rotation + myservo.write(360); // Rotate servo to 0 degrees position + delay(1000); // Wait for the servo to reach the position + } + + // Menampilkan nilai pH dan TDS ke Serial Monitor + Serial.println("pH 1: " + String(pH1)); + Serial.println("pH 2: " + String(pH2)); + Serial.println("TDS 1: " + String(tdsValue1) + " ppm"); + Serial.println("TDS 2: " + String(tdsValue2) + " ppm"); + + // Menampilkan nilai pH dan TDS ke LCD + lcd1.clear(); + lcd2.clear(); + + lcd1.setCursor(0, 1); + lcd1.print("pH 1: "); + lcd1.print(pH1); + lcd2.setCursor(0, 1); + lcd2.print("pH 2: "); + lcd2.print(pH2); + + // Delay 1 detik sebelum membaca kembali + lcd1.setCursor(0, 0); + lcd1.print("TDS 1: "); + lcd1.print(tdsValue1, 0); + lcd1.print(" ppm"); + lcd2.setCursor(0, 0); + lcd2.print("TDS 2: "); + lcd2.print(tdsValue2, 0); + lcd2.print(" ppm"); + + delay(1000); // Delay 1 detik sebelum membaca kembali + + String msg1 = "{\"ph\":\"" + String(pH1) + "\",\"tds\":\"" + String(tdsValue1) + "\"}"; + mqttClient.publish("airlaut", msg1, 0, false); + + String msg2 = "{\"ph\":\"" + String(pH2) + "\",\"tds\":\"" + String(tdsValue2) + "\"}"; + mqttClient.publish("airbersih", msg2, 0, false); +} +void onConnectionEstablishedCallback(esp_mqtt_client_handle_t client) +{ + if (mqttClient.isMyTurn(client)) // can be omitted if only one client + { + mqttClient.subscribe("servo", [](const String &topic, const String &payload) + { + myservo.write(0); // Rotate servo to 90 degrees position + delay(1000); + myservo.write(360); + delay(1000); }); + } + mqttClient.subscribe("servo", [](const String &topic, const String &payload) + { + myservo.write(360); // Rotate servo to 90 degrees position + delay(1000); + myservo.write(0); + delay(1000); }); + } + +esp_err_t handleMQTT(esp_mqtt_event_handle_t event) +{ + mqttClient.onEventCallback(event); + return ESP_OK; +} +