Laporan Akhir

 

 



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


  • Ketika Lm35 mendeteksi maka kipas akan on
  • Ketika lm 35 tidak mendeteksi maka kipas akan off
  • Ketika push button diberi interupt maka kipas akan otomatis off

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 Simulasi[kembali]

 
Video Simulasi Percobaan Modul 3 


     

6. Analisa [kembali]

 

 

 

Jawaban:

1. Konfigurasi rangkaian pada percobaan komunikasi antar mikrokontroler dilakukan dengan menghubungkan pin komunikasi antara master dan slave sesuai protokol yang digunakan, seperti TX-RX pada UART, MOSI-MISO-SCK-SS pada SPI, serta SDA-SCL pada I2C. Pada program, mikrokontroler dikonfigurasi menggunakan inisialisasi parameter komunikasi seperti baudrate, mode komunikasi, alamat slave, clock polarity, dan clock phase agar proses pengiriman serta penerimaan data dapat berjalan dengan baik

2. Proses komunikasi pada percobaan dilakukan dengan pertukaran data antara mikrokontroler master dan slave menggunakan protokol UART, SPI, atau I2C. Pada UART, data dikirim secara serial melalui pin TX dan diterima melalui RX tanpa clock sinkronisasi. Pada SPI, master mengendalikan komunikasi menggunakan sinyal clock dan mengirim data melalui MOSI serta menerima melalui MISO. Pada I2C, komunikasi menggunakan dua jalur yaitu SDA dan SCL dengan sistem addressing untuk memilih slave yang dituju.

3. Kesalahan pengiriman data dapat disebabkan oleh beberapa faktor seperti baudrate yang tidak sama, koneksi kabel yang kurang baik, noise pada jalur komunikasi, kesalahan konfigurasi clock, buffer overflow, serta sinkronisasi data yang tidak sesuai. Selain itu, program yang kurang tepat dalam proses pembacaan dan pengiriman data juga dapat menyebabkan data corrupt atau tidak terbaca

4. Konfigurasi parameter komunikasi harus sama antara master dan slave agar proses sinkronisasi data berjalan dengan benar. Pada UART, baudrate yang berbeda menyebabkan data diterima tidak sesuai sehingga karakter menjadi rusak atau error. Pada SPI, clock polarity (CPOL) dan clock phase (CPHA) harus sama agar slave membaca data pada tepi clock yang benar. Jika konfigurasi berbeda, maka bit data dapat bergeser atau terbaca salah sehingga komunikasi gagal.

5. Data sensor atau input yang dibaca mikrokontroler akan diproses terlebih dahulu sebelum dikirim melalui sistem komunikasi ke mikrokontroler lain atau perangkat output. Nilai input tersebut mempengaruhi respon output yang dihasilkan, misalnya ketika sensor mendeteksi perubahan nilai tertentu maka mikrokontroler akan mengirim data untuk menyalakan LED, mengaktifkan buzzer, atau menampilkan informasi pada LCD. Semakin akurat data input yang diterima, maka respon output yang dihasilkan juga akan semakin sesuai dengan kondisi sistem. 


7. Download File [kembali]














Tidak ada komentar:

Posting Komentar

      BAHAN PRESENTASI UNTUK MATA KULIAH           OLEH: Farrel Maulana 2310952011 Dosen Pengampu: Darwison, M.T