Langsung ke konten utama

TP Percobaan 2 Kondisi 3

  

1. Prosedur[Kembali ke Daftar Isi]

    1. Untuk menjalankan dan memvalidasi simulasi rangkaian pada platform seperti Wokwi, prosedur berikut harus dilakukan secara berurutan:

      1. Menyiapkan platform simulasi menggunakan Wokwi
      2. Menambahkan komponen:
        • STM32 Nucleo C031C6
        • Sensor LDR
        • Motor Servo
        • Push Button (opsional)
      3. Menghubungkan rangkaian:
        • LDR → pin analog PA0
        • Servo → pin PWM PA6
        • Button → pin digital PB1 (opsional)
      4. 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
      5. Meng-upload / menjalankan program pada simulasi
      6. Mengatur nilai lux pada sensor LDR di Wokwi
      7. Mengamati respon servo:
        • Gelap → servo masuk
        • Sedang → servo setengah
        • Terang → servo keluar
      8. Mengulangi pengujian untuk berbagai nilai lux
      9. 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

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).

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]

Sistem ini berfungsi dengan menggunakan sensor detak jantung sebagai pengukur perubahan keadaan fisiologis yang selanjutnya diproses oleh mikrokontroler STM32F103C8 untuk mengatur indikator LED. Sensor detak jantung memproduksi sinyal analog berupa tegangan yang berfluktuasi mengikuti intensitas denyut jantung. Sinyal tersebut diterima di pin analog mikrokontroler (PA0) dan diubah menjadi data digital melalui fitur ADC (Analog to Digital Converter).

Nilai ADC ini selanjutnya diolah oleh perangkat lunak untuk mengidentifikasi keadaan yang dianggap sebagai “senang” atau “sedih”Saat nilai tegangan yang terdeteksi tinggi (mencerminkan aktivitas detak jantung yang lebih intens), mikrokontroler menghidupkan LED merah sebagai tanda kondisi gembira. Sebaliknya, saat nilai tegangan berkurang (merepresentasikan keadaan detak jantung yang lebih rendah atau tenang), mikrokontroler menyalakan LED biru sebagai tanda kondisi sedih.

Dalam situasi tertentu di antara kedua nilai tersebut, LED hijau dapat menyala sebagai keadaan transisi atau netralDi samping itu, buzzer juga bisa dinyalakan sebagai tanda tambahan ketika syarat tertentu terpenuhiOleh karena itu, rangkaian ini mengkonversi sinyal biologis yang berupa denyut jantung menjadi output visual melalui perubahan warna LED dari merah ke biru sesuai dengan kondisi yang terdeteksi

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 HAL
  HAL_Init();

  // 2. Konfigurasi perangkat keras
  Konfigurasi_SistemJam();
  Init_Pin_GPIO();
  Init_Modul_ADC();
  Init_Modul_PWM();

  // 3. Aktifkan sinyal PWM pada Timer 3 Channel 1
  HAL_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 ADC
    uint16_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 berikutnya
    HAL_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 pembaginya
  rcc_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 ADC1
  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)
  {
    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 servo
  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)
  {
    Tangani_Error();
  }

  // Pengaturan mode PWM pada Channel 1
  seting_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 ADC
  HAL_ADC_Start(&hadc1);

  // Tunggu konversi selesai dengan batas waktu 100ms
  if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
  {
    hasil_adc = HAL_ADC_GetValue(&hadc1);
  }

  // Hentikan konversi
  HAL_ADC_Stop(&hadc1);

  return hasil_adc;
}

uint16_t Ambil_RataRata_LDR(void)
{
  uint32_t akumulasi = 0;

  // Lakukan pengambilan data beberapa kali untuk mengurangi noise
  for (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 Servo
Servo motorJemuran;

// Definisi Pin
const int pinLDR = A0;
const int pinServo = 9;

// Variabel Penampung Nilai
int nilaiLDR = 0;

void setup() {
  Serial.begin(9600);           // Untuk memantau nilai di Serial Monitor
  motorJemuran.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 disesuaikan
     tergantung 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]

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. Download File[Kembali ke Daftar Isi]

  1. Download rangkaian STM32 Nucleo C031C6 klik disini

Komentar

Postingan populer dari blog ini

Laporan Akhir Dioda Zener

Laporan Akhir Reverse Bias Dioda

Laporan Akhir Forward Bias Dioda