1. Prosedur [Kembali]
Mikrokontroler STM32 Nucleo C031C6 diprogram menggunakan platform simulasi Wokwi. Langkah pertama dimulai dengan membuat project baru dan memilih board STM32 Nucleo.
Selanjutnya, dilakukan perancangan rangkaian dengan menambahkan komponen:
-
Sensor LDR module (dengan output analog)
-
Sensor PIR
-
LED sebagai lampu jalan
-
Push button (opsional sebagai kontrol tambahan)
Kemudian dilakukan pengkabelan sesuai gambar:
-
LDR
-
VCC → 5V
-
GND → GND
-
AO → pin analog STM32 (misalnya A0)
-
PIR
-
VCC → 5V
-
GND → GND
-
OUT → pin digital STM32 (misalnya D2)
-
LED
-
Anoda → pin output (misalnya D13) melalui resistor
-
Katoda → GND
-
Push button
-
Salah satu kaki → pin digital (misalnya D7)
-
Kaki lain → GND
Setelah rangkaian selesai, program ditulis pada file utama. Program dibuat agar STM32 membaca:
-
Nilai analog dari LDR (intensitas cahaya)
-
Status digital dari PIR (gerakan)
Kemudian jalankan simulasi dengan menekan Start Simulation di Wokwi untuk melihat respon sistem.
2. Hardware dan Diagram Blok[Kembali]
Hardware
STM32 NUCLEO-G474RE
LDR Sensor
PIR Sensor
LED
Switch
Adaptor
Breadboard
Diagram Blok
3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]
Sistem bekerja dengan memanfaatkan dua sensor utama, yaitu LDR untuk mendeteksi cahaya dan PIR untuk mendeteksi gerakan.
Pada kondisi yang diberikan:
-
LDR mendeteksi cahaya terang
Saat kondisi terang, resistansi LDR menurun sehingga tegangan output yang dibaca STM32 menunjukkan nilai tertentu (biasanya nilai ADC tinggi/rendah tergantung rangkaian modul, tapi diasumsikan sebagai kondisi “terang”).
-
PIR tidak mendeteksi gerakan
Output dari PIR berada pada kondisi LOW (0), menandakan tidak ada aktivitas manusia di sekitar.
STM32 kemudian membaca kedua kondisi tersebut secara terus-menerus. Karena:
-
Cahaya dalam kondisi terang
-
Tidak ada gerakan yang terdeteksi
Maka sistem memutuskan bahwa lampu jalan tidak perlu dinyalakan. STM32 memberikan logika LOW pada pin output LED, sehingga LED tetap mati
4. Flowchart dan LIsting Program[Kembali]
Flowchart
MAIN.C
#include "main.h"
ADC_HandleTypeDef hadc1;
// ===== CLOCK =====
void SystemClock_Config(void)
{
RCC_OscInitTypeDef osc = {0};
RCC_ClkInitTypeDef clk = {0};
osc.OscillatorType = RCC_OSCILLATORTYPE_HSI;
osc.HSIState = RCC_HSI_ON;
osc.HSIDiv = RCC_HSI_DIV1;
osc.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
HAL_RCC_OscConfig(&osc);
clk.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK;
clk.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
clk.AHBCLKDivider = RCC_SYSCLK_DIV1;
HAL_RCC_ClockConfig(&clk, FLASH_LATENCY_0);
}
// ===== ADC =====
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef s = {0};
__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;
HAL_ADC_Init(&hadc1);
s.Channel = ADC_CHANNEL_0; // PA0 (LDR)
s.Rank = ADC_REGULAR_RANK_1;
HAL_ADC_ConfigChannel(&hadc1, &s);
}
// ===== GPIO =====
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef g = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
// LED (PA6)
g.Pin = LED_PIN;
g.Mode = GPIO_MODE_OUTPUT_PP;
g.Pull = GPIO_NOPULL;
HAL_GPIO_Init(LED_PORT, &g);
// PIR (PA1)
g.Pin = PIR_PIN;
g.Mode = GPIO_MODE_INPUT;
g.Pull = GPIO_NOPULL;
HAL_GPIO_Init(PIR_PORT, &g);
// LDR (PA0)
g.Pin = LDR_PIN;
g.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(LDR_PORT, &g);
}
// ===== MAIN =====
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
while (1)
{
// Baca LDR
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
uint32_t ldr = HAL_ADC_GetValue(&hadc1);
// Baca PIR
GPIO_PinState pir = HAL_GPIO_ReadPin(PIR_PORT, PIR_PIN);
// LOGIKA UTAMA (sesuai soal)
if (ldr < LDR_THRESHOLD && pir == GPIO_PIN_RESET)
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET); // mati
else
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET); // nyala
HAL_Delay(100);
}
}
MAIN.H
#ifndef __MAIN_H
#define __MAIN_H
#include "stm32c0xx_hal.h"
// LDR (PA0)
#define LDR_PIN GPIO_PIN_0
#define LDR_PORT GPIOA
// PIR (PA1)
#define PIR_PIN GPIO_PIN_1
#define PIR_PORT GPIOA
// LED (PA6)
#define LED_PIN GPIO_PIN_6
#define LED_PORT GPIOA
#define LDR_THRESHOLD 2000
#endif
5. Video Demo [Kembali]
6. Kondisi[Kembali]
Buatlah rangkaian seperti pada gambar percobaan 4 dengan keadaan LDR mendeteksi cahaya terang dan PIR tidak mendeteksi gerakan, maka lampu jalan akan mati
Komentar
Posting Komentar