Sensor Laut: Difference between revisions
Colabs Admin (talk | contribs) No edit summary |
Colabs Admin (talk | contribs) |
||
| (34 intermediate revisions by the same user not shown) | |||
| Line 7: | Line 7: | ||
---- | ---- | ||
= Daftar Komponen = | |||
Daftar Komponen yang digunakan pada sensor tambak ini adalah sebagai berikut: | |||
=== Board dan Mikrokontroler === | |||
*Board PCB Custom: Board yang berfungsi untuk memfasilitasi integrasi berbagai sensor. | |||
* ESP 32: Mikrokontroler yang mengelola pembacaan data dari sensor. | |||
=== Part Sensor === | |||
* Sensor pH (DFRobot Analog pH Sensor/Meter Kit V2): Sensor yang berfungsi untuk mengukur tingkat keasaman atau kebasaan (pH) air. | |||
* Sensor Disolve Oxygen ('''DFRobot Analog Dissolved Oxygen Sensor)''': Sensor yang berfungsi untuk mengukur kadar oksigen terlarut (DO – ''Dissolved Oxygen'') dalam air. | |||
* Sensor Salinitas ('''DFRobot Analog Electrical Conductivity (EC) Sensor / Meter (K=10)):''' Sensor yang berfungsi untuk mengukur tingkat konduktivitas listrik dalam air. | |||
* Sensor Temperatur Air (DS18B20): Sensor yang berfungsi untuk mengukur temperatur air. | |||
* Sensor Temperatur Udara dan Kelembaban (DHT 22): Sensor yang berfungsi untuk mengukur temperatur dan kelembaban udara. | |||
* Sensor Temperatur, kelembaban dan tekanan udara (BME 280): Sensor yang berfungsi untuk mengukur temperatur, kelembaban dan tekanan udara. | |||
=== Power === | |||
* Relay: Modul saklar elektronik. | |||
* Voltage Meter: Modul sensor yang berfungsi mengukur tegangan, arus, dan daya pada suatu rangkaian. | |||
* Step Down: Modul konversi tegangan yang mengubah ''input'' DC 6–24V menjadi ''output'' stabil 5V hingga 3A. | |||
* Buck Boost: XL6009 Auto Boost Buck Adjustable digunakan untuk menaikkan (''step up'') atau menurunkan (''step down'') tegangan secara otomatis, dengan input 5–32V DC dan output 1.2–35V DC yang stabil meski tegangan input berubah. | |||
* Baterai: Baterai 18650 digunakan pada power bank, senter, laptop, ''e-bike'', dan proyek elektronik karena kepadatan energi tinggi, umur pakai panjang, serta kemampuan menyediakan arus besar. | |||
* Solar Panel: Solar panel 10Wp digunakan untuk mengisi baterai kecil, sistem penerangan, atau proyek IoT bertenaga surya. Memiliki ukuran ''compact'', efisiensi tinggi, dan tahan terhadap cuaca luar ruangan. | |||
* BMS: BMS (''Battery Management System'') 2S 8A berfungsi untuk menjaga kinerja dan memperpanjang umur baterai hingga lebih dari 30.000 jam. | |||
== Wiring Sensor == | == Wiring Sensor == | ||
| Line 25: | Line 57: | ||
* DS18B20 → Digital (OneWire) | * DS18B20 → Digital (OneWire) | ||
* DHT22 → Digital (GPIO 27) | * DHT22 → Digital (GPIO 27) | ||
| Line 72: | Line 104: | ||
# Masukkan semua komponen ke dalam casing | # Masukkan semua komponen ke dalam casing | ||
# Pastikan semua koneksi kuat dan tidak longgar | # Pastikan semua koneksi kuat dan tidak longgar | ||
<gallery> | |||
File:Pemasangan ESP32.png | |||
File:Pemasangan INA219.png | |||
File:Pemasangan LoRa.png | |||
File:Pemasangan Modul Dissolve Oxygen.png | |||
File:Pemasangan Kabel Sensor Temperatur Air.png | |||
File:Pastikan Konfigurasi Sesuai dan Berfungsi.jpg | |||
File:Pemasangan Probe Dissolved Oxygen.png | |||
</gallery> | |||
---- | ---- | ||
| Line 118: | Line 160: | ||
|} | |} | ||
= Kalibrasi = | |||
Konfigurasi dan kalibrasi dilakukan setelah proses perakitan selesai untuk memastikan seluruh sensor bekerja dengan baik dan menghasilkan data yang akurat. | |||
[[File:Buffer Sensor pH.png|thumb|none|Buffer Sensor pH]] | |||
== Kalibrasi Sensor pH == | |||
Kalibrasi diperlukan untuk memastikan akurasi pembacaan nilai pH, terutama setelah penggunaan intensif atau ketika hasil pembacaan mulai tidak konsisten. | |||
---- | |||
=== Rekomendasi Frekuensi Kalibrasi === | |||
* Setiap 1 bulan sekali | |||
* Saat hasil pembacaan tidak stabil atau melenceng | |||
---- | |||
=== Peralatan yang Dibutuhkan === | |||
* Larutan buffer standar pH 4.00 | |||
* Larutan buffer standar pH 7.00 | |||
* Gelas ukur atau wadah bersih | |||
* Air tawar untuk membilas probe | |||
---- | |||
=== Persiapan === | |||
* Pastikan modul pH dan ESP32 sudah terhubung dengan benar | |||
* Pastikan sistem dapat membaca data sensor melalui Serial Monitor | |||
* Bilas probe menggunakan air tawar | |||
* Keringkan probe dengan tisu atau kain lembut | |||
---- | |||
=== Langkah Kalibrasi (2 Titik: pH 4 & pH 7) === | |||
==== Kalibrasi Titik Pertama (pH 4.00) ==== | |||
# Siapkan larutan buffer pH 4.00 | |||
# Celupkan probe ke dalam larutan | |||
# Tunggu hingga nilai pembacaan stabil | |||
# Catat nilai ADC atau output sensor | |||
# Simpan nilai tersebut sebagai referensi kalibrasi pertama | |||
==== Kalibrasi Titik Kedua (pH 7.00) ==== | |||
# Bilas probe dengan air tawar | |||
# Celupkan probe ke larutan buffer pH 7.00 | |||
# Tunggu hingga pembacaan stabil | |||
# Catat nilai ADC atau output sensor | |||
# Simpan nilai tersebut sebagai referensi kalibrasi kedua | |||
[[File:Regresi pH pada saat kalibrasi.png|thumb|none|Regresi pH pada saat kalibrasi]] | |||
---- | ---- | ||
== | === Penyesuaian pada Program === | ||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
#define pinProbe 33 ; | |||
void setup() | |||
{ | |||
Serial.begin(115200); | |||
} | |||
{ | |||
void loop() | |||
{ | |||
int ADC = 0; | |||
float meanADC; | |||
for(int i=0; i<800; i++){ | |||
ADC += analogRead(pinProbe); | |||
} | |||
meanADC = ADC/800; | |||
Serial.println("meanADC:" + String(meanADC)); | |||
delay(1000); | |||
} | |||
</syntaxhighlight> | |||
---- | |||
=== Catatan Penting === | |||
* Hindari menyentuh ujung probe secara langsung | |||
* Pastikan larutan buffer tidak terkontaminasi | |||
* Lakukan kalibrasi di suhu ruangan untuk hasil optimal | |||
---- | |||
=== Indikator Kalibrasi Berhasil === | |||
* Nilai pH mendekati nilai larutan standar | |||
* Pembacaan stabil (tidak fluktuatif) | |||
* Tidak terdapat delay pembacaan yang berlebihan | |||
== Kalibrasi Sensor Salinitas == | |||
Kalibrasi dilakukan untuk memastikan pembacaan konduktivitas (EC dalam mS/cm) tetap akurat, terutama setelah penggunaan intensif, pembersihan elektroda, atau ketika hasil pembacaan tidak konsisten. | |||
---- | |||
=== Rekomendasi Frekuensi Kalibrasi === | |||
* Setiap 1 bulan sekali | |||
* Setelah pembersihan elektroda menggunakan larutan asam | |||
* Saat hasil pembacaan tidak stabil atau melenceng | |||
---- | |||
=== Peralatan yang Dibutuhkan === | |||
* Larutan standar konduktivitas (contoh: 12.88 mS/cm atau sesuai spesifikasi sensor K=10) | |||
* Wadah bersih untuk larutan kalibrasi | |||
---- | |||
=== Persiapan === | |||
* Pastikan probe dalam kondisi bersih dan kering | |||
* Pastikan sistem sudah dapat membaca data sensor melalui Serial Monitor | |||
* Hindari kontaminasi larutan kalibrasi | |||
---- | |||
=== Langkah Kalibrasi === | |||
==== Kalibrasi dengan Larutan Standar ==== | |||
# Tuangkan larutan standar konduktivitas ke dalam wadah bersih | |||
# Celupkan probe sepenuhnya ke dalam larutan | |||
# Pastikan tidak ada gelembung udara pada elektroda | |||
# Tunggu hingga pembacaan stabil | |||
# Catat nilai ADC atau output sensor | |||
# Sesuaikan nilai kalibrasi pada program Arduino hingga pembacaan mendekati nilai standar (misal 12.88 mS/cm) | |||
---- | |||
[[File:Regresi Sensor Salinitas.png|thumb|none|Regresi Sensor Salinitas]] | |||
=== Penyesuaian pada Program === | |||
Gunakan nilai hasil kalibrasi untuk menentukan faktor konversi dari ADC ke nilai salinitas. | |||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
#define pinProbe 32 ; | |||
void setup() | |||
{ | |||
Serial.begin(115200); | |||
} | |||
void loop() | |||
{ | |||
int ADC = 0; | |||
float meanADC; | |||
for(int i=0; i<800; i++){ | |||
ADC += analogRead(pinProbe); | |||
} | |||
meanADC = ADC/800; | |||
Serial.println("meanADC:" + String(meanADC)); | |||
delay(1000); | |||
} | |||
</syntaxhighlight> | |||
---- | |||
=== Langkah Setelah Kalibrasi === | |||
* Bilas probe dengan air tawar | |||
* Keringkan dengan kain lembut | |||
* Simpan probe dalam kondisi aman | |||
---- | |||
=== Catatan Penting === | |||
* Gunakan larutan sesuai dengan rentang sensor (K=10 untuk air laut) | |||
* Hindari menyentuh elektroda secara langsung | |||
* Jangan biarkan larutan standar mengering pada probe (dapat menyebabkan kristalisasi) | |||
---- | |||
=== Indikator Kalibrasi Berhasil === | |||
* Nilai mendekati larutan standar | |||
* Pembacaan stabil (tidak fluktuatif) | |||
* Sensor merespon perubahan dengan cepat | |||
== Kalibrasi Sensor Dissolved Oxygen (DO) == | |||
Kalibrasi diperlukan untuk memastikan pembacaan kadar oksigen terlarut (mg/L) akurat, terutama setelah perawatan probe, penggantian membran, atau penggantian larutan elektrolit. | |||
---- | |||
=== Rekomendasi Frekuensi Kalibrasi === | |||
* Setiap 1 bulan sekali | |||
* Setelah mengganti membran atau larutan elektrolit | |||
* Saat hasil pembacaan tidak stabil atau melenceng | |||
---- | |||
=== Persiapan === | |||
* Pastikan probe dalam kondisi bersih dan kering | |||
* Pastikan sistem sudah dapat membaca data sensor melalui Serial Monitor | |||
* Hindari kontaminasi pada permukaan probe | |||
---- | |||
=== Langkah Kalibrasi === | |||
# Bersihkan probe jika diperlukan | |||
# Basahi probe dengan air murni, lalu kibaskan untuk menghilangkan tetesan berlebih | |||
# Paparkan probe ke udara terbuka (jangan gunakan kipas) | |||
# Biarkan probe terkena aliran udara alami hingga pembacaan stabil | |||
# Catat nilai tegangan output sensor (dalam mV) | |||
# Nilai ini merupakan tegangan DO jenuh (saturation voltage) pada suhu saat ini | |||
---- | |||
=== Penyesuaian pada Program === | |||
Gunakan nilai tegangan hasil kalibrasi untuk menggantikan parameter kalibrasi pada kode. | |||
Contoh: | |||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
#include <Arduino.h> | |||
#define VREF 3300//VREF(mv) | |||
#define ADC_RES 4096//ADC Resolution | |||
uint32_t raw; | |||
void setup() | |||
{ | |||
Serial.begin(115200); | |||
} | |||
void loop() | |||
{ | |||
raw=analogRead(A1); | |||
Serial.println("raw:\t"+String(raw)+"\tVoltage(mv)"+String(raw*VREF/ADC_RES)); | |||
delay(1000); | |||
} | |||
</syntaxhighlight> | |||
Nilai tersebut digunakan sebagai referensi tegangan DO jenuh pada perhitungan sensor. | |||
---- | |||
=== Catatan Penting === | |||
* Jangan meniup probe menggunakan kipas atau mulut (dapat merusak akurasi) | |||
* Temperatur sangat mempengaruhi hasil kalibrasi | |||
* Lakukan kalibrasi pada kondisi lingkungan yang stabil | |||
---- | |||
=== Indikator Kalibrasi Berhasil === | |||
* Nilai DO stabil saat probe di udara | |||
* Tidak terjadi fluktuasi signifikan | |||
* Pembacaan konsisten setelah digunakan kembali di air | |||
< | = Pemrograman (Source Code) = | ||
Tahap pertama dalam memulai programming utama adalah menyiapkan initial code yang mencakup seluruh library yang diperlukan untuk komunikasi sensor dan transmisi data. Berikut adalah code program yang digunakan. | |||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
#include <Wire.h> | |||
#include <Adafruit_Sensor.h> | |||
#include <Adafruit_INA219.h> | |||
#include <SoftwareSerial.h> | |||
#include <DHT.h> | |||
#include <Adafruit_BME280.h> | |||
#include <OneWire.h> | |||
#include <DallasTemperature.h> //DS18B20 | |||
#include <SPI.h> | |||
#include <LoRa.h> | |||
</syntaxhighlight> | |||
=== Sensor DHT 22 === | === Sensor DHT 22 === | ||
Konfigurasi sensor DHT22 dimulai dengan mendefinisikan pin koneksi dan tipe sensor yang digunakan untuk pengukuran suhu dan kelembaban udara. fungsi setDHT() untuk akuisisi data, dan printDHT() untuk menampilkan hasil. Berikut adalah code program yang digunakan. | Konfigurasi sensor DHT22 dimulai dengan mendefinisikan pin koneksi dan tipe sensor yang digunakan untuk pengukuran suhu dan kelembaban udara. fungsi setDHT() untuk akuisisi data, dan printDHT() untuk menampilkan hasil. Berikut adalah code program yang digunakan. | ||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
//DHT22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
//Constants | //Constants | ||
#define DHTPIN 27 // what pin we're connected to | |||
#define DHTTYPE DHT22 // DHT 22 (AM2302) | |||
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino | DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino | ||
| Line 188: | Line 472: | ||
} | } | ||
</syntaxhighlight> | |||
=== Sensor BME 280 === | === Sensor BME 280 === | ||
Sensor BME280 dikonfigurasi untuk mengukur empat parameter lingkungan sekaligus: suhu, tekanan barometrik, kelembaban, dan estimasi ketinggian berdasarkan tekanan permukaan laut standar. Berikut adalah code program yang digunakan. | Sensor BME280 dikonfigurasi untuk mengukur empat parameter lingkungan sekaligus: suhu, tekanan barometrik, kelembaban, dan estimasi ketinggian berdasarkan tekanan permukaan laut standar. Berikut adalah code program yang digunakan. | ||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
//BME280 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
#define SEALEVELPRESSURE_HPA (1013.25) | |||
Adafruit_BME280 bme; // I2C | Adafruit_BME280 bme; // I2C | ||
| Line 263: | Line 546: | ||
} | } | ||
</syntaxhighlight> | |||
=== Sensor suhu air (DS18B20) === | === Sensor suhu air (DS18B20) === | ||
Sensor suhu air DS18B20 diimplementasikan dengan protokol OneWire pada GPIO 4, memberikan measurement yang waterproof dan ideal untuk aplikasi monitoring kualitas air laut. Berikut adalah code program yang digunakan. | Sensor suhu air DS18B20 diimplementasikan dengan protokol OneWire pada GPIO 4, memberikan measurement yang waterproof dan ideal untuk aplikasi monitoring kualitas air laut. Berikut adalah code program yang digunakan. | ||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
//DS18B20 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
// GPIO where the DS18B20 is connected to | // GPIO where the DS18B20 is connected to | ||
| Line 304: | Line 587: | ||
} | } | ||
</syntaxhighlight> | |||
=== Sensor pH (DFRobot : Analog pH Sensor/Meter Kit V2) === | === Sensor pH (DFRobot : Analog pH Sensor/Meter Kit V2) === | ||
Pengukuran pH dilakukan melalui pembacaan analog pada pin 33 dengan metode nilai yang didapat setelah dilakukan kalibrasi untuk mendapatkan nilai pH yang stabil dan akurat. Berikut adalah code program yang digunakan. | Pengukuran pH dilakukan melalui pembacaan analog pada pin 33 dengan metode nilai yang didapat setelah dilakukan kalibrasi untuk mendapatkan nilai pH yang stabil dan akurat. Berikut adalah code program yang digunakan. | ||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
//pHSensor +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
const int PH_PIN = 33; | const int PH_PIN = 33; | ||
| Line 349: | Line 632: | ||
} | } | ||
</syntaxhighlight> | |||
=== Sensor Salinitas (DFRobot : Analog Electrical Conductivity Sensor / Meter (K=10)) === | === Sensor Salinitas (DFRobot : Analog Electrical Conductivity Sensor / Meter (K=10)) === | ||
Pengukuran nilai salinitas air menggunakan sensor TDS yang terhubung ke pin 32 pada papan mikrokontroler. Kode ini berfungsi untuk mengambil data analog dari sensor, kemudian mengolahnya menjadi nilai salinitas yang dapat ditampilkan melalui serial monitor. Berikut adalah code program yang digunakan. | Pengukuran nilai salinitas air menggunakan sensor TDS yang terhubung ke pin 32 pada papan mikrokontroler. Kode ini berfungsi untuk mengambil data analog dari sensor, kemudian mengolahnya menjadi nilai salinitas yang dapat ditampilkan melalui serial monitor. Berikut adalah code program yang digunakan. | ||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
//TDS Sensor +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
const int TDS_PIN = 32; | const int TDS_PIN = 32; | ||
| Line 395: | Line 678: | ||
} | } | ||
</syntaxhighlight> | |||
=== ''Sensor Dissolved Oxygen (DFRobot Analog Dissolved Oxygen Sensor)'' === | === ''Sensor Dissolved Oxygen (DFRobot Analog Dissolved Oxygen Sensor)'' === | ||
Kadar oksigen terlarut (Dissolved Oxygen/DO) di dalam air menggunakan sensor DO yang terhubung ke pin 25 pada papan mikrokontroler. Sensor ini bekerja dengan mengubah kadar oksigen yang terlarut menjadi sinyal listrik berupa tegangan. Nilai tegangan tersebut kemudian dibaca oleh mikrokontroler dan diolah menggunakan tabel serta rumus kalibrasi, sehingga dapat ditampilkan sebagai data oksigen terlarut yang lebih mudah dipahami. Berikut adalah code program yang digunakan. | Kadar oksigen terlarut (Dissolved Oxygen/DO) di dalam air menggunakan sensor DO yang terhubung ke pin 25 pada papan mikrokontroler. Sensor ini bekerja dengan mengubah kadar oksigen yang terlarut menjadi sinyal listrik berupa tegangan. Nilai tegangan tersebut kemudian dibaca oleh mikrokontroler dan diolah menggunakan tabel serta rumus kalibrasi, sehingga dapat ditampilkan sebagai data oksigen terlarut yang lebih mudah dipahami. Berikut adalah code program yang digunakan. | ||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
//DO Sensor +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
#define DO_PIN 25 | |||
#define VREF 3300 //VREF (mv) | |||
#define ADC_RES 4095 //ADC Resolution | |||
| Line 414: | Line 696: | ||
//Two-point calibration Mode=1 | //Two-point calibration Mode=1 | ||
#define TWO_POINT_CALIBRATION 0 | |||
#</nowiki>define READ_TEMP (25) //Current water temperature ℃, Or temperature sensor function | |||
//Single point calibration needs to be filled CAL1_V and CAL1_T | //Single point calibration needs to be filled CAL1_V and CAL1_T | ||
#define CAL1_V (269) //mv | |||
#define CAL1_T (25) //℃ | |||
//Two-point calibration needs to be filled CAL2_V and CAL2_T | //Two-point calibration needs to be filled CAL2_V and CAL2_T | ||
| Line 430: | Line 712: | ||
//CAL1 High temperature point, CAL2 Low temperature point | //CAL1 High temperature point, CAL2 Low temperature point | ||
#define CAL2_V (1300) //mv | |||
#define CAL2_T (15) //℃ | |||
| Line 459: | Line 741: | ||
int16_t readDO(uint32_t voltage_mv, uint8_t temperature_c) { | int16_t readDO(uint32_t voltage_mv, uint8_t temperature_c) { | ||
#if TWO_POINT_CALIBRATION == 00 | |||
uint16_t V_saturation = (uint32_t)CAL1_V + (uint32_t)35 * temperature_c - (uint32_t)CAL1_T * 35; | uint16_t V_saturation = (uint32_t)CAL1_V + (uint32_t)35 * temperature_c - (uint32_t)CAL1_T * 35; | ||
| Line 465: | Line 747: | ||
return (voltage_mv * DO_Table[temperature_c] / V_saturation); | return (voltage_mv * DO_Table[temperature_c] / V_saturation); | ||
#else | |||
uint16_t V_saturation = (int16_t)((int8_t)temperature_c - CAL2_T) * ((uint16_t)CAL1_V - CAL2_V) / ((uint8_t)CAL1_T - CAL2_T) + CAL2_V; | uint16_t V_saturation = (int16_t)((int8_t)temperature_c - CAL2_T) * ((uint16_t)CAL1_V - CAL2_V) / ((uint8_t)CAL1_T - CAL2_T) + CAL2_V; | ||
| Line 471: | Line 753: | ||
return (voltage_mv * DO_Table[temperature_c] / V_saturation); | return (voltage_mv * DO_Table[temperature_c] / V_saturation); | ||
#endif | |||
} | } | ||
| Line 505: | Line 787: | ||
} | } | ||
</syntaxhighlight> | |||
=== ''Sensor Voltage'' === | === ''Sensor Voltage'' === | ||
Sensor INA219 pada alamat I2C 0x41 digunakan untuk monitoring power consumption sistem secara real-time, mengukur tegangan, arus, dan daya yang dikonsumsi seluruh rangkaian. Berikut adalah code program yang digunakan. | Sensor INA219 pada alamat I2C 0x41 digunakan untuk monitoring power consumption sistem secara real-time, mengukur tegangan, arus, dan daya yang dikonsumsi seluruh rangkaian. Berikut adalah code program yang digunakan. | ||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
// // INA219 Sensor +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
Adafruit_INA219 ina219(0x41); | Adafruit_INA219 ina219(0x41); | ||
| Line 571: | Line 853: | ||
} | } | ||
</syntaxhighlight> | |||
=== Lora === | === Lora === | ||
Implementasi komunikasi LoRa mencakup ''setup transceiver'' pada frekuensi 915 MHz, konfigurasi pin control, dan ''utility functions'' untuk ''scanning'' perangkat I2C serta kontrol relay pada pin 26. Berikut adalah code program yang digunakan. | Implementasi komunikasi LoRa mencakup ''setup transceiver'' pada frekuensi 915 MHz, konfigurasi pin control, dan ''utility functions'' untuk ''scanning'' perangkat I2C serta kontrol relay pada pin 26. Berikut adalah code program yang digunakan. | ||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
//LoRa +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
// - Pin configs - | // - Pin configs - | ||
#define ss 5 | |||
#define rst 12 | |||
#define dio0 2 | |||
| Line 693: | Line 975: | ||
i2cScan(); | i2cScan(); | ||
</syntaxhighlight> | |||
=== ''Start Sensor'' === | === ''Start Sensor'' === | ||
Proses ''startup'' sistem mencakup inisialisasi berurutan semua komponen monitoring: komunikasi LoRa, power sensing INA219, sensor cuaca DHT22 dan BME280, pengukur suhu air DS18B20, sensor pH, serta konfigurasi ''deep sleep timer'' untuk optimasi daya. Berikut adalah code program yang digunakan. | Proses ''startup'' sistem mencakup inisialisasi berurutan semua komponen monitoring: komunikasi LoRa, power sensing INA219, sensor cuaca DHT22 dan BME280, pengukur suhu air DS18B20, sensor pH, serta konfigurasi ''deep sleep timer'' untuk optimasi daya. Berikut adalah code program yang digunakan. | ||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
//LoRa +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
startLora(); | startLora(); | ||
| Line 784: | Line 1,066: | ||
} | } | ||
Serial.println(millis() - startTime); | |||
*/ | |||
</syntaxhighlight> | |||
=== ''Print Sensor'' === | === ''Print Sensor'' === | ||
Proses print dan fungsi ''loop'' mengimplementasikan ''cycle monitoring'' lengkap: pembacaan sensor berurutan, validasi data berdasarkan threshold suhu air, ''formatting data'' ke protokol komunikasi ''custom'', transmisi LoRa, dan ''power shutdown'' untuk optimasi energi. Berikut adalah code program yang digunakan. | Proses print dan fungsi ''loop'' mengimplementasikan ''cycle monitoring'' lengkap: pembacaan sensor berurutan, validasi data berdasarkan threshold suhu air, ''formatting data'' ke protokol komunikasi ''custom'', transmisi LoRa, dan ''power shutdown'' untuk optimasi energi. Berikut adalah code program yang digunakan. | ||
<syntaxhighlight lang="cpp" style="max-height:300px; overflow:auto;"> | |||
//DS18B20 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | //DS18B20 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| Line 922: | Line 1,204: | ||
} | } | ||
</syntaxhighlight> | |||
Implementasi kode lengkap di atas menunjukkan integrasi sistem ''monitoring'' kualitas air laut. Sistem ini mampu beroperasi secara mandiri dengan ''cycle'' pembacaan sensor, transmisi data LoRa, dan power management yang optimal untuk deployment jangka panjang di lingkungan laut. ''Source code'' lengkap dan dokumentasi tambahan dapat diakses melalui ''repository'' GitHub di: https://github.com/insaninfonesia/Co_LABS. | Implementasi kode lengkap di atas menunjukkan integrasi sistem ''monitoring'' kualitas air laut. Sistem ini mampu beroperasi secara mandiri dengan ''cycle'' pembacaan sensor, transmisi data LoRa, dan power management yang optimal untuk deployment jangka panjang di lingkungan laut. ''Source code'' lengkap dan dokumentasi tambahan dapat diakses melalui ''repository'' GitHub di: https://github.com/insaninfonesia/Co_LABS. | ||
== | = Sensor Mounting Structures = | ||
[[File:Solitude 1.png|thumb|none|Solitude]] | |||
Akurasi data sensor dalam sistem monitoring kualitas air sangat bergantung pada cara dan posisi pemasangan sensor. Oleh karena itu, diperlukan struktur penyangga yang tepat agar sensor tetap stabil, terlindungi, dan mudah diakses untuk perawatan. | |||
---- | |||
=== Tujuan Struktur Pemasangan === | |||
Struktur ini dirancang agar sensor dapat: | |||
* Berada pada kedalaman yang sesuai dengan kebutuhan pengukuran | |||
* Terlindungi dari gelombang, arus, dan faktor lingkungan | |||
* Mudah diakses untuk kalibrasi, perawatan, dan penggantian | |||
---- | |||
== Buoy (Pelampung) == | |||
[[File:Water Rover.png|thumb|none|Water Rover]] | |||
Buoy merupakan platform terapung yang digunakan untuk menopang sensor di atas maupun di dalam air. Metode ini umum digunakan pada laut, danau, atau perairan dalam di mana pemasangan tiang tidak memungkinkan. | |||
---- | |||
=== Karakteristik Buoy === | |||
* Mengapung di permukaan air | |||
* Fleksibel mengikuti gelombang | |||
* Cocok untuk monitoring jangka panjang | |||
* Dapat membawa sistem mandiri (solar panel & baterai) | |||
---- | |||
=== Panduan Pemasangan === | |||
# Gunakan pelampung yang kuat, tahan korosi, dan tahan air laut | |||
# Pasang pemberat (anchor) di dasar perairan untuk menjaga posisi buoy | |||
# Gunakan tali atau kabel penyangga yang kuat dan tahan air | |||
# Sesuaikan kedalaman sensor dengan kebutuhan pengukuran | |||
# Pastikan sensor tidak terlalu dekat permukaan atau dasar | |||
# Sediakan ruang untuk panel surya dan baterai jika menggunakan sistem mandiri | |||
[[File:Solitude.png|thumb|none|Schema 3D Solitude]] | |||
---- | |||
=== Tips Pemasangan === | |||
* Gunakan material stainless steel atau plastik HDPE | |||
* Pastikan semua konektor tahan air (waterproof) | |||
* Hindari kabel terlalu tegang (beri slack untuk gelombang) | |||
* Gunakan pelindung probe (pipa atau housing) | |||
---- | |||
=== Catatan === | |||
Metode buoy sangat cocok untuk: | |||
* Lokasi dengan kedalaman tinggi | |||
* Area tanpa struktur tetap | |||
* Monitoring jangka panjang di laut terbuka | |||
Latest revision as of 02:27, 27 April 2026
Perakitan
Overview
Bab ini menjelaskan proses perakitan perangkat sensor berbasis IoT, mulai dari wiring sensor, distribusi daya (power), hingga pemasangan ke dalam casing.
Sistem menggunakan mikrokontroler ESP32 sebagai pusat kendali yang terhubung dengan berbagai sensor lingkungan seperti pH, Dissolved Oxygen (DO), salinitas, suhu air, serta sensor lingkungan lainnya.
Daftar Komponen
Daftar Komponen yang digunakan pada sensor tambak ini adalah sebagai berikut:
Board dan Mikrokontroler
- Board PCB Custom: Board yang berfungsi untuk memfasilitasi integrasi berbagai sensor.
- ESP 32: Mikrokontroler yang mengelola pembacaan data dari sensor.
Part Sensor
- Sensor pH (DFRobot Analog pH Sensor/Meter Kit V2): Sensor yang berfungsi untuk mengukur tingkat keasaman atau kebasaan (pH) air.
- Sensor Disolve Oxygen (DFRobot Analog Dissolved Oxygen Sensor): Sensor yang berfungsi untuk mengukur kadar oksigen terlarut (DO – Dissolved Oxygen) dalam air.
- Sensor Salinitas (DFRobot Analog Electrical Conductivity (EC) Sensor / Meter (K=10)): Sensor yang berfungsi untuk mengukur tingkat konduktivitas listrik dalam air.
- Sensor Temperatur Air (DS18B20): Sensor yang berfungsi untuk mengukur temperatur air.
- Sensor Temperatur Udara dan Kelembaban (DHT 22): Sensor yang berfungsi untuk mengukur temperatur dan kelembaban udara.
- Sensor Temperatur, kelembaban dan tekanan udara (BME 280): Sensor yang berfungsi untuk mengukur temperatur, kelembaban dan tekanan udara.
Power
- Relay: Modul saklar elektronik.
- Voltage Meter: Modul sensor yang berfungsi mengukur tegangan, arus, dan daya pada suatu rangkaian.
- Step Down: Modul konversi tegangan yang mengubah input DC 6–24V menjadi output stabil 5V hingga 3A.
- Buck Boost: XL6009 Auto Boost Buck Adjustable digunakan untuk menaikkan (step up) atau menurunkan (step down) tegangan secara otomatis, dengan input 5–32V DC dan output 1.2–35V DC yang stabil meski tegangan input berubah.
- Baterai: Baterai 18650 digunakan pada power bank, senter, laptop, e-bike, dan proyek elektronik karena kepadatan energi tinggi, umur pakai panjang, serta kemampuan menyediakan arus besar.
- Solar Panel: Solar panel 10Wp digunakan untuk mengisi baterai kecil, sistem penerangan, atau proyek IoT bertenaga surya. Memiliki ukuran compact, efisiensi tinggi, dan tahan terhadap cuaca luar ruangan.
- BMS: BMS (Battery Management System) 2S 8A berfungsi untuk menjaga kinerja dan memperpanjang umur baterai hingga lebih dari 30.000 jam.
Wiring Sensor

