Laporan Akhir 1




1. Prosedur [Kembali]

  1. Persiapkan seluruh komponen yang dibutuhkan, meliputi STM32F103C8T6, sensor LM35, kipas DC, push button, motor driver L298N, breadboard, adaptor, serta resistor pendukung.

  2. Hubungkan sensor LM35 dengan cara mengoneksikan pin VCC ke sumber tegangan, pin GND ke ground, dan pin VOUT ke pin ADC mikrokontroler pada PA0.

  3. Lakukan pengkabelan motor driver L298N ke STM32. Pin pengendali arah motor dihubungkan ke PA2 dan PA3, sedangkan pin PWM untuk pengaturan kecepatan kipas dihubungkan ke TIM1 Channel 1.

  4. Sambungkan push button ke pin PA4 dan atur sebagai input interrupt. Tombol ini berfungsi untuk mengaktifkan maupun menonaktifkan sistem secara manual.

  5. Pastikan semua jalur ground dari STM32, sensor LM35, motor driver L298N, dan catu daya saling terhubung agar sistem memiliki referensi tegangan yang sama.

  6. Buka software STM32CubeIDE, kemudian lakukan konfigurasi ADC1 pada Channel 0, konfigurasi TIM1 pada mode PWM, serta konfigurasi GPIO PA4 sebagai external interrupt.

  7. Masukkan kode program ke dalam STM32CubeIDE, lalu lakukan proses build untuk memastikan program tidak mengalami error.

  8. Setelah proses build berhasil, upload program ke mikrokontroler STM32F103C8T6 menggunakan downloader atau ST-Link.

  9. Nyalakan sistem dan amati kinerja kipas terhadap perubahan suhu yang terdeteksi oleh sensor LM35.

  10. Tekan push button untuk menguji fungsi interrupt sebagai pengendali manual dalam mengubah kondisi sistem aktif dan nonaktif.

2. Hardware dan diagram blok [Kembali]

  •  Instrumentasi / Alat

    1. Breadboard— Papan prototyping untuk merangkai komponen tanpa solder.
    1. Adaptor — Sumber daya eksternal untuk rangkaian.
    Komponen / Bahan
    1. STM32F103C8 (Blue Pill) — Mikrokontroler berbasis ARM Cortex-M3, beroperasi pada 3.3V dengan 32 pin GPIO dan clock speed 72 MHz.
    1. Spesifikasi:

      • Microcontroller Core : ARM Cortex-M3
      • Operating Voltage : 3.3V
      • Input Voltage (recommended) : 5V
      • Input Voltage (limit) : 2.0V – 3.6V
      • Digital I/O Pins : 32 pin
      • PWM Digital I/O Pins : 15 channel
      • Analog Input Pins : 10 channel (ADC 12-bit)
      • DC Current per I/O Pin : 25 mA
      • DC Current for 3.3V Pin : 150 mA
      • Flash Memory : 64 KB
      • SRAM : 20 KB
      • Clock Speed : 72 MHz
      • Komunikasi : USART, SPI, I²C, USB, CAN
      • Pemrograman : SWD, JTAG, USART Bootloader

    2. Buzzer — Komponen output audio sebagai alarm/peringatan.

      Spesifikasi:

      • Tipe : Active Buzzer (osilator internal)
      • Tegangan Operasi : 3.5V – 5.5V DC
      • Tegangan Rated : 5V DC
      • Konsumsi Arus : < 30 mA
      • Frekuensi Suara : 2300 ± 300 Hz
      • Sound Pressure Level (SPL) : ≥ 85 dB (pada 10 cm)
      • Operating Temperature : -20°C hingga +70°C
      • Dimensi : 12mm × 9.5mm
      • Sambungan : 2 pin (+ dan -)

    3. Resistor — Komponen pembatas arus (1k ohm).

      Spesifikasi (Resistor 100 ohm, 1/4 Watt):

      • Nilai Resistansi : 100 Ω (coklat-hitam-coklat)
      • Toleransi : ±5% (gelang emas)
      • Daya Maksimum : 0.25 Watt (1/4 W)
      • Tegangan Maksimum : 250V
      • Suhu Operasi : -55°C hingga +155°C
      • Material : Carbon Film
    4. Sensor Suhu


    5. Motor DC
    6. Motor listrik DC atau DC Motor adalah suatu perangkat yang mengubah energi listrik menjadi energi kinetik atau gerakan (motion). Motor DC ini juga dapat disebut sebagai motor arus searah. Seperti namanya, DC Motor memiliki dua terminal dan memerlukan tegangan arus searah atau DC (Direct Current) untuk dapat menggerakannya.

      Prinsip Kerja Motor DC

      Terdapat dua bagian utama pada sebuah motor listrik DC, yaitu stator dan rotor. Stator adalah bagian motor yang tidak berputar, bagian yang statis ini terdiri dari rangka dan kumparan medan. Sedangkan rotor adalah bagian yang berputar, terdiri dari kumparan jangkar. Pada prinsipnya motor DC menggunakan fenomena elektromagnet untuk bergerak, ketika arus listrik diberikan ke kumparan, permukaan kumparan yang bersifat utara akan bergerak menghadap ke magnet yang berkutub selatan dan sebaliknya. Karena kutub utara dan selatan kumparan bertemu maka akan terjadi saling tarik menarik yang menyebabkan pergerakan kumparan berhenti.

      Untuk menggerakannya lagi, tepat pada saat kutub kumparan berhadapan dengan kutub magnet, arah arus pada kumparan dibalik. Dengan demikian, kutub utara kumparan akan berubah menjadi kutub selatan dan kutub selatannya akan berubah menjadi kutub utara. Pada saat perubahan kutub tersebut terjadi, kutub selatan kumparan akan berhadap dengan kutub selatan magnet dan kutub utara kumparan akan berhadapan dengan kutub utara magnet. Karena kutubnya sama, maka akan terjadi tolak menolak sehingga kumparan bergerak memutar hingga utara kumparan berhadapan dengan selatan magnet dan selatan kumparan berhadapan dengan utara magnet. Pada saat ini, arus yang mengalir ke kumparan dibalik lagi dan kumparan akan berputar lagi karena adanya perubahan kutub. Siklus ini akan berulang-ulang hingga arus listrik pada kumparan diputuskan.

    Diagram Blok



                            

