LA Modul 3
Kontrol Greenhouse (SPI)
-
Siapkan seluruh alat dan bahan yang diperlukan, meliputi dua buah STM32F103C8T6, sensor LDR, push button, LED, kipas DC, breadboard, dan kabel jumper.
-
Rangkai sensor LDR pada breadboard dan hubungkan keluaran tegangan sensor ke pin ADC Channel 9 (PB1) pada STM32 Master. Pasang push button pada pin PB0 Master dengan konfigurasi pull-up.
-
Hubungkan LED pada pin PB0 STM32 Slave dan kipas DC (melalui relay atau driver) pada pin PB1 STM32 Slave.
-
Hubungkan jalur komunikasi SPI antara STM32 Master dan STM32 Slave sesuai tabel berikut:
- PA5 (SCK) Master → PA5 (SCK) Slave
- PA7 (MOSI) Master → PA7 (MOSI) Slave
- PA6 (MISO) Master → PA6 (MISO) Slave
- PA4 (NSS) Master → PA4 (NSS) Slave
- GND Master → GND Slave (ground bersama)
-
Buka STM32CubeIDE dan buat dua project baru, masing-masing bernama Project_Master dan Project_Slave, dengan target mikrokontroler STM32F103C8T6.
-
Pada Project_Master, lakukan konfigurasi STM32CubeMX sebagai berikut:
- Atur pin PB0 sebagai GPIO Input dengan konfigurasi Pull-up
- Aktifkan ADC1 pada Channel 9
- Aktifkan SPI1 dengan mode Full Duplex Master dan Hardware NSS Signal: Output
-
Pada Project_Slave, lakukan konfigurasi STM32CubeMX sebagai berikut:
- Atur pin PB0 sebagai GPIO Output dengan level awal High
- Atur pin PB1 sebagai GPIO Output dengan level awal High
- Aktifkan SPI1 dengan mode Full Duplex Slave dan Hardware NSS Signal: Input
-
Setelah seluruh konfigurasi selesai, klik Generate Code pada masing-masing project untuk menghasilkan kode inisialisasi otomatis.
-
Tambahkan listing program Master pada file
main.cProject_Master, mencakup fungsi pembacaan ADC (Read_LDR()), logika penentuan nilaitxData[0]dantxData[1], serta pemanggilanHAL_SPI_Transmit()di dalam loop utama. -
Tambahkan listing program Slave pada file
main.cProject_Slave, mencakup pemanggilanHAL_SPI_Receive()dan logika pengendalian output LED serta kipas DC berdasarkan nilairxData[]yang diterima. -
Compile kedua project dan pastikan tidak terdapat error. Upload firmware ke masing-masing STM32 menggunakan ST-Link yang telah terhubung.
-
Nyalakan sistem dan amati kondisi awal. Pastikan komunikasi SPI berjalan dengan memeriksa respons output Slave terhadap kondisi sensor dan tombol pada Master.
-
Lakukan pengujian dengan cara menghalangi atau memaparkan cahaya pada sensor LDR, lalu amati apakah kipas DC merespons sesuai logika program (menyala saat gelap/nilai ADC < 1500, mati saat terang).
-
Tekan push button pada Master dan amati apakah LED pada Slave menyala sebagai respons terhadap perintah manual tersebut.
-
Catat seluruh hasil pengamatan, termasuk nilai ADC yang terbaca, kondisi output, dan ada tidaknya error komunikasi selama percobaan berlangsung.
2. Hardware dan Diagram Blok[Kembali]
3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]
4. Flowchart dan Listing Program[Kembali]
MASTER
#include "main.h"
ADC_HandleTypeDef hadc1;
SPI_HandleTypeDef hspi1;
uint8_t txData[2];
uint32_t ldrValue;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_SPI1_Init(void);
/*=========================================================*/
uint32_t Read_LDR(void)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,100);
return HAL_ADC_GetValue(&hadc1);
}
/*=========================================================*/
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_SPI1_Init();
while (1)
{
ldrValue = Read_LDR();
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)
txData[0] = 1;
else
txData[0] = 0;
if(ldrValue < 1500)
txData[1] = 1;
else
txData[1] = 0;
HAL_SPI_Transmit(&hspi1, txData, 2, 100);
HAL_Delay(200);
}
}
/*=========================================================*/
void SystemClock_Config(void)
{ }
/*=========================================================*/
static 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_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/*=========================================================*/
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_9;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
/*=========================================================*/
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
HAL_SPI_Init(&hspi1);
}
SLAVE
#include "main.h"
SPI_HandleTypeDef hspi1;
uint8_t rxData[2];
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
/*=========================================================*/
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();
while (1)
{
HAL_SPI_Receive(&hspi1, rxData, 2, HAL_MAX_DELAY);
if(rxData[0]==1)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
if(rxData[1]==1)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
}
}
/*=========================================================*/
void SystemClock_Config(void)
{ }
/*=========================================================*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1,
GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/*=========================================================*/
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_SLAVE;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_HARD_INPUT;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
HAL_SPI_Init(&hspi1);
}
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