Sensor Tambak: Difference between revisions
Colabs Admin (talk | contribs) No edit summary |
Colabs Admin (talk | contribs) Update Sub Bab Pemrograman |
||
| Line 216: | Line 216: | ||
|} | |} | ||
=== 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. | |||
{| class="wikitable" | |||
|//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. | |||
{| class="wikitable" | |||
|//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. | |||
{| class="wikitable" | |||
|//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. | |||
{| class="wikitable" | |||
|//DO Sensor +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
<nowiki>#</nowiki>define DO_PIN 25 | |||
<nowiki>#</nowiki>define VREF 3300 //VREF (mv) | |||
<nowiki>#</nowiki>define ADC_RES 4095 //ADC Resolution | |||
//Single-point calibration Mode=0 | |||
//Two-point calibration Mode=1 | |||
<nowiki>#</nowiki>define TWO_POINT_CALIBRATION 0 | |||
<nowiki>#</nowiki>define READ_TEMP (25) //Current water temperature ℃, Or temperature sensor function | |||
//Single point calibration needs to be filled CAL1_V and CAL1_T | |||
<nowiki>#</nowiki>define CAL1_V (269) //mv | |||
<nowiki>#</nowiki>define CAL1_T (25) //℃ | |||
//Two-point calibration needs to be filled CAL2_V and CAL2_T | |||
//CAL1 High temperature point, CAL2 Low temperature point | |||
<nowiki>#</nowiki>define CAL2_V (1300) //mv | |||
<nowiki>#</nowiki>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) { | |||
<nowiki>#</nowiki>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); | |||
<nowiki>#</nowiki>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); | |||
<nowiki>#</nowiki>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. | |||
{| class="wikitable" | |||
|// // 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. | |||
{| class="wikitable" | |||
|//LoRa +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | |||
// - Pin configs - | |||
<nowiki>#</nowiki>define ss 5 | |||
<nowiki>#</nowiki>define rst 12 | |||
<nowiki>#</nowiki>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. | |||
{| class="wikitable" | |||
|//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(); | |||
} | |||
|} | |||
=== ''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. | |||
{| class="wikitable" | |||
|Serial.println(millis() - startTime); | |||
<nowiki>*</nowiki>/ | |||
//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. | |||
== Konfigurasi dan Kalibrasi == | == Konfigurasi dan Kalibrasi == | ||
Revision as of 05:26, 23 April 2026
Deskripsi Singkat
Daftar Komponen
- Board (PCB Custom)
- ESP 32
Perakitan
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 dhtHumidity = 0;
//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 Tinggi Muka Air (Ultrasonic RS485 A01ANY4B)
Konfigurasi sensor DHT22 dimulai dengan mendefinisikan pin koneksi dan tipe sensor yang digunakan untuk pengukuran tinggi muka air. Berikut adalah code program yang digunakan.
| // Ultrasonic RS485 A01ANY4B ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define MAX485_DE 26 #define MAX485_RE_NEG 25 #define RXD2 16 #define TXD2 17 ModbusMaster node485; float distance = 0; void preTransmission() { digitalWrite(MAX485_RE_NEG, 1); digitalWrite(MAX485_DE, 1); } void postTransmission() { digitalWrite(MAX485_RE_NEG, 0); digitalWrite(MAX485_DE, 0); } void setDistance() { uint8_t result = node485.readHoldingRegisters(257, 1); // Read one register delay(100); if (result == node485.ku8MBSuccess) { int jarak = node485.getResponseBuffer(0); // First buffer index holds the temperature distance = 200.0 - jarak / 10.0; } } void printDistance() { Serial.print("Distance = "); Serial.print(distance); Serial.println(" cm"); } |
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;
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); } }
Serial.print("Temperature = "); Serial.print(bmeTemperature); Serial.println(" *C");
Serial.print(bmePressure); Serial.println(" hPa");
Serial.print(bmeAltitude); Serial.println(" m");
Serial.print(bmeHumidity); 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);
sensors.requestTemperatures(); waterTemperature = sensors.getTempCByIndex(0); }
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;
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;
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; }
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 ADC_RES 4095 //ADC Resolution
//Two-point calibration Mode=1 #define TWO_POINT_CALIBRATION 0
#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) //℃
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 };
uint16_t DO_ADC_RAW; uint16_t DO_ADC_Voltage; uint16_t DO;
#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 }
Temperaturet = (uint8_t)READ_TEMP; DO_ADC_RAW = analogRead(DO_PIN); DO_ADC_Voltage = uint32_t(VREF) * DO_ADC_RAW / ADC_RES;
}
//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;
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); } }
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
Serial.println("LoRa Sender"); // Setup LoRa transceiver module LoRa.setPins(ss, rst, dio0); LoRa.setTxPower(23, false); //LoRa.setSpreadingFactor(12); //LoRa.setSignalBandwidth(62.5E3);
Serial.println("Starting LoRa failed!"); ESP.restart(); } else { Serial.println("Starting LoRa successful"); } }
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"); // } }
Serial.begin(115200);
pinMode(26, OUTPUT); digitalWrite(26, LOW); //set pin LOW (Switch Closed) Wire.begin();
|
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();
try { if (!ina219.begin()) { Serial.println("Failed to find INA219 chip"); //while (1) { delay(10); } } } catch (String error) { Serial.println("Error Voltage: " + error); }
dht.begin();
Serial.println("Starting BME280"); bool BMEstatus; BMEstatus = bme.begin(0x76); if (!BMEstatus) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); }
// Start the DS18B20 sensor pinMode(waterTemperaturePin, INPUT); sensors.begin();
pinMode(PH_PIN, INPUT);
// set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db);
// //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(); } |
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.
| Serial.println(millis() - startTime);
*/ //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.
setSalinity(); // printSalinitas();
setPH(); // printPH(); //remove comment on the function to use it.
setDO(); printDO(); //remove comment on the function to use it.
// // setVoltage(); // // printVoltage();
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);
Serial.print("Sending packet: "); Serial.println(message); // send packet LoRa.beginPacket(); LoRa.print(message); LoRa.endPacket();
digitalWrite(26, HIGH); //Set relay pin HIGH (Circuit Opened)
LoRa.end(); Serial.end();
} } |
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.