Laporan Akhir Percobaan 3

 [KEMBALI KE MENU SEBELUMNYA]


Laporan Akhir 1
 Sistem Kontrol Suhu Ruangan

1. Prosedur

1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.
2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE.
3. Compile program dalam format hex, lalu upload ke dalam mikrokontroler di proteus atau uploud ke mikrokontroler lewat stlink.
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus atau jalankan lewat prototype yang telah dibuat.
5. Selesai.


Hardware :

1) Mikrokontroler STM32F103C8
STM32F103C8 board – Microscale





2). Sensor Suhu LM35



3). Kipas DC






4). Power Supply

 
5). Push Button 
6). Driver L298N

7). Adaptor



8).Breadboard


9).Resistor






Diagram Blok  :







 




Prinsip Kerja : 

Program ini bekerja dengan membaca suhu dari sensor analog (melalui ADC channel 0), yang diasumsikan menghasilkan tegangan proporsional terhadap suhu (misalnya sensor seperti LM35, di mana 10 mV = 1°C). Nilai ADC (0–4095) dikonversi menjadi tegangan (0–3,3 V), lalu diubah menjadi suhu dalam derajat Celsius dengan persamaan sederhana. Sistem akan aktif atau nonaktif berdasarkan variabel system_on, yang dapat ditoggle melalui interrupt dari tombol pada pin PA4.

Saat sistem aktif, jika suhu mencapai atau melebihi 27°C, maka output pada PA2 dinyalakan (indikasi atau aktuator aktif), dan sinyal PWM pada TIM1 channel 1 diatur untuk mengontrol kecepatan (misalnya kipas). Duty cycle PWM berubah secara linier: semakin tinggi suhu (27–35°C), duty cycle menurun hingga batas tertentu, dan jika suhu ≥35°C maka duty cycle dijaga pada nilai tetap. Jika suhu di bawah 27°C atau sistem dimatikan, semua output dimatikan dan PWM dihentikan. Proses ini berjalan terus-menerus dengan jeda 200 ms.

4. Flowchart dan Listing Program


Flowchart :








Listing Program :
a. main.c
#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 HTML [Download]
Download Analisa [Download]
Download Rangkaian [Download]
Download Video Simulasi [Download]
Datasheet Mikrokontroler STM32F103C8 [Download]
Datasheet kipas dc [Download]
Datasheet driver l298n [Download]
Datasheet sensor LM35 [Download]

Komentar

Postingan populer dari blog ini