Monitoring Daya Panel Surya



1. Pendahuan [Kembali]

    Pembangkit Listrik Tenaga Surya (PLTS) merupakan solusi vital untuk penyediaan energi di kawasan pasca bencana, seperti di Kawasan Batu Busuak, Kecamatan Pauh. Namun, pengoperasian unit PLTS sering kali menghadapi kendala efisiensi akibat fluktuasi beban dan risiko kerusakan perangkat akibat tegangan jatuh (drop voltage), beban berlebih (overload), serta peningkatan suhu operasional pada komponen utama seperti inverter. Jika dikelola secara manual, pengawasan parameter elektrikal dan termal ini menjadi tidak efisien serta berisiko tinggi menimbulkan kerusakan sistem kelistrikan pasca bencana.
    Oleh karena itu, diperlukan sebuah instrumen pemantauan daya sekaligus sistem manajemen beban cerdas (intelligent load management system). Sistem ini memadukan pembacaan parameter elektrikal secara real-time, pemantauan suhu secara termal, dan deteksi intensitas cahaya matahari menggunakan mikrokontroler STM32. Dengan adanya sistem otomatis ini, distribusi beban dapat diatur secara cerdas melalui mekanisme pemutusan relai (load shedding), serta memberikan peringatan dini (early warning) secara visual sebelum sistem mengalami overheating atau baterai mengalami deep discharge.

2. Tujuan [Kembali]

  • Merancang dan mengimplementasikan sistem manajemen daya cerdas (load shedding) berbasis mikrokontroler STM32 pada unit PLTS pasca bencana.

  • Mengintegrasikan sensor INA219 untuk pemantauan parameter elektrikal (tegangan, arus, daya) baterai secara real-time guna mendeteksi kondisi Under-Voltage.

  • Mengimplementasikan sensor suhu non-kontak MLX90614 untuk mendeteksi titik panas (hotspot) pada inverter dan memicu sistem peringatan dini visual (Traffic LED).

  • Menggunakan sensor LDR (Light Dependent Resistor) sebagai Photo-Switch otomatis dalam pembagian jalur distribusi daya antara beban berat dan beban ringan berdasarkan siklus siang dan malam.


3. Alat dan Komponen [Kembali]

Alat :

1.STM32 Blue Pill (Mikrokontroler Utama)

Bertindak sebagai unit pemroses pusat (CPU) yang mengkuisisi data sensor melalui protokol I2C dan ADC, mengeksekusi logika kontrol, serta mengendalikan aktuator relai dan indikator visual.

 






2. Voltmeter & Amperemeter (Alat Ukur Kalibrasi)
 Digunakan untuk memverifikasi nilai tegangan dan arus listrik pada rangkaian pengujian fisik demi memastikan akurasi data sensor.


Ampermeter adalah alat ukur listrik yang digunakan untuk mengukur besar arus listrik (I) yang mengalir pada suatu rangkaian. Satuan yang digunakan adalah Ampere (A), sesuai dengan hukum Ohm dan konsep dasar arus listrik. Agar pembacaan akurat, ampermeter harus disusun secara seri dengan beban sehingga seluruh arus yang mengalir ke beban juga melewati ampermeter.





3. Solder 



Bahan :

1. Sensor INA219: Sensor pemantau parameter elektrikal (V, I, W) baterai secara real-time melalui komunikasi I2C







2. Sensor MLX90614: Sensor termal inframerah non-kontak yang berfungsi memantau suhu permukaan atau titik panas (hotspot) pada komponen inverter.




3. Sensor LDR (Light Dependent Resistor): Bertindak sebagai sensor intensitas cahaya matahari yang keluarannya berupa sinyal analog untuk dibaca oleh pin ADC STM32








