Tugas Pendahuluan 1 uP & uC : modul 2

 By: Rahmad Fajril Ilhami

2210951016



Percobaan 2 Kondisi 3

1. Kondisi [Kembali]

Buatlah rangkaian seperti gambar pada percobaan 2, buatlah ketika soil moisture sensor mendeteksi kelembapan tanah basah, LED RGB menampilkan warna Biru

2. Rangkaian Simulasi [Kembali]

Prosedur :
  1. Rangkai sesuai gambar percobaan dengan inputnya yaitu sensor Soil Moisture dan outputnya yaitu LED RGB dan Motor Stepper
  2. Buatlah program dengan konfigurasi pin input dan output berdasarkan pada pin GPIO STM32 yang telah dirangkai sebelumnya. Kemudian buatlah program untuk menghasilkan output LED RGB sesuai kondisi yang telah ditentukan
  3. Run simulation dan lihat perubahan ketika sensor soil moisture mendeteksi kelembapan basah
  4. Program selesai


Gambar Rangkaian Sebelum

   
Gambar Rangkaian Sesudah



Gambar 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

#define LED_GREEN_PIN GPIO_PIN_13

#define LED_BLUE_PIN GPIO_PIN_14

#define LED_PORT GPIOB

 

// Mode Stepper

const uint16_t STEP_SEQ_CW[4] = {0x0100, 0x0200, 0x0400, 0x0800}; // Clockwise

 

const uint16_t STEP_SEQ_CCW[4] = {0x0800, 0x0400, 0x0200, 0x0100};   // Counter Clockwise

 

ADC_HandleTypeDef hadc1;

uint8_t current_mode = 0; // 0=CW, 1=CCW, 2=Oscillate

uint8_t direction = 0;    // Untuk mode oscillate

 

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

// Baca potensiometer untuk pilih mode

HAL_ADC_Start(&hadc1);

if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {

 uint16_t adc_val = HAL_ADC_GetValue(&hadc1);

 

// Tentukan mode

if (adc_val < 1365) { // Mode 1: CW

current_mode = 0;

HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN, GPIO_PIN_SET);

HAL_GPIO_WritePin(LED_PORT, LED_GREEN_PIN|LED_BLUE_PIN, GPIO_PIN_RESET);

}

else if (adc_val < 2730) { // Mode 2: CCW

current_mode = 1;

HAL_GPIO_WritePin(LED_PORT, LED_GREEN_PIN, GPIO_PIN_SET);

HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN|LED_BLUE_PIN, GPIO_PIN_RESET);

 }

else { // Mode 3: Oscillate

current_mode = 2;

HAL_GPIO_WritePin(LED_PORT, LED_BLUE_PIN, GPIO_PIN_SET);

HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN|LED_GREEN_PIN,

GPIO_PIN_RESET);

 }

}

 

// Eksekusi mode

switch(current_mode) {

case 0: // CW

RunStepper(STEP_SEQ_CW, 10);

break;

case 1: // CCW

RunStepper(STEP_SEQ_CCW, 10);

break;

case 2: // Oscillate

if(direction == 0) {

RunStepper(STEP_SEQ_CW, 5);

if(STEPPER_PORT->ODR == (STEPPER_PORT->ODR & 0x00FF) | STEP_SEQ_CW[3])

direction = 1;

} else {

RunStepper(STEP_SEQ_CCW, 5);

if(STEPPER_PORT->ODR == (STEPPER_PORT->ODR & 0x00FF) | STEP_SEQ_CCW[3])

direction = 0;

}

break;

}

}

}

 

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;  // Tambahkan pull-down

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;  // High speed untuk stabil

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;

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

}



3. Video [Kembali]

Video 1. Rangkaian sederhana 


4. Prinsip Kerja [Kembali]

Rangkaian ini menggunakan sensor soil moisture untuk mendeteksi tingkat kelembapan tanah. Sensor ini terdiri dari dua probe logam yang dimasukkan ke dalam tanah untuk mengukur resistansi. Ketika tanah basah, resistansi antar probe menjadi rendah, sehingga nilai tegangan output (pada pin AO – analog output) meningkat. Tegangan ini kemudian dikirim ke pin ADC dari mikrokontroler STM32 untuk dibaca dan diinterpretasikan sebagai nilai kelembapan. Potensio (RV1) juga digunakan di rangkaian untuk menyetel sensitivitas pembacaan sensor.

Mikrokontroler STM32F103C8T6 memproses nilai analog yang dibaca dari sensor soil moisture melalui pin ADC. Berdasarkan pengolahan nilai ini, jika terdeteksi bahwa tanah dalam keadaan basah (yakni nilai ADC menunjukkan kelembapan tinggi), maka mikrokontroler akan memberikan sinyal digital ke kaki RGB LED untuk menyalakan warna biru sebagai indikator. Ini dikendalikan melalui tiga buah resistor (R1, R2, R3) yang masing-masing terhubung ke pin PWM untuk mengontrol intensitas warna merah, hijau, dan biru pada LED RGB.

LED RGB yang digunakan dalam rangkaian ini memiliki tiga kanal warna (merah, hijau, biru) dan dikendalikan oleh mikrokontroler melalui output digital. Dalam kondisi tanah basah, hanya kanal biru yang diaktifkan, sedangkan dua lainnya dimatikan (bernilai logika 0 atau duty cycle 0%), sehingga LED akan menyala dengan warna biru solid. Warna ini memberikan indikator visual bahwa kondisi tanah saat itu cukup lembap dan tidak memerlukan penyiraman tambahan.

Selain LED, terdapat pula rangkaian tambahan berupa driver ULN2003A yang biasanya digunakan untuk mengendalikan aktuator seperti motor atau pompa. Meskipun pada simulasi ini fokus utama adalah indikator LED, namun keberadaan ULN2003A memungkinkan pengembangan lebih lanjut, seperti mengaktifkan pompa penyiram otomatis jika tanah terlalu kering. Dengan kata lain, rangkaian ini merupakan dasar dari sistem otomatisasi irigasi berbasis sensor kelembapan tanah, yang dapat ditingkatkan untuk aplikasi pertanian cerdas (smart farming).

Penggunaan mikrokontroler STM32F103C8T6 dalam proyek ini memberikan keunggulan dari sisi performa dan fleksibilitas pemrograman. Mikrokontroler ini memiliki kemampuan ADC 12-bit yang cukup akurat untuk membaca variasi tegangan dari sensor soil moisture. Selain itu, jumlah pin I/O yang banyak memungkinkan integrasi dengan berbagai perangkat tambahan seperti LCD, modul komunikasi (Bluetooth, Wi-Fi), atau aktuator lainnya. Dengan pemrograman yang tepat, sistem ini dapat dikembangkan menjadi lebih kompleks, seperti menampilkan nilai kelembapan secara real-time, mengirim notifikasi ke smartphone, hingga mencatat histori kelembapan tanah untuk analisis pertanian presisi.

5. Link Download [Kembali]

  • Link Project [klik]
  • Download video simulasi [Klik]
  • Download Program Rangkaian [klik]

Komentar

Postingan populer dari blog ini

MATA KULIAH ELEKTRONIKA

PRATIKUM SISTEM DIGITAL

PRATIKUM MIKROKONTROLEL DAN MIKROPROSESOR