3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]


Sistem pengendali suhu ruangan ini memanfaatkan sensor LM35 untuk mendeteksi perubahan temperatur lingkungan. Sensor LM35 menghasilkan tegangan analog yang nilainya berubah sebanding dengan suhu yang terukur. Tegangan keluaran sensor kemudian masuk ke pin PA0 pada STM32F103C8T6 untuk dibaca menggunakan fitur ADC. Data ADC yang diperoleh selanjutnya dikonversi menjadi nilai tegangan dengan resolusi ADC 12-bit, yaitu pada rentang 0–4095 dan menggunakan tegangan referensi sebesar 3,3 V. Setelah proses konversi selesai, mikrokontroler menghitung nilai suhu dalam satuan derajat Celsius berdasarkan karakteristik sensor LM35 yang menghasilkan tegangan sekitar 10 mV setiap kenaikan suhu 1°C.

Setelah suhu berhasil diketahui, STM32F103C8T6 membandingkan nilai tersebut dengan batas suhu yang telah ditentukan pada program. Jika suhu berada di bawah 27°C, maka kipas tetap dalam keadaan mati karena suhu ruangan masih dianggap normal. Akan tetapi, apabila suhu mencapai 27°C atau lebih, mikrokontroler akan mengaktifkan motor driver L298N melalui pin kontrol PA2 dan PA3. Selain itu, STM32 mengirimkan sinyal PWM melalui TIM1 Channel 1 untuk mengatur kecepatan putaran kipas. Pada rentang suhu antara 27°C hingga 35°C, duty cycle PWM akan meningkat secara bertahap sehingga kecepatan kipas juga bertambah mengikuti kenaikan suhu. Ketika suhu mencapai 35°C atau lebih, kipas akan beroperasi pada kecepatan maksimum sesuai pengaturan PWM di dalam program.

Sistem ini juga dilengkapi push button yang berfungsi sebagai kontrol manual. Push button dihubungkan ke pin PA4 dan dikonfigurasikan sebagai external interrupt, sehingga mikrokontroler dapat segera merespons setiap penekanan tombol. Saat tombol ditekan, nilai variabel system_on akan berubah kondisi, misalnya dari aktif menjadi nonaktif atau sebaliknya. Jika sistem berada pada kondisi nonaktif, maka STM32 akan menghentikan sinyal PWM dan mematikan keluaran menuju motor driver L298N sehingga kipas berhenti berputar. Dengan mekanisme tersebut, sistem dapat bekerja otomatis berdasarkan suhu ruangan sekaligus menyediakan fitur kendali manual bagi pengguna untuk mengaktifkan atau menonaktifkan sistem sesuai kebutuhan.

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)
    {
    }
}
 


5. Video Demo [Kembali]


6. Analisa [Kembali]






7. Video Simulasi [Kembali]


                                             

8. Download File [Kembali]














 

Komentar

Postingan populer dari blog ini