4. Modul Relay (Minimal 2 Channel): Sakelar elektromekanis yang menerima instruksi dari STM32 untuk mengeksekusi manajemen beban (Load Shedding Actuator):

  • Relay 1 (Beban Ringan): Tetap terhubung (Normally Closed / aktif terus-menerus) baik siang maupun malam.

  • Relay 2 (Beban Berat): Aktif hanya di siang hari dan otomatis terputus (trip) di malam hari





5. Modul Traffic LED (Merah, Kuning, Hijau): Bertindak sebagai sistem peringatan visual (visual warning system) yang merepresentasikan status termal inverter.



6. Layar LCD / OLED (Jalur I2C): Menampilkan data elektrikal baterai (V, I, W), status produksi energi (siang/malam), serta kondisi status relai.


 7.Kabel Jumper & Board Elektronik: Media penghubung interkoneksi komponen kelistrikan.







4. Landasan Teori [Kembali]

1. Mikrokontroler STM32 (Blue Pill)
STM32 berbasis core ARM Cortex-M merupakan pusat pemroses data (brain) dari sistem ini. Mikrokontroler ini bertugas mengonversi data analog menjadi digital melalui Analog-to-Digital Converter (ADC) serta berkomunikasi dengan periferal lain melalui protokol I2C.
Formulasi ADC (Analog-to-Digital Conversion):

Nilai digital yang dihasilkan oleh pin ADC STM32 (resolusi 12-bit atau 4096) untuk membaca tegangan dari pembagi tegangan sensor LDR dirumuskan sebagai berikut:

ADC_Value = (Vin / Vref) x 4095

Keterangan:

  • ADC_Value = Nilai digital hasil konversi (0 - 4095)
  • Vin = Tegangan analog input yang masuk ke pin STM32 (Volt)
  • Vref = Tegangan referensi STM32 (3.3 Volt)


2. Sensor Pemantau Arus dan Daya (INA219)

grafik respon sensor arus

Sensor INA219 berfungsi untuk memantau parameter elektrikal baterai secara real-time. Sensor ini bekerja dengan mengukur runtuhan tegangan (shunt voltage) pada sebuah resistor jembatan (shunt resistor) yang bernilai sangat kecil (Rshunt).

Formulasi Hukum Ohm dan Daya Elektrikal:

Untuk mendapatkan nilai arus (I) yang mengalir menuju beban dan total daya (P) yang dikonsumsi, digunakan persamaan berikut:

I = Vshunt / Rshunt
P = Vbus x I

Keterangan:

  • I = Arus yang mengalir ke beban (Ampere)
  • Vshunt = Tegangan yang terukur di drop resistor shunt (Volt)
  • Rshunt = Nilai resistansi resistor shunt (Ohm, umumnya 0.1 Ohm)
  • Vbus = Tegangan total pada kutub baterai (Volt)
  • P = Daya listrik yang dihasilkan atau digunakan (Watt)


3. Sensor Suhu Inframerah (MLX90614)

grafik respons sensor suhu



Sensor MLX90614 mendeteksi suhu permukaan inverter secara non-kontak menggunakan prinsip radiasi termal inframerah. Sensor ini menangkap energi inframerah yang dipancarkan oleh objek dan mengubahnya menjadi tegangan listrik yang linear dengan suhu objek.

Formulasi Hukum Stefan-Boltzmann:
Perpindahan energi radiasi panas dari permukaan komponen inverter ke sensor mengikuti hukum dasar radiasi berikut:

E = e x s x A x T4

Keterangan:

  • E = Energi radiasi yang dipancarkan (Watt)
  • e = Emisivitas bahan objek (rentang nilai 0 hingga 1)
  • s = Konstanta Stefan-Boltzmann (5.67 x 10^-8 W/m2K4)
  • A = Luas bidang permukaan yang memancarkan panas (m2)
  • T4 = Suhu mutlak objek dipangkatkan 4 (Kelvin)

Data mentah dari sensor ini kemudian dikonversi secara digital oleh internal DSP sensor menjadi satuan Celcius untuk dikirim ke STM32 melalui bus I2C.


