[menuju akhir]

Langkah-langkah percobaan :

1. Siapkan alat dan bahan yaitu dengan komponen utama STM32F103C8, sensor suhu LM35, kipas DC, Resistor, Motor Driver l298N, Push Button

2. Rangkai sesuai gambar percobaan

3. Rancang kerja rangkaian sesuai kondisi 

4. Inisialisasi STM32F103C8 dengan aplikasi STM32CUBE ID

5. Setelah dapat file hex nya, masukkan file hex ke dalam stm pada proteus

4. Tekan tombol “Play” untuk menjalankan simulasi



2. Hardware dan Diagram Blok [Kembali]
a. Hardware
1. STM32F103C8
TM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 yang  dikembangkan oleh STMicroelectronics. Mikrokontroler ini sering digunakan dalam pengembangan sistem tertanam karena kinerjanya yang baik, konsumsi daya yang rendah, dan kompatibilitas dengan berbagai protokol komunikasi. Pada praktikum ini, kita menggunakan STM32F103C8 yang dapat diprogram menggunakan berbagai  metode, termasuk komunikasi serial (USART), SWD (Serial Wire Debug), atau JTAG untuk berhubungan dengan komputer maupun perangkat lain.

2. Sensor Suhu LM35

LM35 temperature sensor adalah sensor suhu analog berbasis IC yang digunakan untuk mengukur temperatur lingkungan dalam satuan derajat Celsius (°C).

3. Kipas DC

Kipas DC adalah kipas yang menggunakan sumber listrik arus searah (Direct Current / DC) untuk menggerakkan motor sehingga menghasilkan aliran udara.


4. Motor Driver l298N 

Motor Driver L298N adalah modul driver motor berbasis IC L298 yang digunakan untuk mengendalikan motor DC atau motor stepper dengan bantuan mikrokontroler.


5. Push Button

Push button adalah saklar mekanik sederhana yang bekerja saat ditekan untuk menghubungkan atau memutus aliran listrik dalam suatu rangkaian.

6. Resistor 

Resistor adalah komponen elektronik pasif yang berfungsi untuk membatasi arus listrik dalam suatu rangkaian. Resistor bekerja berdasarkan hukum Ohm, yang menyatakan bahwa tegangan (V) = arus (I) × resistansi (R). Resistor memiliki satuan Ohm (Ω) dan digunakan dalam berbagai aplikasi seperti pembagian tegangan, kontrol arus, dan proteksi rangkaian elektronik.

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. Kondisi [Kembali]

Buatlah rangkaian seperti percobaan 3 dengan kondisi ketika sensor LM35 mendeteksi suhu >30 C maka kipas menyala dengan kecepatan penuh dan saat suhu turun maka kecepatan kipas menurun secara linear dan ketika 30 C kipas mati.

7. Video Simulasi [Kembali]




8. Download File [Kembali]
1. Download File Rangkaian  Klik Disini
2. Download Video Simulasi Klik Disini

Komentar

Postingan populer dari blog ini