Modul 4 Mikroprocessor dan Mikrokontroler




Pengembangan Sistem Pemantauan dan Perlindungan Panel Surya PV Berbasis STM32 ARM Cortex untuk Kondisi Pascabencana


1. Pendahuluan[Kembali]

Energi terbarukan seperti Pembangkit Listrik Tenaga Surya (PLTS) menjadi infrastruktur krusial dalam kondisi pasca-bencana (post-disaster), terutama di daerah seperti Batu Busuk, Padang, yang rentan terhadap gangguan jaringan listrik utama akibat aktivitas tektonik. Pada situasi darurat, keandalan suplai daya dari panel surya sangat bergantung pada kondisi kesehatan komponen di dalam panel box (seperti inverter, Solar Charge Controller, dan baterai).

Namun, panel box PLTS sering kali mengalami beban kerja ekstrem pasca-bencana yang memicu risiko overheating (suhu berlebih), kerusakan isolasi akibat overload arus, hingga potensi bahaya kebakaran dini akibat hubungan arus pendek. Oleh karena itu, proyek ini berfokus pada pengembangan sistem monitoring dan proteksi real-time pada panel box PLTS pak Zaini di Batu Busuk. Dengan menggunakan mikrokontroler STM32 berbasis ARM Cortex, sistem ini dirancang untuk mendeteksi anomali arus dan suhu secara cepat, serta mengeksekusi tindakan preventif berupa pengaktifan kipas pendingin, pemutusan arus via relay, dan bunyi alarm peringatan demi menjaga kontinuitas daya di wilayah terdampak bencana.

2. Tujuan[Kembali]

  • Merancang dan membuat prototipe sistem monitoring serta proteksi panel box PLTS berbasis STM32 ARM Cortex untuk kondisi pasca-bencana.
  • Mengintegrasikan sensor ACS712 dan modul XH-W3001 dengan STM32 untuk mendeteksi kondisi overload arus dan overheating secara real-time.
  • Mengaplikasikan konsep ADC, GPIO, Interrupt, Non-blocking delay (HAL_GetTick), dan komunikasi I2C pada arsitektur pemrograman STM32CubeIDE.


3. Alat dan Bahan[Kembali]

ALAT

  • STM32 F103C8T6


  • DHT11
                                    





  • Sensor Arus ACS712
                                           

  • Sensor MQ-2
                                        

  • Relay Module



  • Fan DC
                                            


  • LCD 16x2 dengan Driver I2C






  • Buzzer
                                        


  • Resistor
                                        


BAHAN



  • Breadboard
                                       



  • Kabel Jumper


4. Dasar Teori[Kembali]

4.1General Input Output 
      Input adalah semua data dan perintah yang dimasukkan ke dalam memori untuk diproses lebih lanjut oleh mikroprosesor. Sebuah perangkat input adalah komponen piranti keras yang memungkinkan user atau pengguna memasukkan data ke dalam mikroprosesor. Output adalah data hasil yang telah diproses. Perangkat output adalah semua komponen piranti keras yang menyampaikan informasi kepada orang-orang yang menggunakannya. 
      Pada STM32 dan Raspberry Pi Pico pin input/output terdiri dari digital dan analog yang jumlah pin-nya tergantung jenis mikrokontroller yang digunakan. Input digital digunakan untuk mendeteksi perubahan logika biner pada pin tertentu. Adanya input digital memungkinkan mikrokontroler untuk dapat menerjemahkan 0V menjadi logika LOW dan 5V menjadi logika HIGH. Membaca sinyal digital pada mikrokontroller dapat menggunakan sintaks digitalRead(pin):
    Output digital terdiri dari dua buah logika, yaitu kondisi logika HIGH dan kondisi logika LOW. Untuk menghasilkan output kita dapat menggunakan sintaks digitalWrite(pin,nilai); yang sebelumnya pin sudah diset ke mode OUTPUT, lalu parameter kedua adalah set nilai HIGH atau LOW. Apabila pin diset dengan nilai HIGH, maka voltase pin tersebut akan diset ke 5V atau 3.3V dan bila pin diset ke LOW, maka voltase pin tersebut akan diset ke 0V.


