C. Laporan Akhir 1
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.
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
Posting Komentar