LA Modul 1 Percobaan 1
Nama : Nanda Zahril Pisya
Nim : 2310953030
LAPORAN AKHIR 1
PERCOBAAN 1
1. Prosedur [kembali]
- Membuat project baru di STM32CubeIDE dengan memilih tipe mikrokontroler STM32F103C8 kemudian melakukan konfigurasi pin dengan mengatur PA0 sebagai input untuk sensor PIR, PA1 sebagai input untuk touch sensor, serta PB0 dan PB1 sebagai output untuk LED dan buzzer.
- Melakukan generate code menggunakan fitur yang tersedia di STM32CubeIDE, kemudian menambahkan program utama pada file main.c sesuai dengan kondisi percobaan yaitu saat touch pertama kali aktif maka LED dan buzzer menyala serta sensor PIR dinonaktifkan.
- Melakukan proses build atau kompilasi program untuk menghasilkan file berekstensi .hex yang nantinya akan digunakan pada simulasi di Proteus.
- Membuat rangkaian pada Proteus dengan menambahkan komponen STM32F103C8, sensor touch, sensor PIR, LED, buzzer, serta sumber tegangan VCC dan GND, kemudian menghubungkan touch sensor ke pin PA1, sensor PIR ke pin PA0, LED ke pin PB0 melalui resistor, dan buzzer ke pin PB1, serta memastikan semua ground terhubung dengan benar.
- Memasukkan file .hex hasil kompilasi ke dalam komponen STM32 pada Proteus melalui pengaturan program file.
- Menjalankan simulasi pada Proteus kemudian mengamati kondisi output dimana pada kondisi awal LED dan buzzer dalam keadaan mati, saat sensor PIR mendeteksi gerakan maka LED dapat menyala, dan ketika touch sensor disentuh pertama kali maka LED dan buzzer akan menyala secara bersamaan serta sensor PIR tidak lagi mempengaruhi sistem.
2. Hardware dan Diagram Blok[kembali]
1. STM32F103C8
Microcontroller | ARM Cortex-M3 |
Operating Voltage | 3.3 V |
Input Voltage (recommended) | 5 V |
Input Voltage (limit) | 2 – 3.6 V |
Digital I/O Pins | 32 |
PWM Digital I/O Pins | 15 |
Analog Input Pins | 10 (dengan resolusi 12-bit ADC) |
DC Current per I/O Pin | 25 mA |
DC Current for 3.3V Pin | 150 mA |
Flash Memory | 64 KB |
SRAM | 20 KB |
EEPROM | Emulasi dalam Flash |
Clock Speed | 72 MHz |
2. Touch Sensor
SPESIFIKASI :
- Konsumsi daya yang rendah
- Bisa menerima tegangan dari 2 ~ 5.5V DC
- Dapat menggantikan fungsi saklar tradisional
- Dilengkapi 4 lobang baut untuk memudahkan pemasangan
- Tegangan kerja : 2v s/d 5.5v (optimal 3V)
- Output high VOH : 0.8 VCC (typical)
- Output low VOL : 0.3 VCC (max)
- Arus Output Pin Sink (@ VCC 3V, VOL 0.6V) : 8 mA
- Arus Output pin pull-up (@ VCC=3V, VOH=2.4V) : 4 mA
- Waktu respon (low power mode): max 220 ms
- Waktu respon (touch mode): max 60 ms
- Ukuran: 24 mm x 24 mm x 7.2 mm
4. PIR Sensor
Spesifikasi PIR Sensor
Spesifikasi :
6. Buzzer
Spesifikasi
- Diagram Blok
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
Prinspi Kerja:
Rangkaian ini merupakan implementasi Percobaan 1 Kondisi 8. Saat sensor Touch mendeteksi sentuhan atau sensor PIR mendeteksi radiasi infra merah, kedua sensor tersebut akan mengirimkan sinyal tegangan ke pin input PA0 atau PA1 pada STM32F103C8. Data input tersebut kemudian diproses oleh mikrokontroler untuk mengaktifkan pin output PB0 dan PB1, sehingga LED dan Buzzer menyala secara bersamaan.
4. Flowchart dan Listing Program [kembali]
Flowchart :
Listing Program:
#include "stm32f1xx_hal.h"
// Inisialisasi variabel untuk status sensor
uint8_t pir_now = 0;
uint8_t touch_now = 0;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void Error_Handler(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
// 1. Baca status sensor
// PA0 = PIR, PA1 = Touch
pir_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
touch_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
/* ==============================================================
LOGIKA:
Jika (PIR terdeteksi) ATAU (Touch terdeteksi) -> Nyalakan
Jika (Keduanya TIDAK terdeteksi) -> Matikan
============================================================== */
if (pir_now == GPIO_PIN_SET || touch_now == GPIO_PIN_SET)
{
// Nyalakan LED (PB0) dan Buzzer (PB1)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
}
else
{
// Kondisi sesuai perintahmu: Keduanya tidak mendeteksi
// Matikan LED (PB0) dan Buzzer (PB1)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
}
}
}
// --- Fungsi Konfigurasi Clock dan GPIO tetap sama seperti kode awalmu ---
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;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
Error_Handler();
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
Error_Handler();
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// Input: PA0 (PIR) dan PA1 (Touch)
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN; // Disarankan Pull-down agar stabil saat tidak ada trigger
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// Output: PB0 (LED) dan PB1 (Buzzer)
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// Pastikan awal-awal semua mati
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);
}
void Error_Handler(void)
{
__disable_irq();
while(1) {}
}
// Inisialisasi variabel untuk status sensor
uint8_t pir_now = 0;
uint8_t touch_now = 0;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void Error_Handler(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
// 1. Baca status sensor
// PA0 = PIR, PA1 = Touch
pir_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
touch_now = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
/* ==============================================================
LOGIKA:
Jika (PIR terdeteksi) ATAU (Touch terdeteksi) -> Nyalakan
Jika (Keduanya TIDAK terdeteksi) -> Matikan
============================================================== */
if (pir_now == GPIO_PIN_SET || touch_now == GPIO_PIN_SET)
{
// Nyalakan LED (PB0) dan Buzzer (PB1)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
}
else
{
// Kondisi sesuai perintahmu: Keduanya tidak mendeteksi
// Matikan LED (PB0) dan Buzzer (PB1)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
}
}
}
// --- Fungsi Konfigurasi Clock dan GPIO tetap sama seperti kode awalmu ---
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;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
Error_Handler();
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
Error_Handler();
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// Input: PA0 (PIR) dan PA1 (Touch)
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN; // Disarankan Pull-down agar stabil saat tidak ada trigger
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// Output: PB0 (LED) dan PB1 (Buzzer)
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// Pastikan awal-awal semua mati
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);
}
void Error_Handler(void)
{
__disable_irq();
while(1) {}
}
5. Video Demo [kembali]
6. Analisa [kembali]
7. Download File [kembali]
- Soal Analisa [Download]
- Rangkaian Proteus [Download]
- Program [Download]
- Datasheet STM32F103C8 [Download]
- Datasheet Touch Sensor [Download]
- Datasheet PIR Sensor [Download]
- Datasheet LED [Download]
- Video Demo [Download]
Komentar
Posting Komentar