4.2 PWM 
    PWM (Pulse Width Modulation) adalah salah satu teknik modulasi dengan mengubah lebar pulsa (duty cylce) dengan nilai amplitudo dan frekuensi yang tetap. Satu siklus pulsa merupakan kondisi high kemudian berada di zona transisi ke kondisi low. Lebar pulsa PWM berbanding lurus dengan amplitudo sinyal asli yang belum termodulasi. 
    Duty Cycle adalah perbandingan antara waktu ON (lebar pulsa High) dengan perioda. Duty Cycle biasanya dinyatakan dalam bentuk persen (%). 
Gambar 1. Duty Cycle

Duty Cycle = tON / ttotal
Ton             =  Waktu ON atau Waktu dimana tegangan keluaran berada pada posisi tinggi (high atau 1) 
Toff            = Waktu OFF atau Waktu dimana tegangan keluaran berada pada posisi rendah (low atau 0) 
Ttotal      = Waktu satu siklus atau penjumlahan antara Ton dengan Toff atau disebut juga dengan “periode satu gelombang” 

        Pada Raspberry Pi Pico, terdapat blok PWM yang terdiri dari 8 unit (slice), dan masing-masing slice dapat mengendalikan dua sinyal PWM atau mengukur frekuensi serta duty cycle dari sinyal input. Dengan total 16 output PWM yang dapat dikontrol, semua 30 pin GPIO bisa digunakan untuk PWM. Setiap slice memiliki fitur utama seperti penghitung 16-bit, pembagi clock presisi, dua output independen dengan duty cycle 0–100%, serta mode pengukuran frekuensi dan duty cycle. PWM pada Raspberry Pi Pico juga mendukung pengaturan fase secara presisi serta dapat diaktifkan atau dinonaktifkan secara bersamaan melalui satu register kontrol global, sehingga memungkinkan sinkronisasi beberapa output untuk aplikasi yang lebih kompleks.


4.3 ADC 
     ADC atau Analog to Digital Converter merupakan salah satu perangkat elektronika yang digunakan sebagai penghubung dalam pemrosesan sinyal analog oleh sistem digital. Fungsi utama dari fitur ini adalah mengubah sinyal masukan yang masih dalam bentuk sinyal analog menjadi sinyal digital dengan bentuk kode-kode digital.
    Raspberry Pi Pico memiliki empat ADC (Analog-to-Digital Converter) 12-bit dengan metode SAR, tetapi hanya tiga kanal yang dapat digunakan secara eksternal, yaitu ADC0, ADC1, dan ADC2, yang terhubung ke pin GP26, GP27, dan GP28. Kanal keempat (ADC4) digunakan secara internal untuk membaca suhu dari sensor suhu bawaan. Konversi ADC dapat dilakukan dalam tiga mode: polling, interrupt, dan FIFO dengan DMA. Kecepatan konversi ADC adalah 2μs per sampel atau 500 ribu sampel per detik (500kS/s). Mikrocontroller RP2040 berjalan pada frekuensi 48MHz yang berasal dari USB PLL, dan setiap konversi ADC membutuhkan 96 siklus CPU, sehingga waktu samplingnya adalah 2μs per sampel.


4.4 Interrupt
    Interrupt adalah mekanisme yang memungkinkan suatu instruksi atau perangkat I/O untuk menghentikan sementara eksekusi normal prosesor agar dapat diproses lebih dulu seperti memiliki prioritas tertinggi. Misalnya, saat prosesor menjalankan tugas utama, ia juga dapat terus memantau apakah ada kejadian atau sinyal dari sensor yang memicu interrupt. Ketika terjadi interrupt eksternal, prosesor akan menghentikan sementara tugas utamanya untuk menangani interrupt terlebih dahulu, kemudian melanjutkan eksekusi normal setelah selesai menangani interrupt tersebut. Fungsi yang menangani interrupt disebut Interrupt Service Routine (ISR), yang dieksekusi secara otomatis setiap kali interrupt terjadi.
        Pada RP2040, setiap inti prosesor dilengkapi dengan ARM Nested Vectored Interrupt Controller (NVIC) yang memiliki 32 jalur interrupt. Namun, hanya 26 jalur pertama yang digunakan, sedangkan jalur IRQ 26 hingga 31 tidak aktif. Setiap NVIC menerima interrupt yang sama, kecuali untuk GPIO, di mana setiap bank GPIO memiliki satu interrupt per inti. Ini berarti, misalnya, core 0 dapat menerima interrupt dari GPIO 0 di bank 0, sementara core 1 menerima interrupt dari GPIO 1 di bank yang sama secara independen. Jika diperlukan, inti prosesor masih bisa dipaksa masuk ke interrupt handler dengan menulis bit 26 hingga 31 pada register NVIC ISPR.      

