Percobaan 2 Kontrol Suhu Ruang



1. Prosedur [Kembali]

1. Rangkai alat sesuai prosedur modul

2. Buka software proteus lalu rangkai komponen sesuai dengan gambar yang ada di modul

3. Buka software STM32CubeIDE lalu lakukan konfigurasi pin pada STM untuk menentukan GPIO input dan GPIO output

4. Masukan program ke dalam STM32

5. Jalankan program 


2. Hardware [Kembali]

1. Resistor


2. Push Button


3. Breadboard

4. Motor Driver

5. Kipas DC
6. Sensor Suhu lm35

7. Adaptor

 8. STM32F103C8


  • Diagram Blog


3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]


  • Deteksi Suhu (Input Analog): Sensor LM35 mendeteksi suhu lingkungan dan menghasilkan output tegangan linier sebesar $10\text{ mV}$ untuk setiap kenaikan suhu satu derajat Celcius.

  • Konversi Data (ADC): Tegangan analog dari sensor tersebut masuk ke pin ADC STM32F103C8T6 untuk dikonversi menjadi nilai digital 12-bit (0–4095).

  • Pengolahan Logika Kontrol: Mikrokontroler menghitung nilai suhu sebenarnya dari data ADC tersebut, kemudian membandingkannya dengan parameter suhu yang diinginkan untuk menentukan kecepatan kipas.

  • Penggerak Daya (Motor Driver): Karena pin mikrokontroler tidak dapat menyuplai arus besar, sinyal kendali diteruskan ke Motor Driver L298N yang berfungsi sebagai sakelar daya untuk menggerakkan kipas DC.

  • Modulasi Kecepatan (PWM): Mikrokontroler menggunakan sinyal PWM untuk mengatur kecepatan kipas; semakin tinggi suhu yang terdeteksi, semakin besar duty cycle yang diberikan sehingga kipas berputar lebih cepat.

  • Interaksi Manual (Interrupt): Push Button yang dikonfigurasi dengan sistem Interrupt (EXTI) memungkinkan pengguna untuk mematikan atau menyalakan sistem secara instan tanpa terhambat oleh proses pembacaan sensor yang sedang berjalan.

  • Manajemen Waktu: Sistem menggunakan fungsi HAL_GetTick() untuk mengatur interval pembacaan sensor dan pembaruan kecepatan kipas secara berkala tanpa menghentikan aliran program utama (non-blocking).


4. Flowchart [Kembali]

  • Flowchart




  • Listing Program
#include "main.h"
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM1_Init(void);
uint32_t adcValue = 0;
float voltage = 0;
float temperature = 0;
uint8_t system_on = 1;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM1_Init();
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
adcValue = HAL_ADC_GetValue(&hadc1);
voltage = ( adcValue / 4095.0) * 3.3;
temperature = ( voltage * 100);
if(system_on)
{
if(temperature >= 27.0)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
float duty;
if(temperature >= 35.0)
{
duty = 0.5;
}
else

(temperature - 27.0) / 8.0) * 0.5;
}
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty *
65535);
}
else
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
}
}
else
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
}
HAL_Delay(200);
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType =
RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
}
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};

hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
static void MX_TIM1_Init(void)
{
TIM_OC_InitTypeDef sConfigOC = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 65535;
HAL_TIM_PWM_Init(&htim1);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_MspPostInit(&htim1);
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_4)
{
system_on = !system_on;
}
}
void Error_Handler(void)
{
__disable_irq();
while (1) {}
}

5. Video Demo [Kembali]


6. Analisa [Kembali]






7. Download File [Kembali]

Analisa [Klik]


Kembali ke Halaman Atas



Komentar