Laporan Akhir 1


Percobaan 7

UART & I2C (STM – Pi Pico)

1. Prosedur [Kembali]

  • Rangkai semua komponen 
  • Buat program di STM32 CubeIDE dan ThonnyIDE
  • Jalankan program dan cobakan sesuai kondisi

Hardware :

  • STM32



  • Raspberry Pi Pico

  • LCD 2 × 16

  • Resistor

  • Push Button




Diagram Blok


  • Rangkaian
  • Prinsip Kerja

Sistem ini dirancang untuk mendeteksi penekanan tombol pada board STM32 dan mengirimkan informasi melalui komunikasi UART ke Raspberry Pi Pico, yang kemudian menampilkan informasi warna tombol yang ditekan pada LCD 16x2 berbasis I2C. Pada sisi STM32, terdapat tiga buah tombol yang terhubung ke pin PB12, PB13, dan PB14 yang masing-masing dikonfigurasi sebagai input dengan internal pull-up resistor. Ketika salah satu tombol ditekan, logika pin akan berubah dari HIGH menjadi LOW karena tersambung ke ground. STM32 mendeteksi perubahan ini di dalam loop utama program.

Ketika PB12 ditekan, STM32 akan mengirimkan string “MERAH” melalui UART1 dengan baudrate 9600, menggunakan fungsi HAL_UART_Transmit. Demikian pula, jika PB13 ditekan, maka string “HIJAU” dikirimkan, dan jika PB14 ditekan, maka string “BIRU” yang dikirim. Setelah mengirim data, program memberikan delay 300 ms untuk menghindari bouncing tombol, dan kemudian menunggu tombol dilepas sebelum kembali memeriksa kondisi lainnya. UART1 dikonfigurasikan menggunakan pin PA9 sebagai TX dan PA10 sebagai RX.

Pada sisi penerima, Raspberry Pi Pico menerima data serial melalui UART0 dengan konfigurasi pin GPIO0 sebagai TX dan GPIO1 sebagai RX. Data yang diterima akan dibaca dalam loop utama menggunakan fungsi uart.readline(). Data ini kemudian diproses oleh fungsi process_uart_data(data) yang akan mendekode isi pesan dan menampilkan hasilnya pada LCD I2C. Jika data yang diterima adalah "MERAH", maka LCD akan menampilkan tulisan "Warna: Merah". Begitu pula untuk data “HIJAU” dan “BIRU”. Jika data yang diterima bukan salah satu dari ketiga itu, maka LCD tetap akan menampilkan data tersebut secara langsung.

LCD yang digunakan pada Raspberry Pi Pico menggunakan protokol I2C, terhubung pada pin SCL (GPIO5) dan SDA (GPIO4) dengan alamat default 0x27. Setelah inisialisasi, LCD akan menampilkan “Menunggu input...” sebagai indikator awal bahwa sistem siap menerima perintah. Ketika data dari STM32 masuk, layar akan diperbarui untuk menampilkan warna sesuai tombol yang ditekan di sisi pengirim.

  • Flowchart
  • Listing Program
STM32
#include "main.h"
#include <string.h>

// Inisialisasi UART
UART_HandleTypeDef huart1;

// Deklarasi fungsi
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_USART1_UART_Init(void);

// Fungsi kirim data UART
void send_uart(char *text) {
    HAL_UART_Transmit(&huart1, (uint8_t *)text, strlen(text), HAL_MAX_DELAY);
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();

    while (1) {
        if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_RESET) {
            send_uart("MERAH\r\n");
            HAL_Delay(300);
            while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_RESET);
        }
        else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13) == GPIO_PIN_RESET) {
            send_uart("HIJAU\r\n");
            HAL_Delay(300);
            while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13) == GPIO_PIN_RESET);
        }
        else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14) == GPIO_PIN_RESET) {
            send_uart("BIRU\r\n");
            HAL_Delay(300);
            while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14) == GPIO_PIN_RESET);
        }
    }
}

// Konfigurasi clock STM32F103
void SystemClock_Config(void) {
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    __HAL_RCC_AFIO_CLK_ENABLE();
    __HAL_RCC_PWR_CLK_ENABLE();
    __HAL_AFIO_REMAP_SWJ_NOJTAG();  // Bebaskan PB3 dan PB4

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
    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_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}

// Konfigurasi USART1 (TX: PA9, RX: PA10)
void MX_USART1_UART_Init(void) {
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 9600;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;

    HAL_UART_Init(&huart1);
}

// Inisialisasi GPIO PB12, PB13, PB14 sebagai input pull-up
void MX_GPIO_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

Raspberry Pi Pico 

from machine import I2C, Pin, UART
import utime
from pico_i2c_lcd import I2cLcd

# Inisialisasi UART0 (TX: GP0, RX: GP1)
uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))

# Inisialisasi LCD I2C (SCL: GP5, SDA: GP4)
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)
I2C_ADDR = 0x27  # Alamat I2C LCD
lcd = I2cLcd(i2c, I2C_ADDR, 2, 16)

# Bersihkan dan tampilkan pesan awal
utime.sleep_ms(100)
lcd.clear()
lcd.putstr("Menunggu input...")

# Fungsi proses data UART
def process_uart_data(data):
    try:
        decoded = data.decode('utf-8').strip()
        lcd.clear()
        if decoded == "MERAH":
            lcd.putstr("Warna: Merah")
        elif decoded == "HIJAU":
            lcd.putstr("Warna: Hijau")
        elif decoded == "BIRU":
            lcd.putstr("Warna: Biru")
        else:
            lcd.putstr(f"Data: {decoded}")
    except Exception as e:
        lcd.clear()
        lcd.putstr(f"Error: {str(e)}")

# Loop utama
while True:
    if uart.any():
        data = uart.readline()
        if data:
            process_uart_data(data)
    utime.sleep_ms(100)  # Hindari beban CPU berlebih

5. Video Demo [Kembali]

6. Analisa [Kembali]



HTML [Download]
Rangkaian [Download
Video Simulasi [Download 
Listring Program [Download 


Tidak ada komentar:

Posting Komentar

   BAHAN PRESENTASI UNTUK MATA KULIAH  ELEKTRONIKA 2023 Nama : Hadi Andhika Jafta NIM : 2210951009 Dosen Pengampu : Dr. Darwison, MT...