4.5 COMMUNICATION
4.5.1 I2C (Inter-Integrated Circuit) 
         Inter Integrated Circuit atau sering disebut I2C adalah standar komunikasi serial dua arah menggunakan dua saluran yang didisain khusus untuk mengirim maupun menerima data. Sistem I2C terdiri dari saluran SCL (Serial Clock) dan SDA (Serial Data) yang membawa informasi data antara I2C dengan pengontrolnya.
Gambar 2. Cara Kerja Komunikasi I2C

        Pada I2C, data ditransfer dalam bentuk message yang terdiri dari kondisi start, Address Frame, R/W bit, ACK/NACK bit, Data Frame 1, Data Frame 2, dan kondisi Stop. Kondisi start dimana saat pada SDA beralih dari logika high ke low sebelum SCL. Kondisi stop dimana saat pada SDA beralih dari logika low ke high sebelum SCL. 
        R/W bit berfungsi untuk menentukan apakah master mengirim data ke slave atau meminta data dari slave. (logika 0 = mengirim data ke slave, logika 1 = meminta data dari slave) ACK/NACK bit berfungsi sebagai pemberi kabar jika data frame ataupun address frame telah diterima receiver.
4.6 STM32103C8 

STM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini sering digunakan dalam pengembangan sistem tertanam karena kinerjanya yang baik, konsumsi daya yang rendah, dan kompatibilitas dengan berbagai protokol komunikasi. Pada praktikum ini, kita menggunakan STM32F103C8 yang dapat diprogram menggunakan berbagai metode, termasuk komunikasi serial (USART), SWD (Serial Wire Debug), atau JTAG untuk berhubungan dengan komputer maupun perangkat lain. Adapun spesifikasi dari STM32F4 yang digunakan dalam praktikum ini adalah sebagai berikut:

 

Gambar 3. STM32103C8


A. BAGIAN-BAGIAN PENDUKUNG


STM32 F103C8

1. RAM (Random Access Memory) 

STM32F103C8 dilengkapi dengan 20KB SRAM on-chip. Kapasitas RAM ini memungkinkan mikrokontroler menjalankan berbagai aplikasi serta menyimpan data sementara selama eksekusi program.


2. Memori Flash Internal 

STM32F103C8 memiliki memori flash internal sebesar 64KB atau 128KB, yang digunakan untuk menyimpan firmware dan program pengguna. Memori ini memungkinkan penyimpanan kode program secara permanen tanpa memerlukan media penyimpanan eksternal. 


3. Crystal Oscillator 

STM32F103C8 menggunakan crystal oscillator eksternal (biasanya 8MHz) yang bekerja dengan PLL untuk meningkatkan frekuensi clock hingga 72MHz. Sinyal clock yang stabil ini penting untuk mengatur kecepatan operasi mikrokontroler dan komponen lainnya.


4. Regulator Tegangan 

STM32F103C8 memiliki sistem pengaturan tegangan internal yang memastikan pasokan daya stabil ke mikrokontroler. Tegangan operasi yang didukung berkisar antara 2.0V hingga 3.6V.


5. Pin GPIO (General Purpose Input/Output) 

STM32F103C8 memiliki hingga 37 pin GPIO yang dapat digunakan untuk menghubungkan berbagai perangkat eksternal seperti sensor, motor, LED, serta komunikasi dengan antarmuka seperti UART, SPI, dan I²C.