4. Sensor LDR (Light Dependent Resistor) sebagai Photo-Switch

grafik respons sensor LDR

LDR adalah resistor yang nilai hambatannya berubah secara eksponensial berdasarkan intensitas cahaya (lux) yang mengenainya. LDR dipasang dalam konfigurasi rangkaian Pembagi Tegangan (Voltage Divider) agar perubahan resistansinya dapat dibaca sebagai perubahan tegangan analog oleh ADC STM32.

Formulasi Rangkaian Pembagi Tegangan LDR:

Vout = Vcc x (RLDR / (R1 + RLDR))

Keterangan:

  • Vout = Tegangan input analog yang menuju pin ADC STM32 (Volt)
  • Vcc = Tegangan sumber rangkaian sensor (3.3 Volt atau 5 Volt)
  • RLDR = Resistansi LDR yang nilainya berubah (Ohm). Saat siang hari atau terang nilai RLDR mengecil, sedangkan saat malam hari atau gelap nilai RLDR membesar.
  • R1 = Resistor tetap sebagai penyeimbang atau pull-up (Ohm)


5. Modul Relai (Load Shedding Actuator)

Relai adalah sakelar elektromekanis yang memanfaatkan prinsip induksi magnetik untuk menarik kontak sakelar dari posisi Normally Open (NO) ke Normally Closed (NC) atau sebaliknya. Di dalam sistem, relai menerjemahkan perintah logika digital tegangan rendah dari STM32 untuk memutus atau menghubungkan arus listrik beban berat dan ringan.

Formulasi Energi Medan Magnet Elektromagnetik (Solenoid Relai):

Gaya magnet (F) yang dihasilkan oleh koil relai untuk menarik tuas sakelar berbanding lurus dengan jumlah lilitan dan kuadrat arus yang mengalir:

F = ((N x I)^2 x u0 x A) / (2 x g^2)

Keterangan:

  • F = Gaya gerak magnet yang dihasilkan (Newton)
  • N = Jumlah lilitan kawat pada koil relai
  • I = Arus pemicu koil yang diberikan oleh rangkaian driver relai (Ampere)
  • u0 = Permeabilitas vakum atau udara (4 x pi x 10^-7 H/m)
  • A = Luas penampang inti besi (m2)
  • g = Jarak celah udara antara lengan penarik dengan inti besi (meter)


5. Flowchart dan Listing Program [Kembali]

  • Flowchart

  • Listing Program

/* USER CODE BEGIN Header */

/**

******************************************************************************

* @file : main.c

* @brief : Final Robust Version - Monitoring System (With Buzzer & Fixed Sensors)

******************************************************************************

*/

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include "main.h"


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include "ssd1306.h"

#include "ssd1306_fonts.h"

#include <stdio.h>

/* USER CODE END Includes */


/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

// I2C Addresses (Format HAL: 7-bit address digeser ke kiri 1 bit)

#define INA219_ADDRESS (0x40 << 1) // Hasil: 0x80

#define MLX90614_ADDRESS (0x5A << 1) // Hasil: 0xB4

#define MLX90614_TOBJ1 0x07 // Register Suhu Objek


// Ambang Batas Sensor

#define LDR_THRESHOLD_HIGH 2500

#define LDR_THRESHOLD_LOW 1500

#define SUHU_NORMAL 45.0f

#define SUHU_PERINGATAN 65.0f

#define LVD_THRESHOLD 10.0f // Batas 10.0V untuk Trip

/* USER CODE END PD */


/* Private variables ---------------------------------------------------------*/

ADC_HandleTypeDef hadc1;

I2C_HandleTypeDef hi2c1;


/* USER CODE BEGIN PV */

float suhu_inverter = 0.0f;

float v_baterai = 0.0f;

float arus_beban = 0.0f;

float daya_total = 0.0f;

uint16_t ldr_value = 0;


float faktor_V = 1.0f;

float faktor_I = 1.0f;


char status_sistem[16] = "INIT";

