1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.
2. Tulis program untuk IC STM32 di software STM32IDE.3. Compile program tadi, lalu upload file dengan format .hex ke dalam IC STM32.4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.
4. Push Button
5. LED
7.Buzzer
Buzzer adalah komponen elektronik yang berfungsi untuk menghasilkan bunyi atau suara sebagai indikator dalam suatu rangkaian. Buzzer biasanya digunakan sebagai alarm, notifikasi, atau penanda kondisi tertentu, misalnya ketika sistem aktif, terjadi kesalahan, atau ada input dari pengguna.
Secara umum, buzzer bekerja dengan mengubah sinyal listrik menjadi getaran mekanik yang kemudian menghasilkan gelombang suara. Ketika diberi tegangan, elemen di dalam buzzer akan bergetar dengan frekuensi tertentu sehingga terdengar bunyi “beep”.
Terdapat dua jenis buzzer yang sering digunakan, yaitu buzzer aktif dan buzzer pasif. Buzzer aktif memiliki rangkaian osilator internal sehingga cukup diberi tegangan langsung untuk menghasilkan suara, sedangkan buzzer pasif memerlukan sinyal PWM atau frekuensi tertentu dari mikrokontroler agar dapat menghasilkan bunyi.
Rangkaian tersebut bekerja dengan memanfaatkan mikrokontroler pada board NUCLEO-C031C6 sebagai pusat kendali yang menerima input dari push button dan slide switch, lalu mengontrol LED RGB dan buzzer sebagai output. Push button berfungsi sebagai pemicu (trigger) yang saat ditekan akan mengirimkan sinyal logika ke pin input mikrokontroler, di mana resistor digunakan sebagai pull-down atau pull-up untuk menjaga kestabilan logika agar tidak floating. Slide switch berperan sebagai pemilih kondisi atau mode, yaitu menentukan apakah rangkaian dalam keadaan aktif atau tidak.
Ketika kondisi input terpenuhi, misalnya switch dalam posisi ON dan tombol ditekan, mikrokontroler akan memproses sinyal tersebut dan mengaktifkan output berupa LED RGB serta buzzer. LED RGB akan menyala dengan warna tertentu sesuai pengaturan pin output (merah, hijau, atau biru), sedangkan buzzer akan berbunyi sebagai indikator suara. Sebaliknya, jika switch dimatikan atau tidak ada input dari tombol, maka mikrokontroler tidak memberikan sinyal ke output sehingga LED padam dan buzzer tidak berbunyi.
Dengan demikian, prinsip kerja rangkaian ini adalah sistem kontrol sederhana berbasis input (switch dan tombol) yang diproses oleh mikrokontroler untuk menghasilkan output berupa cahaya (LED RGB) dan suara (buzzer).
#include "stm32f1xx_hal.h"
/* ================= HANDLE ================= */
ADC_HandleTypeDef hadc1;
/* ================= VARIABLE ================= */
uint32_t adcValue = 0;
uint32_t filteredValue = 0;
uint8_t beatDetected = 0;
uint32_t BPM = 0;
uint32_t lastBeatTime = 0;
uint32_t interval = 0;
uint8_t buzzerOff = 0;
/* ================= FILTER ================= */
#define FILTER_SIZE 10
uint16_t buffer[FILTER_SIZE];
uint8_t indexBuf = 0;
uint16_t moving_average(uint16_t val)
{
buffer[indexBuf++] = val;
if(indexBuf >= FILTER_SIZE) indexBuf = 0;
void LED_Kuning() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
uint32_t sum = 0;
for(int i=0;i<FILTER_SIZE;i++) sum += buffer[i];
return sum / FILTER_SIZE;
}
/* ================= LED ================= */
void LED_Hijau() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
}
}
void LED_Merah() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
}
void LED_Mati() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 |
GPIO_PIN_10, GPIO_PIN_RESET);
}
/* ================= BUZZER ================= */
void Buzzer_On() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11,
GPIO_PIN_SET); }
void Buzzer_Off() { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11,
GPIO_PIN_RESET); }
/* ================= INTERRUPT ================= */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_1) // PA1
{
buzzerOff = !buzzerOff;
}
}
while (1)
{
/* ================= PROTOTYPE ================= */
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
/* ================= MAIN ================= */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
uint32_t baseline = 0;
/* ==== BACA ADC
==== */
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
adcValue =
HAL_ADC_GetValue(&hadc1);
/* ==== FILTER
==== */
filteredValue =
moving_average(adcValue);
/* ==== BASELINE
(ADAPTIF) ==== */
baseline =
(baseline * 9 + filteredValue) / 10;
uint32_t threshold
= baseline + 50;
/* ==== DETEKSI
DETAK + INTERVAL ==== */
if(filteredValue
> threshold && beatDetected == 0)
{
beatDetected =
1;
uint32_t now =
HAL_GetTick();
if(lastBeatTime != 0)
{
interval =
now - lastBeatTime;
BPM =
60000 / interval;
}
lastBeatTime =
now;
}
if(filteredValue
< threshold)
{
beatDetected =
0;
}
/* ==== TIMEOUT
(TIDAK ADA DETAK) ==== */
if(HAL_GetTick() -
lastBeatTime > 2000)
{
BPM = 0;
}
/* ==== OUTPUT
==== */
if(BPM > 0)
{
if(BPM >30
&& BPM < 60)
{
LED_Kuning();
Buzzer_Off();
buzzerOff
= 0;
}
else if(BPM
<= 80)
{
LED_Hijau();
Buzzer_Off();
buzzerOff
= 0;
}
else
{
LED_Merah();
if(!buzzerOff)
Buzzer_On();
else
Buzzer_Off();
}
}
else
{
LED_Mati();
Buzzer_Off();
}
HAL_Delay(5);
}
}
/* ================= CLOCK ================= */
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.PLL.PLLState = RCC_PLL_NONE;
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_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct,
FLASH_LATENCY_0);
}
/* ================= ADC ================= */
void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
__HAL_RCC_ADC1_CLK_ENABLE();
hadc1.Instance =
ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign
= ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc1);
sConfig.Channel =
ADC_CHANNEL_0;
sConfig.Rank =
ADC_REGULAR_RANK_1;
sConfig.SamplingTime
= ADC_SAMPLETIME_71CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
/* ================= GPIO ================= */
void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* PA0 = ADC */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* PA1 = BUTTON */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
/* LED + BUZZER */
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 |
GPIO_PIN_10 | GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 |
GPIO_PIN_10 | GPIO_PIN_11, GPIO_PIN_RESET);
}
Download HTML klik disini
Download file rangkaian klik disiniDownload video Simulasi klik disiniDownload Datasheet Push Button klik disiniDownload Datasheet LED klik disiniDownload Datasheet Resistor klik disiniDownload Datasheet STM32F103C8T6 klik disini
.jpeg)






Tidak ada komentar:
Posting Komentar