4.7 DHT22

                                          




Gambar 4. Sensor DHT11

Sensor kelembapan dan suhu adalah perangkat elektronika yang digunakan untuk mendeteksi, mengukur, dan mengonversi parameter fisis berupa kadar uap air di udara (Relative Humidity) dan suhu lingkungan menjadi sinyal digital. Sensor ini bekerja berdasarkan prinsip perubahan nilai konduktivitas atau kapasitansi antara dua elektroda pada elemen sensor kelembapan polimer kapasitif (atau resistif), serta perubahan resistansi pada komponen termistor NTC (Negative Temperature Coefficient) akibat pengaruh suhu sekitar. Data analog dari kedua elemen sensor internal tersebut kemudian diproses secara lokal oleh chip mikrokontroler 8-bit bawaan di dalam modul untuk menghasilkan luaran data digital fase tunggal (single-bus digital signal).

Salah satu jenis sensor kelembapan dan suhu yang sangat populer digunakan untuk aplikasi dasar dan hobi adalah seri DHT11. Sensor ini digunakan dalam berbagai aplikasi, mulai dari sistem kendali iklim pada rumah kaca (greenhouse) skala kecil, alat pemantau cuaca otomatis sederhana, hingga sistem proteksi lingkungan pada fasilitas industri dan panel box daya seperti PLTS. Penggunaan sensor DHT11 pada panel box PLTS pasca-bencana di Batu Busuk sangat krusial untuk memantau kelembapan ekstrem yang berpotensi menimbulkan kondensasi (pengembunan) air. Kondensasi yang dibiarkan pada sirkuit internal inverter atau Solar Charge Controller (SCC) dapat memicu korosi dini, penurunan isolasi listrik, hingga korsleting fatal yang dapat memutus total suplai daya darurat.


DHT11 Features & Specifications
                                                        


                                    


                                               Gambar 6. Grafik Respon Sensor DHT11

4.8 Sensor Gas MQ-2

                                                     




Gambar 6. Sensor MQ-2
  Sensor arus adalah perangkat elektronika yang digunakan untuk mendeteksi dan mengukur kuat arus listrik yang mengalir melalui suatu jalur konduktor. Sensor ini bekerja berdasarkan prinsip Efek Hall (Hall Effect), di mana aliran arus listrik pada jalur tembaga internal akan membangkitkan medan magnet proporsional di sekitarnya, yang kemudian dikonversi oleh IC Hall internal menjadi tegangan analog linear.

Salah satu jenis sensor arus yang umum digunakan dalam modul instrumentasi adalah ACS712, yang mengintegrasikan sirkuit sensor Hall dengan konduktor tembaga berhambatan rendah secara internal. Sensor arus digunakan dalam berbagai aplikasi, mulai dari sistem manajemen pengisian daya baterai, pemantauan konsumsi energi pada mesin industri, hingga sistem proteksi dini dari beban lebih (overload) pada jaringan distribusi listrik. Penggunaan sensor arus memungkinkan identifikasi dan pembacaan dini terhadap lonjakan arus abnormal, sehingga sistem proteksi otomatis seperti pemutusan relay dapat dilakukan secara real-time untuk menghindari kerusakan komponen sensitif (seperti inverter atau baterai) dan mencegah bahaya kebakaran akibat korsleting.

MQ-2 ModuleFeatures & Specifications
                                                        



                            

                                                                      
Gambar 7. Grafik Respon Sensor MQ-2

 4.9 Sensor Arus ACS712

                                       

Gambar 8 Sensor ACS712

  Sensor arus adalah perangkat elektronika yang digunakan untuk mendeteksi dan mengukur kuat arus listrik yang mengalir melalui suatu jalur konduktor. Sensor ini bekerja berdasarkan prinsip Efek Hall (Hall Effect), di mana aliran arus listrik pada jalur tembaga internal akan membangkitkan medan magnet proporsional di sekitarnya, yang kemudian dikonversi oleh IC Hall internal menjadi tegangan analog linear.

