Tugas Pendahuluan 2 Modul II

 [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








2. LDR Sensor




3. Buzzer


4. Power Supply

 
5. Motor Servo


6. push button



7. Adaptor



8. Breadboard



Diagram Blok  :








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.









Download HTML [Download]
Download File Rangkaian  [wokwi link]
Download Video Simulasi [Download]
Datasheet Mikrokontroler STM32 NUCLEO-G474RE [Download]
Datasheet Sensor LDR [Download]
Datasheet servo [Download]

Komentar

Postingan populer dari blog ini