1. Prosedur [kembali]
- Rangkai semua komponen
- Buat program di website wokwi
- Jalankan program dan cobakan sesuai kondisi
2. Hardware dan Diagram Blok [kembali]
Hardware :
1. STM32
3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]
RANGKAIAN INI MENGGUNAKAN STM32 SEBAGAI MIKROKONTROLLER, DI MANA INPUTNYA ADALAH PIR SENSOR DAN TOUCH SENSOR DENGAN LED RGB SEBAGAI OUTPUT. PADA PROGRAM DAN STM32, PIN PB7 DIATUR SEBAGAI INPUT UNTUK TOUCH SENSOR DAN PIN PB10 SEBAGAI INPUT UNTUK PIR SENSOR. LALU PIN PB0, PA6, DAN PA7 SEBAGAI OUTPUT UNTUK RED, GREEN, DAN BLUE PADA RGB LED. KETIKA PIR BERLOGIKA 1, MAKA LED RGB AKAN BEWARNA MERAH SELAMA 3 DETIK LALU MATI SELAMA 3 DETIK, DAN TERUS BERULANG SAMPAI PIR BERLOGIKA 0. KETIKA TOUCH BERLOGIKA 1, MAKA LED RGB AKAN BEWARNA BIRU SELAMA 3 DETIK LALU MATI SELAMA 3 DETIK, DAN TERUS BERULANG SAMPAI TOUCH SENSOR BERLOGIKA 0.
RANGKAIAN INI MENGGUNAKAN STM32 SEBAGAI MIKROKONTROLLER, DI MANA INPUTNYA ADALAH PIR SENSOR DAN TOUCH SENSOR DENGAN LED RGB SEBAGAI OUTPUT. PADA PROGRAM DAN STM32, PIN PB7 DIATUR SEBAGAI INPUT UNTUK TOUCH SENSOR DAN PIN PB10 SEBAGAI INPUT UNTUK PIR SENSOR. LALU PIN PB0, PA6, DAN PA7 SEBAGAI OUTPUT UNTUK RED, GREEN, DAN BLUE PADA RGB LED. KETIKA PIR BERLOGIKA 1, MAKA LED RGB AKAN BEWARNA MERAH SELAMA 3 DETIK LALU MATI SELAMA 3 DETIK, DAN TERUS BERULANG SAMPAI PIR BERLOGIKA 0. KETIKA TOUCH BERLOGIKA 1, MAKA LED RGB AKAN BEWARNA BIRU SELAMA 3 DETIK LALU MATI SELAMA 3 DETIK, DAN TERUS BERULANG SAMPAI TOUCH SENSOR BERLOGIKA 0.
4. Flowchart dan Listing Program[Kembali]
Flowchart:
Listing Program:
#include "main.h"
// Definisi pin dan port GPIO
#define RED_Pin GPIO_PIN_0
#define GREEN_Pin GPIO_PIN_1
#define BLUE_Pin GPIO_PIN_2
#define PIR_Pin GPIO_PIN_3
#define TOUCH_Pin GPIO_PIN_4
#define RGB_GPIO_Port GPIOA
#define PIR_GPIO_Port GPIOB
#define TOUCH_GPIO_Port GPIOB
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
uint8_t pir_status = HAL_GPIO_ReadPin(PIR_GPIO_Port, PIR_Pin);
uint8_t touch_status = HAL_GPIO_ReadPin(TOUCH_GPIO_Port, TOUCH_Pin);
if (touch_status == GPIO_PIN_SET) {
// Jika touch sensor aktif -> RGB biru berkedip 3 detik
while (HAL_GPIO_ReadPin(TOUCH_GPIO_Port, TOUCH_Pin) == GPIO_PIN_SET) {
HAL_GPIO_WritePin(RGB_GPIO_Port, RED_Pin | GREEN_Pin, GPIO_PIN_RESET); // Matikan merah & hijau
HAL_GPIO_WritePin(RGB_GPIO_Port, BLUE_Pin, GPIO_PIN_SET); // Nyalakan biru
HAL_Delay(3000);
HAL_GPIO_WritePin(RGB_GPIO_Port, BLUE_Pin, GPIO_PIN_RESET); // Matikan biru
HAL_Delay(3000);
}
}
else if (pir_status == GPIO_PIN_SET) {
// Jika PIR mendeteksi gerakan -> RGB merah berkedip 3 detik
while (HAL_GPIO_ReadPin(PIR_GPIO_Port, PIR_Pin) == GPIO_PIN_SET) {
HAL_GPIO_WritePin(RGB_GPIO_Port, GREEN_Pin | BLUE_Pin, GPIO_PIN_RESET); // Matikan hijau & biru
HAL_GPIO_WritePin(RGB_GPIO_Port, RED_Pin, GPIO_PIN_SET); // Nyalakan merah
HAL_Delay(3000);
HAL_GPIO_WritePin(RGB_GPIO_Port, RED_Pin, GPIO_PIN_RESET); // Matikan merah
HAL_Delay(3000);
}
}
else {
// Jika tidak ada input dari PIR dan Touch, matikan semua LED
HAL_GPIO_WritePin(RGB_GPIO_Port, RED_Pin | GREEN_Pin | BLUE_Pin, GPIO_PIN_RESET);
}
}
}
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_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = 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_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// Inisialisasi pin LED RGB
HAL_GPIO_WritePin(RGB_GPIO_Port, RED_Pin | GREEN_Pin | BLUE_Pin, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = RED_Pin | GREEN_Pin | BLUE_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(RGB_GPIO_Port, &GPIO_InitStruct);
// Inisialisasi pin sensor PIR dan touch
GPIO_InitStruct.Pin = PIR_Pin | TOUCH_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN; // Pull-down untuk kestabilan sinyal
HAL_GPIO_Init(PIR_GPIO_Port, &GPIO_InitStruct);
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
HAL_GPIO_TogglePin(RGB_GPIO_Port, RED_Pin); // Kedipkan LED merah sebagai indikasi error
HAL_Delay(500);
}
}
Flowchart:
Listing Program:
#include "main.h"
// Definisi pin dan port GPIO
#define RED_Pin GPIO_PIN_0
#define GREEN_Pin GPIO_PIN_1
#define BLUE_Pin GPIO_PIN_2
#define PIR_Pin GPIO_PIN_3
#define TOUCH_Pin GPIO_PIN_4
#define RGB_GPIO_Port GPIOA
#define PIR_GPIO_Port GPIOB
#define TOUCH_GPIO_Port GPIOB
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
uint8_t pir_status = HAL_GPIO_ReadPin(PIR_GPIO_Port, PIR_Pin);
uint8_t touch_status = HAL_GPIO_ReadPin(TOUCH_GPIO_Port, TOUCH_Pin);
if (touch_status == GPIO_PIN_SET) {
// Jika touch sensor aktif -> RGB biru berkedip 3 detik
while (HAL_GPIO_ReadPin(TOUCH_GPIO_Port, TOUCH_Pin) == GPIO_PIN_SET) {
HAL_GPIO_WritePin(RGB_GPIO_Port, RED_Pin | GREEN_Pin, GPIO_PIN_RESET); // Matikan merah & hijau
HAL_GPIO_WritePin(RGB_GPIO_Port, BLUE_Pin, GPIO_PIN_SET); // Nyalakan biru
HAL_Delay(3000);
HAL_GPIO_WritePin(RGB_GPIO_Port, BLUE_Pin, GPIO_PIN_RESET); // Matikan biru
HAL_Delay(3000);
}
}
else if (pir_status == GPIO_PIN_SET) {
// Jika PIR mendeteksi gerakan -> RGB merah berkedip 3 detik
while (HAL_GPIO_ReadPin(PIR_GPIO_Port, PIR_Pin) == GPIO_PIN_SET) {
HAL_GPIO_WritePin(RGB_GPIO_Port, GREEN_Pin | BLUE_Pin, GPIO_PIN_RESET); // Matikan hijau & biru
HAL_GPIO_WritePin(RGB_GPIO_Port, RED_Pin, GPIO_PIN_SET); // Nyalakan merah
HAL_Delay(3000);
HAL_GPIO_WritePin(RGB_GPIO_Port, RED_Pin, GPIO_PIN_RESET); // Matikan merah
HAL_Delay(3000);
}
}
else {
// Jika tidak ada input dari PIR dan Touch, matikan semua LED
HAL_GPIO_WritePin(RGB_GPIO_Port, RED_Pin | GREEN_Pin | BLUE_Pin, GPIO_PIN_RESET);
}
}
}
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_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = 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_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// Inisialisasi pin LED RGB
HAL_GPIO_WritePin(RGB_GPIO_Port, RED_Pin | GREEN_Pin | BLUE_Pin, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = RED_Pin | GREEN_Pin | BLUE_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(RGB_GPIO_Port, &GPIO_InitStruct);
// Inisialisasi pin sensor PIR dan touch
GPIO_InitStruct.Pin = PIR_Pin | TOUCH_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN; // Pull-down untuk kestabilan sinyal
HAL_GPIO_Init(PIR_GPIO_Port, &GPIO_InitStruct);
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
HAL_GPIO_TogglePin(RGB_GPIO_Port, RED_Pin); // Kedipkan LED merah sebagai indikasi error
HAL_Delay(500);
}
}
Tidak ada komentar:
Posting Komentar