Salah satu jenis sensor arus yang umum digunakan dalam modul instrumentasi adalah ACS712, yang mengintegrasikan sirkuit sensor Hall dengan konduktor tembaga berhambatan rendah secara internal. Sensor arus digunakan dalam berbagai aplikasi, mulai dari sistem manajemen pengisian daya baterai, pemantauan konsumsi energi pada mesin industri, hingga sistem proteksi dini dari beban lebih (overload) pada jaringan distribusi listrik. Penggunaan sensor arus memungkinkan identifikasi dan pembacaan dini terhadap lonjakan arus abnormal, sehingga sistem proteksi otomatis seperti pemutusan relay dapat dilakukan secara real-time untuk menghindari kerusakan komponen sensitif (seperti inverter atau baterai) dan mencegah bahaya kebakaran akibat korsleting.

ACS ModuleFeatures & Specifications
                                                        


                                        


                                               



                                                                      
Gambar 9. Grafik Respon Sensor ACS712

 

4.10 LCD 16x2 
Gambar 10. LCD 16X2


        Pengertian LCD (Liquid Crystal Display), LCD (Liquid Crystal Display) adalah jenis tampilan layar yang menggunakan senyawa cair yang memiliki struktur molekul polar, ditempatkan di antara dua elektroda transparan. Ketika medan listrik diberikan, molekul-molekul tersebut akan menyesuaikan posisinya pada medan dan membentuk susunan kristalin yang mempolarisasi cahaya yang melaluinya. Citra dihasilkan dengan menggabungkan kondisi nyala dan mati dari piksel-piksel yang membentuk layar LCD. Umumnya, LCD yang dijual di pasaran telah dilengkapi dengan sirkuit terintegrasi sehingga pengguna dapat dengan mudah mengontrol tampilan LCD menggunakan mikrokontroler dan mengirimkan data melalui pin input yang telah tersedia. 

Gambar 11. Stuktur penyusun LCD 



Spesifikasi LCD I2C:
Format tampilan : 16 x 2 karakter
Pengontrol bawaan : ST 7066 (atau setara)
Siklus kerja : 1/16
5 x 8 titik termasuk kursor
Supply + 5 V (juga tersedia untuk + 3 V)
LED dapat digerakkan oleh pin 1, pin 2, pin 15, pin 16 atau A dan K
N.V. opsional untuk supply + 3 V
Kontrol pin : SDA dan SCL
Built-in potensio untuk adjust brightness
Built-in jumper untuk menon-aktifkan backlight
Dimensi : 40mm x 18mm
Berat : 20 gram


Pinout LCD I2C

Pin name

Pin type

Pin description

GND

Power

Ground

VCC

Power

Voltage Input

SDA

I2C Data

Serial Data

SCL

I2C Clock

Serial Clock

A0

Jumper

I2C Address Selection 1

A1

Jumper

I2C Address Selection 2

A2

Jumper

I2C Address Selection 3

Backlight

Jumper

Control Backlight of panel



4.11 Buzzer




Gambar 12. Buzzer


        Buzzer merupakan komponen elektronik yang mampu menghasilkan getaran suara dalam bentuk gelombang bunyi. Getaran suara diproduksi saat buzzer menerima tegangan listrik yang sesuai dengan spesifikasi dan karakteristiknya. Buzzer sering digunakan sebagai alarm karena cara penggunaannya yang sederhana: cukup berikan tegangan input untuk menghasilkan getaran suara yang dapat didengar.

Spesifikasi Buzzer:
Tegangan pengoperasian : 5V 
Arus  : ≤30mA 
Keluaran suara pada 10cm : ≥85dB 
Frekuensi resonansi : 2300 ±300Hz 
Nada : Berkelanjutan 
Suhu operasional : -25°C hingga +80°C 
Suhu penyimpanan : -30°C hingga +85°C 
Berat : 2g

Pinout Buzzer:
Pin VCC : Positif
Pin GND : Negatif



4.12 Kabel Jumper


