LA 2




a. Prosedur[Kembali]

  • Pertama, siapkan seluruh alat dan bahan yaitu STM32 Nucleo G474RE, LED, sensor LDR, sensor PIR, push button, breadboard, jumper, resistor, dan sumber tegangan.
  • Kedua, hubungkan output LDR ke pin PA0 sebagai input ADC untuk membaca intensitas cahaya lingkungan.
  • Ketiga, hubungkan output PIR ke pin PA1 sebagai input digital untuk mendeteksi adanya gerakan di sekitar area lampu jalan.
  • Keempat, hubungkan push button ke pin PB1 sebagai external interrupt untuk mengaktifkan emergency mode, dan gunakan resistor pull-up agar pembacaan tombol stabil.
  • Kelima, hubungkan LED ke pin PA6 yang menggunakan PWM TIM3 Channel 1 agar intensitas cahaya lampu dapat diatur secara bertingkat.
  • Keenam, lakukan konfigurasi ADC untuk LDR, konfigurasi PWM untuk LED, konfigurasi input digital untuk PIR, dan konfigurasi interrupt untuk push button.
  • Ketujuh, upload program ke STM32 Nucleo G474RE menggunakan STM32CubeIDE lalu jalankan sistem.
  • Kedelapan, lakukan pengujian dengan menutup sensor LDR untuk simulasi malam hari, memberikan cahaya untuk simulasi siang hari, menggerakkan tangan di depan PIR untuk simulasi kendaraan atau pejalan kaki, serta menekan tombol untuk menguji emergency mode
  • b. Hardware dan Diagram Blok[Kembali]

    HARDWARE


         1. STM32G474RE


    Microcontroller

    STM32G474RE (ARM Cortex-M4F)

    Operating Voltage

    3.3 V

    Input Voltage (recommended)

    5 V via USB (ST-LINK) atau 7–12 V via VIN

    Input Voltage (limit)

    4.5  15 V (VIN board Nucleo)

    Digital I/O Pins

    ±51 GPIO pins (tergantung konfigurasi fungsi)

    PWM Digital I/O Pins

    Hingga 24 channel PWM (advanced, general-purpose, dan high-resolution timers)

    Analog Input Pins

    Hingga 24 channel ADC (12-bit / 16-bit dengan oversampling)

    DC Current per I/O Pin

    Maks. 20 mA per pin (disarankan  8 mA)

    DC Current for 3.3V Pin

    Hingga ±500 mA (tergantung regulator & sumber daya)

    Flash Memory

    512 KB internal Flash

    SRAM

    128 KB SRAM (termasuk CCM RAM)

    Clock Speed

    Hingga 170 MHz

        


        2. LDR Sensor

        SPESIFIKASI :

    • 1. Supply : 3.3 V – 5 V (arduino available)

      2. Output Type: Digital Output (0 and 1) 

      3. Inverse output

      4. Include IC LM393 voltage comparator

      5. Sensitivitasnya dapat diatur 

      6. Dimensi PCB size: 3.2 cm x 1.4 cm

        4. PIR Sensor




    • Wide range on input voltage varying from 4.V to 12V (+5V recommended)
    • Output voltage is High/Low (3.3V TTL)
    • Can distinguish between object movement and human movement
    • Has to operating modes - Repeatable(H) and Non- Repeatable(H)
    • Cover distance of about 120° and 7 meters
    • Low power consumption of 65mA
    • Operating temperature from -20° to +80° Celsius

        5. LED



        6. Push Button

    Tombol tekan merupakan salah satu komponen elektronik yang memiliki fungsi yang sangat penting. Tombol ini dapat digunakan untuk memutuskan atau menghubungkan aliran listrik pada suatu rangkaian.

    Ketika tombol ditekan, aliran listrik akan terputus atau terhubung tergantung dari mekanisme yang digunakan.

    Mekanisme pemutusan dan penghubungan aliran ini disebut dengan sistem unlock atau tidak mengunci. Saat tombol tidak ditekan, sirkuit akan berada dalam keadaan normal. Tombol ini dioperasikan secara manual dengan cara ditekan.

    Tombol tekan juga sangat penting pada mesin-mesin industri, terutama dalam mematikan dan menyalakan mesin. Tombol ini merupakan tombol utama dalam operasional mesin, yang digunakan pada berbagai jenis mesin industri.







        7. Resistor


             DIAGRAM BLOK  








                                                                                                                                                                   

    c. Rangkaian Simulasi dan Prinsip Kerja[Kembali]











    Prinsip Kerja

    Sistem alarm perimeter pintu ini bekerja dengan memanfaatkan kombinasi sensor sentuh (touch sensor) dan sensor inframerah (IR). Pada awalnya, mikrokontroler akan melakukan inisialisasi terhadap semua komponen yang digunakan, terutama IR sensor dan touch sensor. Touch sensor berfungsi sebagai saklar utama untuk mengaktifkan atau menonaktifkan sistem keamanan.

    Ketika touch sensor dalam kondisi aktif (ON), sistem akan mulai memantau kondisi dari sensor inframerah. IR transmitter akan memancarkan sinar inframerah yang diterima oleh IR receiver. Selama sinar tersebut tidak terhalang, sistem menganggap kondisi aman sehingga LED dan buzzer tetap dalam keadaan mati.

    Namun, ketika sinar inframerah terputus (misalnya karena pintu dibuka atau ada objek yang menghalangi), maka IR receiver akan mendeteksi perubahan tersebut dan mengirimkan sinyal ke mikrokontroler. Mikrokontroler kemudian akan mengaktifkan LED dan buzzer sebagai tanda adanya gangguan atau penyusup.

    Sebaliknya, jika touch sensor dalam kondisi OFF, maka sistem tidak akan melakukan pemantauan, sehingga LED dan buzzer tetap dalam keadaan mati meskipun terjadi gangguan pada sensor inframerah. Dengan demikian, sistem ini memungkinkan pengguna untuk mengontrol kapan alarm diaktifkan dan memberikan peringatan secara otomatis ketika terjadi pelanggaran pada area yang dipantau.


    d. Flowchart dan Listing Program[Kembali]

    FLOWCHART
     







    LISTING PROGRAM 

    /* ================= main.h ================= */ #ifndef __MAIN_H #define __MAIN_H #include "stm32g4xx_hal.h" /* ================= PIN DEFINITIONS ================= */ /* LDR (ADC) */ #define LDR_PORT GPIOA #define LDR_PIN GPIO_PIN_0 // PA0 /* PIR SENSOR */ #define PIR_PORT GPIOA #define PIR_PIN GPIO_PIN_1 // PA1 /* PUSH BUTTON */ #define BUTTON_PORT GPIOB #define BUTTON_PIN GPIO_PIN_1 // PB1 /* LED PWM */ #define LED_PORT GPIOA #define LED_PIN GPIO_PIN_6 // PA6 (TIM3_CH1) /* ================= FUNCTION PROTOTYPES ================= */ void SystemClock_Config(void); void MX_GPIO_Init(void); void MX_ADC1_Init(void); void MX_TIM3_Init(void); void Error_Handler(void); #endif /* ================= main.c ================= */ #include "main.h" /* ================= HANDLE ================= */ ADC_HandleTypeDef hadc1; TIM_HandleTypeDef htim3; /* ================= VARIABLE ================= */ volatile uint8_t emergency_mode = 0; uint32_t last_motion_time = 0; /* fallback tombol */ uint8_t last_button_state = 1; /* ================= PARAMETER ================= */ #define LDR_THRESHOLD 2000 #define MOTION_TIMEOUT 5000 #define LED_OFF 0 #define LED_DIM 100 #define LED_FULL 1000 /* ================= 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.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } 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; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } } /* ================= GPIO ================= */ void MX_GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; /* PIR → PA1 */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* BUTTON → PB1 (Pull-up + Interrupt) */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* LED PWM → PA6 (TIM3_CH1) */ GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF2_TIM3; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* Interrupt EXTI untuk PB1 */ HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI1_IRQn); } /* ================= ADC ================= */ void MX_ADC1_Init(void) { __HAL_RCC_ADC12_CLK_ENABLE(); hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc1.Init.LowPowerAutoWait = DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.NbrOfConversion = 1; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.DMAContinuousRequests = DISABLE; hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; hadc1.Init.OversamplingMode = DISABLE; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_1; // PA0 sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_12CYCLES_5; sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.Offset = 0; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } } /* ================= PWM ================= */ void MX_TIM3_Init(void) { __HAL_RCC_TIM3_CLK_ENABLE(); htim3.Instance = TIM3; htim3.Init.Prescaler = 64 - 1; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 1000 - 1; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) { Error_Handler(); } TIM_OC_InitTypeDef sConfigOC = {0}; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } } /* ================= INTERRUPT CALLBACK ================= */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_1) { emergency_mode = !emergency_mode; } } /* ================= HELPER ================= */ uint16_t read_LDR(void) { HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); return HAL_ADC_GetValue(&hadc1); } void set_LED(uint16_t value) { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, value); } /* ================= MAIN ================= */ int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC1_Init(); MX_TIM3_Init(); if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } while (1) { /* ===== fallback button ===== */ uint8_t current_button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1); if (last_button_state == 1 && current_button == 0) { emergency_mode = !emergency_mode; HAL_Delay(50); // debounce } last_button_state = current_button; /* ===== MODE DARURAT ===== */ if (emergency_mode) { set_LED(LED_OFF); continue; } uint16_t ldr = read_LDR(); uint8_t pir = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1); /* ===== SIANG ===== */ if (ldr < LDR_THRESHOLD) { set_LED(LED_OFF); } else { /* ===== MALAM ===== */ if (pir == GPIO_PIN_SET) { last_motion_time = HAL_GetTick(); } if ((HAL_GetTick() - last_motion_time) < MOTION_TIMEOUT) { set_LED(LED_FULL); } else { set_LED(LED_DIM); } } HAL_Delay(100); } } /* ================= ERROR HANDLER ================= */ void Error_Handler(void) { __disable_irq(); while (1) { } }

    e. Video Demo[Kembali]








     

    f. Analisa [Kembali]














      















    g. Download File[Kembali]

    FIle Zip Percobaan 4   [klik disini]

    LAPORAN AKHIR [Klik Disini]

    Datasheet Sensor: 

    Datasheet Led  [klik disini]











     

     

    <



    Komentar

    Postingan populer dari blog ini

    Tugas Besar