Wiring sensor merupakan proses menghubungkan seluruh sensor ke ESP32 melalui PCB.
Setiap sensor memiliki koneksi dasar:
- VCC → Tegangan (Power)
- GND → Ground
- Data → Sinyal (Analog/Digital)
Konfigurasi Sensor
- pH → Analog (GPIO 33)
- Salinitas → Analog (GPIO 32)
- Dissolved Oxygen → Analog (GPIO 25)
- DS18B20 → Digital (OneWire)
- DHT22 → Digital (GPIO 27)
Wiring Power

Sistem menggunakan sumber daya berbasis baterai dan panel surya.
Alur Power
- Solar Panel → Buck/Boost Converter
- → BMS (Battery Management System)
- → Baterai
- → Step Down 5V
- → ESP32 & Sensor

Konfigurasi
- 2S (7.4V) → sistem standar
- 4S (14.8V) → untuk kebutuhan daya lebih besar
Catatan Penting
- Pastikan output ke ESP32 stabil di 5V
- Gunakan BMS untuk proteksi baterai
- Periksa arus menggunakan INA219
Langkah Perakitan

Ikuti langkah berikut untuk merakit sistem:
- Pasang ESP32 pada PCB
- Pasang modul INA219 (monitoring power)
- Pasang modul LoRa
- Pasang sensor:
- pH
- Dissolved Oxygen (DO)
- Salinitas
- Hubungkan probe ke masing-masing sensor
- Sambungkan kabel sensor temperatur dan ultrasonic
- Lakukan wiring power sesuai diagram
- Masukkan semua komponen ke dalam casing
- Pastikan semua koneksi kuat dan tidak longgar
Integrasi ke Casing