uint8_t status_siang = 1;

uint8_t i2c_error_flag = 0;


uint32_t tick_terakhir = 0;

const uint32_t interval_baca = 1000;

/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);

static void MX_I2C1_Init(void);

/* USER CODE BEGIN PFP */

void INA219_Init(void);

void Reset_I2C(void);

uint16_t Baca_LDR(void);

void Baca_MLX90614(void);

void Baca_INA219(void);

void Update_OLED(void);

/* USER CODE END PFP */


/* USER CODE BEGIN 0 */

void Reset_I2C(void) {

HAL_I2C_DeInit(&hi2c1);

HAL_Delay(10);

MX_I2C1_Init();

HAL_Delay(10);

ssd1306_Init();

INA219_Init();

i2c_error_flag = 0;

}


uint16_t Baca_LDR(void) {

uint32_t total_adc = 0;

const uint8_t sample_count = 10; // Ambil 10 sampel untuk oversampling


for (uint8_t i = 0; i < sample_count; i++) {

HAL_ADC_Start(&hadc1);

if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {

total_adc += HAL_ADC_GetValue(&hadc1);

}

HAL_ADC_Stop(&hadc1);

HAL_Delay(2); // Beri jeda 2ms antar sampling agar kapasitor internal ADC stabil

}


return (uint16_t)(total_adc / sample_count); // Kembalikan nilai rata-rata

}


void Baca_MLX90614(void) {

uint8_t buffer[3];

uint16_t raw_data;


// Membaca 3 byte data (LSB, MSB, PEC) dari register TOBJ1

if (HAL_I2C_Mem_Read(&hi2c1, MLX90614_ADDRESS, MLX90614_TOBJ1, I2C_MEMADD_SIZE_8BIT, buffer, 3, 100) == HAL_OK) {

// Menggabungkan LSB dan MSB

raw_data = (buffer[1] << 8) | buffer[0];


// Konversi raw data ke derajat Celcius

suhu_inverter = (raw_data * 0.02f) - 273.15f;

} else {

i2c_error_flag = 1;

}

}


void INA219_Init(void) {

// Register 0x00 (Config): 0x399F -> Range 32V, Gain /8 (320mV), 12-bit ADC, Continuous

uint8_t config_buf[2] = {0x39, 0x9F};

HAL_I2C_Mem_Write(&hi2c1, INA219_ADDRESS, 0x00, I2C_MEMADD_SIZE_8BIT, config_buf, 2, 100);

HAL_Delay(10);

}


void Baca_INA219(void) {

uint8_t buf[2];

uint16_t raw_bus;

int16_t raw_shunt;


// 1. Baca Bus Voltage (Register 0x02)

if (HAL_I2C_Mem_Read(&hi2c1, INA219_ADDRESS, 0x02, I2C_MEMADD_SIZE_8BIT, buf, 2, 100) == HAL_OK) {

raw_bus = (buf[0] << 8) | buf[1];

// Shift kanan 3 bit karena 3 bit LSB adalah flag (CNVR & OVF)

// LSB = 4mV (0.004 V)

v_baterai = ((raw_bus >> 3) * 0.004f) * faktor_V;

} else {

i2c_error_flag = 1;

}


// 2. Baca Shunt Voltage (Register 0x01)

if (HAL_I2C_Mem_Read(&hi2c1, INA219_ADDRESS, 0x01, I2C_MEMADD_SIZE_8BIT, buf, 2, 100) == HAL_OK) {

raw_shunt = (int16_t)((buf[0] << 8) | buf[1]);

// LSB Shunt = 10uV = 0.00001 V.

// Asumsi R_Shunt = 0.1 Ohm (standar modul INA219)

arus_beban = ((float)raw_shunt * 0.0001f) * faktor_I;

} else {

i2c_error_flag = 1;

}


// Hindari pembacaan minus kecil saat tidak ada beban

if (arus_beban < 0.0f) arus_beban = 0.0f;


daya_total = v_baterai * arus_beban;

}


