Langsung ke konten utama

LA MODUL 2 PERCOBAAN 2

JEMURAN OTOMATIS

1. Prosedur [Kembali ke Daftar Isi]

Berikut adalah langkah-langkah untuk mensimulasikan sistem jemuran otomatis:

  1. Buka perangkat lunak simulasi rangkaian elektronik (misalnya Proteus atau perangkat sejenis).

  2. Buat lembar kerja baru dan tambahkan komponen yang dibutuhkan: Mikrokontroler STM32 (sesuai library), Sensor LDR (dengan sumber cahaya interaktif), Push Button, dan Motor Servo.

  3. Rangkai komponen sesuai dengan skema: hubungkan output LDR ke pin Analog (PA0), Push Button ke pin Digital dengan interupsi (PB1), dan pin kontrol Motor Servo ke pin PWM (PA6) Buka software IDE (seperti STM32CubeIDE), build program jemuran otomatis hingga menghasilkan file biner (.hex atau .elf).

  4. Masukkan file biner tersebut ke dalam komponen mikrokontroler STM32 di software simulasi.

  5. Jalankan simulasi (Play).

  6. Uji rangkaian dengan mengubah intensitas cahaya pada sensor LDR dan amati pergerakan motor servo. Tekan push button untuk menguji mode interupsi (manual).

2. Hardware dan Diagram Blok [Kembali ke Daftar Isi]

Hardware dan Diagram Blok

Hardware (Alat dan Bahan): Berdasarkan modul, perangkat keras yang digunakan meliputi:

  1. STM32 Nucleo G474RE



  2. LDR Sensor (Sensor Cahaya)



  3. Push Button



  4. Motor Servo



  5. Breadboard

  6. Adaptor




3. Rangkaian Simulasi dan Prinsip Kerja [Kembali ke Daftar Isi]



Prinsip Kerja Berurutan:

  1. Kondisi Awal (Inisialisasi): Saat sistem dihidupkan, mikrokontroler menginisialisasi pin ADC untuk LDR, pin PWM untuk Servo, dan mengaktifkan mode otomatis. 

  2. Mode Otomatis (Input LDR aktif duluan): * Sensor LDR terus menerus membaca intensitas cahaya matahari. Nilai analog ini diubah menjadi data digital oleh ADC.

    • Jika cuaca mendung/gelap (Nilai ADC LDR < LDR_THRESHOLD 2000), maka STM32 memerintahkan Motor Servo (Output) bergerak ke posisi 0 (menarik jemuran masuk ke tempat teduh).

    • Jika cuaca terang (Nilai ADC LDR >= LDR_THRESHOLD), maka Motor Servo bergerak ke posisi 1 (mengeluarkan jemuran agar terkena panas).

  3. Mode Manual (Input Interupsi Push Button):

    • Jika pengguna menekan Push Button, program akan mendeteksi perubahan logika dan memicu fungsi Interrupt.

    • Penekanan ini akan mengubah status manual_mode. Saat berada di mode manual, pembacaan LDR diabaikan, dan posisi servo sepenuhnya dikendalikan oleh penekanan tombol (jemuran bisa dimasukkan/dikeluarkan secara manual sesuai keinginan pengguna) .

4. Flowchart dan Listing Program [Kembali ke Daftar Isi]



Listing Program:

#include "main.h" 
 
// HANDLE 
ADC_HandleTypeDef hadc1; 
TIM_HandleTypeDef htim3; 
 
// VARIABLE 
uint8_t manual_mode = 0; 
uint8_t posisi_servo = 0; 
uint8_t last_button = 1; 
 
// THRESHOLD 
#define LDR_THRESHOLD 2000 
 
// ================= 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(); 
  __HAL_RCC_GPIOB_CLK_ENABLE(); 
 
  GPIO_InitTypeDef GPIO_InitStruct = {0}; 
 
  // LDR PA0 
  GPIO_InitStruct.Pin = GPIO_PIN_0; 
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; 
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 
 
  // BUTTON PB1 
  GPIO_InitStruct.Pin = GPIO_PIN_1; 
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT; 
  GPIO_InitStruct.Pull = GPIO_PULLUP; 
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// SERVO PA6 GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Alternate = GPIO_AF1_TIM3; HAL_GPIO_Init(GPIOA, &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; HAL_ADC_Init(&hadc1); } // ================= PWM (FIX SERVO) ================= void MX_TIM3_Init(void) { __HAL_RCC_TIM3_CLK_ENABLE(); htim3.Instance = TIM3; // FIX: 1us tick (assume 48MHz clock) htim3.Init.Prescaler = 48 - 1; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 20000 - 1; // 20ms = 50Hz (servo standard) HAL_TIM_PWM_Init(&htim3); TIM_OC_InitTypeDef sConfigOC = {0}; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 1500; // posisi tengah awal sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1); } // ================= SERVO CONTROL ================= void set_servo(uint8_t state) { if (state == 0) { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000); // masuk atap } else {
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000); // keluar atap } } // ================= ADC READ ================= uint16_t read_LDR(void) { ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = ADC_REGULAR_RANK_1; HAL_ADC_ConfigChannel(&hadc1, &sConfig); HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); return HAL_ADC_GetValue(&hadc1); } // ================= 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) { // ===== BUTTON TOGGLE ===== uint8_t button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1); if (last_button == 1 && button == 0) { manual_mode = !manual_mode; posisi_servo = !posisi_servo; set_servo(posisi_servo); HAL_Delay(50); } last_button = button; // ===== MODE OTOMATIS ===== if (!manual_mode) { uint16_t ldr = read_LDR();
if (ldr < LDR_THRESHOLD) { posisi_servo = 0; // mendung → masuk } else { posisi_servo = 1; // terang → keluar } set_servo(posisi_servo); } HAL_Delay(100); } }
#ifndef __MAIN_H #define __MAIN_H #include "stm32c0xx_hal.h" // PIN #define LDR_PIN GPIO_PIN_0 #define LDR_PORT GPIOA #define BUTTON_PIN GPIO_PIN_1 #define BUTTON_PORT GPIOB #define SERVO_PIN GPIO_PIN_6 #define SERVO_PORT GPIOA // FUNCTION void SystemClock_Config(void); void MX_GPIO_Init(void); void MX_ADC1_Init(void); void MX_TIM3_Init(void); #endif

5. Video Demo [Kembali ke Daftar Isi]



6. Soal Analisa [Kembali ke Daftar Isi]

Soal analisa modul 2

1. Analisa bagaimana perbedaan implementasi PWM antara STM32 serta dampaknya terhadap kontrol motor dan LED.

2. Analisa bagaimana cara pembacaan nilai sensor analog menggunakan ADC pada STM32 

3. Analisa bagaimana penggunaan interrupt eksternal dalam mendeteksi input dari sensor atau tombol pada STM32

4. Analisa bagaimana cara kerja fungsi HAL_GetTick() pada STM32

5. Analisa bagaimana perbedaan konfigurasi dan kontrol pin PWM serta pemanfaatan timer internal pada STM32 dalam menghasilkan sinyal PWM

6. Bagaimana mengatur pergerakan motor servo pada stm 32?

JAWABAN : 

    





7. Video Simulasi [Kembali ke Daftar Isi]



8. Download File [Kembali ke Daftar Isi]

Link Video



Komentar

Postingan populer dari blog ini