[menuju akhir]


Langkah-langkah percobaan :

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

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

3. Masukan Program ke dalam software STM32CubeIDE lalu build untuk mendapatkan file .hex

4. Masukan file .hex ke dalam file library STM32F103C8 pada proteus

5. Simulasikan rangkaian


2. Hardware dan Diagram Blok [Kembali]
a. Hardware
1. STM32F103C8





2. Sensor Suhu LM35




3. Fan DCrt





4. Switch




5. Driver Motor L298



6. Resistor 

b. Diagram Blok




3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]



Prinsip Kerja :

Rangkaian ini merupakan sistem kontrol suhu ruangan berbasis mikrokontroler yang menggunakan sensor suhu LM35 sebagai input, mikrokontroler STM32F103C8 sebagai pengolah data, serta driver motor L298 untuk mengendalikan kecepatan kipas. Sensor LM35 mendeteksi suhu lingkungan dan menghasilkan tegangan analog yang sebanding dengan suhu (10 mV per °C). Tegangan ini kemudian dibaca oleh pin ADC pada STM32 dan dikonversi menjadi nilai digital, lalu diolah menjadi nilai suhu dalam satuan derajat Celcius melalui perhitungan dalam program.

Setelah suhu diperoleh, mikrokontroler membandingkannya dengan batas yang telah ditentukan menggunakan metode histeresis untuk menjaga kestabilan sistem. Kipas akan mulai menyala ketika suhu mencapai atau melebihi 31°C, dan akan mati kembali ketika suhu turun hingga 30,5°C. Rentang ini digunakan untuk mencegah kipas sering hidup dan mati secara cepat akibat fluktuasi kecil pada pembacaan sensor. Ketika kipas aktif, kecepatan putarnya tidak langsung maksimum, melainkan diatur secara bertahap menggunakan sinyal PWM (Pulse Width Modulation) yang dihasilkan oleh timer pada STM32. Semakin tinggi suhu (dari 31°C hingga 40°C), semakin besar duty cycle PWM yang diberikan ke driver L298, sehingga kecepatan kipas meningkat secara linear hingga mencapai kecepatan penuh pada suhu 40°C atau lebih.

Driver L298 berfungsi sebagai penguat arus untuk menggerakkan motor kipas, karena arus dari mikrokontroler tidak cukup untuk langsung menggerakkan motor. Selain itu, terdapat push button yang terhubung ke salah satu pin input mikrokontroler dengan resistor pull-up, yang berfungsi sebagai saklar untuk mengaktifkan atau menonaktifkan sistem secara keseluruhan. Ketika tombol ditekan, sistem akan berganti status antara aktif dan nonaktif melalui mekanisme interrupt. Secara keseluruhan, rangkaian ini bekerja dengan cara membaca suhu secara terus-menerus, memprosesnya di mikrokontroler, lalu mengatur kecepatan kipas secara otomatis agar suhu ruangan dapat dikendalikan dengan lebih stabil dan efisien.

4. Flowchart dan Listing Program [Kembali]
a. Flowchart


b. 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);


#define ADC_SAMPLES 10


uint32_t adcBuffer[ADC_SAMPLES];

uint8_t system_on = 1;

uint8_t fan_active = 0;


// ================= READ TEMPERATURE =================

float readTemperature()

{

uint32_t sum = 0;


for(int i = 0; i < ADC_SAMPLES; i++)

{

HAL_ADC_Start(&hadc1);

HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);

adcBuffer[i] = HAL_ADC_GetValue(&hadc1);

sum += adcBuffer[i];

}


float avg = sum / (float)ADC_SAMPLES;

float voltage = (avg / 4095.0) * 3.3;


return voltage * 100.0; // LM35

}


// ================= MAIN =================

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)

{

float temperature = readTemperature();

float duty = 0;


if(system_on)

{

// ===== HISTERESIS =====

if(fan_active == 0 && temperature >= 31.0)

fan_active = 1;

else if(fan_active == 1 && temperature <= 30.5)

fan_active = 0;


if(fan_active)

{

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);


// ===== PWM LINEAR (31 → 40) =====

if(temperature >= 40.0)

duty = 1.0;

else

duty = (temperature - 31.0) / 9.0;


// ===== CLAMP =====

if(duty < 0) duty = 0;

if(duty > 1) duty = 1;

}

else

{

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);

duty = 0;

}


__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);

}


HAL_Delay(200);

}

}


/* ================= CLOCK ================= */

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);

}


/* ================= ADC ================= */

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);

}


/* ================= PWM ================= */

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);

}


/* ================= GPIO ================= */

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};


__HAL_RCC_GPIOA_CLK_ENABLE();


// Output ke driver motor

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);


// Tombol

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);

}


/* ================= INTERRUPT ================= */

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin == GPIO_PIN_4)

{

HAL_Delay(50); // debounce

system_on = !system_on;

}

}


/* ================= ERROR ================= */

void Error_Handler(void)

{

__disable_irq();

while (1) {}

}


 
 
5. Video Demo [Kembali]




6. Analisa [Kembali]






7. Download File [Kembali]
1. Download Video Demo Klik Disini
2. Download File LA Klik Disini


Komentar

Postingan populer dari blog ini