TP 2 MODUL 2 KONDISI 3
DAFTAR ISI
JEMURAN OTOMATIS
1. Prosedur [Kembali ke Daftar Isi]
Prosedur Operasional Sistem Jemuran Otomatis
Langkah 1: Tahap Inisialisasi (Persiapan)
Alat dihubungkan ke sumber daya (tegangan masuk ke STM32 Nucleo).
Sistem mengatur motor servo ke posisi awal, yaitu 90° (posisi jemuran setengah terbuka).
Layar Serial Monitor menampilkan status "MENUNGGU TOMBOL DITEKAN...".
Pada tahap ini, sistem berada dalam mode standby (siaga). Sensor LDR belum aktif memengaruhi motor servo.
Langkah 2: Aktivasi Sistem (Tombol Enable)
Pengguna menekan dan menahan Push Button yang terdapat pada rangkaian.
Sistem mengenali penekanan tombol ini sebagai sinyal Enable (Aktif).
Catatan: Sistem dirancang agar hanya bekerja secara eksklusif saat tombol ini ditekan. Jika tombol dilepas, sistem akan kembali ke mode standby.
Langkah 3: Pembacaan Sensor (Sensing)
Selama tombol ditahan, mikrokontroler STM32 Nucleo membaca data dari sensor LDR secara terus-menerus (real-time).
Modul LDR mendeteksi tingkat iluminasi cahaya di sekitar dan mengirimkan data analog tersebut ke mikrokontroler untuk diolah.
Langkah 4: Pemrosesan dan Pengamanan Data (Processing)
Mikrokontroler menerima nilai pembacaan cahaya dan menguncinya di batas aman (nilai 300 untuk paling gelap, 700 untuk paling terang).
Mikrokontroler melakukan perhitungan matematis proporsional (mapping). Sistem menerjemahkan skala cahaya menjadi skala sudut motor (0° hingga 180°).
Langkah 5: Eksekusi Pergerakan Jemuran (Actuation)
Mikrokontroler mengirimkan sinyal PWM ke motor servo berdasarkan hasil perhitungan di Langkah 4.
Motor servo menggerakkan jemuran dengan perilaku berikut:
Cahaya Redup/Gelap: Motor servo akan menarik jemuran bergerak perlahan menuju sudut 0° (masuk ke bawah atap).
Cahaya Berubah Sedang: Saat matahari mulai muncul, motor servo bergeser perlahan mengikuti cahaya menuju sudut tengah, di sekitar 90°.
Cahaya Sangat Terik: Saat matahari sangat terang, motor servo mendorong jemuran bergerak penuh hingga sudut maksimal 180° (keluar dari atap).
Pergerakan ini terjadi secara halus, bergeser sedikit demi sedikit sesuai perubahan intensitas cahaya, bukan melompat secara tiba-tiba.
Langkah 6: Penonaktifan (Deaktivasi)
Saat pengguna melepas Push Button, mikrokontroler langsung menghentikan pembacaan sensor LDR.
Motor servo akan berhenti berputar dan mempertahankan posisi terakhir jemuran.
Sistem kembali mencetak status "MENUNGGU TOMBOL DITEKAN..." dan diam di posisi tersebut hingga tombol ditekan kembali.
2. Hardware dan Diagram Blok [Kembali ke Daftar Isi]
a. Alat dan Bahan
• STM32 Nucleo G474RE
STM32 Nucleo G474RE berfungsi sebagai mikrokontroler utama yang membaca data sensor LDR dan mengontrol gerakan motor servo sesuai program.
• LDR Sensor
LDR Sensor berfungsi mendeteksi intensitas cahaya. Jika cahaya terang maka jemuran dapat dibuka, sedangkan saat gelap atau mendung jemuran dapat ditutup.
• Push Button
Push Button berfungsi sebagai tombol input manual untuk membuka, menutup, atau mereset sistem.
• Motor Servo
Motor Servo berfungsi sebagai aktuator penggerak jemuran otomatis, yaitu membuka atau menutup posisi jemuran sesuai perintah mikrokontroler.
• Breadboard
Breadboard berfungsi sebagai tempat merangkai komponen elektronik sementara agar mudah dilakukan pengujian.
• Adaptor
Adaptor berfungsi sebagai sumber tegangan listrik untuk menyalakan rangkaian dan memberikan daya pada motor servo maupun mikrokontroler.
3. Rangkaian Simulasi dan Prinsip Kerja [Kembali ke Daftar Isi]
Berikut adalah urutan prinsip kerjanya secara teknis:
1. Kondisi Siaga (Standby) dan Aktuasi (Push Button) Pada keadaan normal, mikrokontroler STM32 Nucleo berada dalam mode siaga. Rangkaian ini memiliki mekanisme pengaman (enable switch) berupa push button yang terhubung ke pin digital dengan konfigurasi pull-up internal.
Selama tombol tidak ditekan, mikrokontroler akan mengabaikan semua data dari lingkungan dan menahan posisi motor servo.
Sistem hanya akan mulai bekerja ketika push button ditekan secara fisik (memberikan logika LOW). Penekanan tombol ini bertindak sebagai sakelar utama yang menginstruksikan mikrokontroler untuk memulai siklus pembacaan sensor.
2. Pendeteksian Iluminasi (Sensor LDR) Ketika sistem aktif (tombol ditahan), sensor LDR mulai bertugas membaca tingkat iluminasi (kecerahan cahaya) di lingkungan sekitar.
Prinsip fisik LDR adalah mengubah nilai resistansi (hambatan) berdasarkan cahaya yang diterimanya. Semakin terang cahaya, hambatan menurun; semakin gelap, hambatan meningkat.
Perubahan hambatan ini oleh modul sensor diubah menjadi perubahan tegangan listrik analog. Tegangan ini kemudian dikirimkan ke pin Analog-to-Digital Converter (ADC) pada mikrokontroler (pin A5).
3. Pemrosesan Data Proporsional (Mikrokontroler) Mikrokontroler STM32 Nucleo mengonversi tegangan analog dari LDR menjadi nilai angka digital (misalnya dari rentang nilai 300 untuk gelap, hingga 700 untuk terang).
Di dalam programnya, mikrokontroler tidak menggunakan logika kondisi kaku (if-else), melainkan menggunakan rumus pemetaan proporsional (mapping).
Mikrokontroler mengonversi skala cahaya (300 - 700) secara langsung ke skala sudut putaran motor (0° - 180°). Rangkaian juga memiliki fungsi pembatas (constrain) agar perhitungan tidak melebihi batas fisik perangkat jika cahaya terlalu ekstrem.
4. Eksekusi Mekanis (Motor Servo) Setelah sudut yang tepat dihitung, mikrokontroler membangkitkan sinyal PWM (Pulse Width Modulation) dan mengirimkannya ke pin sinyal motor servo (pin D10).
Lebar pulsa PWM ini akan mendikte motor servo untuk berputar persis ke sudut yang diperintahkan.
Jika cahaya sedikit berubah (misalnya dari sangat terik menjadi agak berawan), nilai ADC akan sedikit berubah, hasil mapping akan sedikit berubah, dan servo akan bergeser sedikit demi sedikit secara presisi.
Secara keseluruhan: Saat gelap, servo menarik jemuran masuk (mendekati 0°). Saat matahari perlahan muncul, jemuran akan didorong keluar secara proporsional hingga terbuka penuh (180°) saat kondisi sangat terik.
4. Flowchart dan Listing Program [Kembali ke Daftar Isi]
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
5. Video Demo [Kembali ke Daftar Isi]
6. Kondisi [Kembali ke Daftar Isi]
Percobaan 2 kondisi 3
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. Video Simulasi [Kembali ke Daftar Isi]
8. Download File [Kembali ke Daftar Isi]
Bagi yang ingin mempelajari lebih lanjut atau mencoba merangkai sendiri, Anda dapat mengunduh file proyek melalui tautan di bawah ini:
Download File Wokwi


Komentar
Posting Komentar