- Gunakan casing IP65/IP66 untuk perlindungan outdoor
- Pastikan semua kabel memiliki seal (anti air)
- Gunakan pipa pelindung untuk probe sensor
Validasi Sistem
Setelah perakitan selesai, lakukan pengecekan:
Checklist
- Semua modul menyala (LED indikator aktif)
- ESP32 dapat membaca data sensor
- Tidak ada kabel longgar atau short circuit
- Tegangan stabil sesuai spesifikasi
Indikator Berhasil
- Data sensor muncul di serial monitor
- Sistem dapat berjalan tanpa restart
- Komunikasi LoRa aktif
Troubleshooting Dasar
| Masalah | Penyebab | Solusi |
|---|---|---|
| Sensor tidak terbaca | Wiring salah | Periksa pin dan koneksi |
| ESP32 mati | Tegangan tidak stabil | Cek step-down dan baterai |
| Data tidak konsisten | Sensor belum kalibrasi | Lakukan kalibrasi ulang |
| Tidak ada komunikasi LoRa | Modul tidak terhubung | Cek wiring SPI dan antena |
Kalibrasi
Konfigurasi dan kalibrasi dilakukan setelah proses perakitan selesai untuk memastikan seluruh sensor bekerja dengan baik dan menghasilkan data yang akurat.