Gambar 13. Jumper

    Kabel jumper adalah kabel elektrik yang memiliki pin konektor di setiap ujungnya dan memungkinkan untuk menghubungkan dua komponen tanpa memerlukan solder. Biasanya kabel jamper digunakan pada breadboard atau alat prototyping lainnya agar lebih mudah untuk mengutak-atik rangkaian. Konektor yang ada pada ujung kabel terdiri atas dua jenis yaitu konektor jantan (male connector) dan konektor betina (female connector).
Jenis-jenis kabel jumper meliputi:
a. Kabel Jumper Male-to-Male (M-M): Kabel ini memiliki konektor male di kedua ujungnya. Digunakan untuk menghubungkan dua titik pada breadboard atau menghubungkan titik pada breadboard dengan pin header pada mikrokontroler atau modul.
b. Kabel Jumper Male-to-Female (M-F): Kabel ini memiliki konektor male di satu ujung dan konektor female di ujung lainnya. Biasanya digunakan untuk menghubungkan pin header pada mikrokontroler atau modul dengan perangkat yang memiliki konektor male.
c. Kabel Jumper Female-to-Female (F-F): Kabel ini memiliki konektor female di kedua ujungnya. Umumnya digunakan untuk menghubungkan dua perangkat yang memiliki konektor male, seperti menghubungkan modul sensor dengan mikrokontroler

5. Flowchart dan Listing Program[Kembali]




                                    


#include "main.h"

#include "lcd.h"

#include <string.h>


ADC_HandleTypeDef hadc1;


void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);


/*==============================================================================

 * FUNGSI KONVERSI

 *============================================================================*/


void IntToStr(int num, char* str)

{

    int i = 0;

    if (num == 0)

    {

        str[0] = '0';

        str[1] = '\0';

        return;

    }


    if (num < 0)

    {

        str[i++] = '-';

        num = -num;

    }


    int len = 0;

    int temp = num;

    while (temp > 0)

    {

        len++;

        temp /= 10;

    }


    for (int j = len - 1; j >= 0; j--)

    {

        str[i + j] = (num % 10) + '0';

        num /= 10;

    }

    str[i + len] = '\0';

}


void FloatToStr1(float value, char* str)

{

    int int_part;

    int frac_part;


    if (value < 0)

    {

        *str++ = '-';

        value = -value;

    }


    int_part = (int)value;

    frac_part = (int)((value - int_part) * 10 + 0.5);


    char int_str[10];

    IntToStr(int_part, int_str);


    char* p = int_str;

    while (*p) *str++ = *p++;


    *str++ = '.';

    *str++ = frac_part + '0';

    *str = '\0';

}


void FloatToStr2(float value, char* str)

{

    int int_part;

    int frac_part;


    if (value < 0)

    {

        *str++ = '-';

        value = -value;

    }


    int_part = (int)value;

    frac_part = (int)((value - int_part) * 100 + 0.5);


    char int_str[10];

    IntToStr(int_part, int_str);


    char* p = int_str;

    while (*p) *str++ = *p++;


    *str++ = '.';


    if (frac_part < 10) *str++ = '0';

    *str++ = (frac_part / 10) + '0';

    *str++ = (frac_part % 10) + '0';

    *str = '\0';

}


/*==============================================================================

 * FUNGSI ADC

 *============================================================================*/


uint32_t ReadADC(uint32_t channel)

{

    ADC_ChannelConfTypeDef sConfig = {0};

    uint32_t adc_value = 0;


    sConfig.Channel = channel;

    sConfig.Rank = ADC_REGULAR_RANK_1;

    sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;

    HAL_ADC_ConfigChannel(&hadc1, &sConfig);


    HAL_ADC_Start(&hadc1);

    if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)

    {

        adc_value = HAL_ADC_GetValue(&hadc1);

    }

    HAL_ADC_Stop(&hadc1);


    return adc_value;

}


float BacaSuhu(void)

{

    uint32_t adc = ReadADC(ADC_CHANNEL_1);

    float tegangan = (adc * 3.3f) / 4095.0f;

    float suhu = tegangan * 100.0f;


    if (suhu < 0) suhu = 0;

    if (suhu > 100) suhu = 100;


    return suhu;

}


