LA Modul 3



1. Prosedur [Kembali]

 Kontrol Greenhouse (SPI)

  1. Siapkan seluruh alat dan bahan yang diperlukan, meliputi dua buah STM32F103C8T6, sensor LDR, push button, LED, kipas DC, breadboard, dan kabel jumper.

  2. 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.

  3. Hubungkan LED pada pin PB0 STM32 Slave dan kipas DC (melalui relay atau driver) pada pin PB1 STM32 Slave.

  4. 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)
  5. Buka STM32CubeIDE dan buat dua project baru, masing-masing bernama Project_Master dan Project_Slave, dengan target mikrokontroler STM32F103C8T6.

  6. 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
  7. 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
  8. Setelah seluruh konfigurasi selesai, klik Generate Code pada masing-masing project untuk menghasilkan kode inisialisasi otomatis.

  9. Tambahkan listing program Master pada file main.c Project_Master, mencakup fungsi pembacaan ADC (Read_LDR()), logika penentuan nilai txData[0] dan txData[1], serta pemanggilan HAL_SPI_Transmit() di dalam loop utama.

  10. Tambahkan listing program Slave pada file main.c Project_Slave, mencakup pemanggilan HAL_SPI_Receive() dan logika pengendalian output LED serta kipas DC berdasarkan nilai rxData[] yang diterima.

  11. Compile kedua project dan pastikan tidak terdapat error. Upload firmware ke masing-masing STM32 menggunakan ST-Link yang telah terhubung.

  12. Nyalakan sistem dan amati kondisi awal. Pastikan komunikasi SPI berjalan dengan memeriksa respons output Slave terhadap kondisi sensor dan tombol pada Master.

  13. 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).

  14. Tekan push button pada Master dan amati apakah LED pada Slave menyala sebagai respons terhadap perintah manual tersebut.

  15. 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]


    




STM32F103C8




LDR Sensor







Kipas DC





Push Button


Resistor



Motor Driver


Adaptor


Breadboard






3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]



Sistem ini bekerja dengan memanfaatkan sensor LDR (Light Dependent Resistor) sebagai pendeteksi intensitas cahaya lingkungan di dalam greenhouse. Perubahan kondisi pencahayaan — misalnya saat cuaca mendung atau memasuki malam hari — akan menyebabkan nilai resistansi LDR meningkat, sehingga tegangan keluarannya berubah dan dibaca melalui kanal ADC pada STM32F103C8T6 yang berperan sebagai Master. STM32 Master kemudian mengolah data hasil konversi ADC tersebut untuk menentukan status kondisi cahaya di dalam greenhouse. Apabila nilai ADC yang terbaca berada di bawah ambang batas yang telah ditetapkan, yang mengindikasikan kondisi lingkungan sedang gelap atau kekurangan cahaya, Master akan mengirimkan data perintah ke STM32 Slave melalui jalur komunikasi SPI. 

STM32 Slave menerima perintah tersebut dan segera mengaktifkan pin output yang terhubung ke kipas DC, sehingga sistem ventilasi atau sirkulasi udara pada greenhouse dapat bekerja secara otomatis guna menjaga kondisi lingkungan tanaman tetap optimal. Sebaliknya, apabila intensitas cahaya yang diterima sensor LDR berada di atas ambang batas — menandakan kondisi terang atau siang hari — Master akan mengirimkan data perintah untuk menonaktifkan kipas, sehingga konsumsi daya dapat ditekan dan sistem tidak bekerja secara berlebihan. Selain respons otomatis berbasis sensor, operator juga dapat memberikan perintah manual melalui push button yang terhubung ke Master, yang hasilnya turut dikemas dalam paket data SPI dan dikirimkan ke Slave untuk mengaktifkan LED sebagai indikator status sistem. Seluruh proses pembacaan sensor, pengolahan data, pengiriman via SPI, hingga aktuasi output berlangsung secara terus-menerus dalam loop utama, sehingga sistem mampu merespons perubahan kondisi lingkungan greenhouse secara real-time dan otomatis.

4. Flowchart dan Listing Program[Kembali]

Master





Slave





LISTING PROGRAM


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

}

5. Video Demo [Kembali]


























7. Download File [Kembali]

   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