TP 2




a. Prosedur[Kembali]

1. Persiapan Alat dan Bahan

Sesuai modul :

  • STM32 Nucleo G474RE
  • Sensor LDR
  • Motor Servo
  • Push Button
  • Breadboard
  • Adaptor / supply

2. Perancangan Rangkaian

Buat rangkaian seperti gambar yang kamu kirim:

  • LDR → PA0 (ADC)
  • Servo → PA6 (PWM TIM3)
  • Push button → PB1 (input)
  • VCC dan GND terhubung dengan benar

3. Konfigurasi Sistem

Lakukan konfigurasi:

  • ADC untuk membaca nilai LDR
  • PWM (TIM3) untuk mengontrol posisi servo
  • GPIO untuk tombol

4. Penentuan Kondisi Cahaya

Tambahkan 3 kategori intensitas cahaya dari nilai ADC

5. Algoritma Sistem

Alur kerja:

  1. Baca nilai LDR dari ADC
  2. Bandingkan dengan threshold
  3. Tentukan posisi servo:
    • Gelap → masuk atap
    • Sedang → setengah
    • Terang → keluar
  4. Kirim PWM ke servo
  5. Ulangi terus

b. Hardware dan Diagram Blok[Kembali]

HARDWARE

  STM32G474RE

Microcontroller

STM32G474RE (ARM Cortex-M4F)

Operating Voltage

3.3 V

Input Voltage (recommended)

5 V via USB (ST-LINK) atau 7–12 V via VIN

Input Voltage (limit)

4.5  15 V (VIN board Nucleo)

Digital I/O Pins

±51 GPIO pins (tergantung konfigurasi fungsi)

PWM Digital I/O Pins

Hingga 24 channel PWM (advanced, general-purpose, dan high-resolution timers)

Analog Input Pins

Hingga 24 channel ADC (12-bit / 16-bit dengan oversampling)

DC Current per I/O Pin

Maks. 20 mA per pin (disarankan  8 mA)

DC Current for 3.3V Pin

Hingga ±500 mA (tergantung regulator & sumber daya)

Flash Memory

512 KB internal Flash

SRAM

128 KB SRAM (termasuk CCM RAM)

Clock Speed

Hingga 170 MHz

 

  1. Sensor LDR



    Spesifikasi Sensor Cahaya LDR

     

    1. Supply : 3.3 V – 5 V (arduino available)

    2. Output Type: Digital Output (0 and 1) 

    3. Inverse output

    4. Include IC LM393 voltage comparator

    5. Sensitivitasnya dapat diatur 

    6. Dimensi PCB size: 3.2 cm x 1.4 cm

     

    Modul sensor cahaya ini memudahkan Anda dalam menggunakan sensor LDR (Light Dependent Resistor) untuk mengukur intensitas cahaya. Modul LDR ini memiliki pin output analog dan pin output digital dengan label AO dan DO pada PCB. Nilai resistansi LDR pada pin analog akan meningkat apabila intensitas cahaya meningkat dan menurun ketika intensitas cahaya semakin gelap. Pada pin digital, pada batas tertentu DO akan high atau low, yang dikendalikan sensitivitas nya menggunakan on-board potensiometer.

    • Input Voltage: DC 3.3V - 5V

    • Output: Digital - Sensitivitas bisa diatur, dan analog

    • Ukuran PCB : 33 mm x 15 mm 

     

    LDR atau Light Dependent Resistor merupakan salah satu komponen jenis resistor dengan nilai resistansi yang terus berubah sesuai intensitas cahaya yang mengenai sensor. Semakin banyak cahaya yang mengenai sensor LDR, maka akan semakin menurun nilai resistansinya. Nah, semakin sedikit cahaya yang mengenai sensor (gelap), maka nilai resistansinya akan semakin besar, jadi arus listrik yang mengalir akan terhambat.

     

    Pada umumnya, sensor LDR mempunyai nilai resistansi sebesar 200 KOhm di tengah kegelapan dan akan turun menjadi 500 Ohm saat terkena banyak cahaya. Oleh karena itu, menjadi hal biasa apabila komponen elektronika yang peka cahaya ini sering digunakan untuk lampu alarm, kamar tidur, penerangan jalan dan lain sebagainya.

     

    LDR memiliki peran sebagai sensor cahaya di dalam aneka rangkaian elektronika seperti saklar otomatis berdasarkan cahaya. Jadi jika sensor terkena cahaya, maka arus listrik akan mengalir (ON) dan jika sensor berada di dalam kondisi minim cahaya alias gelap, maka aliran listrik akan terhambat (OFF). LDR sering digunakan untuk sensor lampu kamar tidur, penerangan jalan otomatis, alarm dan lain sebagainya




  2. Motor Servo



  3. Push Button


    Spesifikasi Teknis Push Button Switch

    Karakteristik Listrik

    • Rating Tegangan (Voltage): Menunjukkan batas maksimum tegangan yang bisa ditangani, misalnya 12V DC atau 250V AC.

    • Rating Arus (Current): Menunjukkan seberapa besar arus yang bisa dialirkan tanpa merusak kontak, biasanya berkisar antara 1A hingga 5A.

    • Tipe Kontak: Bisa NO (Normally Open), NC (Normally Closed), atau kombinasi keduanya (SPDT / Single Pole Double Throw).


         DIAGRAM BLOK  




    
                                                                                                                                                           