void Update_OLED(void) {

char buff_teks[25];

ssd1306_Fill(Black);

sprintf(buff_teks, "V:%.2fV", v_baterai); ssd1306_SetCursor(0, 0); ssd1306_WriteString(buff_teks, Font_7x10, White);

sprintf(buff_teks, "I:%.2fA", arus_beban); ssd1306_SetCursor(60, 0); ssd1306_WriteString(buff_teks, Font_7x10, White);

sprintf(buff_teks, "P:%.1fW", daya_total); ssd1306_SetCursor(0, 15); ssd1306_WriteString(buff_teks, Font_7x10, White);

sprintf(buff_teks, "T:%.1fC", suhu_inverter); ssd1306_SetCursor(60, 15); ssd1306_WriteString(buff_teks, Font_7x10, White);

sprintf(buff_teks, "%s", status_sistem); ssd1306_SetCursor(0, 30); ssd1306_WriteString(buff_teks, Font_7x10, White);

ssd1306_UpdateScreen();

}

/* USER CODE END 0 */


/**

* @brief The application entry point.

* @retval int

*/

int main(void) {

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();


/* Configure the system clock */

SystemClock_Config();


/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_ADC1_Init();

MX_I2C1_Init();


/* USER CODE BEGIN 2 */

ssd1306_Init();

INA219_Init();


// Tampilan awal diposisikan di tengah layar OLED

ssd1306_Fill(Black);

ssd1306_SetCursor(22, 27); // Koordinat diubah ke tengah (X=22, Y=27)

ssd1306_WriteString("SYSTEM READY", Font_7x10, White); // Teks diubah menjadi SYSTEM READY

ssd1306_UpdateScreen();

HAL_Delay(1000);

/* USER CODE END 2 */


/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1) {

uint32_t tick_sekarang = HAL_GetTick();

if (tick_sekarang - tick_terakhir >= interval_baca) {

tick_terakhir = tick_sekarang;

if (i2c_error_flag == 1) Reset_I2C();


ldr_value = Baca_LDR();

Baca_MLX90614();

Baca_INA219();


if (i2c_error_flag == 0) {

// Logika Indikator Suhu (LED)

if (suhu_inverter < SUHU_NORMAL) {

HAL_GPIO_WritePin(GPIOA, LED_G_Pin, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOA, LED_Y_Pin | LED_R_Pin, GPIO_PIN_RESET);

} else if (suhu_inverter >= SUHU_NORMAL && suhu_inverter <= SUHU_PERINGATAN) {

HAL_GPIO_WritePin(GPIOA, LED_Y_Pin, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOA, LED_G_Pin | LED_R_Pin, GPIO_PIN_RESET);

} else {

HAL_GPIO_WritePin(GPIOA, LED_R_Pin, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOA, LED_G_Pin | LED_Y_Pin, GPIO_PIN_RESET);

}


// Proteksi (Low Voltage Disconnect & Overheat) + Buzzer

if ((v_baterai < LVD_THRESHOLD && v_baterai > 1.0f) || (suhu_inverter >= SUHU_PERINGATAN)) {

HAL_GPIO_WritePin(GPIOA, RELAY_RINGAN_Pin | RELAY_BERAT_Pin | BUZZER_Pin, GPIO_PIN_SET);

sprintf(status_sistem, (suhu_inverter >= SUHU_PERINGATAN) ? "TRIP: OVERHEAT" : "TRIP: LOW BATT");

} else {

HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_RESET);


// Logika Beban Berdasarkan LDR (Siang/Malam)

if (ldr_value > LDR_THRESHOLD_HIGH) {

HAL_GPIO_WritePin(GPIOA, RELAY_RINGAN_Pin | RELAY_BERAT_Pin, GPIO_PIN_RESET);

sprintf(status_sistem, "SIANG (FULL)");

} else {

HAL_GPIO_WritePin(GPIOA, RELAY_RINGAN_Pin, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOA, RELAY_BERAT_Pin, GPIO_PIN_SET);

sprintf(status_sistem, "MALAM (ECO)");

}

}

Update_OLED();

}

}

