B. Tugas Pendahuluan 2
1. Buka web WOKWI.COM dan cari STM 32 NUCLEO C031C6
2. Rangkai komponen sesuai dengan gambar rangkaian di modul
3. Klik pada Library Manager untuk membuat file baru yang bernama main.h dan main.c
4. Masukan program yang telah di buat sesuai kondisi pada kedua file tersebut
5. simulasikan
- Hardware
1. STM32 NUCLEO-C031C6
2. Float Switch
3. Infrared Sensor
4. Resistor
5. Buzzer
6. LED
- Diagram Blog
c) Rangkaian Simulasi dan Prinsip Kerja
- Rangkaian Simulasi
- Prinsip kerja
- 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) {}
}
-
Percobaan 2 kondisi 6
Buatlah rangkaian seperti 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.pada
File TP/Link Wokwi [klik disini]
Komentar
Posting Komentar