Kalibrasi Sensor pH
Kalibrasi diperlukan untuk memastikan akurasi pembacaan nilai pH, terutama setelah penggunaan intensif atau ketika hasil pembacaan mulai tidak konsisten.
Rekomendasi Frekuensi Kalibrasi
- Setiap 1 bulan sekali
- Saat hasil pembacaan tidak stabil atau melenceng
Peralatan yang Dibutuhkan
- Larutan buffer standar pH 4.00
- Larutan buffer standar pH 7.00
- Gelas ukur atau wadah bersih
- Air tawar untuk membilas probe
Persiapan
- Pastikan modul pH dan ESP32 sudah terhubung dengan benar
- Pastikan sistem dapat membaca data sensor melalui Serial Monitor
- Bilas probe menggunakan air tawar
- Keringkan probe dengan tisu atau kain lembut
Langkah Kalibrasi (2 Titik: pH 4 & pH 7)
Kalibrasi Titik Pertama (pH 4.00)
- Siapkan larutan buffer pH 4.00
- Celupkan probe ke dalam larutan
- Tunggu hingga nilai pembacaan stabil
- Catat nilai ADC atau output sensor
- Simpan nilai tersebut sebagai referensi kalibrasi pertama
Kalibrasi Titik Kedua (pH 7.00)
- Bilas probe dengan air tawar
- Celupkan probe ke larutan buffer pH 7.00
- Tunggu hingga pembacaan stabil
- Catat nilai ADC atau output sensor
- Simpan nilai tersebut sebagai referensi kalibrasi kedua

