C. Laporan Akhir 1

 a. Prosedur

1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.
2. Buat program untuk mikrokontroler STM32 NUCLEO-G474RE di software STM32 CubeIDE.
3. Compile program dalam format hex, lalu upload ke dalam mikrokontroler.
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.
5. Selesai.

b. Hardware dan Diagram Blok

  • Hardware :


a) Mikrokontroler STM32 NUCLEO-G474RE








2. Flame Sensor



3. Buzzer


4. Power Supply

 
5. RGB LED
Jual LED RGB 4 PIN WARNA MERAH HIJAU BIRU 5mm ( ARDUINO ) - Common Cathode  - Jakarta Barat - Ardushop-id | Tokopedia

6. Resistor 1k Ohm



7. Floating Switch

8. Adaptor



9. Breadboard

c. Rangkaian Simulasi dan Prinsip Kerja

  • Rangkaian Simulasi


Percobaan 2 kondisi 6

Buatlah rangkaian seperti pada gambar percobaan 2 dengan kondisi ketika infrared sensor mendeteksi benda secara terus-menerus selama lebih dari 15 detik, maka buzzer tetap berbunyi dan LED merah tetap menyala.


  • Prinsip Kerja

1. Tahap Persiapan

  • Inisialisasi Pin: Saat sistem pertama kali dijalankan (Mulai), mikrokontroler akan melakukan inisialisasi. Tahap ini mendaftarkan pin mana yang berfungsi sebagai Input (Flame Sensor dan Sensor Level Air/Tangki) dan pin mana yang berfungsi sebagai Output (Relay Pompa, Buzzer, dan LED).

2. Pengecekan Keamanan (Prioritas Utama)

Setelah inisialisasi, sistem tidak langsung mengecek air, melainkan mengecek kondisi keamanan sekitar terlebih dahulu.

  • Kondisi (Flame Sensor mendeteksi): Mikrokontroler membaca status sensor api.

    • Jika YA (Ada Api): Sistem masuk ke mode darurat darurat. Pompa dimatikan (Off) agar tidak terjadi korsleting atau masalah lain, sementara Buzzer dinyalakan (On) sebagai alarm suara, dan LED dinyalakan (On) sebagai indikator bahaya visual. Setelah itu, alur eksekusi selesai.

    • Jika TIDAK (Aman dari Api): Sistem menganggap lingkungan aman dan melanjutkan ke tahap fungsional utama, yaitu mengontrol air.

3. Pengecekan Level Air (Operasional Normal)

Jika lingkungan dipastikan aman dari api, sistem mengecek kondisi air di dalam tangki.

  • Kondisi (Tangki Penuh): Mikrokontroler membaca status sensor level air di tangki.

    • Jika YA (Tangki sudah Penuh): Sistem akan mematikan Pompa (Off). Hal ini dilakukan untuk mencegah air luber atau tumpah berlebihan (overflow).

    • Jika TIDAK (Tangki belum Penuh): Sistem akan menyalakan Pompa (On) untuk mulai/tetap mengisi tangki hingga penuh.

d. Flowchart dan Listing Program

  • Flowchart

  • Listing Program

Codingan main.h

#ifndef __MAIN_H

#define __MAIN_H

 

#ifdef __cplusplus

extern "C" {

#endif

 

#include "stm32c0xx_hal.h"

 

void Error_Handler(void);

 

// ===== INPUT =====

#define IR_SENSOR_Pin           GPIO_PIN_0

#define IR_SENSOR_GPIO_Port     GPIOA

 

// ===== OUTPUT RGB LED + BUZZER =====

#define LED_GREEN_Pin           GPIO_PIN_0

#define LED_GREEN_GPIO_Port     GPIOB

 

#define LED_RED_Pin             GPIO_PIN_1

#define LED_RED_GPIO_Port       GPIOB

 

#define LED_BLUE_Pin            GPIO_PIN_2

#define LED_BLUE_GPIO_Port      GPIOB

 

#define BUZZER_Pin              GPIO_PIN_3

#define BUZZER_GPIO_Port        GPIOB

 

#ifdef __cplusplus

}

#endif

 

#endif /* __MAIN_H */

 

Codingan main.c

#include "main.h"

 

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

 

#define DETECTION_THRESHOLD_MS  15000   // 15 detik dalam milidetik

 

int main(void)