/* USER CODE END WHILE */


/* USER CODE BEGIN 3 */

}

/* USER CODE END 3 */

}


/**

* @brief System Clock Configuration

* @retval None

*/

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};


/** Initializes the RCC Oscillators according to the specified parameters

* in the RCC_OscInitTypeDef structure.

*/

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Error_Handler();

}


/** Initializes the CPU, AHB and APB buses clocks

*/

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;


if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

{

Error_Handler();

}

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;

PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;

if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

{

Error_Handler();

}

}


/**

* @brief ADC1 Initialization Function

* @param None

* @retval None

*/

static void MX_ADC1_Init(void)

{

ADC_ChannelConfTypeDef sConfig = {0};


hadc1.Instance = ADC1;

hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;

hadc1.Init.ContinuousConvMode = DISABLE;

hadc1.Init.DiscontinuousConvMode = DISABLE;

hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;

hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;

hadc1.Init.NbrOfConversion = 1;

if (HAL_ADC_Init(&hadc1) != HAL_OK)

{

Error_Handler();

}


/** Configure Regular Channel

*/

sConfig.Channel = ADC_CHANNEL_0;

sConfig.Rank = ADC_REGULAR_RANK_1;

sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;

if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)

{

Error_Handler();

}

}


/**

* @brief I2C1 Initialization Function

* @param None

* @retval None

*/

static void MX_I2C1_Init(void)

{

hi2c1.Instance = I2C1;

hi2c1.Init.ClockSpeed = 100000;

hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;

hi2c1.Init.OwnAddress1 = 0;

hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;

hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

hi2c1.Init.OwnAddress2 = 0;

hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

if (HAL_I2C_Init(&hi2c1) != HAL_OK)

{

Error_Handler();

}

}


/**

* @brief GPIO Initialization Function

* @param None

* @retval None

*/

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};


/* GPIO Ports Clock Enable */

__HAL_RCC_GPIOD_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();


/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(GPIOA, LED_R_Pin|LED_Y_Pin|LED_G_Pin|BUZZER_Pin, GPIO_PIN_RESET);


/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(GPIOA, RELAY_RINGAN_Pin|RELAY_BERAT_Pin, GPIO_PIN_SET);


/*Configure GPIO pins : LED_R_Pin LED_Y_Pin LED_G_Pin RELAY_RINGAN_Pin

RELAY_BERAT_Pin BUZZER_Pin */

GPIO_InitStruct.Pin = LED_R_Pin|LED_Y_Pin|LED_G_Pin|RELAY_RINGAN_Pin

|RELAY_BERAT_Pin|BUZZER_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}


/**

* @brief This function is executed in case of error occurrence.

* @retval None

*/

void Error_Handler(void)

{

__disable_irq();

while (1)

{

}

}


#ifdef USE_FULL_ASSERT

/**

* @brief Reports the name of the source file and the source line number

* where the assert_param error has occurred.

* @param file: pointer to the source file name

* @param line: assert_param error line source number

* @retval None

*/

void assert_failed(uint8_t *file, uint32_t line)

