LA MODUL 2 P1K4
Percobaan 1
2. Buat program STM 32 IDE CLUB
3. Connect Rangkaian STM32 dengan ST LINK ke laptop
4. Jalankan program
5. Selesai.
2. Hardware dan Diagram Blok[Kembali]
3. Rangkaian Simulasi[Kembali]
- Rangkaian
- Prinsip Kerja
Rangkaian yang digunakan terdiri dari sensor sentuh, sensor inframerah, mikrokontroler STM32, serta komponen output berupa LED. Alur kerja rangkaian dimulai dari kedua sensor yang berfungsi sebagai input dan terhubung ke pin GPIO pada STM32. Agar rangkaian dapat bekerja dengan baik, masing-masing sensor harus terhubung dengan benar ke sumber tegangan (VCC) dan ground (GND), kemudian pin output dari sensor dihubungkan ke pin input pada STM32. Pada bagian output, LED dipasang secara seri dengan resistor sebelum menuju ground untuk mencegah kerusakan akibat arus berlebih. Selain itu, penataan kabel juga perlu diperhatikan agar rangkaian lebih rapi dan mudah saat dilakukan pengecekan.
Prinsip kerja rangkaian ini dimulai ketika sistem dinyalakan, di mana STM32 akan melakukan inisialisasi terhadap seluruh pin yang digunakan. Sensor sentuh berfungsi untuk mendeteksi adanya sentuhan, sedangkan sensor inframerah digunakan untuk mendeteksi keberadaan objek di sekitarnya. Ketika salah satu sensor aktif, sinyal akan dikirim ke STM32 untuk diproses sesuai dengan program yang telah dibuat. Selanjutnya, STM32 akan menghasilkan output, misalnya dengan menyalakan LED. Jika tidak terdapat input dari sensor, maka LED akan tetap dalam kondisi mati. Dengan demikian, rangkaian ini bekerja dengan cara membaca input dari sensor, memprosesnya melalui mikrokontroler, lalu mengendalikan output sesuai kondisi yang terdeteksi.
4. Flowchart dan Listing Program[Kembali]
-
Flowchart
- Listing Program
#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; 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); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); } void LED_Kuning() { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); } void LED_Merah() { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); } 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; } } /* ================= 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; while (1) { /* ==== 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); }












Komentar
Posting Komentar