c. Rangkaian Simulasi dan Prinsip Kerja[Kembali]







Prinsip Kerja

Prinsip kerja sistem jemuran otomatis ini dimulai ketika mikrokontroler STM32 dihidupkan dan melakukan inisialisasi seluruh peripheral yang digunakan, yaitu GPIO, ADC, dan PWM (timer). Sensor LDR yang terhubung ke pin analog (PA0) berfungsi sebagai pendeteksi intensitas cahaya lingkungan. Nilai cahaya yang diterima oleh LDR akan diubah menjadi sinyal analog, kemudian dikonversi oleh ADC 12-bit menjadi data digital dengan rentang nilai 0 hingga 4095.

Selanjutnya, mikrokontroler secara terus-menerus membaca nilai ADC dari sensor LDR menggunakan fungsi read_LDR(). Nilai digital ini merepresentasikan tingkat pencahayaan di sekitar jemuran. Semakin kecil nilai ADC, maka kondisi lingkungan semakin gelap (cahaya rendah), sedangkan semakin besar nilai ADC menunjukkan kondisi semakin terang. Nilai tersebut kemudian dibandingkan dengan dua batas ambang (threshold), yaitu LDR_RENDAH dan LDR_SEDANG, yang telah ditentukan sebelumnya melalui proses kalibrasi.

Berdasarkan hasil perbandingan tersebut, sistem akan menentukan posisi jemuran dalam tiga kondisi. Jika nilai LDR lebih kecil dari LDR_RENDAH, maka dianggap kondisi gelap atau mendung sehingga jemuran akan masuk ke dalam atap untuk menghindari hujan atau kondisi tidak optimal. Jika nilai LDR berada di antara LDR_RENDAH dan LDR_SEDANG, maka kondisi dianggap cahaya sedang sehingga jemuran diposisikan setengah terbuka sebagai posisi aman. Sedangkan jika nilai LDR lebih besar dari LDR_SEDANG, maka kondisi dianggap sangat terang sehingga jemuran akan keluar sepenuhnya untuk memaksimalkan proses penjemuran.

Untuk menggerakkan jemuran, digunakan motor servo yang dikendalikan menggunakan sinyal PWM dari timer TIM3 pada pin PA6. Lebar pulsa (pulse width) PWM menentukan sudut putar servo. Pada program ini, nilai pulsa 1000 digunakan untuk posisi 0 derajat (jemuran masuk), 1500 untuk posisi 90 derajat (setengah terbuka), dan 2000 untuk posisi 180 derajat (jemuran keluar). Fungsi set_servo() akan mengatur nilai PWM tersebut sesuai dengan kondisi cahaya yang telah ditentukan.

