Tugas Pendahuluan M1


MODUL 2 PERCOBAAN 1 KONDISI 5


1. Prosedur[Kembali]

  1. Pahami terlebih dahulu kondisi yang akan digunakan
  2. Buka software Proteus 8.17
  3. Persiapkan alat dan bahan
  4. Buat rangkaian sesuai dengan kondisi dan modul
  5. Buka software STM32Cube IDE 
  6. Setelah membuka software, pilih perangkat STM32F103C8T6 
  7. Sesuaikan konfigurasi pin sesuai dengan rangkaian proteus 
  8. Buat kode program untuk mengoperasikan rangkaian tersebut sesuai dengan kondisi 
  9. Konfigurasi kan program dengan software Proteus
  10. Jalankan simulasi rangkaian.  
  11. Proses selesai

2. Hardware dan Diagram Blok[Kembali]

  • Hardware
1. STM32F103C8





2. Touch Sensor



3. PIR Sensor



4. LED



5. Buzzer



6. Resistor 


  • Diagram Blog


3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]



  • Sistem dalam keadaan OFF
  • LED dan buzzer dalam keadaan mati
  • Sensor belum mempengaruhi output
  • PA0 digunakan sebagai interrupt eksternal
  • Setiap menerima logika HIGH (1):
    • Sistem akan berubah kondisi (toggle):
      • OFF → ON
      • ON → OFF
      • 3. Kondisi Sistem ON

        • Sistem mulai aktif
        • STM32 mulai membaca input dari sensor lain (PIR)

        Jika PIR (PA1) = HIGH (1)

        • Menandakan ada gerakan
        • Maka:
          • LED (PB0) menyala
          • Buzzer (PB1) aktif

        Jika PIR (PA1) = LOW (0)

        • Tidak ada gerakan
        • Maka:
          • LED mati
          • Buzzer mati
  •  

4. Flowchart dan Listing Program[Kembali]

  • Flowchart


  • Listing Program
#include "main.h"

// ================= HANDLE =================
ADC_HandleTypeDef hadc1;

// ================= PROTOTYPE =================
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);

// ================= 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 system_on = 0;

// ================= FILTER =================
#define FILTER_SIZE 10
uint16_t buffer[FILTER_SIZE] = {0};
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(void){
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 | GPIO_PIN_10, GPIO_PIN_RESET);
}

void LED_Kuning(void){
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_10, GPIO_PIN_RESET);
}

void LED_Merah(void){
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);
}

void LED_Mati(void){
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10, GPIO_PIN_RESET);
}

// ================= BUZZER =================
void Buzzer_On(void){ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET); }
void Buzzer_Off(void){ 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)
    {
        static uint32_t last = 0;

        if(HAL_GetTick() - last > 200)
        {
            system_on = !system_on;
            last = HAL_GetTick();
        }
    }
}

// ================= MAIN =================
int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_ADC1_Init();

    HAL_ADCEx_Calibration_Start(&hadc1);

    uint32_t baseline = 0;

    while (1)
    {
        if(system_on)
        {
            HAL_ADC_Start(&hadc1);
            HAL_ADC_PollForConversion(&hadc1, 10);
            adcValue = HAL_ADC_GetValue(&hadc1);

            filteredValue = moving_average(adcValue);

            baseline = (baseline * 9 + filteredValue) / 10;
            uint32_t threshold = baseline + 50;

            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;

            if(HAL_GetTick() - lastBeatTime > 2000)
                BPM = 0;

            if(BPM > 0)
            {
                if(BPM > 30 && BPM < 60)
                {
                    LED_Kuning();
                    Buzzer_Off();
                }
                else if(BPM <= 80)
                {
                    LED_Hijau();
                    Buzzer_Off();
                }
                else
                {
                    LED_Merah();
                    Buzzer_On();
                }
            }
            else
            {
                LED_Mati();
                Buzzer_Off();
            }
        }
        else
        {
            LED_Mati();
            Buzzer_Off();
            BPM = 0;
            beatDetected = 0;
        }

        HAL_Delay(5);
    }
} // ✅ INI YANG TADI HILANG

// ================= 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};

    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    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);

    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);
}

// ================= 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);
}

5. Video Demo[Kembali]



6. Kondisi[Kembali]

M2 P1 K5: Buatlah rangkaian seperti pada gambar percobaan 1 namun interuptnya berubah fungsi jadi kontak on/off seluruh sistem

8. Download File[Kembali]

Rangkaian Simulasi [Klik]

Video Simulasi [Klik]








Komentar