TP 2 MODUL 2 MIKRO
1. Prosedur [kembali]
- Akses situs Wokwi melalui alamat wokwi.com, kemudian pilih board STM32 Nucleo C031C6.
- Susun rangkaian komponen sesuai dengan diagram rangkaian yang terdapat pada modul praktikum.
- Buka menu Library Manager, lalu buat dua file baru dengan nama main.h dan main.c.
- Masukkan program yang telah dibuat ke dalam kedua file tersebut sesuai dengan kondisi yang ditentukan pada percobaan.
- Jalankan simulasi untuk menguji apakah rangkaian dan program telah bekerja dengan baik.
2. Hardware dan Diagram Blok [kembali]
Hardware
1. STM32 NUCLEO-G474RE
2. PIR Sensor
3. Infrared Sensor
4. Resistor
5. Buzzer
6. LED
7. Push Button
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
Prinsip Kerja:
Rangkaian pada percobaan ini bekerja sebagai sistem kontrol pencahayaan otomatis berbasis mikrokontroler STM32 Nucleo C031C6 dengan memanfaatkan sensor cahaya (LDR) dan sensor gerak (PIR). LDR berfungsi untuk mendeteksi intensitas cahaya lingkungan dan menghasilkan sinyal analog yang akan dibaca oleh mikrokontroler melalui pin ADC. Nilai analog tersebut menunjukkan kondisi terang atau gelap di sekitar sensor. Sementara itu, sensor PIR digunakan untuk mendeteksi adanya gerakan manusia dan menghasilkan sinyal digital berupa logika HIGH ketika terdapat gerakan dan LOW ketika tidak ada gerakan.
Data dari sensor LDR dan sensor PIR diproses oleh mikrokontroler untuk mengontrol sistem lampu jalan otomatis. Ketika sensor LDR mendeteksi kondisi gelap atau intensitas cahaya lingkungan rendah, LED akan menyala redup sebagai penerangan jalan pada malam hari. Selanjutnya, apabila sensor PIR mendeteksi adanya gerakan, seperti kendaraan atau pejalan kaki yang melintas, maka mikrokontroler akan meningkatkan intensitas LED menjadi terang agar area jalan lebih jelas dan aman. Sebaliknya, ketika sensor LDR mendeteksi kondisi terang atau intensitas cahaya tinggi pada siang hari, maka LED akan dimatikan secara otomatis karena pencahayaan alami sudah mencukupi. Dengan demikian, sistem lampu jalan otomatis ini mampu menghemat energi listrik dengan mengatur tingkat kecerahan lampu berdasarkan kondisi lingkungan dan aktivitas di sekitar jalan.
4. Flowchart dan Listing Program [kembali]
Flowchart
Listing Program:
#ifndef __MAIN_H
#define __MAIN_H
#include "stm32c0xx_hal.h"
#define LDR_PORT GPIOA
#define LDR_PIN GPIO_PIN_0
#define PIR_PORT GPIOA
#define PIR_PIN GPIO_PIN_1
#define LED_PORT GPIOA
#define LED_PIN GPIO_PIN_6 // PA6 sesuai diagram.json
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void MX_TIM3_Init(void);
#endif
#include "main.h"
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;
// ===== PARAMETER =====
#define LDR_THRESHOLD 4000
#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;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
}
// ================= GPIO =================
void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// PIR -> PA1
GPIO_InitStruct.Pin = PIR_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(PIR_PORT, &GPIO_InitStruct);
// LED PWM -> PA6 (D10 / TIM3_CH1)
GPIO_InitStruct.Pin = LED_PIN;
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(LED_PORT, &GPIO_InitStruct);
}
// ================= ADC =================
void MX_ADC1_Init(void)
{
__HAL_RCC_ADC_CLK_ENABLE();
hadc1.Instance = ADC1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
HAL_ADC_Init(&hadc1);
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0; // PA0
sConfig.Rank = ADC_REGULAR_RANK_1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
// ================= PWM =================
void MX_TIM3_Init(void)
{
__HAL_RCC_TIM3_CLK_ENABLE();
htim3.Instance = TIM3;
htim3.Init.Prescaler = 64;
htim3.Init.Period = 1000;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(&htim3);
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}
// ================= 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)
{
uint16_t ldr = read_LDR();
uint8_t pir = HAL_GPIO_ReadPin(PIR_PORT, PIR_PIN);
// ===== LOGIKA UTAMA =====
if (ldr < LDR_THRESHOLD)
{
// TERANG (lux tinggi)
set_LED(LED_OFF);
}
else
{
// GELAP (lux rendah)
if (pir == GPIO_PIN_SET)
{
// Ada gerakan
set_LED(LED_FULL);
}
else
{
// Tidak ada gerakan
set_LED(LED_DIM);
}
}
HAL_Delay(100);
}
}
5. Video Demo [kembali]
6. Kondisi [kembali]
Buatlah rangkaian seperti pada gambar percobaan 4 dengan kondisi ketika LDR mendeteksi keadaan gelap dan PIR tidak mendeteksi gerakan, maka LED menyala redup,
7. Video Simulasi [kembali]
Percobaan 4 Kondisi 5
8. Download File [kembali]
Komentar
Posting Komentar