Proses ini berlangsung secara terus-menerus di dalam loop utama dengan jeda waktu tertentu, sehingga sistem dapat merespons perubahan intensitas cahaya secara real-time. Dengan demikian, jemuran dapat bergerak otomatis menyesuaikan kondisi lingkungan tanpa intervensi pengguna, sehingga meningkatkan efisiensi dan keamanan dalam proses penjemuran pakaian.


d. Flowchart dan Listing Program[Kembali]

FLOWCHART




LISTING PROGRAM 

main.c

#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 =================
// Sesuaikan nilai ini setelah kalibrasi LDR
// Nilai ADC STM32 = 0 s/d 4095

#define LDR_RENDAH   1500   // cahaya rendah → jemuran masuk atap
#define LDR_SEDANG   2800   // cahaya sedang → posisi aman (setengah)
                          // > 2800 → sangat terang → keluar atap

// ================= 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 SERVO =================
void MX_TIM3_Init(void)
{
    __HAL_RCC_TIM3_CLK_ENABLE();

    htim3.Instance = TIM3;

    // 1 us tick (48 MHz / 48)
    htim3.Init.Prescaler = 48 - 1;
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 20000 - 1;   // 20 ms = 50 Hz

    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 =================
// state:
// 0 = masuk atap
// 1 = setengah terbuka (aman)
// 2 = keluar atap

void set_servo(uint8_t state)
{
    if (state == 0)
    {
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000);
        // 0 derajat → jemuran masuk
    }
    else if (state == 1)
    {
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1500);
        // 90 derajat → posisi aman
    }
    else if (state == 2)
    {
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000);
        // 180 derajat → jemuran keluar
    }
}

// ================= 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)
    {
        // ===== MODE OTOMATIS =====
        uint16_t ldr = read_LDR();

        /*
           KONDISI:
           LDR kecil  = gelap / cahaya rendah
           LDR sedang = cahaya sedang
           LDR besar  = sangat terang
        */

        if (ldr < LDR_RENDAH)
        {
            posisi_servo = 0;
            // cahaya rendah → jemuran masuk ke dalam atap
        }
        else if (ldr >= LDR_RENDAH && ldr < LDR_SEDANG)
        {
            posisi_servo = 1;
            // cahaya sedang → posisi aman (setengah terbuka)
        }
        else
        {
            posisi_servo = 2;
            // sangat terang → jemuran keluar atap
        }

        set_servo(posisi_servo);

        HAL_Delay(200);
    }
}


main.h

#ifndef __MAIN_H
#define __MAIN_H

#include "stm32c0xx_hal.h"

// ================= PIN =================

// LDR Sensor
#define LDR_PIN        GPIO_PIN_0
#define LDR_PORT       GPIOA

// Push Button (opsional jika ingin mode manual)
#define BUTTON_PIN     GPIO_PIN_1
#define BUTTON_PORT    GPIOB

// Servo Motor
#define SERVO_PIN      GPIO_PIN_6
#define SERVO_PORT     GPIOA

// ================= FUNCTION PROTOTYPE =================

void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void MX_TIM3_Init(void);

uint16_t read_LDR(void);
void set_servo(uint8_t state);

#endif


e. Video Demo
[Kembali]


f. Kondisi[Kembali]

Buatlah rangkaian dengan kondisi ketika sensor cahaya (LDR) mendeteksi cahaya rendah, maka jemuran berada di dalam atap. Jika cahaya meningkat ke tingkat sedang, jemuran berada pada posisi aman (setengah terbuka). Jika cahaya sangat terang, jemuran berada di luar atap.

g. Video Simulasi[Kembali]

  




h. Download File[Kembali]

FIle Zip  [klik disini]


Datasheet Sensor: 









 

Komentar

Postingan populer dari blog ini

Tugas Besar