Penyesuaian pada Program
#define pinProbe 33 ;
void setup()
{
Serial.begin(115200);
}
void loop()
{
int ADC = 0;
float meanADC;
for(int i=0; i<800; i++){
ADC += analogRead(pinProbe);
}
meanADC = ADC/800;
Serial.println("meanADC:" + String(meanADC));
delay(1000);
}
Catatan Penting
- Hindari menyentuh ujung probe secara langsung
- Pastikan larutan buffer tidak terkontaminasi
- Lakukan kalibrasi di suhu ruangan untuk hasil optimal
Indikator Kalibrasi Berhasil
- Nilai pH mendekati nilai larutan standar
- Pembacaan stabil (tidak fluktuatif)
- Tidak terdapat delay pembacaan yang berlebihan
Kalibrasi Sensor Salinitas
Kalibrasi dilakukan untuk memastikan pembacaan konduktivitas (EC dalam mS/cm) tetap akurat, terutama setelah penggunaan intensif, pembersihan elektroda, atau ketika hasil pembacaan tidak konsisten.
Rekomendasi Frekuensi Kalibrasi
- Setiap 1 bulan sekali
- Setelah pembersihan elektroda menggunakan larutan asam
- Saat hasil pembacaan tidak stabil atau melenceng
Peralatan yang Dibutuhkan
- Larutan standar konduktivitas (contoh: 12.88 mS/cm atau sesuai spesifikasi sensor K=10)
- Wadah bersih untuk larutan kalibrasi
Persiapan
- Pastikan probe dalam kondisi bersih dan kering
- Pastikan sistem sudah dapat membaca data sensor melalui Serial Monitor
- Hindari kontaminasi larutan kalibrasi
Langkah Kalibrasi
Kalibrasi dengan Larutan Standar
- Tuangkan larutan standar konduktivitas ke dalam wadah bersih
- Celupkan probe sepenuhnya ke dalam larutan
- Pastikan tidak ada gelembung udara pada elektroda
- Tunggu hingga pembacaan stabil
- Catat nilai ADC atau output sensor
- Sesuaikan nilai kalibrasi pada program Arduino hingga pembacaan mendekati nilai standar (misal 12.88 mS/cm)

