Tugas Pendahuluan 2 M2 uP&uC
Modul 1 Percobaan 2 Kondisi 7
Langkah - langkah men-simulasikan rangkaiannya :
- Buatlah rangkaian sesuai dengan gambar di modul di Wokwi.com
- Lalu buka STMCUBEIDE,klik New STM32 Project
- Pilih BOARD SELECTOR, dan ketik STM32 Nucleo G474RE
- Setting pin di file.ioc nya sesuai dengan kebutuhan
- Lalu generate code dan masukkan kode di main.c dan main.h
- Klik Build project dan Masukkan file main.c dan main.h yang telat digenerate
- Masukkan kedua file tersebut ke STM32 Nucleo G474RE di Wokwi
- Run simulasi di Wokwi
2. Hardware dan Diagram Blok [kembali]
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
Prinsip Kerja :
Rangkaian ini bekerja dengan memanfaatkan mikrokontroler STM32 sebagai pusat kendali yang membaca dua input, yaitu switch sebagai pengaktif sistem dan sensor (push button/IR) sebagai pendeteksi objek. Ketika switch dalam kondisi OFF, seluruh sistem dimatikan sehingga LED RGB tidak menyala. Saat switch diaktifkan (ON), mikrokontroler mulai memantau kondisi sensor: jika sensor tidak mendeteksi objek, maka LED RGB menyala hijau sebagai indikasi kondisi aman. Sebaliknya, jika sensor mendeteksi objek, maka LED berubah menjadi merah (atau kombinasi warna tertentu sesuai pemrograman) sebagai tanda adanya objek, dan buzzer dapat diaktifkan sebagai alarm. Selain itu, pada kondisi tertentu saat sistem pertama kali diaktifkan dan sensor langsung mendeteksi objek, sistem dapat masuk ke mode error yang ditandai dengan perubahan warna LED (misalnya ungu). Seluruh proses ini berlangsung secara kontinu dalam loop program dengan pembacaan input dan pengaturan output dilakukan secara real-time berdasarkan logika yang telah diprogram.
4. Flowchart dan Listing Program [kembali]
Flowchart :
Listing Program :
- main.c
#include "main.h"
// HANDLE
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;
// VARIABLE
uint8_t manual_mode = 0;
uint8_t posisi_servo = 0;
uint8_t last_button = 1;
// THRESHOLD
#define LDR_THRESHOLD 2000
// ================= 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};
// LDR PA0
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// BUTTON PB1
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// SERVO PA6
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// ================= 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;
HAL_ADC_Init(&hadc1);
}
// ================= PWM (FIX SERVO) =================
void MX_TIM3_Init(void)
{
__HAL_RCC_TIM3_CLK_ENABLE();
htim3.Instance = TIM3;
// FIX: 1us tick (assume 48MHz clock)
htim3.Init.Prescaler = 48 - 1;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 20000 - 1; // 20ms = 50Hz (servo standard)
HAL_TIM_PWM_Init(&htim3);
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1500; // posisi tengah awal
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}
// ================= SERVO CONTROL =================
void set_servo(uint8_t state)
{
if (state == 0)
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000); // masuk atap
}
else
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000); // keluar
atap
}
}
// ================= ADC READ =================
uint16_t read_LDR(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
return HAL_ADC_GetValue(&hadc1);
}
// ================= 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)
{
// ===== BUTTON TOGGLE =====
uint8_t button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
if (last_button == 1 && button == 0)
{
manual_mode = !manual_mode;
posisi_servo = !posisi_servo;
set_servo(posisi_servo);
HAL_Delay(50);
}
last_button = button;
// ===== MODE OTOMATIS =====
if (!manual_mode)
{
uint16_t ldr = read_LDR();
- main.h
#ifndef __MAIN_H
#define __MAIN_H
#include "stm32c0xx_hal.h"
// PIN
#define LDR_PIN GPIO_PIN_0
#define LDR_PORT GPIOA
#define BUTTON_PIN GPIO_PIN_1
#define BUTTON_PORT GPIOB
#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);
#endif
Buatlah rangkaian dengan kondisi ketika sensor cahaya (LDR) mendeteksi cahaya sangat rendah, maka jemuran akan segera masuk ke dalam atap. Jika cahaya sedang, jemuran berada pada posisi setengah terbuka, dan jika terang, jemuran berada di luar atap.
Link Wokwi [klik disini]
Download File Wokwi [klik disini]
Download Datasheet STM32-NUCLEO G474RE [klik disini]
Download Datasheet Servo SG-90 [klik disini]
Download Datasheet LDR Sensor [klik disini]
Download Datasheet Push Button [klik disini]
Komentar
Posting Komentar