Laporan Akhir
MODUL 3 PERCOBAAN 1
- Siapkan alat dan bahan seperti, STM32 Bluepill, PIR Sensor, Sensor LDR, push button, LED, Fan, resistor, breadboard, dan jumper.
- Rangkai komponen sesuai gambar rangkaian pada modul serta hubungkan komunikasi SPI antara 2 Bluepill.
- Buka STM32CubeIDE lalu buat project.
- Lakukan konfigurasi GPIO dan SPI sesuai pengaturan pada modul kemudian Generate Code.
- Masukkan listing program transmitter pada project Bluepill dan listing program receiver pada project Bluepill sesuai modul.
- Hubungkan kedua board STM32 ke laptop menggunakan kabel USB.
- Build dan Run program pada STM32CubeIDE.
- Uji LDR Sensor dan button dan amati kondisi fan dan LED apakah bekerja sesuai program.
2. Hardware dan Diagram Blok[Kembali]
Hardware
STM32 F103C8T6
Sensor LDR
Push button
LED
Fan
Jumper
Breadboard
Blok Diagram
3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]
Rangkaian Simulasi
Berdasarkan gambar rangkaian dan program di atas, sistem Kontrol Greenhouse bekerja dengan prinsip komunikasi SPI antara dua STM32F103C8T6 sebagai Master dan Slave. Pada sisi Master, sensor LDR dihubungkan ke pin ADC (Channel 9) untuk membaca intensitas cahaya lingkungan, dan push button dihubungkan ke pin PB0 dengan konfigurasi pull-up sebagai input manual. Program Master secara terus-menerus membaca nilai ADC dari sensor LDR menggunakan fungsi
Read_LDR(), kemudian membandingkan hasilnya dengan nilai threshold 1500, jika nilai ADC kurang dari 1500 yang berarti kondisi gelap maka txData[1] diisi nilai 1, dan jika push button ditekan (logika LOW) maka txData[0] diisi nilai 1. Kedua byte data tersebut kemudian dikirimkan ke Slave melalui jalur SPI (MOSI) menggunakan fungsi HAL_SPI_Transmit() setiap 200ms dengan konfigurasi Mode 0 (CPOL=LOW, CPHA=1Edge), MSB first, dan NSS Hard Output untuk mengaktifkan Slave secara otomatis. Pada sisi Slave, data diterima melalui fungsi HAL_SPI_Receive() dan diproses untuk mengontrol dua aktuator, yaitu jika rxData[1] = 1 maka LED pada pin PB0 dinyalakan sebagai respons terhadap kondisi gelap yang terdeteksi LDR, dan jika rxData[0] = 1 maka relay pada pin PB1 diaktifkan (logika LOW) untuk menghidupkan fan sebagai sistem ventilasi greenhouse yang dikendalikan oleh push button.4. Flowchart dan Listing Program[Kembali]
Flowchart
Listing Program
- Master
#include "main.h" // Memanggil file header utama STM32 HAL
ADC_HandleTypeDef hadc1; // Membuat handle untuk ADC1
SPI_HandleTypeDef hspi1; // Membuat handle untuk SPI1
uint8_t txData[2]; // Array untuk menyimpan data yang akan dikirim SPI
uint32_t ldrValue; // Variabel untuk menyimpan hasil pembacaan ADC LDR
// Prototype fungsi konfigurasi clock sistem
void SystemClock_Config(void);
// Prototype fungsi inisialisasi GPIO
static void MX_GPIO_Init(void);
// Prototype fungsi inisialisasi ADC1
static void MX_ADC1_Init(void);
// Prototype fungsi inisialisasi SPI1
static void MX_SPI1_Init(void);
/*=========================================================*/
// Fungsi membaca nilai ADC dari sensor LDR
uint32_t Read_LDR(void)
{
HAL_ADC_Start(&hadc1); // Memulai proses konversi ADC
HAL_ADC_PollForConversion(&hadc1,100); // Menunggu konversi selesai maksimal 100 ms
return HAL_ADC_GetValue(&hadc1); // Mengambil hasil ADC lalu mengembalikannya
}
/*=========================================================*/
// Fungsi utama program
int main(void)
{
HAL_Init(); // Inisialisasi HAL Library STM32
SystemClock_Config(); // Konfigurasi clock sistem
MX_GPIO_Init(); // Inisialisasi GPIO
MX_ADC1_Init(); // Inisialisasi ADC1
MX_SPI1_Init(); // Inisialisasi SPI1
while (1) // Perulangan utama program
{
ldrValue = Read_LDR(); // Membaca nilai LDR menggunakan ADC
// Membaca status tombol pada PB0
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)
txData[0] = 1; // Jika tombol ditekan maka kirim data 1
else
txData[0] = 0; // Jika tombol tidak ditekan maka kirim data 0
// Mengecek intensitas cahaya dari LDR
if(ldrValue < 1500)
txData[1] = 1; // Jika gelap maka kirim data 1
else
txData[1] = 0; // Jika terang maka kirim data 0
// Mengirim 2 byte data melalui SPI
HAL_SPI_Transmit(&hspi1, txData, 2, 100);
HAL_Delay(200); // Delay 200 ms
}
}
/*=========================================================*/
// Fungsi konfigurasi clock sistem
void SystemClock_Config(void)
{
// Kosong karena konfigurasi clock belum dibuat
}
/*=========================================================*/
// Fungsi inisialisasi GPIO
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; // Struktur konfigurasi GPIO
__HAL_RCC_GPIOA_CLK_ENABLE(); // Mengaktifkan clock GPIOA
__HAL_RCC_GPIOB_CLK_ENABLE(); // Mengaktifkan clock GPIOB
GPIO_InitStruct.Pin = GPIO_PIN_0; // Menggunakan pin PB0
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // Mode input
GPIO_InitStruct.Pull = GPIO_PULLUP; // Mengaktifkan pull-up internal
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // Inisialisasi PB0
}
/*=========================================================*/
// Fungsi inisialisasi ADC1
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0}; // Struktur konfigurasi channel ADC
hadc1.Instance = ADC1; // Menggunakan ADC1
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // Scan mode nonaktif
hadc1.Init.ContinuousConvMode = DISABLE; // Continuous mode nonaktif
hadc1.Init.DiscontinuousConvMode = DISABLE; // Discontinuous mode nonaktif
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // Trigger ADC dari software
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // Data rata kanan
hadc1.Init.NbrOfConversion = 1; // Jumlah konversi 1 channel
HAL_ADC_Init(&hadc1); // Inisialisasi ADC1
sConfig.Channel = ADC_CHANNEL_9; // Menggunakan channel ADC 9
sConfig.Rank = ADC_REGULAR_RANK_1; // Menjadi urutan konversi pertama
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5; // Waktu sampling ADC
HAL_ADC_ConfigChannel(&hadc1, &sConfig); // Konfigurasi channel ADC
}
/*=========================================================*/
// Fungsi inisialisasi SPI1
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1; // Menggunakan SPI1
hspi1.Init.Mode = SPI_MODE_MASTER; // SPI sebagai master
hspi1.Init.Direction = SPI_DIRECTION_2LINES; // Komunikasi full duplex
hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // Data SPI 8 bit
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // Clock idle low
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // Data dibaca pada rising edge pertama
hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT; // NSS diatur hardware output
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; // Prescaler clock SPI /16
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // Mengirim bit MSB terlebih dahulu
hspi1.Init.TIMode = SPI_TIMODE_DISABLE; // TI mode nonaktif
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; // CRC nonaktif
hspi1.Init.CRCPolynomial = 7; // Nilai polynomial CRC
HAL_SPI_Init(&hspi1); // Inisialisasi SPI1
}
- Slave
#include "main.h" // Memanggil file header utama STM32 HAL
SPI_HandleTypeDef hspi1; // Membuat handle untuk SPI1
uint8_t rxData[2]; // Array untuk menyimpan data yang diterima dari SPI
// Prototype fungsi konfigurasi clock sistem
void SystemClock_Config(void);
// Prototype fungsi inisialisasi GPIO
static void MX_GPIO_Init(void);
// Prototype fungsi inisialisasi SPI1
static void MX_SPI1_Init(void);
/*=========================================================*/
// Fungsi utama program
int main(void)
{
HAL_Init(); // Inisialisasi HAL Library STM32
SystemClock_Config(); // Konfigurasi clock sistem
MX_GPIO_Init(); // Inisialisasi GPIO
MX_SPI1_Init(); // Inisialisasi SPI1
while (1) // Perulangan utama program
{
// Menerima 2 byte data SPI dari master
HAL_SPI_Receive(&hspi1, rxData, 2, HAL_MAX_DELAY);
// Mengecek data pertama yang diterima
if(rxData[0]==1)
// Jika data = 1 maka LED/output PB0 menyala
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
else
// Jika data = 0 maka LED/output PB0 mati
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
// Mengecek data kedua yang diterima
if(rxData[1]==1)
// Jika data = 1 maka PB1 dibuat LOW
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
else
// Jika data = 0 maka PB1 dibuat HIGH
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
}
}
/*=========================================================*/
// Fungsi konfigurasi clock sistem
void SystemClock_Config(void)
{
// Kosong karena konfigurasi clock belum dibuat
}
/*=========================================================*/
// Fungsi inisialisasi GPIO
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; // Struktur konfigurasi GPIO
__HAL_RCC_GPIOA_CLK_ENABLE(); // Mengaktifkan clock GPIOA
__HAL_RCC_GPIOB_CLK_ENABLE(); // Mengaktifkan clock GPIOB
// Mengatur kondisi awal PB0 dan PB1 menjadi LOW
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET);
// Memilih pin PB0 dan PB1
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
// Mengatur mode output push-pull
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
// Tanpa pull-up atau pull-down
GPIO_InitStruct.Pull = GPIO_NOPULL;
// Kecepatan output rendah
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
// Inisialisasi GPIO PB0 dan PB1
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/*=========================================================*/
// Fungsi inisialisasi SPI1
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1; // Menggunakan SPI1
hspi1.Init.Mode = SPI_MODE_SLAVE; // SPI sebagai slave
hspi1.Init.Direction = SPI_DIRECTION_2LINES; // Komunikasi full duplex
hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // Ukuran data 8 bit
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // Clock idle LOW
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // Data dibaca pada rising edge pertama
hspi1.Init.NSS = SPI_NSS_HARD_INPUT; // NSS dikontrol hardware sebagai input
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // Mengirim dan menerima MSB terlebih dahulu
hspi1.Init.TIMode = SPI_TIMODE_DISABLE; // TI mode dinonaktifkan
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; // CRC dinonaktifkan
hspi1.Init.CRCPolynomial = 7; // Nilai polynomial CRC
HAL_SPI_Init(&hspi1); // Inisialisasi SPI1
}
Video Simulasi [tekan disini]
HTML [tekan disini]
Datasheet STM32F103C8T6 [tekan disini]
Datasheet LED [tekan disini]
Datasheet resistor [tekan disini]
Datasheet sensor LDR [tekan disini]
Datasheet fan [tekan disini]
Datasheet button [tekan disini]
Laporan Akhir [tekan disini]
Komentar
Posting Komentar