LA 1 M2 P3
- Buat rangkaian pada papan percobaan sesuai skematik, meliputi sensor LM35, driver L298N, kipas DC, push button, dan STM32.
- Buat program pada STM32CubeIDE untuk pembacaan ADC (LM35), pengolahan suhu, serta kontrol PWM untuk kipas.
- Hubungkan rangkaian STM32 dengan ST-Link ke laptop.
- Upload dan jalankan program pada mikrokontroler.
- Amati respon sistem terhadap perubahan suhu dan fungsi tombol ON/OFF.
- Selesai.
2. Hardware dan Diagram Blok[Kembali]
- Hardware
- Diagram Blog

3. Rangkaian Simulasi[Kembali]
Pada percobaan ini, sistem kontrol suhu ruangan dirancang untuk bekerja secara otomatis dengan memanfaatkan sensor suhu LM35 sebagai input, serta mikrokontroler STM32 sebagai pengolah data dan pengendali aktuator. Sensor LM35 menghasilkan tegangan analog yang linier terhadap suhu, dengan karakteristik perubahan sebesar 10 mV untuk setiap kenaikan 1°C. Tegangan analog tersebut masuk ke pin ADC STM32 (PA0) dan dikonversi menjadi data digital menggunakan ADC beresolusi 12-bit, sehingga menghasilkan nilai dalam rentang 0 hingga 4095.
Proses pembacaan dilakukan dengan mengaktifkan ADC menggunakan fungsi HAL_ADC_Start(), kemudian menunggu hingga konversi selesai dengan HAL_ADC_PollForConversion(), dan hasilnya diambil menggunakan HAL_ADC_GetValue(). Nilai digital yang diperoleh selanjutnya dikonversi menjadi tegangan dengan persamaan perbandingan terhadap tegangan referensi 3.3 V, kemudian dihitung menjadi nilai suhu dalam satuan derajat Celsius. Proses ini berlangsung secara kontinu di dalam loop utama sehingga sistem dapat memantau perubahan suhu secara real-time.
Hasil pembacaan suhu digunakan sebagai parameter untuk mengontrol kipas DC melalui driver motor L298N. STM32 menghasilkan sinyal PWM menggunakan timer internal (TIM1), dimana nilai duty cycle diatur melalui register compare. Ketika suhu berada di bawah batas tertentu (kurang dari 27°C), kipas dalam kondisi mati (duty cycle = 0). Ketika suhu mulai melebihi 27°C, sistem akan mengaktifkan kipas dan mengatur kecepatannya secara bertahap. Pada rentang suhu 27°C hingga 35°C, duty cycle PWM akan berubah secara linier sehingga kecepatan kipas meningkat secara proporsional terhadap suhu. Jika suhu mencapai atau melebihi 35°C, duty cycle ditetapkan pada nilai maksimum tertentu sehingga kipas beroperasi pada kecepatan tinggi.
Selain pengendalian kipas, sistem juga mengatur arah putaran motor melalui pin digital yang terhubung ke driver L298N. Pin ini digunakan untuk mengaktifkan atau menonaktifkan driver sesuai kondisi suhu, sehingga kipas hanya bekerja saat diperlukan.
Untuk meningkatkan interaksi pengguna, sistem dilengkapi dengan push button yang dikonfigurasi sebagai interrupt eksternal. Ketika tombol ditekan, interrupt akan dipicu dan fungsi callback HAL_GPIO_EXTI_Callback() akan dijalankan untuk mengubah status sistem (ON/OFF). Dengan metode ini, perubahan kondisi sistem dapat dilakukan secara langsung tanpa harus menunggu proses loop utama, sehingga meningkatkan respons dan efisiensi kerja mikrokontroler.
Secara keseluruhan, prinsip kerja sistem ini melibatkan integrasi antara pembacaan sensor analog (ADC), pengolahan data suhu, serta pengendalian aktuator menggunakan PWM dan interrupt. Sistem mampu bekerja secara otomatis, adaptif terhadap perubahan suhu, serta responsif terhadap input pengguna, sehingga efektif dalam menjaga kondisi suhu ruangan sesuai dengan batas yang telah ditentukan.
4. Flowchart dan Listing Program[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
{
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) {}
}
Komentar
Posting Komentar