TP 2 M2 MIKRO



1. Kondisi[Kembali]

Buatlah rangkaian seperti gambar pada percobaan 2, buatlah ketika soil moisture sensor mendeteksi kelembapan tanah basah, Motor Stepper berputar secara Clockwise

2. Gambar Rangkaian Simulasi[Kembali]










3. Video Simulasi[Kembali]







4. Prinsip Kerja[Kembali]

  1. Deteksi Kelembapan:

    • Soil moisture sensor mengukur kelembapan tanah. Sensor ini memberikan output analog (A0) yang nilainya berubah tergantung kadar air di tanah.

    • Nilai ini dikirim ke mikrokontroler (STM32F103C8) melalui pin ADC (Analog to Digital Converter).

  2. Pemrosesan oleh Mikrokontroler:

    • Mikrokontroler membaca nilai dari sensor melalui pin ADC.

    • Mikrokontroler sudah diprogram untuk memiliki threshold (ambang batas) kelembapan tertentu. Misalnya, jika nilai ADC di bawah ambang (tanah basah), maka dianggap sebagai kondisi "tanah basah".

    • Setelah mendeteksi kondisi tanah basah, mikrokontroler akan mengirim sinyal kontrol secara berurutan ke ULN2003A untuk menggerakkan motor stepper.

  3. Pengendalian Motor Stepper:

    • ULN2003A menerima sinyal dari mikrokontroler pada input (1B, 2B, 3B, 4B) dan mengaktifkan output (1C, 2C, 3C, 4C) secara berurutan.

    • Motor stepper terhubung ke ULN2003A dan bergerak berdasarkan urutan aktivasi tersebut.

    • Urutan aktivasi yang diberikan oleh mikrokontroler memastikan motor berputar searah jarum jam (clockwise).

5. Flowchart dan Listing Program[Kembali]

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

}

6. Download [Kembali]

Rangkaian Simulasi [Download]

Video Simulasi [Download]

 














Komentar

Postingan populer dari blog ini

Modul 3

Modul 2 Praktikum Sistem Digital

Modul 4