Percobaan 2 kondisi 1
(Led RGB, Motor Stepper, & Soil Moisture)
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.
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.5. Selesai.
Hardware :
- Mikrokontroler STM32F103C8
- Sensor Soil Moisture
- LED RGB
- Rangkaian sebelum di running
- Prinsip Kerja
1. Sensor Kelembaban Tanah (Soil Moisture Sensor)
Berfungsi untuk mengukur tinggat kelembaban tanah, dengan output berupa tegangan analok yang bervariasi tergantung kadar air dalam tanah. Semakin basah tanah, semakin rendah nilai ADC karena konduktivitas tinggi berlaku sebaliknya.
2. Mikrokontroler STM32
Berfungsi untuk membaca nilai ADC dari sensor kelembaban tanah dan mengendalikan LED indikator serta motor stepper. Kemudian nilai dari sensor dibaca menggunakan pin ADC1 Channel 0.3. Motor Stepper
Terkoneksi ke GPIOB pin 8–11, Dimana dikendalikan menggunakan urutan langkah STEP_SEQ_CW untuk rotasi searah jarum jam. Hanya akan aktif bila kembaban tanah tinggi.4. Fungsi Utama dalam Program
RunStepper() digunakan untuk mengaktifkan motor satu langkah per siklus dengan delay yang ditentukan.
MX_GPIO_Init() dan MX_ADC1_Init() untuk inisialisasi pin dan ADC
- Flowchart
- Listing Program
#include "stm32f1xx_hal.h"
// Konfigurasi Hardware
#define STEPPER_PORT GPIOB
#define IN1_PIN GPIO_PIN_8
#define IN2_PIN GPIO_PIN_9
#define IN3_PIN GPIO_PIN_10
#define IN4_PIN GPIO_PIN_11
#define LED_RED_PIN GPIO_PIN_12 // Menyala saat tanah basah
#define LED_GREEN_PIN GPIO_PIN_13 // Mati saat tanah basah
#define LED_BLUE_PIN GPIO_PIN_14 // Tidak digunakan
#define LED_PORT GPIOB
const uint16_t STEP_SEQ_CW[4] = {0x0100, 0x0200, 0x0400, 0x0800}; // Clockwise
ADC_HandleTypeDef hadc1;
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void RunStepper(const uint16_t *sequence, uint8_t speed);
void Error_Handler(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
while (1) {
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
uint16_t adc_val = HAL_ADC_GetValue(&hadc1);
// Asumsikan nilai < 1500 berarti tanah basah
if (adc_val < 1500) {
// Tanah basah - jalankan motor CW
HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN, GPIO_PIN_SET); // Merah nyala
HAL_GPIO_WritePin(LED_PORT, LED_GREEN_PIN, GPIO_PIN_RESET); // Hijau mati
RunStepper(STEP_SEQ_CW, 10);
} else {
// Tanah kering - motor tidak jalan
HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN, GPIO_PIN_RESET); // Merah mati
HAL_GPIO_WritePin(LED_PORT, LED_GREEN_PIN, GPIO_PIN_SET); // Hijau nyala
HAL_Delay(200);
}
}
}
}
void RunStepper(const uint16_t *sequence, uint8_t speed) {
static uint8_t step = 0;
STEPPER_PORT->ODR = (STEPPER_PORT->ODR & 0x00FF) | sequence[step];
step = (step + 1) % 4;
HAL_Delay(speed);
}
void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
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_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {
Error_Handler();
}
}
void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
// Konfigurasi LED
GPIO_InitStruct.Pin = LED_RED_PIN | LED_GREEN_PIN | LED_BLUE_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
// Konfigurasi Stepper
GPIO_InitStruct.Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN;
HAL_GPIO_Init(STEPPER_PORT, &GPIO_InitStruct);
}
void MX_ADC1_Init(void) {
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK) {
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_0; // Sesuaikan dengan pin sensor
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
Error_Handler();
}
}
void Error_Handler(void) {
while (1) {}
}
Tidak ada komentar:
Posting Komentar