[KEMBALI KE MENU SEBELUMNYA]
Tugas Pendahuluan 2 Modul 2
(Percobaan 2 Kondisi 9)
1. Prosedur
1. Rangkai rangkaian di wokwi sesuai dengan kondisi percobaan.
2. Buat program untuk mikrokontroler STM32 NUCLEO-G474RE di software STM32 CubeIDE.
3. Salin program main.c dan main.h dari stm32cubeide ke wokwi
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada wokwi.
5. Selesai.
Hardware :
1) Mikrokontroler STM32 NUCLEO-G474RE
4. Power Supply
5. Motor Servo
6. push button
7. Adaptor
8. Breadboard
Rangkaian Simulasi Sebelum dirunning:
Rangkaian Simulasi Setelah dirunning:
Prinsip Kerja :
Program ini bekerja sebagai sistem otomatis jemuran berbasis sensor cahaya (LDR) dan servo menggunakan mikrokontroler STM32. Prinsip kerjanya dimulai saat sistem dinyalakan, mikrokontroler menginisialisasi clock, GPIO, ADC, dan timer PWM. Sensor LDR yang terhubung ke pin analog (PA0) akan membaca intensitas cahaya lingkungan dan menghasilkan nilai digital melalui ADC dengan resolusi 12-bit. Nilai ini kemudian dibandingkan dengan nilai ambang batas (LDR_THRESHOLD = 2000) untuk menentukan kondisi terang atau gelap.
Pada proses utama (loop), sistem secara terus-menerus membaca nilai LDR. Jika nilai LDR lebih kecil dari threshold (menandakan kondisi gelap), maka servo akan digerakkan ke posisi 1000 µs (jemuran masuk/tertutup). Sebaliknya, jika nilai LDR lebih besar dari threshold (menandakan kondisi terang), servo akan bergerak ke posisi 2000 µs (jemuran keluar/terbuka). Pergerakan servo dikontrol menggunakan sinyal PWM dari Timer 3 dengan periode 20 ms (50 Hz), yang sesuai dengan standar kontrol servo. Proses ini diulang setiap 100 ms sehingga sistem dapat merespons perubahan cahaya secara real-time.
4. Flowchart dan Listing Program
Flowchart :
Listing Program :
a. main.c
#include "main.h" // Library utama STM32 HAL (GPIO, ADC, Timer, dll)
/* ================= PRIVATE VARIABLES ================= */
ADC_HandleTypeDef hadc1; // Handle untuk ADC1 (sensor LDR)
TIM_HandleTypeDef htim3; // Handle untuk Timer 3 (PWM servo)
/* ================= DEFINE ================= */
#define LDR_THRESHOLD 2000 // Ambang batas cahaya (gelap/terang)
/* ================= FUNCTION PROTOTYPE ================= */
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void MX_TIM3_Init(void);
/* ================= SERVO FUNCTION ================= */
void set_servo(uint8_t state) // Fungsi untuk mengatur posisi servo
{
if (state == 0)
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000);
// GELAP → servo posisi masuk (1 ms)
}
else
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000);
// TERANG → servo posisi keluar (2 ms)
}
}
/* ================= ADC READ FUNCTION ================= */
uint16_t read_LDR(void) // Fungsi membaca nilai sensor LDR
{
ADC_ChannelConfTypeDef sConfig = {0}; // Struktur konfigurasi ADC
sConfig.Channel = ADC_CHANNEL_0; // Gunakan channel 0 (PA0)
sConfig.Rank = ADC_REGULAR_RANK_1; // Ranking pertama
HAL_ADC_ConfigChannel(&hadc1, &sConfig); // Terapkan channel
HAL_ADC_Start(&hadc1); // Mulai konversi ADC
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
// Tunggu sampai konversi selesai
return HAL_ADC_GetValue(&hadc1); // Ambil nilai ADC
}
/* ================= MAIN PROGRAM ================= */
int main(void)
{
HAL_Init(); // Inisialisasi HAL
SystemClock_Config(); // Konfigurasi clock sistem
MX_GPIO_Init(); // Inisialisasi GPIO
MX_ADC1_Init(); // Inisialisasi ADC
MX_TIM3_Init(); // Inisialisasi Timer PWM
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
// Mulai PWM untuk servo
while (1) // Loop utama (berjalan terus)
{
uint16_t ldr = read_LDR(); // Baca nilai sensor cahaya
// ===== KEPUTUSAN BERDASARKAN CAHAYA =====
if (ldr < LDR_THRESHOLD)
{
set_servo(0); // GELAP → jemuran masuk
}
else
{
set_servo(1); // TERANG → jemuran keluar
}
HAL_Delay(100); // Delay 100 ms (stabilisasi pembacaan)
}
}
/* ================= SYSTEM CLOCK ================= */
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Struktur oscillator
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Struktur clock
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // Gunakan HSI
RCC_OscInitStruct.HSIState = RCC_HSI_ON; // Aktifkan HSI
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Tanpa PLL
HAL_RCC_OscConfig(&RCC_OscInitStruct); // Terapkan konfigurasi
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // Clock dari HSI
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // Tidak dibagi
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
}
/* ================= ADC CONFIG ================= */
void MX_ADC1_Init(void)
{
__HAL_RCC_ADC_CLK_ENABLE(); // Aktifkan clock ADC
hadc1.Instance = ADC1; // Gunakan ADC1
hadc1.Init.Resolution = ADC_RESOLUTION_12B; // Resolusi 12-bit
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // Data rata kanan
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // Single channel
HAL_ADC_Init(&hadc1); // Inisialisasi ADC
}
/* ================= TIMER PWM CONFIG ================= */
void MX_TIM3_Init(void)
{
__HAL_RCC_TIM3_CLK_ENABLE(); // Aktifkan clock Timer 3
htim3.Instance = TIM3;
htim3.Init.Prescaler = 48 - 1; // 1 µs tick
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 20000 - 1; // 20 ms → 50 Hz (servo)
HAL_TIM_PWM_Init(&htim3); // Inisialisasi PWM
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1; // Mode PWM1
sConfigOC.Pulse = 1500; // Posisi tengah servo
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}
/* ================= GPIO CONFIG ================= */
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); // Aktifkan GPIOA
// ===== LDR (PA0) =====
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; // Input analog
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// ===== SERVO (PA6) =====
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // Alternate function PWM
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/* ================= ERROR HANDLER ================= */
void Error_Handler(void)
{
__disable_irq(); // Matikan interrupt jika error
while (1)
{
// Sistem berhenti di sini jika terjadi error
}
}
b. main.h
#ifndef __MAIN_H // Jika belum didefinisikan
#define __MAIN_H // Definisikan agar tidak include berulang
#include "stm32c0xx_hal.h"
// Library utama STM32 HAL (GPIO, ADC, Timer, dll)
/* ================= PIN CONFIG ================= */
// ===== LDR (Sensor Cahaya) =====
#define LDR_PIN GPIO_PIN_0 // LDR terhubung ke PA0
#define LDR_PORT GPIOA // Port GPIOA
// ===== BUTTON (Opsional / Manual Control) =====
#define BUTTON_PIN GPIO_PIN_1 // Tombol di PB1
#define BUTTON_PORT GPIOB // Port GPIOB
// ===== SERVO =====
#define SERVO_PIN GPIO_PIN_6 // Servo di PA6 (TIM3 CH1)
#define SERVO_PORT GPIOA // Port GPIOA
/* ================= FUNCTION PROTOTYPE ================= */
// Deklarasi fungsi agar bisa dipanggil di file lain (main.c)
void SystemClock_Config(void); // Konfigurasi clock sistem
void MX_GPIO_Init(void); // Inisialisasi GPIO
void MX_ADC1_Init(void); // Inisialisasi ADC
void MX_TIM3_Init(void); // Inisialisasi Timer PWM
#endif // End of include guard
Percobaan 2 Kondisi 9
Buatlah rangkaian dengan kondisi ketika sensor cahaya (LDR) mendeteksi cahaya di bawah ambang batas tertentu, maka jemuran akan masuk ke dalam atap secara otomatis. Jika berada di atas ambang batas tersebut, jemuran akan keluar ke luar atap tanpa kondisi perantara.
Datasheet Mikrokontroler STM32 NUCLEO-G474RE [Download]
Komentar
Posting Komentar