Penyesuaian pada Program
Gunakan nilai hasil kalibrasi untuk menentukan faktor konversi dari ADC ke nilai salinitas.
#define pinProbe 32 ;
void setup()
{
Serial.begin(115200);
}
void loop()
{
int ADC = 0;
float meanADC;
for(int i=0; i<800; i++){
ADC += analogRead(pinProbe);
}
meanADC = ADC/800;
Serial.println("meanADC:" + String(meanADC));
delay(1000);
}
Langkah Setelah Kalibrasi
- Bilas probe dengan air tawar
- Keringkan dengan kain lembut
- Simpan probe dalam kondisi aman
Catatan Penting
- Gunakan larutan sesuai dengan rentang sensor (K=10 untuk air laut)
- Hindari menyentuh elektroda secara langsung
- Jangan biarkan larutan standar mengering pada probe (dapat menyebabkan kristalisasi)
Indikator Kalibrasi Berhasil
- Nilai mendekati larutan standar
- Pembacaan stabil (tidak fluktuatif)
- Sensor merespon perubahan dengan cepat
Kalibrasi Sensor Dissolved Oxygen (DO)
Kalibrasi diperlukan untuk memastikan pembacaan kadar oksigen terlarut (mg/L) akurat, terutama setelah perawatan probe, penggantian membran, atau penggantian larutan elektrolit.
Rekomendasi Frekuensi Kalibrasi
- Setiap 1 bulan sekali
- Setelah mengganti membran atau larutan elektrolit
- Saat hasil pembacaan tidak stabil atau melenceng
Persiapan
- Pastikan probe dalam kondisi bersih dan kering
- Pastikan sistem sudah dapat membaca data sensor melalui Serial Monitor
- Hindari kontaminasi pada permukaan probe
Langkah Kalibrasi
- Bersihkan probe jika diperlukan
- Basahi probe dengan air murni, lalu kibaskan untuk menghilangkan tetesan berlebih
- Paparkan probe ke udara terbuka (jangan gunakan kipas)
- Biarkan probe terkena aliran udara alami hingga pembacaan stabil
- Catat nilai tegangan output sensor (dalam mV)
- Nilai ini merupakan tegangan DO jenuh (saturation voltage) pada suhu saat ini
Penyesuaian pada Program
Gunakan nilai tegangan hasil kalibrasi untuk menggantikan parameter kalibrasi pada kode.
Contoh:
#include <Arduino.h>
#define VREF 3300//VREF(mv)
#define ADC_RES 4096//ADC Resolution
uint32_t raw;
void setup()
{
Serial.begin(115200);
}
void loop()
{
raw=analogRead(A1);
Serial.println("raw:\t"+String(raw)+"\tVoltage(mv)"+String(raw*VREF/ADC_RES));
delay(1000);
}
Nilai tersebut digunakan sebagai referensi tegangan DO jenuh pada perhitungan sensor.
Catatan Penting
- Jangan meniup probe menggunakan kipas atau mulut (dapat merusak akurasi)
- Temperatur sangat mempengaruhi hasil kalibrasi
- Lakukan kalibrasi pada kondisi lingkungan yang stabil
Indikator Kalibrasi Berhasil
- Nilai DO stabil saat probe di udara
- Tidak terjadi fluktuasi signifikan
- Pembacaan konsisten setelah digunakan kembali di air
Pemrograman (Source Code)
Tahap pertama dalam memulai programming utama adalah menyiapkan initial code yang mencakup seluruh library yang diperlukan untuk komunikasi sensor dan transmisi data. Berikut adalah code program yang digunakan.
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_INA219.h>
#include <SoftwareSerial.h>
#include <DHT.h>
#include <Adafruit_BME280.h>
#include <OneWire.h>
#include <DallasTemperature.h> //DS18B20
#include <SPI.h>
#include <LoRa.h>
Sensor DHT 22
Konfigurasi sensor DHT22 dimulai dengan mendefinisikan pin koneksi dan tipe sensor yang digunakan untuk pengukuran suhu dan kelembaban udara. fungsi setDHT() untuk akuisisi data, dan printDHT() untuk menampilkan hasil. Berikut adalah code program yang digunakan.
//DHT22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//Constants
#define DHTPIN 27 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino
float dhtTemperature = 0;
float dhtHumidity = 0;
void setDHT() {
//Read data and store it to variables hum and temp
dhtHumidity = dht.readHumidity();
dhtTemperature = dht.readTemperature();
}
void printDHT() {
Serial.print("Humidity = ");
Serial.print(dhtHumidity);
Serial.print("Temperature = ");
Serial.print(dhtTemperature);
Serial.println("ºC");
}
Sensor BME 280
Sensor BME280 dikonfigurasi untuk mengukur empat parameter lingkungan sekaligus: suhu, tekanan barometrik, kelembaban, dan estimasi ketinggian berdasarkan tekanan permukaan laut standar. Berikut adalah code program yang digunakan.
//BME280 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
float bmeTemperature;
float bmePressure;
float bmeHumidity;
float bmeAltitude;
void setBMEValues() {
try {
bmeTemperature = bme.readTemperature(); //Celcius
bmePressure = bme.readPressure() / 100.0F; // hPa
bmeHumidity = bme.readHumidity(); // %
bmeAltitude = bme.readAltitude(SEALEVELPRESSURE_HPA); // meter
} catch (String error) {
Serial.println("Error BME: " + error);
}
}
void printBMEValues() {
Serial.print("Temperature = ");
Serial.print(bmeTemperature);
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bmePressure);
Serial.println(" hPa");
Serial.print("Approx. Altitude = ");
Serial.print(bmeAltitude);
Serial.println(" m");
Serial.print("Humidity = ");
Serial.print(bmeHumidity);
Serial.println(" %");
Serial.println();
}
Sensor suhu air (DS18B20)
Sensor suhu air DS18B20 diimplementasikan dengan protokol OneWire pada GPIO 4, memberikan measurement yang waterproof dan ideal untuk aplikasi monitoring kualitas air laut. Berikut adalah code program yang digunakan.
//DS18B20 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// GPIO where the DS18B20 is connected to
const int waterTemperaturePin = 4;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(waterTemperaturePin);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
float waterTemperature = 0;
void setWaterTemperature() {
sensors.requestTemperatures();
waterTemperature = sensors.getTempCByIndex(0);
}
void printWaterTemperature() {
Serial.print("Water Temperature = ");
Serial.print(waterTemperature);
Serial.println("ºC");
}
Sensor pH (DFRobot : Analog pH Sensor/Meter Kit V2)
Pengukuran pH dilakukan melalui pembacaan analog pada pin 33 dengan metode nilai yang didapat setelah dilakukan kalibrasi untuk mendapatkan nilai pH yang stabil dan akurat. Berikut adalah code program yang digunakan.
//pHSensor +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
const int PH_PIN = 33;
float ph;
float PH_ADC_RAW = 0;
void setPH() {
for (int i = 0; i < 800; i++) {
PH_ADC_RAW += analogRead(PH_PIN);
}
PH_ADC_RAW /= 800;
//Serial.println(PH_ADC_RAW);
ph = 15.5942 - 0.0051167 * PH_ADC_RAW;
//ph = -0.2668 * PH_ADC_RAW + 519.93;
}
void printPH() {
Serial.print("PH_ADC_RAW = ");
Serial.println(PH_ADC_RAW);
Serial.print("pH = ");
Serial.println(ph);
}
Sensor Salinitas (DFRobot : Analog Electrical Conductivity Sensor / Meter (K=10))
Pengukuran nilai salinitas air menggunakan sensor TDS yang terhubung ke pin 32 pada papan mikrokontroler. Kode ini berfungsi untuk mengambil data analog dari sensor, kemudian mengolahnya menjadi nilai salinitas yang dapat ditampilkan melalui serial monitor. Berikut adalah code program yang digunakan.
//TDS Sensor +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
const int TDS_PIN = 32;
float salinity;
float TDS_ADC_RAW = 0;
void setSalinity() {
for (int i = 0; i < 800; i++) {
TDS_ADC_RAW += analogRead(TDS_PIN);
}
TDS_ADC_RAW /= 800;
//Serial.println(TDS_ADC_RAW);
//salinity = 1E-06 * TDS_ADC_RAW * TDS_ADC_RAW + 0.0266 * TDS_ADC_RAW + 0.9853;
//salinity = 0.1294 * TDS_ADC_RAW + 21.266 ;
salinity = 0.0176 * TDS_ADC_RAW - 6.9707;
}
void printSalinitas() {
Serial.print("TDS_ADC_RAW = ");
Serial.println(TDS_ADC_RAW);
Serial.print("Salinitas = ");
Serial.println(salinity);
}
Sensor Dissolved Oxygen (DFRobot Analog Dissolved Oxygen Sensor)
Kadar oksigen terlarut (Dissolved Oxygen/DO) di dalam air menggunakan sensor DO yang terhubung ke pin 25 pada papan mikrokontroler. Sensor ini bekerja dengan mengubah kadar oksigen yang terlarut menjadi sinyal listrik berupa tegangan. Nilai tegangan tersebut kemudian dibaca oleh mikrokontroler dan diolah menggunakan tabel serta rumus kalibrasi, sehingga dapat ditampilkan sebagai data oksigen terlarut yang lebih mudah dipahami. Berikut adalah code program yang digunakan.
//DO Sensor +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define DO_PIN 25
#define VREF 3300 //VREF (mv)
#define ADC_RES 4095 //ADC Resolution
//Single-point calibration Mode=0
//Two-point calibration Mode=1
#define TWO_POINT_CALIBRATION 0
#</nowiki>define READ_TEMP (25) //Current water temperature ℃, Or temperature sensor function
//Single point calibration needs to be filled CAL1_V and CAL1_T
#define CAL1_V (269) //mv
#define CAL1_T (25) //℃
//Two-point calibration needs to be filled CAL2_V and CAL2_T
//CAL1 High temperature point, CAL2 Low temperature point
#define CAL2_V (1300) //mv
#define CAL2_T (15) //℃
const uint16_t DO_Table[41] = {
14460, 14220, 13820, 13440, 13090, 12740, 12420, 12110, 11810, 11530,
11260, 11010, 10770, 10530, 10300, 10080, 9860, 9660, 9460, 9270,
9080, 8900, 8730, 8570, 8410, 8250, 8110, 7960, 7820, 7690,
7560, 7430, 7300, 7180, 7070, 6950, 6840, 6730, 6630, 6530, 6410
};
uint8_t Temperaturet;
uint16_t DO_ADC_RAW;
uint16_t DO_ADC_Voltage;
uint16_t DO;
int16_t readDO(uint32_t voltage_mv, uint8_t temperature_c) {
#if TWO_POINT_CALIBRATION == 00
uint16_t V_saturation = (uint32_t)CAL1_V + (uint32_t)35 * temperature_c - (uint32_t)CAL1_T * 35;
return (voltage_mv * DO_Table[temperature_c] / V_saturation);
#else
uint16_t V_saturation = (int16_t)((int8_t)temperature_c - CAL2_T) * ((uint16_t)CAL1_V - CAL2_V) / ((uint8_t)CAL1_T - CAL2_T) + CAL2_V;
return (voltage_mv * DO_Table[temperature_c] / V_saturation);
#endif
}
void setDO() {
Temperaturet = (uint8_t)READ_TEMP;
DO_ADC_RAW = analogRead(DO_PIN);
DO_ADC_Voltage = uint32_t(VREF) * DO_ADC_RAW / ADC_RES;
DO = readDO(DO_ADC_Voltage, Temperaturet);
}
void printDO() {
//Serial.print("DO Temperaturet:\t" + String(Temperaturet) + "\t");
//Serial.print("DO ADC RAW:\t" + String(DO_ADC_RAW) + "\t");
//Serial.print("DO ADC Voltage:\t" + String(DO_ADC_Voltage) + "\t");
Serial.println("DO_ADC_RAW:\t" + String(DO_ADC_RAW));
Serial.println("DO_ADC_Voltage:\t" + String(DO_ADC_Voltage));
Serial.println("DO:\t" + String(DO));
}
Sensor Voltage
Sensor INA219 pada alamat I2C 0x41 digunakan untuk monitoring power consumption sistem secara real-time, mengukur tegangan, arus, dan daya yang dikonsumsi seluruh rangkaian. Berikut adalah code program yang digunakan.
// // INA219 Sensor +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adafruit_INA219 ina219(0x41);
float shuntvoltage = 0;
float busvoltage = 0;
float current_mA = 0;
float loadvoltage = 0;
float power_mW = 0;
void setVoltage() {
try {
shuntvoltage = ina219.getShuntVoltage_mV();
busvoltage = ina219.getBusVoltage_V();
current_mA = ina219.getCurrent_mA();
power_mW = ina219.getPower_mW();
loadvoltage = busvoltage + (shuntvoltage / 1000);
} catch (String error) {
Serial.println("Error Voltage: " + error);
}
}
void printVoltage() {
Serial.print("bus voltage = ");
Serial.println(busvoltage);
Serial.print("shunt voltage = ");
Serial.println(shuntvoltage);
Serial.print("load voltage");
Serial.println(loadvoltage);
Serial.print("current mA = ");
Serial.println(current_mA);
Serial.print("power mW = ");
Serial.println(power_mW);
}
Lora
Implementasi komunikasi LoRa mencakup setup transceiver pada frekuensi 915 MHz, konfigurasi pin control, dan utility functions untuk scanning perangkat I2C serta kontrol relay pada pin 26. Berikut adalah code program yang digunakan.
//LoRa +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// - Pin configs -
#define ss 5
#define rst 12
#define dio0 2
void startLora() {
Serial.println("LoRa Sender");
// Setup LoRa transceiver module
LoRa.setPins(ss, rst, dio0);
LoRa.setTxPower(23, false);
//LoRa.setSpreadingFactor(12);
//LoRa.setSignalBandwidth(62.5E3);
if (!LoRa.begin(915E6)) {
Serial.println("Starting LoRa failed!");
ESP.restart();
} else {
Serial.println("Starting LoRa successful");
}
}
void i2cScan() {
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
nDevices++;
} else if (error == 4) {
Serial.print("Unknow error at address 0x");
if (address < 16) {
Serial.print("0");
}
Serial.println(address, HEX);
}
}
if (nDevices == 0) {
Serial.println("No I2C devices found\n");
}
// else {
// Serial.println("done\n");
// }
}
void setup() {
Serial.begin(115200);
//Relay +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
pinMode(26, OUTPUT);
digitalWrite(26, LOW); //set pin LOW (Switch Closed)
Wire.begin();
i2cScan();
Start Sensor
Proses startup sistem mencakup inisialisasi berurutan semua komponen monitoring: komunikasi LoRa, power sensing INA219, sensor cuaca DHT22 dan BME280, pengukur suhu air DS18B20, sensor pH, serta konfigurasi deep sleep timer untuk optimasi daya. Berikut adalah code program yang digunakan.
//LoRa +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
startLora();
//INA219 +++++++++++++++++++++++++++++
try {
if (!ina219.begin()) {
Serial.println("Failed to find INA219 chip");
//while (1) { delay(10); }
}
} catch (String error) {
Serial.println("Error Voltage: " + error);
}
//DHT22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
dht.begin();
//BME280 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Serial.println("Starting BME280");
bool BMEstatus;
BMEstatus = bme.begin(0x76);
if (!BMEstatus) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
}
//DS18B20 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Start the DS18B20 sensor
pinMode(waterTemperaturePin, INPUT);
sensors.begin();
//pH Sensor +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
pinMode(PH_PIN, INPUT);
// Voltage Sensor +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// set the ADC attenuation to 11 dB (up to ~3.3V input)
analogSetAttenuation(ADC_11db);
// // Sleep Configuration
// //esp_sleep_enable_timer_wakeup(1800E6);
esp_sleep_enable_timer_wakeup(30E6);
}
void loop() {
//Set relay pin LOW (Switch closed)
//digitalWrite(25, LOW);
/*
if (millis() - startTime > restartTime) {
ESP.restart();
}
Serial.println(millis() - startTime);
*/
Print Sensor
Proses print dan fungsi loop mengimplementasikan cycle monitoring lengkap: pembacaan sensor berurutan, validasi data berdasarkan threshold suhu air, formatting data ke protokol komunikasi custom, transmisi LoRa, dan power shutdown untuk optimasi energi. Berikut adalah code program yang digunakan.
//DS18B20 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
setWaterTemperature();
// printWaterTemperature(); //remove comment on the function to use it.
if (waterTemperature < 84.00) {
//DHT22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
setDHT();
// printDHT();
//BME280 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
setBMEValues();
// printBMEValues(); //remove comment on the function to use it.
//Salinitas +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
setSalinity();
// printSalinitas();
//pH Sensor +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
setPH();
// printPH(); //remove comment on the function to use it.
//DO Sensor +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
setDO();
printDO(); //remove comment on the function to use it.
// // Voltage Sensor ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// // setVoltage();
// // printVoltage();
String message = "ID=Aceh_Solitude-1";
message += "&GROUP=colabs";
//message += "&deviceid=PA00";
message += "&loc=BlangSitungkoh";
message += "&long=5.6691075";
message += "&lat=95.0906248";
message += "&iT=" + String(bmeTemperature);
message += "&iH=" + String(bmeHumidity);
message += "&iP=" + String(bmePressure);
message += "&iA=" + String(bmeAltitude);
message += "&eT=" + String(dhtTemperature);
message += "&eH=" + String(dhtHumidity);
message += "&wT=" + String(waterTemperature);
message += "&pH=" + String(ph);
message += "&DO=" + String(DO);
message += "&Sal=" + String(salinity);
message += "&bV=" + String(busvoltage);
message += "&sV=" + String(shuntvoltage);
message += "&lV=" + String(loadvoltage);
message += "&mA=" + String(current_mA);
message += "&mW=" + String(power_mW);
// message += "&softwaretype=prototype-00";
Serial.print("Sending packet: ");
Serial.println(message);
// send packet
LoRa.beginPacket();
LoRa.print(message);
LoRa.endPacket();
delay(500);
digitalWrite(26, HIGH); //Set relay pin HIGH (Circuit Opened)
Wire.end();
LoRa.end();
Serial.end();
delay(100);
esp_deep_sleep_start();
}
}
Implementasi kode lengkap di atas menunjukkan integrasi sistem monitoring kualitas air laut. Sistem ini mampu beroperasi secara mandiri dengan cycle pembacaan sensor, transmisi data LoRa, dan power management yang optimal untuk deployment jangka panjang di lingkungan laut. Source code lengkap dan dokumentasi tambahan dapat diakses melalui repository GitHub di: https://github.com/insaninfonesia/Co_LABS.
Sensor Mounting Structures