{

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

 

  uint32_t detect_start_tick = 0;       // waktu mulai deteksi

  uint8_t  is_detecting      = 0;       // flag: sedang deteksi terus-menerus?

  uint8_t  alarm_active      = 0;       // flag: alarm sudah aktif?

 

  /* Pastikan semua output mati di awal */

  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 |

                           GPIO_PIN_2 | GPIO_PIN_3, GPIO_PIN_RESET);

 

  while (1)

  {

    /*

     * IR sensor aktif-LOW (umum):

     *   GPIO_PIN_RESET = benda terdeteksi

     *   GPIO_PIN_SET   = tidak ada benda

     *

     * Jika sensor Anda aktif-HIGH, ganti kondisinya:

     *   GPIO_PIN_SET   = benda terdeteksi

     */

    uint8_t ir_state = HAL_GPIO_ReadPin(IR_SENSOR_GPIO_Port, IR_SENSOR_Pin);

    uint8_t object_detected = (ir_state == GPIO_PIN_RESET); // aktif-LOW

 

    if (object_detected)

    {

      if (!is_detecting)

      {

        /* Benda baru pertama kali terdeteksi → catat waktu mulai */

        detect_start_tick = HAL_GetTick();

        is_detecting = 1;

      }

 

      /* Hitung durasi deteksi terus-menerus */

      uint32_t elapsed = HAL_GetTick() - detect_start_tick;

 

      if (elapsed >= DETECTION_THRESHOLD_MS)

      {

        /* === KONDISI ALARM: deteksi > 15 detik === */

        alarm_active = 1;

 

        HAL_GPIO_WritePin(LED_RED_GPIO_Port,   LED_RED_Pin,   GPIO_PIN_SET);   // LED Merah ON

        HAL_GPIO_WritePin(BUZZER_GPIO_Port,    BUZZER_Pin,    GPIO_PIN_SET);   // Buzzer ON

 

        /* Matikan LED lain agar hanya merah yang menyala */

        HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);

        HAL_GPIO_WritePin(LED_BLUE_GPIO_Port,  LED_BLUE_Pin,  GPIO_PIN_RESET);

      }

      else

      {

        /* Deteksi ada tapi belum 15 detik → LED Hijau sebagai indikator standby */

        if (!alarm_active)

        {

          HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);

          HAL_GPIO_WritePin(LED_RED_GPIO_Port,   LED_RED_Pin,   GPIO_PIN_RESET);

          HAL_GPIO_WritePin(LED_BLUE_GPIO_Port,  LED_BLUE_Pin,  GPIO_PIN_RESET);

          HAL_GPIO_WritePin(BUZZER_GPIO_Port,    BUZZER_Pin,    GPIO_PIN_RESET);

        }

      }

    }

    else

    {

      /* Tidak ada benda → reset timer dan semua output */

      is_detecting      = 0;

      alarm_active      = 0;

      detect_start_tick = 0;

 

      HAL_GPIO_WritePin(GPIOB,

                        GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3,

                        GPIO_PIN_RESET);

    }

 

    HAL_Delay(50); // polling setiap 50ms

  }

}

 

/* ------------------------------------------------------------------ */

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;

 

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

    Error_Handler();

 

  RCC_ClkInitStruct.ClockType      = RCC_CLOCKTYPE_HCLK  |

                                     RCC_CLOCKTYPE_SYSCLK |

                                     RCC_CLOCKTYPE_PCLK1;

  RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_HSI;

  RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

 

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

    Error_Handler();

}

 

static void MX_GPIO_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

 

  __HAL_RCC_GPIOA_CLK_ENABLE();

  __HAL_RCC_GPIOB_CLK_ENABLE();

 

  /* IR Sensor sebagai INPUT dengan PULLUP (untuk sensor aktif-LOW) */

  GPIO_InitStruct.Pin  = IR_SENSOR_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

  GPIO_InitStruct.Pull = GPIO_PULLUP;        // ganti PULLDOWN jika sensor aktif-HIGH

  HAL_GPIO_Init(IR_SENSOR_GPIO_Port, &GPIO_InitStruct);

 

  /* LED RGB + Buzzer sebagai OUTPUT */

  GPIO_InitStruct.Pin   = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;

  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);

}

 

void Error_Handler(void)

{

  __disable_irq();

  while (1) {}

}

 


g. Download File

File Analisa [Klik disini]

Video Demo [Klik disini]

Download Datasheet Touch Sensor (klik disini)

Download Datasheet Pir Sensor (klik disini)

Download Datasheet Resistor (klik disini)

Download Datasheet LED (klik disini)

Download Datasheet Buzzer (klik disini)

Komentar

Postingan populer dari blog ini