Rangkaian ini terdiri dari STM32 yang terhubung ke tiga push button, Raspberry Pi Pico, dan LCD 16x2 I2C. STM32 digunakan untuk membaca input dari tombol dan mengirimkan data melalui komunikasi UART ke Raspberry Pi Pico. Pico kemudian menampilkan data tersebut ke LCD menggunakan komunikasi I2C. Tegangan 3.3V dan GND dibagikan ke seluruh komponen agar sistem dapat berjalan. Saat tombol ditekan, STM32 mengirimkan teks seperti “MERAH”, “HIJAU”, atau “BIRU” ke Pico, lalu Pico menampilkannya di layar LCD.
- Raspberry Pi Pico untuk menerima data dari STM32 dan menampilkannya ke LCD
Rangkaian ini bekerja dengan cara membaca input dari tombol menggunakan STM32. Ketika salah satu tombol ditekan, STM32 akan mengirimkan data berupa teks melalui komunikasi UART ke Raspberry Pi Pico. Pico kemudian menerima data tersebut dan mengolahnya. Setelah itu, Pico akan menampilkan informasi yang diterima ke LCD 16x2 menggunakan komunikasi I2C. Semua komponen mendapatkan suplai daya dari jalur yang sama, dan komunikasi antar mikrokontroler dilakukan secara serial.
#include "main.h"
#include <string.h>
UART_HandleTypeDef huart1;
// Fungsi prototipe
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_USART1_UART_Init(void);
// Fungsi kirim 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 standar STM32F1
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-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);
}
// Inisialisasi UART1 (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();
// Konfigurasi
input tombol dengan Pull-Up
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 UART
uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
# Inisialisasi LCD I2C
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)
I2C_ADDR = 0x27 #
Ganti dengan alamat LCD Anda
I2C_NUM_ROWS = 2
I2C_NUM_COLS = 16
lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)
# Tunggu LCD siap
utime.sleep_ms(100)
lcd.clear()
lcd.putstr("Menunggu input...")
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)}")
while True:
if uart.any():
data = uart.readline()
if data:
process_uart_data(data)
utime.sleep_ms(100) #
Beri sedikit jeda
File HTML [disini]
Datasheet Raspberry Pi Pico [disini]
Listing Program [disini]
Video [disini]
Datasheet STM32F103C8 [disini]
Datasheet LCD I2C 16x2 [disini]
0 comments:
Posting Komentar