#include "stm32c0xx_hal.h"
// INPUT
#define FLAME_PIN GPIO_PIN_0 // PA0: Sensor Api
#define FLOAT_PIN GPIO_PIN_1 // PA1: Sensor Pelampung (Tangki)
#define GPIO_PORT GPIOA
// OUTPUT
#define LED_PIN GPIO_PIN_5 // PA5: Indikator Api (LED)
#define RELAY_PIN GPIO_PIN_6 // PA6: Pompa (Relay) - Pink Tengah
#define BUZZER_PIN GPIO_PIN_7 // PA7: Alarm (Buzzer) - Pink Bawah
/* Prototipe Fungsi */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* ==========================================================
2. PROGRAM UTAMA
========================================================== */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
// Membaca input sensor
GPIO_PinState ada_api = HAL_GPIO_ReadPin(GPIO_PORT, FLAME_PIN);
GPIO_PinState tangki_penuh = HAL_GPIO_ReadPin(GPIO_PORT, FLOAT_PIN);
/* --- LOGIKA 1: ALARM (LED & BUZZER) --- */
// Buzzer & LED HANYA hidup jika ada API.
// Jika hanya Tangki Penuh, Buzzer & LED harus MATI.
if (ada_api == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIO_PORT, LED_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIO_PORT, BUZZER_PIN, GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIO_PORT, LED_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIO_PORT, BUZZER_PIN, GPIO_PIN_RESET);
}
/* --- LOGIKA 2: PENGAMAN POMPA (RELAY) --- */
// Pompa MATI (RESET) jika: Ada Api ATAU Tangki Penuh.
// Ini adalah sistem interlock pengaman.
if ((ada_api == GPIO_PIN_SET) || (tangki_penuh == GPIO_PIN_SET))
{
// Kondisi Berhenti (Safety / Full)
HAL_GPIO_WritePin(GPIO_PORT, RELAY_PIN, GPIO_PIN_RESET);
}
else
{
// Kondisi Jalan (Aman & Belum Penuh)
HAL_GPIO_WritePin(GPIO_PORT, RELAY_PIN, GPIO_PIN_SET);
}
HAL_Delay(50); // Stabilitas pembacaan
}
}
/* ==========================================================
3. KONFIGURASI HARDWARE
========================================================== */
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
// Reset Output awal (Semua OFF)
HAL_GPIO_WritePin(GPIO_PORT, LED_PIN | RELAY_PIN | BUZZER_PIN, GPIO_PIN_RESET);
// Konfigurasi INPUT (PA0 & PA1)
GPIO_InitStruct.Pin = FLAME_PIN | FLOAT_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN; // Menggunakan internal pull-down agar tidak floating
HAL_GPIO_Init(GPIO_PORT, &GPIO_InitStruct);
// Konfigurasi OUTPUT (PA5, PA6, PA7)
GPIO_InitStruct.Pin = LED_PIN | RELAY_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(GPIO_PORT, &GPIO_InitStruct);
}
void SystemClock_Config(void)
{
// Konfigurasi clock standar Nucleo di Wokwi
}