Tugas Pendahuluan 1
1. Prosedur [kembali]
- Menyiapkan alat dan bahan.
- Merangkai komponen pada breadboard sesuai dengan gambar rangkaian percobaan.
- Menghubungkan masing masing pin input output.
- Mengunggah program menggunakan ST-LINK ke mikrokontroler.
- Jalankan Rangkaian
2. Hardware dan Diagram Blok [kembali]
- STM32F103C8T6
- Sensor Suhu Lm35
- Kipas DC
- Push Button
- Motor Driver l298N
- Breadboard
- Adaptor
- Resistor
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
Rangkaian ini merupakan sistem pengendali kipas berbasis mikrokontroler STM32 yang bekerja dengan kombinasi input manual (tombol) dan sensor suhu (LM35). Pada saat sistem pertama kali dinyalakan, semua komponen diinisialisasi dan kipas berada dalam kondisi mati. Sensor LM35 mulai membaca suhu lingkungan dan mengirimkan sinyal berupa tegangan analog ke pin ADC pada mikrokontroler. Tegangan ini kemudian dikonversi menjadi nilai suhu dalam satuan derajat Celcius oleh program di dalam STM32.
Ketika tombol ditekan satu kali, mikrokontroler mendeteksi perubahan logika dari HIGH ke LOW (karena menggunakan konfigurasi pull-up). Setelah proses debounce untuk menghindari pembacaan ganda, STM32 akan mengaktifkan driver motor L298 dengan memberikan logika HIGH pada pin IN1 dan LOW pada IN2. Kondisi ini menyebabkan arus mengalir ke motor DC sehingga kipas mulai berputar. Dalam kondisi ini, kipas akan terus menyala selama belum ada kondisi lain yang memerintahkannya untuk berhenti.
Selama kipas beroperasi, mikrokontroler secara terus-menerus membaca suhu dari sensor LM35. Jika suhu yang terbaca melebihi 30°C, maka sistem tidak langsung mematikan kipas secara tiba-tiba. Sebaliknya, mikrokontroler akan menjalankan fungsi penghentian bertahap (slow stop) selama kurang lebih 5 detik. Proses ini dilakukan dengan teknik PWM software, yaitu dengan mengatur nyala dan mati sinyal pada pin kontrol motor secara cepat dengan duty cycle yang semakin kecil. Akibatnya, tegangan efektif yang diterima motor berkurang secara perlahan sehingga putaran kipas menurun secara halus hingga akhirnya berhenti.
4. Flowchart dan Listing Program [kembali]
#include "main.h" /* ================= PRIVATE VARIABLES ================= */ ADC_HandleTypeDef hadc1; /* ================= FUNCTION PROTOTYPES ================= */ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_ADC1_Init(void); /* ================= USER CODE ================= */ /* Baca ADC */ uint32_t Read_ADC(void) { uint32_t adc; HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 100); adc = HAL_ADC_GetValue(&hadc1); HAL_ADC_Stop(&hadc1); return adc; } /* Konversi ke suhu (LM35) */ float Read_Temperature(void) { uint32_t adc = Read_ADC(); float voltage = adc * 3.3f / 4095.0f; float suhu = voltage * 100.0f; return suhu; } /* ================= FAN CONTROL ================= */ /* Kipas ON */ void Fan_ON(void) { HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_RESET); } /* Kipas OFF */ void Fan_OFF(void) { HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_RESET); } /* Kipas mati perlahan ±5 detik */ void Fan_Slow_Stop_5s(void) { for (int duty = 100; duty >= 0; duty -= 5) { uint32_t start = HAL_GetTick(); while (HAL_GetTick() - start < 250) { HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_SET); HAL_Delay(duty / 5); HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_RESET); HAL_Delay((100 - duty) / 5); } } Fan_OFF(); } /* ================= MAIN ================= */ int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC1_Init(); uint8_t fan_status = 0; uint8_t last_button = GPIO_PIN_SET; Fan_OFF(); while (1) { float suhu = Read_Temperature(); uint8_t button = HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin); /* Tombol ditekan sekali → kipas hidup */ if (button == GPIO_PIN_RESET && last_button == GPIO_PIN_SET) { HAL_Delay(50); // debounce if (HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin) == GPIO_PIN_RESET) { fan_status = 1; Fan_ON(); } } last_button = button; /* Suhu > 30°C → kipas mati perlahan */ if (fan_status == 1 && suhu > 30.0f) { fan_status = 0; Fan_Slow_Stop_5s(); } HAL_Delay(100); } } /* ================= CONFIG ================= */ 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.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; 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; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); } /* ADC INIT */ 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.DiscontinuousConvMode = 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_239CYCLES_5; HAL_ADC_ConfigChannel(&hadc1, &sConfig); } /* GPIO INIT */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); /* Set awal output */ HAL_GPIO_WritePin(GPIOA, IN1_Pin | IN2_Pin, GPIO_PIN_RESET); /* OUTPUT motor */ GPIO_InitStruct.Pin = IN1_Pin | IN2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* INPUT tombol */ GPIO_InitStruct.Pin = BUTTON_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(BUTTON_GPIO_Port, &GPIO_InitStruct); } /* ERROR HANDLER */ void Error_Handler(void) { __disable_irq(); while (1) { } } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t *file, uint32_t line) { } #endif
5. Video Demo [kembali]
Buatlah rangkaian seperti percobaan 3 dengan kondisi ketika sensor tombol ditekan sekali maka kipas hidup dan ketika sensor suhu >30 C maka kipas mati secara perlahan selama 5 detik.
7. Video Simulasi [kembali]
- Download File Rangkaian (klik disini)
- Download Video Penjelasan Rangkaian (klik disini)
- Download Datasheet Touch Sensor (klik disini)
- Download Datasheet Infrared Sensor (klik disini)
- Download Datasheet Resistor (klik disini)
- Download Datasheet LED (klik disini)
- Download Datasheet Buzzer (klik disini)
Komentar
Posting Komentar