/*

 * Baca arus - KALIBRASI BERDASARKAN DATA AKTUAL

 *

 * Data kalibrasi:

 * - ADC = 2047 → Arus = 0.00 A

 * - ADC = 1659 → Arus = 2.37 A

 *

 * Persamaan: Arus = 12.50 - (0.006108 × ADC)

 */

float BacaArus(void)

{

    uint32_t adc = ReadADC(ADC_CHANNEL_2);

    float arus;


    float intercept = 12.50f;      /* 12.50 */

    float slope = 0.006108f;       /* 0.006108 */


    arus = intercept - (slope * adc);


    /* Batasi range */

    if (arus < 0) arus = 0;

    if (arus > 5) arus = 5;


    return arus;

}


int BacaGas(void)

{

    return (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET) ? 1 : 0;

}


/*==============================================================================

 * MAIN FUNCTION

 *============================================================================*/


int main(void)

{

    float suhu;

    float arus;

    int gas;

    int motor;


    char buffer[17];

    char temp_str[10];

    char current_str[10];


    HAL_Init();

    SystemClock_Config();

    MX_GPIO_Init();

    MX_ADC1_Init();


    LCD_Init();

    LCD_Clear();


    /* Tampilkan pesan awal */

    LCD_SetCursor(0, 0);

    LCD_Print("System Ready");

    LCD_SetCursor(1, 0);

    LCD_Print("Monitoring...");

    HAL_Delay(2000);

    LCD_Clear();


    while (1)

    {

        suhu = BacaSuhu();

        arus = BacaArus();

        gas = BacaGas();


        /* Motor ON jika suhu > 40°C di PB1 */

        motor = (suhu > 40.0f) ? 1 : 0;

        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, motor ? GPIO_PIN_SET : GPIO_PIN_RESET);


        /* Buzzer ON jika gas terdeteksi di PB0 */

        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, gas ? GPIO_PIN_SET : GPIO_PIN_RESET);


        /* Tampilkan ke LCD */

        FloatToStr1(suhu, temp_str);

        FloatToStr2(arus, current_str);


        strcpy(buffer, "T:");

        strcat(buffer, temp_str);

        strcat(buffer, "C I:");

        strcat(buffer, current_str);

        strcat(buffer, "A");

        buffer[16] = '\0';


        LCD_SetCursor(0, 0);

        LCD_Print(buffer);


        LCD_SetCursor(1, 0);

        if (gas)

            LCD_Print("Gas: DETECTED");

        else

            LCD_Print("Gas: NORMAL  ");


        HAL_Delay(500);

    }

}


/*==============================================================================

 * SYSTEM CLOCK CONFIGURATION

 *============================================================================*/


void SystemClock_Config(void)

{

    RCC_OscInitTypeDef RCC_OscInitStruct = {0};

    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};


    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

    RCC_OscInitStruct.HSIState = RCC_HSI_ON;

    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;

    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;

    HAL_RCC_OscConfig(&RCC_OscInitStruct);


    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK

                                | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;

    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);

}


static void MX_ADC1_Init(void)

{

    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;

    HAL_ADC_Init(&hadc1);

}


static void MX_GPIO_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();


    /* PA1, PA2: Analog input untuk LM35 dan ACS712 */

    GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2;

    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    /* PA4: Digital input untuk MQ-2 DOUT */

    GPIO_InitStruct.Pin = GPIO_PIN_4;

    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    /* LCD pins: PB3, PB4, PB5, PB6, PB7, PB8 */

    GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8;

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    /* Buzzer PB0, Relay PB1 */

    GPIO_InitStruct.Pin = GPIO_PIN_0;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    GPIO_InitStruct.Pin = GPIO_PIN_1;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    /* Initial state: OFF */

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

}


void Error_Handler(void)

{

    while(1) {}

}


6. Rangkaian Simulasi dan Prototype[Kembali]

Rangkaian Simulasi

                            

Rangkaian Prototype

                            

                                  








7. Prinsip Kerja Sistem[Kembali]

                                                                Penjelasan Prinsip Kerja


                                                            

