Tahap Persiapan
Sebelum simulasi dijalankan, mikrokontroler STM32F103C8 (U1) harus terlebih dahulu diisi dengan program . Caranya adalah dengan melakukan klik dua kali pada komponen mikrokontroler, kemudian pada bagian Program File masukkan file hasil kompilasi dengan ekstensi .hex atau .elf.
Setelah program dimasukkan, jalankan simulasi dengan menekan tombol Play yang ditandai dengan ikon panah hijau pada bagian kiri bawah antarmuka Proteus.
Tahap Pengujian Kondisi 3 percobaan 1
Untuk memperoleh kondisi di mana sensor PIR mendeteksi gerakan sementara sensor Touch tidak mendeteksi sentuhan, digunakan komponen Logic State yang terhubung ke pin TestPin masing-masing sensor.
Pengaturan dilakukan sebagai berikut:
-
Sensor Touch (tidak ada sentuhan):
Temukan Logic State yang terhubung ke sensor TOUCH1, kemudian klik hingga menunjukkan nilai 0 (ditandai lingkaran berwarna biru). Hal ini menunjukkan bahwa tidak terjadi sentuhan. -
Sensor IR (terdeteksi gerakan):
Temukan Logic State yang terhubung ke sensor IR1, lalu klik hingga bernilai 1 (ditandai lingkaran berwarna merah). Kondisi ini menandakan adanya gerakan yang terdeteksi.
Observasi Hasil
Setelah kedua input diatur dengan kondisi Touch = 0 dan PIR = 1, lakukan pengamatan pada LED RED. Berdasarkan instruksi pada rangkaian, buzzer seharusnya aktif. Indikasinya dapat berupa perubahan warna pada titik logika menjadi merah atau munculnya suara apabila fitur audio pada simulator diaktifkan.
Tahap Akhir
Setelah proses pengamatan selesai, hentikan simulasi dengan menekan tombol Stop (ikon kotak biru di bagian kiri bawah) sebelum melakukan perubahan rangkaian atau kompilasi ulang program.
2. Hardware dan Diagram Blok [Kembali]
Daftar Hardware/Komponen Utama:
3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
Prinsip Kerja
1. Kondisi Awal
Saat rangkaian dinyalakan:
- Mikrokontroler STM32 menjalankan:
HAL_Init()→ inisialisasi HAL librarySystemClock_Config()→ menggunakan clock internal HSIMX_GPIO_Init()→ konfigurasi pin GPIO
- Konfigurasi pin:
- PA0 → Input (IR Sensor) dengan pull-down
- PA1 → Input (Touch Sensor) dengan pull-down
- PB0 & PB1 → Output (LED)
- Kondisi awal:
- LED dalam keadaan mati (RESET)
while(1):- STM32 membaca kedua sensor secara terus-menerus:
ir_state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
touch_state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1); - Interpretasi logika:
- IR Sensor = LOW (0) → objek terdeteksi
- Touch Sensor = LOW (0) → tidak disentuh
3. Logika Pada Kondisi
Sistem akan menyalakan LED jika kondisi berikut terpenuhi secara bersamaan:
IR = LOW (objek terdeteksi) dan Touch = LOW (tidak disentuh)
4.Output Sistem LED
Jika kondisi benar:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
LED pada PB0 dan PB1 → MENYALA (ON)
LED menyala stabil (tidak berkedip)
Jika salah satu kondisi tidak terpenuhi:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
LED mati
4. Flowchart dan Listing Program [Kembali]
>#include "main.h"
// ===== PROTOTYPE =====
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)
{
uint8_t ir_state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
uint8_t touch_state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
// Kondisi:
// IR DETEKSI (LOW) dan TOUCH TIDAK DISENTUH (LOW)
if (ir_state == GPIO_PIN_RESET && touch_state == GPIO_PIN_RESET)
{
// LED ON (PB0 & PB1)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
}
else
{
// LED OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
}
HAL_Delay(10);
}
}
// ===== CLOCK CONFIG =====
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();
}
}
// ===== GPIO CONFIG =====
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// Enable clock
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// ===== INPUT (PA0 = IR, PA1 = TOUCH) =====
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// ===== OUTPUT (PB0 & PB1 = LED) =====
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// Default LED OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET);
}
// ===== ERROR HANDLER =====
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
Kondisi 1
Buatlah rangkaian seperti pada gambar percobaan 3 dengan kondisi ketika Infrared sensor mendeteksi benda dan sensor Touch tidak mendeteksi sentuhan, maka LED menyala.
Tidak ada komentar:
Posting Komentar