Untuk menjalankan dan memvalidasi simulasi rangkaian pada platform seperti Wokwi, prosedur berikut harus dilakukan secara berurutan:
- Menyiapkan platform simulasi menggunakan Wokwi
-
Menambahkan komponen:
- STM32 Nucleo C031C6
- Sensor LDR
- Motor Servo
- Push Button (opsional)
-
Menghubungkan rangkaian:
- LDR → pin analog PA0
- Servo → pin PWM PA6
- Button → pin digital PB1 (opsional)
-
Menuliskan program pada file
main.c:- Inisialisasi sistem (clock, GPIO, ADC, PWM)
- Membaca nilai ADC dari LDR
- Membandingkan nilai ADC dengan threshold
- Mengatur posisi servo sesuai kondisi cahaya
- Meng-upload / menjalankan program pada simulasi
- Mengatur nilai lux pada sensor LDR di Wokwi
-
Mengamati respon servo:
- Gelap → servo masuk
- Sedang → servo setengah
- Terang → servo keluar
- Mengulangi pengujian untuk berbagai nilai lux
- Menganalisis apakah sistem bekerja sesuai perintah soal
2. Hardware dan Diagram Blok [Kembali]
A. Hardware
Rangkaian ini terdiri dari beberapa komponen esensial yang saling terintegrasi:- STM32 Nucleo C031C6
-
Berfungsi sebagai mikrokontroler utama
-
Mengolah data dari sensor dan mengendalikan output
-
Sensor LDR (Light Dependent Resistor)
-
Mendeteksi intensitas cahaya lingkungan
-
Mengubah cahaya menjadi tegangan analog
-
Motor Servo
-
Berfungsi sebagai aktuator
-
Menggerakkan posisi jemuran (masuk / setengah / keluar)
-
Push Button (opsional)
-
Digunakan untuk kontrol manual (jika diperlukan)
-
Sumber Tegangan (VCC & GND)
-
Menyediakan daya untuk seluruh rangkaian
- STM32 Nucleo C031C6
- Berfungsi sebagai mikrokontroler utama
- Mengolah data dari sensor dan mengendalikan output
-
Sensor LDR (Light Dependent Resistor)
- Mendeteksi intensitas cahaya lingkungan
- Mengubah cahaya menjadi tegangan analog
-
Motor Servo
- Berfungsi sebagai aktuator
- Menggerakkan posisi jemuran (masuk / setengah / keluar)
-
Push Button (opsional)
- Digunakan untuk kontrol manual (jika diperlukan)
-
Sumber Tegangan (VCC & GND)
- Menyediakan daya untuk seluruh rangkaian
B. Diagram Blok
Diagram blok sistem menunjukkan alur kerja jemuran otomatis yang bekerja dengan memanfaatkan sensor cahaya (LDR) untuk mendeteksi intensitas cahaya lingkungan. Nilai cahaya yang diterima diubah menjadi tegangan analog, kemudian dibaca oleh mikrokontroler STM32 melalui ADC (Analog to Digital Converter) 12-bit (0–4095).
Diagram blok sistem menunjukkan alur kerja jemuran otomatis yang bekerja dengan memanfaatkan sensor cahaya (LDR) untuk mendeteksi intensitas cahaya lingkungan. Nilai cahaya yang diterima diubah menjadi tegangan analog, kemudian dibaca oleh mikrokontroler STM32 melalui ADC (Analog to Digital Converter) 12-bit (0–4095).
Mikrokontroler membandingkan nilai ADC dengan dua batas (threshold) yang telah ditetapkan, yaitu BATAS_SEDANG (1500) dan BATAS_GELAP (2800). Berdasarkan hasil perbandingan, mikrokontroler menentukan kondisi lingkungan:
Gelap (ADC > 2800) → jemuran masuk ke dalam atap
Sedang (ADC 1500–2800) → jemuran setengah terbuka
Terang (ADC < 1500) → jemuran keluar dari atap
Setelah kondisi ditentukan, mikrokontroler menghasilkan sinyal PWM (Pulse Width Modulation) melalui Timer 3 pada pin PA6 untuk mengendalikan motor servo. Lebar pulsa PWM menentukan sudut putaran servo (0°–180°), sehingga posisi jemuran dapat berubah sesuai kondisi cahaya, yaitu masuk ke dalam atap, setengah terbuka, atau keluar dari atap.
Mikrokontroler membandingkan nilai ADC dengan dua batas (threshold) yang telah ditetapkan, yaitu BATAS_SEDANG (1500) dan BATAS_GELAP (2800). Berdasarkan hasil perbandingan, mikrokontroler menentukan kondisi lingkungan:
Gelap (ADC > 2800) → jemuran masuk ke dalam atap
Sedang (ADC 1500–2800) → jemuran setengah terbuka
Terang (ADC < 1500) → jemuran keluar dari atap
Setelah kondisi ditentukan, mikrokontroler menghasilkan sinyal PWM (Pulse Width Modulation) melalui Timer 3 pada pin PA6 untuk mengendalikan motor servo. Lebar pulsa PWM menentukan sudut putaran servo (0°–180°), sehingga posisi jemuran dapat berubah sesuai kondisi cahaya, yaitu masuk ke dalam atap, setengah terbuka, atau keluar dari atap.
3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
Prinsip kerja sistem jemuran otomatis ini bekerja dengan memanfaatkan sensor LDR untuk mendeteksi intensitas cahaya lingkungan. LDR memiliki karakteristik resistansi yang berubah sesuai dengan cahaya yang diterima. Pada kondisi terang, resistansi LDR menurun sehingga tegangan output menjadi lebih kecil dan menghasilkan nilai ADC yang rendah. Sebaliknya, pada kondisi gelap, resistansi LDR meningkat sehingga tegangan output menjadi lebih besar dan menghasilkan nilai ADC yang tinggi.
Nilai ADC yang diperoleh kemudian dibandingkan dengan batas threshold yang telah ditentukan dalam program, yaitu BATAS_SEDANG (1500) dan BATAS_GELAP (2800). Jika nilai ADC lebih besar dari 2800, maka kondisi dianggap gelap dan servo akan bergerak ke posisi masuk (jemuran masuk ke dalam atap). Jika nilai ADC berada di antara 1500 hingga 2800, maka kondisi dianggap sedang dan servo berada pada posisi setengah terbuka. Sedangkan jika nilai ADC lebih kecil dari 1500, maka kondisi dianggap terang dan servo akan bergerak ke posisi keluar (jemuran berada di luar atap).
Pergerakan servo dikendalikan menggunakan sinyal PWM dengan periode 20 ms (50 Hz). Lebar pulsa sebesar 1000 µs menghasilkan sudut 0° (posisi masuk), 1500 µs menghasilkan sudut 90° (posisi setengah terbuka), dan 2000 µs menghasilkan sudut 180° (posisi keluar). Dengan demikian, sistem dapat secara otomatis menyesuaikan posisi jemuran berdasarkan perubahan intensitas cahaya lingkungan.
Listing Program :
#include "main.h" /* HANDLE */ ADC_HandleTypeDef hadc1; TIM_HandleTypeDef htim3; /* BATAS ADC LDR WOKWI Pada sensor LDR Wokwi: Lux rendah / gelap = ADC tinggi Lux tinggi / terang = ADC rendah */ #define BATAS_SEDANG 1500 #define BATAS_GELAP 2800 #define JUMLAH_SAMPLE 10 /* POSISI SERVO */ #define SERVO_MASUK 1000 // jemuran masuk penuh #define SERVO_TENGAH 1500 // jemuran setengah terbuka #define SERVO_KELUAR 2000 // jemuran keluar atap void SystemClock_Config(void); void MX_GPIO_Init(void); void MX_ADC1_Init(void); void MX_TIM3_Init(void); void Error_Handler(void); uint16_t read_LDR(void); uint16_t read_LDR_average(void); void set_servo_us(uint16_t pulse_us); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC1_Init(); MX_TIM3_Init(); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); /* Posisi awal */ set_servo_us(SERVO_TENGAH); while (1) { uint16_t nilai_ldr = read_LDR_average(); if (nilai_ldr > BATAS_GELAP) { /* Gelap: jemuran masuk sepenuhnya ke dalam atap */ set_servo_us(SERVO_MASUK); } else if (nilai_ldr >= BATAS_SEDANG && nilai_ldr <= BATAS_GELAP) { /* Cahaya sedang: jemuran setengah terbuka */ set_servo_us(SERVO_TENGAH); } else { /* Terang: jemuran berada di luar atap */ set_servo_us(SERVO_KELUAR); } HAL_Delay(200); } } 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; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } } void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); /* PA0 = input analog LDR */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* PA6 = output PWM servo TIM3_CH1 */ 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); } void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; __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; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } } void MX_TIM3_Init(void) { TIM_OC_InitTypeDef sConfigOC = {0}; __HAL_RCC_TIM3_CLK_ENABLE(); htim3.Instance = TIM3; htim3.Init.Prescaler = 48 - 1; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 20000 - 1; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = SERVO_TENGAH; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } } uint16_t read_LDR(void) { uint16_t adc_value = 0; HAL_ADC_Start(&hadc1); if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) { adc_value = HAL_ADC_GetValue(&hadc1); } HAL_ADC_Stop(&hadc1); return adc_value; } uint16_t read_LDR_average(void) { uint32_t total = 0; for (uint8_t i = 0; i < JUMLAH_SAMPLE; i++) { total += read_LDR(); HAL_Delay(2); } return total / JUMLAH_SAMPLE; } void set_servo_us(uint16_t pulse_us) { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pulse_us); } void Error_Handler(void) { __disable_irq(); while (1) { } }
#ifndef __MAIN_H #define __MAIN_H #include "stm32c0xx_hal.h" /* PIN */ #define LDR_PIN GPIO_PIN_0 #define LDR_PORT GPIOA #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); void Error_Handler(void); uint16_t read_LDR(void); uint16_t read_LDR_average(void); void set_servo_us(uint16_t pulse_us); #endif
Buatlah rangkaian dengan kondisi ketika sensor cahaya (LDR) mendeteksi lingkungan gelap, maka jemuran akan masuk sepenuhnya ke dalam atap. Namun, jika cahaya berada pada kondisi sedang, jemuran berada pada posisi setengah terbuka, dan jika terang, jemuran berada di luar atap.
Download rangkaian STM32 Nucleo C031C6 klik disini

Tidak ada komentar:
Posting Komentar