Sistem monitoring dan proteksi panel listrik ini menggunakan mikrokontroler STM32 sebagai pusat pengendali utama yang terhubung dengan sensor gas MQ-2, sensor suhu DHT11, sensor arus ACS712, layar LCD, buzzer, dan kipas atau fan. Sistem ini bekerja secara terus-menerus memantau kondisi panel untuk memberikan proteksi dini terhadap bahaya kebocoran gas, suhu berlebih, maupun arus berlebih.

Pada saat pertama kali diaktifkan, mikrokontroler STM32 akan melakukan inisialisasi terhadap seluruh komponen perangkat keras yang terhubung. Setelah proses inisialisasi selesai, sistem langsung membaca data secara berkala dari sensor MQ-2 untuk mendeteksi gas, sensor DHT11 untuk mengukur suhu, dan sensor ACS712 untuk memantau arus, yang mana seluruh hasil pembacaan data dari ketiga sensor tersebut akan langsung ditampilkan secara real-time pada layar LCD.

Logika kontrol proteksi dimulai dengan memeriksa kondisi sensor gas MQ-2 sebagai prioritas utama. Apabila sensor mendeteksi adanya kebocoran gas, maka mikrokontroler akan langsung mengaktifkan buzzer hingga berbunyi sebagai alarm peringatan. Setelah kondisi gas diperiksa, sistem akan melanjutkan pengecekan pada sensor arus ACS712, di mana jika arus yang mengalir terdeteksi melebihi batas normal, layar LCD akan menampilkan peringatan bertuliskan "OVERLOAD".

Namun, jika sejak awal sensor MQ-2 tidak mendeteksi adanya gas, alur program akan beralih untuk memeriksa parameter suhu lingkungan panel melalui sensor DHT11. Ketika parameter suhu yang terbaca mencapai atau melebihi batas 40°C, mikrokontroler akan merespons dengan mengaktifkan kipas untuk membantu mendinginkan panel. Sebaliknya, jika suhu terpantau berada di bawah 40°C, sistem berada dalam kondisi aman dan kipas akan tetap dimatikan. Setelah semua kondisi tersebut selesai dievaluasi, alur program akan berputar kembali ke tahap awal untuk melakukan pembacaan sensor secara terus-menerus agar keamanan panel listrik selalu terjaga secara berkelanjutan.

                                                        Video Demo Rangkaian di PLTS



8. Kesimpulan dan Saran[Kembali]

Berdasarkan kondisi pasca-bencana yang berpotensi menyebabkan gangguan pada jaringan listrik utama, keberadaan Pembangkit Listrik Tenaga Surya (PLTS) menjadi sumber energi alternatif yang sangat penting untuk menjaga kontinuitas pasokan listrik. Namun, keandalan sistem PLTS sangat dipengaruhi oleh kondisi panel box beserta komponen di dalamnya, yang rentan mengalami overheating, overload arus, maupun potensi gangguan yang dapat menyebabkan kerusakan hingga kebakaran.

Oleh karena itu, diperlukan suatu sistem monitoring dan proteksi yang mampu bekerja secara real-time untuk mendeteksi kondisi abnormal pada panel box PLTS. Implementasi sistem berbasis mikrokontroler STM32 yang dilengkapi dengan sensor arus dan suhu serta mekanisme proteksi otomatis berupa kipas pendingin, relay pemutus arus, dan alarm peringatan diharapkan dapat meningkatkan keamanan, memperpanjang umur komponen, serta menjaga kontinuitas suplai daya PLTS pada kondisi darurat pasca-bencana di Batu Busuk, Padang.

9. Download File[Kembali]

Download Rangkaian [Download]

Datasheet Fan [Download]

Datasheet Mq-2 [Download]

Datasheet acs712 [Download]

Datasheet dht11 [Download]

Datasheet Buzzer [Download]

Datasheet LCD [Download]

Datasheet STM32 bluepil [Download]

Datasheet jumper [Download]







No comments:

Post a Comment

  BAHAN PRESENTASI UNTUK MATA KULIAH  ELEKTRONIKA 2024 Nama : Muhammad Fadhlurrahman Yuzary NIM : 2310952015 Elektronika A Dosen Pengampu ; ...