Laporan Akhir 1



1. Prosedur [kembali]

  1. Menyiapkan alat dan bahan.
  2. Merangkai komponen pada breadboard sesuai dengan gambar rangkaian percobaan.
  3. Menghubungkan masing masing pin input output.
  4. Mengunggah program menggunakan ST-LINK ke mikrokontroler.
  5. Jalankan Rangkaian

2. Hardware dan Diagram Blok [kembali]

  • STM32 Nucleo 
  • G474RE  
  • LDR Sensor 
  • Push Button 
  • Motor Servo 
  • Breadboard 
  • Adaptor

3. Rangkaian Simulasi dan Prinsip Kerja [kembali]





Prinsip Kerja

Sistem diawali dengan proses inisialisasi oleh mikrokontroler STM32 NUCLEO terhadap seluruh komponen yang digunakan pada rangkaian, seperti sensor LDR, sensor PIR, push button, dan lampu sebagai output. Pada tahap ini, mikrokontroler mengatur konfigurasi pin input dan output serta memastikan seluruh perangkat siap bekerja sesuai program yang telah ditanamkan.

Setelah proses inisialisasi selesai, sensor LDR (Light Dependent Resistor) mulai membaca intensitas cahaya di lingkungan sekitar. Sensor ini berfungsi untuk membedakan kondisi siang dan malam. Ketika lingkungan dalam keadaan terang, nilai pembacaan LDR menghasilkan logika 0 sehingga sistem menganggap kondisi masih cukup cahaya dan lampu tidak perlu dinyalakan. Sebaliknya, ketika kondisi lingkungan gelap atau malam hari, sensor LDR menghasilkan logika 1 yang menandakan kurangnya pencahayaan sehingga sistem akan mengaktifkan proses selanjutnya, yaitu pembacaan sensor PIR.

Sensor PIR (Passive Infrared) digunakan untuk mendeteksi adanya gerakan manusia atau objek di sekitar area pemantauan. Pada saat sensor PIR tidak mendeteksi gerakan, keluaran sensor bernilai logika 0 sehingga mikrokontroler mengatur lampu menyala dalam kondisi redup sebagai pencahayaan minimum. Namun, apabila sensor PIR mendeteksi adanya pergerakan, keluaran sensor berubah menjadi logika 1 dan mikrokontroler akan meningkatkan intensitas cahaya lampu sehingga lampu menyala lebih terang. Kondisi ini bertujuan untuk memberikan pencahayaan yang lebih optimal ketika terdapat aktivitas di sekitar area sensor.

Selain bekerja secara otomatis berdasarkan sensor, sistem juga dilengkapi dengan push button yang berfungsi sebagai interrupt atau saklar kendali manual untuk mengubah status sistem menjadi ON atau OFF. Setiap kali tombol ditekan dan menerima logika 1, status sistem akan berubah. Ketika sistem berada pada kondisi OFF, seluruh output lampu akan dimatikan tanpa mempedulikan hasil pembacaan sensor. Sedangkan ketika sistem berada pada kondisi ON, kerja lampu akan kembali mengikuti hasil deteksi sensor LDR dan PIR secara otomatis.

Output akhir dari sistem berupa lampu dengan tiga kondisi kerja, yaitu mati, redup, dan terang. Kondisi mati terjadi saat lingkungan terang atau sistem dalam keadaan OFF. Kondisi redup terjadi ketika lingkungan gelap tetapi tidak ada gerakan yang terdeteksi. Sementara itu, kondisi terang terjadi ketika lingkungan gelap dan sensor PIR mendeteksi adanya gerakan. Seluruh proses tersebut berlangsung secara terus-menerus dalam bentuk looping sehingga sistem mampu melakukan pemantauan sensor dan pengendalian lampu secara real-time dan berkelanjutan.





Flowchart

Listing Program:

#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; HAL_RCC_OscConfig(&RCC_OscInitStruct); 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; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); } // ================= 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 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_AF1_TIM3; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Interrupt EXTI HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_1_IRQn); } // ================= ADC ================= void MX_ADC1_Init(void) { __HAL_RCC_ADC_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; HAL_ADC_Init(&hadc1); ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_39CYCLES_5; HAL_ADC_ConfigChannel(&hadc1, &sConfig); } // ================= PWM ================= void MX_TIM3_Init(void) { __HAL_RCC_TIM3_CLK_ENABLE(); htim3.Instance = TIM3; htim3.Init.Prescaler = 64 - 1; htim3.Init.Period = 1000 - 1; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim3); TIM_OC_InitTypeDef sConfigOC = {0}; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1); } // ================= INTERRUPT ================= 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(); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); 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); } last_button_state = current_button; // ===== MODE OFF ===== 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); } }

5. Video Demo [kembali]




6. Analisa [kembali]


7. Video Simulasi [kembali]







8. Download File [kembali]









Komentar

Postingan populer dari blog ini