Akurasi data sensor dalam sistem monitoring kualitas air sangat bergantung pada cara dan posisi pemasangan sensor. Oleh karena itu, diperlukan struktur penyangga yang tepat agar sensor tetap stabil, terlindungi, dan mudah diakses untuk perawatan.
Tujuan Struktur Pemasangan
Struktur ini dirancang agar sensor dapat:
- Berada pada kedalaman yang sesuai dengan kebutuhan pengukuran
- Terlindungi dari gelombang, arus, dan faktor lingkungan
- Mudah diakses untuk kalibrasi, perawatan, dan penggantian
Buoy (Pelampung)

Buoy merupakan platform terapung yang digunakan untuk menopang sensor di atas maupun di dalam air. Metode ini umum digunakan pada laut, danau, atau perairan dalam di mana pemasangan tiang tidak memungkinkan.
Karakteristik Buoy
- Mengapung di permukaan air
- Fleksibel mengikuti gelombang
- Cocok untuk monitoring jangka panjang
- Dapat membawa sistem mandiri (solar panel & baterai)
Panduan Pemasangan
- Gunakan pelampung yang kuat, tahan korosi, dan tahan air laut
- Pasang pemberat (anchor) di dasar perairan untuk menjaga posisi buoy
- Gunakan tali atau kabel penyangga yang kuat dan tahan air
- Sesuaikan kedalaman sensor dengan kebutuhan pengukuran
- Pastikan sensor tidak terlalu dekat permukaan atau dasar
- Sediakan ruang untuk panel surya dan baterai jika menggunakan sistem mandiri

Tips Pemasangan
- Gunakan material stainless steel atau plastik HDPE
- Pastikan semua konektor tahan air (waterproof)
- Hindari kabel terlalu tegang (beri slack untuk gelombang)
- Gunakan pelindung probe (pipa atau housing)
Catatan
Metode buoy sangat cocok untuk:
- Lokasi dengan kedalaman tinggi
- Area tanpa struktur tetap
- Monitoring jangka panjang di laut terbuka