MODUL 4 PROJECT
MODUL 4 PROJECT
Rice Fields Irrigation Flood Detection and Automatic Gate Control System using STM32
1. Pendahuluan [kembali]
Perkembangan teknologi otomatisasi di bidang pertanian semakin diperlukan untuk meningkatkan efisiensi pengelolaan sumber daya air dan mengurangi risiko kerugian akibat banjir maupun kekurangan air pada lahan persawahan. Salah satu permasalahan yang sering terjadi pada sistem irigasi sawah adalah sulitnya melakukan pemantauan kondisi lingkungan secara terus-menerus, terutama saat terjadi hujan deras yang dapat menyebabkan peningkatan debit air secara tiba-tiba dan berpotensi menimbulkan banjir.
Untuk mengatasi permasalahan tersebut, dirancang sebuah sistem Rice Field Irrigation Flood Detection and Automatic Gate Control System Using STM32 yang mampu memantau kondisi sawah secara otomatis dan mengendalikan pintu air berdasarkan kondisi lingkungan yang terdeteksi. Sistem ini menggunakan STM32F103C8T6 Blue Pill sebagai pusat pengendali, dengan tiga sensor utama yaitu Sensor Ultrasonik HC-SR04 untuk mengukur ketinggian permukaan air, Rain Sensor HL-83 untuk mendeteksi curah hujan, dan Soil Moisture Sensor untuk mengukur tingkat kelembapan tanah.
Data dari ketiga sensor akan diproses oleh STM32 untuk menentukan kondisi lahan dan kebutuhan pengaturan irigasi. Hasil pemantauan ditampilkan pada LCD 16×2, sedangkan motor servo MG996R digunakan sebagai aktuator untuk mengontrol buka-tutup pintu air secara otomatis. Selain itu, buzzer berfungsi sebagai alarm peringatan apabila terdeteksi kondisi yang berpotensi menyebabkan banjir. Dengan adanya sistem ini, pengelolaan irigasi dapat dilakukan secara lebih efektif, efisien, dan real-time sehingga dapat membantu petani dalam menjaga kondisi lahan pertanian tetap optimal.
- Merancang sistem pendeteksi banjir dan pengendali pintu air otomatis berbasis STM32F103C8T6 Blue Pill pada area persawahan.
- Mengimplementasikan sensor Ultrasonik HC-SR04, Rain Sensor HL-83, dan Soil Moisture Sensor untuk memantau kondisi ketinggian air, curah hujan, dan kelembapan tanah secara real-time.
- Mengendalikan motor servo MG996R secara otomatis sebagai mekanisme buka-tutup pintu air berdasarkan data yang diperoleh dari sensor.
- Menampilkan informasi kondisi sawah melalui LCD 16×2 serta memberikan peringatan dini menggunakan buzzer ketika terdeteksi potensi banjir atau kondisi yang memerlukan perhatian pengguna.
3. Alat dan Bahan [kembali]
2. Breadboard
- Bahan
4. Dasar Teori [kembali]
a. STM32F103C8T6
STM32F103C8T6 adalah mikrokontroler 32-bit dari keluarga STM32F1 yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini menggunakan inti ARM Cortex-M3 dengan kecepatan hingga 72 MHz, memori Flash 64 KB, dan SRAM 20 KB. STM32F103C8T6 banyak digunakan pada sistem embedded, IoT, robotika, otomasi, dan berbagai proyek elektronika karena memiliki performa tinggi serta konsumsi daya yang rendah
b. Rain Sensor HL-83
Rain Sensor HL-83 (sering juga disebut YL-83 atau FC-37) adalah sensor yang digunakan untuk mendeteksi adanya air hujan atau tetesan air pada permukaan sensor. Sensor ini bekerja berdasarkan perubahan nilai hambatan (resistansi) ketika air mengenai jalur konduktor pada pelat sensor. Nilai tersebut kemudian dikirim ke mikrokontroler untuk diproses
berikut contoh grafik respon Rain Sensor HL-83 yang menunjukkan hubungan antara intensitas hujan (%) dan nilai ADC yang dibaca oleh STM32. Pada sensor hujan tipe resistif seperti HL-83, semakin banyak air yang mengenai permukaan sensor, maka resistansi menurun sehingga nilai ADC cenderung menurun.
Grafik Respon Rain Sensor HL-83
Interpretasi grafik:
- 0–20% → tidak hujan atau hanya beberapa tetes air, nilai ADC tinggi.
- 30–60% → hujan ringan hingga sedang, nilai ADC mulai turun.
- 70–100% → hujan lebat, permukaan sensor banyak tertutup air, nilai ADC sangat rendah
c. Motor Servo
Motor servo adalah aktuator elektromekanik yang mampu mengatur posisi sudut, kecepatan, dan arah putaran dengan tingkat presisi yang tinggi. Motor servo terdiri dari motor DC, rangkaian kontrol, gearbox, dan sensor umpan balik (feedback) yang bekerja dalam satu kesatuan.
Motor servo dikendalikan menggunakan sinyal PWM (Pulse Width Modulation) dari mikrokontroler. Lebar pulsa yang diberikan akan menentukan posisi sudut poros servo
d. HC-SR04 (SONAR1)
HC-SR04 adalah sensor ultrasonik yang digunakan untuk mengukur jarak suatu objek tanpa kontak langsung. Sensor ini bekerja dengan prinsip SONAR (Sound Navigation and Ranging), yaitu memancarkan gelombang ultrasonik 40 kHz dan mengukur waktu pantul (echo) dari objek untuk menentukan jarak. Sensor ini banyak digunakan pada robotika, sistem otomatisasi, pengukur ketinggian air, dan sistem deteksi banjir.
Prinsip Kerja
- Mikrokontroler mengirim pulsa 10 μs ke pin TRIG.
- HC-SR04 memancarkan 8 gelombang ultrasonik dengan frekuensi 40 kHz.
- Gelombang dipantulkan oleh objek dan diterima kembali oleh sensor.
- Pin ECHO menghasilkan pulsa dengan durasi sesuai waktu tempuh gelombang.
- Jarak dihitung berdasarkan waktu pantul gelombang suara.
Grafik tersebut bersifat linier, karena semakin jauh objek dari sensor maka semakin lama waktu yang dibutuhkan gelombang ultrasonik untuk kembali ke penerima. Pada kondisi ideal, rentang pengukuran HC-SR04 adalah sekitar 2 cm hingga 400 cm dengan akurasi hingga sekitar ±3 mm.
e.Soil Moisture Sensor (SOIL) 1
Soil Moisture Sensor adalah sensor yang digunakan untuk mengukur tingkat kelembapan tanah berdasarkan konduktivitas listrik antara dua probe yang ditancapkan ke dalam tanah. Sensor ini banyak digunakan pada sistem irigasi otomatis, pertanian cerdas (smart farming), dan pemantauan kondisi tanah.
Prinsip Kerja
- Saat tanah kering, hambatan listrik tinggi sehingga nilai keluaran sensor menunjukkan kelembapan rendah.
- Saat tanah basah, kandungan air meningkatkan konduktivitas listrik sehingga sensor mendeteksi kelembapan yang lebih tinggi.
- Data kelembapan kemudian dikirim ke mikrokontroler, seperti STM32F103C8T6, untuk diproses.
Berikut contoh grafik respon Soil Moisture Sensor (SOIL2) yang menunjukkan hubungan antara kelembaban tanah (%) dan nilai ADC yang dibaca STM32. Pada sensor kelembaban tanah resistif, nilai ADC biasanya menurun saat tanah semakin basah dan meningkat saat tanah semakin kering.
Grafik Respon Soil Moisture Sensor (SOIL2)
f. LCD 16x2 LM016L
LCD 16x2 LM016L adalah modul Liquid Crystal Display (LCD) yang mampu menampilkan 16 karakter pada 2 baris, sehingga total dapat menampilkan 32 karakter. LCD ini sering digunakan pada sistem mikrokontroler seperti STM32, Arduino, dan ESP32 untuk menampilkan data sensor, status sistem, menu, atau informasi lainnya.
Prinsip Kerja
LCD LM016L menerima data dari mikrokontroler melalui pin data dan pin kontrol. Data yang diterima kemudian ditampilkan dalam bentuk karakter, angka, atau simbol pada layar LCD.
g. Buzzer (BUZ1)
Buzzer adalah komponen elektronika yang berfungsi sebagai alat keluaran (output) suara untuk menghasilkan bunyi atau alarm. Buzzer sering digunakan sebagai indikator peringatan, notifikasi, atau penanda kondisi tertentu pada suatu sistem elektronik yang dikendalikan oleh mikrokontroler seperti STM32, Arduino, dan ESP32.
Prinsip Kerja
Buzzer bekerja dengan mengubah energi listrik menjadi energi suara. Ketika mikrokontroler memberikan tegangan atau sinyal PWM ke buzzer, diafragma di dalam buzzer akan bergetar dan menghasilkan bunyi.
Jenis Buzzer
- Active Buzzer
- Memiliki osilator internal.
- Cukup diberi tegangan untuk menghasilkan bunyi.
- Lebih mudah digunakan.
- Passive Buzzer
- Tidak memiliki osilator internal.
- Memerlukan sinyal PWM dari mikrokontroler untuk menghasilkan bunyi.
- Dapat menghasilkan berbagai nada atau frekuensi.
- Memiliki osilator internal.
- Cukup diberi tegangan untuk menghasilkan bunyi.
- Lebih mudah digunakan.
- Tidak memiliki osilator internal.
- Memerlukan sinyal PWM dari mikrokontroler untuk menghasilkan bunyi.
- Dapat menghasilkan berbagai nada atau frekuensi.
Spesifikasi Singkat
- Tegangan kerja: 3,3 V – 5 V
- Konsumsi arus rendah
- Menghasilkan suara pada frekuensi tertentu
- Mudah dihubungkan ke pin digital mikrokontroler
h. Adaptor 5V
Adaptor 5V adalah perangkat eksternal yang berfungsi sebagai Catu Daya (Power Supply). Tugas utamanya adalah mengubah tegangan listrik AC (arus bolak-balik) dari stopkontak dinding menjadi tegangan DC (arus searah) yang stabil, biasanya sebesar 5 Volt, untuk mengoperasikan perangkat elektronik.
i. Resistor
Resistor adalah salah satu komponen pasif paling mendasar dan umum dalam rangkaian elektronik. Komponen ini dirancang untuk menghambat atau membatasi aliran arus listrik (current) dan sekaligus menurunkan tegangan listrik (
5. Percobaan [kembali]
a) Prosedur [kembali]
- Buka Proteus
- Siapkan semua komponen rangkaian yang diperlukan
- Rangkai komponen sehingga menjadi sebuah rangkaian
- Lakukan simulasi rangkaian pada proteus
b) Hardware [kembali]
c) Rangkaian simulasi dan Prinsip Kerja [kembali]
listing program :
*/
/* ===================== PIN OUTPUT ===================== */
#define BUZZER_PORT GPIOB
#define BUZZER_PIN GPIO_PIN_0
/* ===================== PIN LCD ===================== */
#define LCD_RS_PORT GPIOB
#define LCD_RS_PIN GPIO_PIN_10
#define LCD_E_PORT GPIOB
#define LCD_E_PIN GPIO_PIN_11
#define LCD_D4_PORT GPIOB
#define LCD_D4_PIN GPIO_PIN_12
#define LCD_D5_PORT GPIOB
#define LCD_D5_PIN GPIO_PIN_13
#define LCD_D6_PORT GPIOB
#define LCD_D6_PIN GPIO_PIN_14
#define LCD_D7_PORT GPIOB
#define LCD_D7_PIN GPIO_PIN_15
/* ===================== SETTING SISTEM ===================== */
/*
Logika ultrasonik:
- Jarak makin kecil = air makin tinggi = bahaya
- Jarak makin besar = air makin rendah = aman
Jika jarak <= 150 cm, buzzer ON.
Jika jarak > 150 cm, buzzer OFF.
*/
#define WATER_LIMIT_CM 400
#define MAX_DISTANCE_CM 900
/* Batas kelembapan tanah */
#define SOIL_LIMIT_PERCENT 60
/* Servo */
#define SERVO_OPEN_US 1000
#define SERVO_CLOSE_US 2000
/* Logic sensor */
#define RAIN_ACTIVE_STATE GPIO_PIN_SET
/*
1 = nilai persen soil makin besar berarti makin basah.
Jika di Proteus ternyata kebalik, ubah menjadi 0.
*/
#define SOIL_WET_WHEN_PERCENT_GREATER 1
/*
1 = buzzer aktif saat PB0 HIGH.
Kalau buzzer kamu aktif saat LOW, ubah menjadi 0.
*/
#define BUZZER_ACTIVE_HIGH 1
/* ===================== PROTOTYPE ===================== */
void SystemClock_Config(void);
void delay_us(uint16_t us);
uint32_t HCSR04_ReadDistanceCM(void);
uint32_t Soil_ReadADC(void);
uint8_t Soil_ADC_ToPercent(uint32_t adc_value);
void Servo_WriteUs(uint16_t pulse_us);
void Buzzer_On(void);
void Buzzer_Off(void);
void LCD_Enable(void);
void LCD_Send_4bit(uint8_t data);
void LCD_Send_Cmd(uint8_t cmd);
void LCD_Send_Data(uint8_t data);
void LCD_Init(void);
void LCD_Clear(void);
void LCD_Set_Cursor(uint8_t row, uint8_t col);
void LCD_Send_String(char *str);
void LCD_Print_Line(uint8_t row, char *text);
/* ===================== MAIN PROGRAM ===================== */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
MX_TIM3_Init();
MX_ADC1_Init();
HAL_TIM_Base_Start(&htim2);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
HAL_ADCEx_Calibration_Start(&hadc1);
Buzzer_Off();
Servo_WriteUs(SERVO_OPEN_US);
LCD_Init();
LCD_Clear();
LCD_Print_Line(0, "SISTEM IRIGASI");
LCD_Print_Line(1, "START...");
HAL_Delay(1000);
LCD_Clear();
while (1)
{
uint8_t rain_active = 0;
uint8_t ultrasonic_active = 0;
uint8_t soil_active = 0;
uint8_t status_bahaya = 0;
uint32_t distance_cm = 0;
uint32_t soil_adc = 0;
uint8_t soil_percent = 0;
char line1[17];
char line2[17];
/* ===================== BACA SENSOR ===================== */
rain_active = (HAL_GPIO_ReadPin(RAIN_PORT, RAIN_PIN) == RAIN_ACTIVE_STATE);
distance_cm = HCSR04_ReadDistanceCM();
soil_adc = Soil_ReadADC();
soil_percent = Soil_ADC_ToPercent(soil_adc);
/* ===================== VALIDASI JARAK ===================== */
if (distance_cm > MAX_DISTANCE_CM)
{
distance_cm = 999;
}
/* ===================== LOGIKA ULTRASONIK ===================== */
/*
Jarak dekat <= WATER_LIMIT_CM : air tinggi, buzzer ON
Jarak jauh > WATER_LIMIT_CM : air rendah, buzzer OFF
Error 999 dianggap tidak bahaya.
*/
if ((distance_cm != 999) && (distance_cm > 0) && (distance_cm <= WATER_LIMIT_CM))
{
ultrasonic_active = 1;
}
else
{
ultrasonic_active = 0;
}
/* ===================== LOGIKA SOIL MOISTURE ===================== */
#if SOIL_WET_WHEN_PERCENT_GREATER
if (soil_percent >= SOIL_LIMIT_PERCENT)
{
soil_active = 1;
}
else
{
soil_active = 0;
}
#else
if (soil_percent <= SOIL_LIMIT_PERCENT)
{
soil_active = 1;
}
else
{
soil_active = 0;
}
#endif
/* ===================== STATUS SISTEM ===================== */
if (ultrasonic_active || soil_active)
{
status_bahaya = 1;
}
else
{
status_bahaya = 0;
}
/* ===================== OUTPUT BUZZER ===================== */
/*
Buzzer hanya ON jika ultrasonik membaca air tinggi.
*/
if (ultrasonic_active)
{
Buzzer_On();
}
else
{
Buzzer_Off();
}
/* ===================== OUTPUT SERVO ===================== */
/*
Servo menutup jika tanah terlalu basah.
*/
if (soil_active)
{
Servo_WriteUs(SERVO_CLOSE_US);
}
else
{
Servo_WriteUs(SERVO_OPEN_US);
}
/* ===================== TAMPILAN LCD ===================== */
if (status_bahaya)
{
snprintf(line1, sizeof(line1), "STATUS: BAHAYA");
}
else if (rain_active)
{
snprintf(line1, sizeof(line1), "STATUS: SIAGA");
}
else
{
snprintf(line1, sizeof(line1), "STATUS: AMAN");
}
if (distance_cm == 999)
{
snprintf(line2, sizeof(line2), "A:ERR K:%3d%%", soil_percent);
}
else
{
snprintf(line2, sizeof(line2), "A:%03lu K:%3d%%", distance_cm, soil_percent);
}
LCD_Print_Line(0, line1);
LCD_Print_Line(1, line2);
HAL_Delay(150);
}
}
/* ===================== DELAY MICROSECOND ===================== */
void delay_us(uint16_t us)
{
__HAL_TIM_SET_COUNTER(&htim2, 0);
while (__HAL_TIM_GET_COUNTER(&htim2) < us);
}
/* ===================== BACA JARAK ULTRASONIK ===================== */
uint32_t HCSR04_ReadDistanceCM(void)
{
uint32_t time_us;
uint32_t timeout;
HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET);
delay_us(2);
HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_SET);
delay_us(10);
HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET);
timeout = HAL_GetTick();
while (HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_RESET)
{
if ((HAL_GetTick() - timeout) > 60)
{
return 999;
}
}
__HAL_TIM_SET_COUNTER(&htim2, 0);
timeout = HAL_GetTick();
while (HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_SET)
{
if ((HAL_GetTick() - timeout) > 60)
{
return 999;
}
}
time_us = __HAL_TIM_GET_COUNTER(&htim2);
if (time_us < 100)
{
return 999;
}
return time_us / 58;
}
/* ===================== BACA ADC SOIL MOISTURE ===================== */
uint32_t Soil_ReadADC(void)
{
uint32_t value = 0;
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
{
value = HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
return value;
}
/* ===================== KONVERSI ADC KE PERSEN ===================== */
uint8_t Soil_ADC_ToPercent(uint32_t adc_value)
{
uint32_t percent;
if (adc_value > 4095)
{
adc_value = 4095;
}
percent = (adc_value * 100) / 4095;
return (uint8_t)percent;
}
/* ===================== SERVO ===================== */
void Servo_WriteUs(uint16_t pulse_us)
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pulse_us);
}
/* ===================== BUZZER ===================== */
void Buzzer_On(void)
{
#if BUZZER_ACTIVE_HIGH
HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_SET);
#else
HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_RESET);
#endif
}
void Buzzer_Off(void)
{
#if BUZZER_ACTIVE_HIGH
HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_RESET);
#else
HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_SET);
#endif
}
/* ===================== LCD 16x2 MODE 4-BIT ===================== */
void LCD_Enable(void)
{
HAL_GPIO_WritePin(LCD_E_PORT, LCD_E_PIN, GPIO_PIN_SET);
delay_us(1);
HAL_GPIO_WritePin(LCD_E_PORT, LCD_E_PIN, GPIO_PIN_RESET);
delay_us(50);
}
void LCD_Send_4bit(uint8_t data)
{
HAL_GPIO_WritePin(LCD_D4_PORT, LCD_D4_PIN, (data & 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_D5_PORT, LCD_D5_PIN, (data & 0x02) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_D6_PORT, LCD_D6_PIN, (data & 0x04) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_D7_PORT, LCD_D7_PIN, (data & 0x08) ? GPIO_PIN_SET : GPIO_PIN_RESET);
LCD_Enable();
}
void LCD_Send_Cmd(uint8_t cmd)
{
HAL_GPIO_WritePin(LCD_RS_PORT, LCD_RS_PIN, GPIO_PIN_RESET);
LCD_Send_4bit(cmd >> 4);
LCD_Send_4bit(cmd & 0x0F);
HAL_Delay(2);
}
void LCD_Send_Data(uint8_t data)
{
HAL_GPIO_WritePin(LCD_RS_PORT, LCD_RS_PIN, GPIO_PIN_SET);
LCD_Send_4bit(data >> 4);
LCD_Send_4bit(data & 0x0F);
HAL_Delay(1);
}
void LCD_Init(void)
{
HAL_Delay(50);
HAL_GPIO_WritePin(LCD_RS_PORT, LCD_RS_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_E_PORT, LCD_E_PIN, GPIO_PIN_RESET);
LCD_Send_4bit(0x03);
HAL_Delay(5);
LCD_Send_4bit(0x03);
HAL_Delay(5);
LCD_Send_4bit(0x03);
HAL_Delay(1);
LCD_Send_4bit(0x02);
LCD_Send_Cmd(0x28);
LCD_Send_Cmd(0x0C);
LCD_Send_Cmd(0x06);
LCD_Send_Cmd(0x01);
HAL_Delay(2);
}
void LCD_Clear(void)
{
LCD_Send_Cmd(0x01);
HAL_Delay(2);
}
void LCD_Set_Cursor(uint8_t row, uint8_t col)
{
uint8_t address;
if (row == 0)
{
address = 0x80 + col;
}
else
{
address = 0xC0 + col;
}
LCD_Send_Cmd(address);
}
void LCD_Send_String(char *str)
{
while (*str)
{
LCD_Send_Data(*str++);
}
}
void LCD_Print_Line(uint8_t row, char *text)
{
uint8_t i;
LCD_Set_Cursor(row, 0);
for (i = 0; i < 16; i++)
{
if (text[i] != '\0')
{
LCD_Send_Data(text[i]);
}
else
{
LCD_Send_Data(' ');
}
}
}
/* ===================== CLOCK 64 MHz ===================== */
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_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |
RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_PCLK1 |
RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
}
/* ===================== ERROR HANDLER ===================== */
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif
Prinsip kerja :
d) Flowchart [kembali]
e) Video Demo [kembali]
f) Download File [kembali]
- Rangkaian Proteus disini
- Simulasi Rangkaian disini



Komentar
Posting Komentar