1. Prosedur [kembali]
- Menyiapkan alat dan bahan.
- Merangkai komponen pada breadboard sesuai dengan gambar rangkaian percobaan.
- Menghubungkan masing masing pin input output.
- Mengunggah program menggunakan ST-LINK ke mikrokontroler.
- Jalankan Rangkaian
2. Hardware dan Diagram Blok [kembali]
- STM32 Nucleo G474RE
- LED
- LDR Sensor
- PIR Sensor
- Push Button
- Breadboard
- Jumper
- Resistor
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
Prinsip Kerja:
Rangkaian ini bekerja sebagai sistem lampu otomatis berbasis cahaya (LDR) dan gerakan (PIR) yang dikontrol oleh mikrokontroler STM32. Pada kondisi awal, sistem terus membaca dua sensor, yaitu LDR untuk mendeteksi intensitas cahaya dan PIR untuk mendeteksi adanya gerakan. LDR akan memberikan nilai analog ke STM32, di mana saat kondisi gelap nilai yang terbaca melewati ambang batas (threshold), sedangkan PIR akan memberikan sinyal digital HIGH ketika ada pergerakan di sekitarnya.
Ketika kedua kondisi terpenuhi secara bersamaan, yaitu lingkungan gelap (LDR aktif) dan terdapat gerakan (PIR aktif), maka STM32 akan memberikan sinyal output ke LED sehingga LED menyala sangat terang (biasanya menggunakan PWM dengan duty cycle maksimum). Pada saat LED menyala, sistem juga mulai menghitung waktu menggunakan timer internal (HAL_GetTick). LED akan tetap menyala selama kurang lebih 5 detik, kemudian setelah waktu tersebut habis, STM32 akan mematikan LED kembali meskipun kondisi sensor masih aktif. Setelah itu, sistem kembali ke kondisi awal dan terus melakukan pemantauan sensor untuk siklus berikutnya.
4. Flowchart dan Listing Program [kembali]
Flowchart
Listing Program:
Main.h
#ifndef MAIN_HEADER_FILE
#define MAIN_HEADER_FILE
#include "stm32c0xx_hal.h"
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void LED_On(void);
void LED_Off(void);
extern ADC_HandleTypeDef hadc1;
#endif /* MAIN_HEADER_FILE */
Main.c
#include "main.h"
#include <stdio.h>
/* ADC Handle */
ADC_HandleTypeDef hadc1;
/* System Variables */
uint16_t ldrValue = 0;
uint8_t pirState = 0;
uint32_t lastMotion = 0;
uint8_t ledOn = 0;
#define DARK_THRESHOLD 1000
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
printf("=== Lampu Jalan Otomatis ===\r\n");
printf("Gelap + Gerak = LED TERANG 5 detik\r\n\r\n");
LED_Off();
uint32_t printTimer = 0;
while (1)
{
/* Read Sensors */
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
ldrValue = HAL_ADC_GetValue(&hadc1);
pirState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
/* Main Logic */
if (ledOn == 0 && ldrValue > DARK_THRESHOLD && pirState == 1)
{
printf(">>> GELAP(LDR:%d)+GERAK → LED TERANG!\r\n", ldrValue);
LED_On();
lastMotion = HAL_GetTick();
ledOn = 1;
}
/* Auto OFF 5 detik */
if (ledOn && (HAL_GetTick() - lastMotion) >= 5000)
{
printf(">>> LED OFF (timeout 5s)\r\n");
LED_Off();
ledOn = 0;
}
/* Monitoring */
if (HAL_GetTick() - printTimer > 1000)
{
uint32_t remain = ledOn ? (5000 - (HAL_GetTick() - lastMotion)) / 1000 : 0;
printf("LDR:%4d | PIR:%s | LED:%s | %lus\r\n",
ldrValue,
pirState ? "GERAK" : "-",
ledOn ? "TERANG" : "OFF",
remain);
printTimer = HAL_GetTick();
}
HAL_Delay(100);
}
}
void LED_On(void)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
}
void LED_Off(void)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_RCC_SYSCFG_CLK_ENABLE();
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);
}
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
/* LED Output */
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* PIR Input */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Button 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);
HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
}
void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_79CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_1)
{
printf(">>> BUTTON PRESSED!\r\n");
}
}
void Error_Handler(void)
{
while (1)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_6);
HAL_Delay(200);
}
}
5. Video Demo [kembali]
Buatlah rangkaian seperti pada gambar percobaan 4 dengan kondisi ketika LDR mendeteksi kondisi gelap dan PIR mendeteksi adanya gerakan, maka LED menyala sangat terang selama 5 detik lalu kembali mati.
7. Video Simulasi [kembali]
Percobaan 4 Kondisi 6
Komentar
Posting Komentar