TP Percobaan 2 Kondisi 3
DAFTAR ISI
1. Prosedur[Kembali ke Daftar Isi]
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 ke Daftar Isi]
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 ke Daftar Isi]
4. Flowchart dan Listing Program[Kembali ke Daftar Isi]
Listing Program:
#include "main.h"/* --- VARIABEL GLOBAL --- */ADC_HandleTypeDef hadc1;TIM_HandleTypeDef htim3;/* --- KONFIGURASI SENSOR LDR WOKWI ---Karakteristik LDR Wokwi:- Terang = Nilai ADC kecil- Gelap = Nilai ADC besar*/#define AMBANG_TERANG 1500#define AMBANG_GELAP 2800#define TOTAL_SAMPEL 10/* --- KONFIGURASI POSISI SERVO (Mikrodetik) --- */#define POSISI_TARIK 1000 // Jemuran masuk sepenuhnya ke bawah atap#define POSISI_SIAGA 1500 // Jemuran terbuka setengah#define POSISI_JEMUR 2000 // Jemuran keluar sepenuhnya/* --- DEKLARASI FUNGSI --- */void Konfigurasi_SistemJam(void);void Init_Pin_GPIO(void);void Init_Modul_ADC(void);void Init_Modul_PWM(void);void Tangani_Error(void);uint16_t Ambil_Nilai_LDR(void);uint16_t Ambil_RataRata_LDR(void);void Gerakkan_Servo(uint16_t lebar_pulsa);int main(void){// 1. Inisialisasi pustaka HALHAL_Init();// 2. Konfigurasi perangkat kerasKonfigurasi_SistemJam();Init_Pin_GPIO();Init_Modul_ADC();Init_Modul_PWM();// 3. Aktifkan sinyal PWM pada Timer 3 Channel 1HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);// 4. Setel posisi awal jemuran ke tengah (siaga)Gerakkan_Servo(POSISI_SIAGA);while (1){// Baca intensitas cahaya berdasarkan nilai rata-rata ADCuint16_t intensitas_cahaya = Ambil_RataRata_LDR();// Evaluasi kondisi cahaya (dari Terang -> Redup -> Gelap)if (intensitas_cahaya < AMBANG_TERANG){/* Kondisi Terang: Keluarkan jemuran sepenuhnya */Gerakkan_Servo(POSISI_JEMUR);}else if (intensitas_cahaya <= AMBANG_GELAP){/* Kondisi Redup (Sedang): Tarik jemuran setengah */Gerakkan_Servo(POSISI_SIAGA);}else{/* Kondisi Gelap: Amankan jemuran ke dalam atap */Gerakkan_Servo(POSISI_TARIK);}// Beri jeda sejenak sebelum pembacaan berikutnyaHAL_Delay(200);}}/* --- IMPLEMENTASI FUNGSI --- */void Konfigurasi_SistemJam(void){RCC_OscInitTypeDef rcc_osc_init = {0};RCC_ClkInitTypeDef rcc_clk_init = {0};// Menggunakan osilator internal (HSI)rcc_osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSI;rcc_osc_init.HSIState = RCC_HSI_ON;if (HAL_RCC_OscConfig(&rcc_osc_init) != HAL_OK){Tangani_Error();}// Mengatur sumber clock sistem dan pembaginyarcc_clk_init.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK;rcc_clk_init.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;rcc_clk_init.AHBCLKDivider = RCC_SYSCLK_DIV1;if (HAL_RCC_ClockConfig(&rcc_clk_init, FLASH_LATENCY_0) != HAL_OK){Tangani_Error();}}void Init_Pin_GPIO(void){GPIO_InitTypeDef seting_gpio = {0};// Aktifkan clock untuk GPIO Port A__HAL_RCC_GPIOA_CLK_ENABLE();/* Konfigurasi PA0: Input Analog dari Sensor LDR */seting_gpio.Pin = GPIO_PIN_0;seting_gpio.Mode = GPIO_MODE_ANALOG;seting_gpio.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &seting_gpio);/* Konfigurasi PA6: Output Alternate Function untuk PWM Servo (TIM3_CH1) */seting_gpio.Pin = GPIO_PIN_6;seting_gpio.Mode = GPIO_MODE_AF_PP;seting_gpio.Pull = GPIO_NOPULL;seting_gpio.Alternate = GPIO_AF1_TIM3;HAL_GPIO_Init(GPIOA, &seting_gpio);}void Init_Modul_ADC(void){ADC_ChannelConfTypeDef seting_kanal = {0};__HAL_RCC_ADC_CLK_ENABLE();// Pengaturan dasar ADC1hadc1.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){Tangani_Error();}// Pengaturan kanal ADC (Kanal 0)seting_kanal.Channel = ADC_CHANNEL_0;seting_kanal.Rank = ADC_REGULAR_RANK_1;seting_kanal.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;if (HAL_ADC_ConfigChannel(&hadc1, &seting_kanal) != HAL_OK){Tangani_Error();}}void Init_Modul_PWM(void){TIM_OC_InitTypeDef seting_pwm = {0};__HAL_RCC_TIM3_CLK_ENABLE();// Pengaturan Timer 3 untuk menghasilkan sinyal frekuensi yang pas untuk servohtim3.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){Tangani_Error();}// Pengaturan mode PWM pada Channel 1seting_pwm.OCMode = TIM_OCMODE_PWM1;seting_pwm.Pulse = POSISI_SIAGA;seting_pwm.OCPolarity = TIM_OCPOLARITY_HIGH;seting_pwm.OCFastMode = TIM_OCFAST_DISABLE;if (HAL_TIM_PWM_ConfigChannel(&htim3, &seting_pwm, TIM_CHANNEL_1) != HAL_OK){Tangani_Error();}}uint16_t Ambil_Nilai_LDR(void){uint16_t hasil_adc = 0;// Mulai konversi ADCHAL_ADC_Start(&hadc1);// Tunggu konversi selesai dengan batas waktu 100msif (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK){hasil_adc = HAL_ADC_GetValue(&hadc1);}// Hentikan konversiHAL_ADC_Stop(&hadc1);return hasil_adc;}uint16_t Ambil_RataRata_LDR(void){uint32_t akumulasi = 0;// Lakukan pengambilan data beberapa kali untuk mengurangi noisefor (uint8_t iterasi = 0; iterasi < TOTAL_SAMPEL; iterasi++){akumulasi += Ambil_Nilai_LDR();HAL_Delay(2);}return akumulasi / TOTAL_SAMPEL;}void Gerakkan_Servo(uint16_t lebar_pulsa){// Ubah nilai register Compare untuk memodifikasi lebar pulsa (Duty Cycle)__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, lebar_pulsa);}void Tangani_Error(void){// Matikan interrupt dan masuk ke infinite loop jika terjadi kesalahan fatal__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#include <Servo.h>// Inisialisasi ServoServo motorJemuran;// Definisi Pinconst int pinLDR = A0;const int pinServo = 9;// Variabel Penampung Nilaiint nilaiLDR = 0;void setup() {Serial.begin(9600); // Untuk memantau nilai di Serial MonitormotorJemuran.attach(pinServo); // Menghubungkan servo ke pin 9}void loop() {// Membaca input dari LDR (rentang 0 - 1023)nilaiLDR = analogRead(pinLDR);Serial.print("Nilai Cahaya: ");Serial.println(nilaiLDR);/* Catatan: Ambang batas (threshold) mungkin perlu disesuaikantergantung kondisi cahaya di tempat Anda.*/if (nilaiLDR < 300) {// KONDISI GELAP: Jemuran masuk sepenuhnya (0 derajat)motorJemuran.write(0);Serial.println("Kondisi: GELAP - Jemuran MASUK");}else if (nilaiLDR >= 300 && nilaiLDR <= 700) {// KONDISI SEDANG: Jemuran setengah terbuka (90 derajat)motorJemuran.write(90);Serial.println("Kondisi: REDUP - Jemuran SETENGAH");}else {// KONDISI TERANG: Jemuran di luar (180 derajat)motorJemuran.write(180);Serial.println("Kondisi: TERANG - Jemuran LUAR");}delay(500); // Jeda pembacaan agar gerakan tidak terlalu patah-patah
5. Video Demo
[Kembali ke Daftar Isi]
6. Kondisi[Kembali ke Daftar Isi]
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.
7. Download File[Kembali ke Daftar Isi]
Download rangkaian STM32 Nucleo C031C6 klik disini


Komentar
Posting Komentar