- Siapkan seluruh alat dan bahan, yaitu STM32F103C8T6, sensor LM35, kipas DC, push button, motor driver L298N, breadboard, adaptor, dan resistor.
- Rangkai sensor LM35 dengan menghubungkan pin VCC ke sumber tegangan, pin GND ke ground, dan pin VOUT ke pin ADC mikrokontroler yaitu PA0.
- Hubungkan pin kontrol motor driver L298N ke mikrokontroler. Pin arah motor dikendalikan melalui PA2 dan PA3, sedangkan pin PWM untuk pengaturan kecepatan kipas dihubungkan ke TIM1 Channel 1.
- Hubungkan push button ke pin PA4 sebagai input interrupt. Tombol ini digunakan untuk mengubah kondisi sistem dari aktif menjadi tidak aktif, atau sebaliknya.
- Pastikan seluruh ground dari STM32, sensor LM35, motor driver, dan catu daya terhubung menjadi satu agar sistem memiliki referensi tegangan yang sama.
- Buka STM32CubeIDE, lakukan konfigurasi ADC1 pada Channel 0, konfigurasi TIM1 sebagai PWM, serta konfigurasi GPIO PA4 sebagai external interrupt.
- Masukkan program ke STM32CubeIDE, kemudian lakukan proses build untuk memastikan tidak terdapat error pada program.
- Upload program ke mikrokontroler STM32F103C8T6.
- Jalankan sistem dan amati respons kipas terhadap perubahan suhu pada sensor LM35.
- Tekan push button untuk menguji fungsi interrupt sebagai saklar manual sistem.
2. Hardware dan Diagram Blok [Kembali]
A. Hardware
Rangkaian ini terdiri dari beberapa komponen utama yang saling terintegrasi untuk membentuk sistem kontrol suhu ruangan berbasis mikrokontroler:
- Mikrokontroler STM32F103C8T6: Merupakan unit pemroses utama yang bertugas menjalankan program, membaca data suhu dari sensor LM35 melalui ADC, mengolah nilai suhu, serta mengatur kecepatan kipas DC melalui sinyal PWM.
- Sensor Suhu LM35: Komponen sensor yang berfungsi mendeteksi suhu ruangan. LM35 menghasilkan tegangan analog yang sebanding dengan suhu, yaitu sekitar 10 mV untuk setiap kenaikan 1°C. Tegangan ini dibaca oleh ADC mikrokontroler untuk dikonversi menjadi nilai suhu.
- Kipas DC: Aktuator utama yang berfungsi menurunkan suhu ruangan dengan menghasilkan aliran udara. Kecepatan kipas diatur berdasarkan suhu yang terdeteksi oleh sensor.
- Motor Driver L298N: Modul pengendali motor yang digunakan sebagai perantara antara STM32 dan kipas DC. Driver ini menerima sinyal kontrol dari mikrokontroler, lalu mengatur arah putaran dan suplai daya ke kipas.
- Push Button: Komponen input manual yang digunakan sebagai saklar untuk mengaktifkan atau menonaktifkan sistem. Tombol ini bekerja menggunakan interrupt sehingga perubahan status dapat langsung diproses oleh mikrokontroler.
- Breadboard: Media perakitan sementara yang digunakan untuk menghubungkan komponen-komponen rangkaian tanpa proses penyolderan.
- Adaptor / Catu Daya: Berfungsi sebagai sumber tegangan untuk menyuplai daya ke mikrokontroler, sensor, driver motor, dan kipas DC.
- Resistor: Komponen pasif yang digunakan untuk membatasi arus dan membantu kestabilan sinyal input, terutama pada rangkaian push button.
Pada sistem kontrol suhu ruangan, diagram blok terdiri dari beberapa bagian utama yang saling terhubung, yaitu sensor, controller, driver, aktuator, serta input tambahan berupa push button.
1. Sensor LM35 (Deteksi Suhu)
2. STM32F103C8T6 (Controller)
3. Motor Driver L298N (Penguat Sinyal Motor)
4. Kipas DC (Aktuator/Pendingin)
5. Push Button (Interrupt PA4)
3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
Sistem kontrol suhu ruangan bekerja dengan memanfaatkan sensor LM35 sebagai pendeteksi suhu. Sensor LM35 menghasilkan tegangan analog yang nilainya sebanding dengan suhu lingkungan. Tegangan tersebut dibaca oleh ADC pada STM32F103C8T6 melalui pin PA0. Nilai ADC kemudian dikonversi menjadi tegangan menggunakan rumus perbandingan terhadap resolusi ADC 12-bit, yaitu 0 sampai 4095, dengan tegangan referensi 3,3 V. Setelah diperoleh nilai tegangan, mikrokontroler mengubahnya menjadi nilai suhu dalam derajat Celsius dengan prinsip bahwa LM35 menghasilkan tegangan sekitar 10 mV untuk setiap 1°C.
Setelah nilai suhu diperoleh, mikrokontroler membandingkannya dengan batas suhu yang telah ditentukan dalam program. Jika suhu berada di bawah 27°C, kipas akan dimatikan karena ruangan dianggap masih dalam kondisi normal. Jika suhu mencapai atau melebihi 27°C, mikrokontroler mengaktifkan motor driver L298N melalui pin PA2 dan PA3, kemudian memberikan sinyal PWM dari TIM1 Channel 1 untuk mengatur kecepatan kipas. Pada rentang suhu 27°C sampai 35°C, kecepatan kipas diatur secara bertahap sesuai perubahan suhu. Ketika suhu mencapai 35°C atau lebih, kipas bekerja pada kondisi maksimum sesuai nilai PWM yang diberikan pada program.
Sistem juga dilengkapi push button sebagai kendali manual. Tombol ini terhubung ke pin PA4 dan bekerja menggunakan external interrupt. Saat tombol ditekan, nilai variabel system_on akan berubah dari aktif menjadi tidak aktif, atau sebaliknya. Jika sistem dalam keadaan tidak aktif, maka mikrokontroler akan mematikan output ke motor driver dan menghentikan sinyal PWM sehingga kipas tidak berputar. Dengan demikian, sistem dapat bekerja secara otomatis berdasarkan suhu ruangan, tetapi tetap memiliki kontrol manual untuk mematikan atau menyalakan sistem sesuai kebutuhan pengguna.
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
{
duty = 1.0 - ((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) {}
}Download rangkaian Proteus klik disini
Download library STM32F103C8 klik disini




Tidak ada komentar:
Posting Komentar