Laporan Akhir

 


MODUL 3 PERCOBAAN 1


1. Prosedur[Kembali]

  1. Siapkan alat dan bahan seperti, STM32 Bluepill, PIR Sensor, Sensor LDR, push button, LED, Fan, resistor, breadboard, dan jumper.
  2. Rangkai komponen sesuai gambar rangkaian pada modul serta hubungkan komunikasi SPI antara 2 Bluepill.
  3. Buka STM32CubeIDE lalu buat project.
  4. Lakukan konfigurasi GPIO dan SPI sesuai pengaturan pada modul kemudian Generate Code.
  5. Masukkan listing program transmitter pada project Bluepill dan listing program receiver pada project Bluepill sesuai modul.
  6. Hubungkan kedua board STM32 ke laptop menggunakan kabel USB.
  7. Build dan Run program pada STM32CubeIDE.
  8. 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



    Prinsip Kerja

    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
}


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

Postingan populer dari blog ini

Modul 1

Tugas Besar : Garasi Otomatis

Modul 2