{

/* USER CODE BEGIN 6 */

/* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */


6. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

  • Rangkaian Simulasi

    • Prinsip Kerja :

    Sistem monitoring dan manajemen daya PLTS berbasis mikrokontroler STM32 Blue Pill bekerja secara otomatis melalui proses pemantauan dan pengendalian yang berlangsung secara kontinu. Saat sistem pertama kali diaktifkan, STM32 melakukan inisialisasi seluruh periferal yang digunakan, yaitu komunikasi I2C untuk sensor MLX90614, INA219, dan layar OLED, serta ADC untuk membaca sensor LDR. Pada kondisi awal, seluruh LED indikator dimatikan dan relai beban berada dalam keadaan OFF untuk menghindari lonjakan arus sebelum pembacaan sensor stabil.

    Setelah inisialisasi selesai, mikrokontroler secara terus-menerus membaca data dari seluruh sensor. Sensor MLX90614 digunakan untuk mengukur suhu permukaan inverter, sensor INA219 mengukur tegangan baterai, arus beban, dan daya keluaran sistem, sedangkan sensor LDR mendeteksi intensitas cahaya lingkungan sebagai indikator kondisi siang atau malam. Data yang diperoleh kemudian diolah oleh mikrokontroler untuk menjalankan fungsi monitoring dan proteksi sistem.

    Berdasarkan nilai suhu yang terukur, sistem memberikan indikasi kondisi termal inverter melalui modul Traffic LED. LED hijau menyala ketika suhu berada pada kondisi normal di bawah 45°C, LED kuning menyala ketika suhu berada pada rentang peringatan 45°C hingga 65°C, dan LED merah menyala apabila suhu melebihi 65°C yang menandakan kondisi kritis atau potensi overheating.

    Selain pemantauan suhu, sistem juga menerapkan proteksi baterai menggunakan metode Low Voltage Disconnect (LVD). Tegangan baterai yang dibaca oleh sensor INA219 akan dibandingkan dengan batas tegangan minimum yang telah ditentukan. Jika tegangan baterai turun di bawah batas kritis, misalnya 10,8 V pada sistem 12 V, maka mikrokontroler akan memutus kedua relai beban secara otomatis untuk mencegah terjadinya pengosongan baterai secara berlebihan (deep discharge). Pada kondisi ini, logika pengendalian beban berdasarkan sensor LDR diabaikan karena prioritas utama sistem adalah melindungi baterai.

    Apabila tegangan baterai masih berada pada kondisi aman, mikrokontroler akan menjalankan fungsi manajemen beban berdasarkan intensitas cahaya yang dideteksi sensor LDR. Saat intensitas cahaya tinggi atau kondisi siang hari, kedua relai beban diaktifkan sehingga beban ringan dan beban berat dapat beroperasi secara bersamaan. Sebaliknya, pada kondisi malam hari dengan intensitas cahaya rendah, relai beban berat dimatikan untuk mengurangi konsumsi energi, sementara relai beban ringan tetap diaktifkan agar kebutuhan daya esensial tetap terpenuhi.

    Seluruh data hasil pemantauan, meliputi tegangan, arus, daya, suhu inverter, serta status relai dan kondisi sistem, ditampilkan pada layar OLED secara berkala melalui komunikasi I2C. Proses pembaruan tampilan dilakukan tanpa mengganggu pembacaan sensor sehingga informasi yang ditampilkan selalu aktual. Setelah seluruh proses selesai, mikrokontroler kembali mengulangi siklus pembacaan sensor dan pengambilan keputusan secara terus-menerus, sehingga sistem mampu melakukan monitoring, proteksi, dan manajemen daya PLTS secara real-time dan berkelanjutan.

    7. Vidio Simulasi [Kembali]

    Penjelasan Proteus

    Penjelasan Program

    Penjelasan Hardware


    8. Download File [Kembali]

    Download File Rangkaian                                               klik disini

    Download Kelengkapan Sistem                                 klik disini

    Download Video Penjelasan Proteus                               klik disini

    Download Video Penjelasan Program                             klik disini

    Download Video Penjelasan Hardware                           klik disini

    Download Datasheet STM32 BLUEPILL                 klik disini

    Download Datasheet INA219                                          klik disini

    Download Datasheet MLX90614                                    klik disini

    Download Datasheet Modul Traffic LED                            klik disini 

    Download Datasheet Layar LCD Display (Jalur: I2C)          klik disini

    Download Datasheet LDR Sensor                                   klik disini

    Download Datasheet Modul Relay                                      klik disini

    Komentar

    Postingan populer dari blog ini