M2-Tugas Pendahuluan 2



1. Prosedur [kembali]

  • Buka web WOKWI.COM dan cari STM 32 NUCLEO C031C6
  • Rangkai komponen sesuai dengan gambar rangkaian di modul
  • Klik pada Library Manager untuk membuat file baru yang bernama main.h dan main.c
  • Masukan program yang telah di buat sesuai kondisi pada kedua file tersebut
  • Simulasikan

2. Hardware dan Diagram Blok[kembali]

    Hardware

1. STM32 NUCLEO-G474RE



2. PIR Sensor



3. LDR Sensor


4. Resistor


5. LED 

6. Push Button

3. Rangkaian Simulasi dan Prinsip Kerja [kembali]


Sistem lampu jalan otomatis ini bekerja dengan memanfaatkan sensor LDR (Light Dependent Resistor) untuk mendeteksi intensitas cahaya lingkungan, sensor PIR (Passive Infrared) untuk mendeteksi gerakan, serta sebuah push button yang digunakan sebagai input interrupt untuk mengaktifkan mode darurat.

Pada tahap awal, mikrokontroler melakukan proses inisialisasi terhadap seluruh peripheral yang digunakan, yaitu GPIO untuk input/output, ADC untuk membaca nilai dari sensor LDR, serta timer PWM untuk mengatur tingkat kecerahan lampu LED.

Setelah inisialisasi selesai, sistem akan masuk ke dalam loop utama yang berjalan secara terus-menerus. Di dalam loop ini, sistem terlebih dahulu memeriksa kondisi mode darurat (emergency mode) yang dikontrol melalui interrupt dari push button. Ketika tombol ditekan, interrupt akan aktif dan mengubah status mode darurat. Jika mode darurat aktif, maka lampu akan dimatikan tanpa memperhatikan kondisi sensor.

Apabila mode darurat tidak aktif, sistem akan membaca nilai dari sensor LDR untuk menentukan kondisi lingkungan. Jika nilai LDR menunjukkan kondisi terang (siang hari), maka lampu akan dimatikan secara otomatis karena pencahayaan tidak diperlukan.

Sebaliknya, jika kondisi lingkungan gelap (malam hari), maka sistem akan membaca sensor PIR. Apabila sensor PIR mendeteksi adanya gerakan, maka lampu akan menyala dengan intensitas penuh. Namun, jika tidak ada gerakan yang terdeteksi, lampu akan menyala dalam kondisi redup untuk menghemat energi.



4. Flowchart dan Listing Program [kembali]

    Flowchart





    Listing program

main.h

 #ifndef __MAIN_H
#define __MAIN_H

#include "stm32c0xx_hal.h"

// ================= PIN DEFINITIONS =================

// LDR (ADC)
#define LDR_PORT GPIOA
#define LDR_PIN GPIO_PIN_0   // PA0

// PIR SENSOR
#define PIR_PORT GPIOA
#define PIR_PIN GPIO_PIN_1   // PA1

// PUSH BUTTON (INTERRUPT)
#define BUTTON_PORT GPIOB
#define BUTTON_PIN GPIO_PIN_1

// LED PWM
#define LED_PORT GPIOA
#define LED_PIN GPIO_PIN_6   // PA6 (TIM3_CH1)

// ================= FUNCTION PROTOTYPES =================
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void MX_TIM3_Init(void);

#endif


main.c

#include "main.h"

// HANDLE
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;

// VARIABLE
volatile uint8_t emergency_mode = 0;

// PARAMETER
#define LDR_THRESHOLD 2000
#define LED_OFF 0
#define LED_DIM 100
#define LED_FULL 1000

// ================= 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};

 // PIR → PA1
 GPIO_InitStruct.Pin = PIR_PIN;
 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(PIR_PORT, &GPIO_InitStruct);

 // BUTTON → PB1 (INTERRUPT)
 GPIO_InitStruct.Pin = BUTTON_PIN;
 GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);

 // LED PWM → PA6
 GPIO_InitStruct.Pin = LED_PIN;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
 HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);

 // AKTIFKAN INTERRUPT
 HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
}

// ================= 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;
 hadc1.Init.ContinuousConvMode = DISABLE;
 HAL_ADC_Init(&hadc1);

 ADC_ChannelConfTypeDef sConfig = {0};
 sConfig.Channel = ADC_CHANNEL_0;
 sConfig.Rank = ADC_REGULAR_RANK_1;
 HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

// ================= PWM =================
void MX_TIM3_Init(void)
{
 __HAL_RCC_TIM3_CLK_ENABLE();

 htim3.Instance = TIM3;
 htim3.Init.Prescaler = 64;
 htim3.Init.Period = 1000;
 htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
 HAL_TIM_PWM_Init(&htim3);

 TIM_OC_InitTypeDef sConfigOC = {0};
 sConfigOC.OCMode = TIM_OCMODE_PWM1;
 sConfigOC.Pulse = 0;
 HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}

// ================= INTERRUPT CALLBACK =================
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
 if (GPIO_Pin == BUTTON_PIN)
 {
     emergency_mode = !emergency_mode; // toggle mode
 }
}

// ================= HELPER =================
uint16_t read_LDR(void)
{
 HAL_ADC_Start(&hadc1);
 HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
 return HAL_ADC_GetValue(&hadc1);
}

void set_LED(uint16_t value)
{
 __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, value);
}

// ================= 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 INTERRUPT =====
     if (emergency_mode)
     {
         set_LED(LED_OFF); // tombol ditekan → semua mati
         continue;
     }

     uint16_t ldr = read_LDR();
     uint8_t pir = HAL_GPIO_ReadPin(PIR_PORT, PIR_PIN);

     // ===== LOGIKA UTAMA =====
     if (ldr < LDR_THRESHOLD)
     {
         // SIANG → lampu mati
         set_LED(LED_OFF);
     }
     else
     {
         // MALAM
         if (pir == GPIO_PIN_SET)
         {
             set_LED(LED_FULL); // ada gerakan
         }
         else
         {
             set_LED(LED_DIM); // tidak ada gerakan → redup
         }
     }

     HAL_Delay(100);
 }
}

5. Video Demo [kembali]


6. Kondisi [kembali]

Buatlah rangkaian seperti pada gambar percobaan 4 dengan keadaan LDR mendeteksi cahaya terang dan PIR tidak mendeteksi gerakan, maka lampu jalan akan mati

7. Video Simulasi [kembali]



8. Download File [kembali]











Komentar

Postingan populer dari blog ini

2.2 Load-Line Analysis

Detektor non-inverting dengan Vref = 0

3.13 Computer Analysis