LA MODUL 2 Percobaan 2



Percobaan 1

1. Prosedur[Kembali]

1. Buat rangkaian dipapan rangkaian sesuai dengan percobaan yang dilakukan pada modul.
2. Buat program STM 32 IDE CLUB
3. Connect Rangkaian STM32 dengan ST LINK ke laptop
4. Jalankan program
5. Selesai.

2. Hardware dan Diagram Blok[Kembali]

Hardware :


    • STM32 Nucleo G474RE

    • LDR Sensor

    • PIR Sensor

    • Push Button

    • Jumper 
    • Resistor

    • Motor Servo

    • Adaptor

    • Breadboard 

    Diagram Blok

3. Rangkaian Simulasi[Kembali]

  • Rangkaian 

  • Prinsip Kerja 

Sistem jemuran otomatis ini bekerja dengan menggunakan sensor cahaya (LDR) yang terhubung ke mikrokontroler STM32. Saat alat dinyalakan, sistem akan mengaktifkan semua komponen seperti sensor, ADC, dan PWM untuk mengontrol servo. LDR membaca intensitas cahaya lingkungan, lalu nilai tersebut diubah menjadi data digital oleh ADC. Nilai ini kemudian dibandingkan dengan batas (threshold) sebesar 2000. Jika nilai LDR lebih kecil dari 2000 (kondisi gelap atau mendung), maka servo bergerak ke posisi masuk sehingga jemuran masuk ke dalam atap. Sebaliknya, jika nilai LDR lebih besar atau sama dengan 2000 (kondisi terang), maka servo bergerak ke posisi keluar sehingga jemuran berada di luar untuk dijemur.

Selain itu, sistem juga memiliki push button sebagai kontrol manual. Jika tombol ditekan, sistem akan berpindah ke mode manual dan posisi servo akan berubah sesuai perintah tombol, tanpa mengikuti sensor LDR. Namun jika mode manual tidak aktif, maka sistem akan terus bekerja otomatis berdasarkan kondisi cahaya. Dengan cara ini, jemuran bisa keluar saat terang dan masuk saat gelap untuk menghindari hujan.


4. Flowchart dan Listing Program[Kembali]

  • Flowchart

  • Listing Program

// 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); } }


5. Video Demo[Kembali]




6. Kondis[Kembali]

Percobaan 2

Buatlah rangkaian dengan kondisi ketika sensor cahaya (LDR) mendeteksi lingkungan terang, maka jemuran akan berada di luar atap (servo pada posisi keluar). Sebaliknya, ketika lingkungan gelap, jemuran akan masuk ke dalam atap (servo pada posisi masuk) untuk menghindari hujan.

7. Analisa[Kembali]

7. Download File[Kembali]

HTML [Download]
Listing Program [Download]
Video Simulasi [Download]  
  









Komentar

Postingan populer dari blog ini

Modul 1 General Input dan Output

MODUL 2 PWM, ADC, dan INTERRUPT

Sub chapter 7.6