"Sistem Otomatisasi Gudang Gabah/Beras dengan Pemantauan Stok dan Deteksi gangguan Multi-Sensor"

Modul 4

"Sistem Otomatisasi Gudang Gabah/Beras dengan Pemantauan Stok dan Deteksi gangguan Multi-Sensor"




1. Tujuan [Kembali]
  • Merancang dan membangun sistem otomatisasi gudang gabah/beras berbasis mikrokontroler yang mampu memantau stok secara real-time menggunakan berbagai sensor.

  • Menerapkan sensor-sensor pendukung (Load Cell, Ultrasonic, Infrared, dan Vibration Sensor) untuk mendeteksi jumlah stok, posisi barang, dan gangguan fisik seperti getaran atau pergerakan mencurigakan.

  • Meningkatkan efisiensi dan keamanan pengelolaan gudang dengan penyediaan informasi stok dan notifikasi gangguan secara langsung melalui tampilan LCD atau sistem monitoring lainnya.

  • Memenuhi syarat untuk modul 4 Praktikum Mikroprosesor & Mikrokontroler


2. Alat dan Komponen[Kembali]

  • Rasberry Pi Pico

  • HX711


  • Motor Servo                           






  • STM32F103C8T6


  • Jumper

     


  • Sensor Ultrasonik HC-SR04





 

  • Solder
SIOPEN BALANGAN - AR ELEKTRONIK & KOMPUTER - NEPTO CX-30 SOLDER TANGAN  - SOLDER LISTRIK - SOLDERING IRON 30W 220V
  • IR Sensor

  • Fan DC 5V


  • DHT22


  • Load Cell

  • Relay 3 Channel 5V







3. Landasan Teori[Kembali]

Sensor yang Digunakan (Minimal 3 per unit silo/dispenser + sensor lingkungan):

Sensor Load Cell (kapasitas disesuaikan dengan skala penyimpanan, misal 100kg, 500kg, dengan modul HX711): Ditempatkan di bawah struktur penyangga setiap silo atau wadah penyimpanan utama untuk mengukur berat gabah/beras secara akurat. Ini adalah data kunci untuk inventaris.
Sensor Suhu dan Kelembaban (misalnya DHT22/AM2302 atau SHT31 - I2C/digital): Ditempatkan di dalam atau di dekat silo untuk memantau kondisi lingkungan penyimpanan gabah/beras. Suhu dan kelembaban yang tepat sangat krusial untuk mencegah kerusakan, jamur, atau kutu pada gabah/beras.
Sensor Level Ultrasonik Jarak Jauh (misalnya JSN-SR04T yang tahan air atau tipe industrial jika memungkinkan) atau Sensor Level Kapasitif (untuk material padat): Digunakan untuk mengukur ketinggian tumpukan gabah/beras di dalam silo. Ini bisa menjadi data pendukung untuk load cell atau sebagai alternatif jika pembacaan berat mengalami gangguan.
(Opsional Tambahan) Sensor Kelembaban Gabah/Beras (DHT22): Jika ingin lebih canggih, sensor ini bisa mengukur kadar air langsung pada gabah/beras, yang sangat penting untuk kualitas dan lama penyimpanan.
(Opsional Tambahan) Tombol atau Keypad (digital input): Untuk input manual jumlah yang akan didispense atau untuk memulai/menghentikan proses dari dekat unit dispenser.
Aktuator (Motor):

Motor Servo: Ini adalah aktuator utama untuk mengeluarkan gabah/beras dari silo atau wadah penyimpanan secara terkontrol. Servo cocok untuk memindahkan material curah seperti beras. Katup geser bisa digunakan untuk membuka/menutup lubang output silo.
(Opsional Tambahan) Vibrator Motor kecil: Dapat dipasang di sisi silo untuk membantu aliran gabah/beras jika terjadi penyumbatan, terutama jika kelembaban agak tinggi.
Display:

LCD I2C 20x4 atau OLED I2C (pada setiap unit kontrol STM32 atau pada panel kontrol utama): Menampilkan informasi lokal seperti ID silo, berat gabah/beras saat ini, suhu & kelembaban silo, dan status proses dispensing .
Antarmuka Web/Aplikasi pada Raspberry Pi: Untuk visualisasi data inventaris secara komprehensif dari semua silo, pengaturan parameter dispensing (target berat/volume per transaksi), penjadwalan, riwayat transaksi/dispensing, dan peringatan (misalnya stok silo tertentu rendah, suhu/kelembaban di luar batas aman).
Analog: Sinyal dari sensor load cell (melalui modul HX711), sinyal dari beberapa jenis grain moisture meter.
Digital: Data dari sensor suhu/kelembaban DHT22, sinyal echo dari sensor ultrasonik, input dari tombol/keypad, sinyal dari limit switch (jika katup geser menggunakan limit switch untuk posisi terbuka/tertutup penuh).
Output:

Digital (ke Driver Motor seperti L298N, Relay Solid State, atau Kontaktor jika motor besar): Sinyal kontrol untuk mengaktifkan dan mengatur arah putaran motor servo atau motor penggerak katup geser.
Digital: LED indikator status (misalnya, silo aktif, proses dispensing, stok aman/rendah, peringatan kondisi lingkungan). Sinyal untuk mengaktifkan vibrator motor (jika digunakan).
Protokol Komunikasi:

I2C: Untuk display LCD/OLED dan beberapa jenis sensor (misalnya SHT31).

UART, Ethernet, atau CAN Bus (antara unit STM32 dan Raspberry Pi):
Setiap STM32 akan bertanggung jawab atas satu atau beberapa silo yang berdekatan.
Data sensor dari setiap STM32 (berat, suhu, kelembaban, status dispensing) dikirim ke Raspberry Pi sebagai unit pusat.
Raspberry Pi mengirimkan perintah dispensing (misalnya, "Unit Silo 3, keluarkan 100kg beras ke jalur A") ke STM32 yang relevan.
CAN Bus: Cocok untuk lingkungan industri karena ketahanannya terhadap noise dan memungkinkan komunikasi multi-master atau master-slave yang andal antar mikrokontroler.

Cara Kerja Alat :

    Ketika Dispenser akan dimasukkan gabah. Maka IR sensor akan men-trigger buzzer berbunyi dan servo atas (di bawah pintu) akan terbuka dan jika sudah sampai 95% dari gabah yang ditentukan (850 g dri 1kg) maka buzzer akan berbunyi seperti sirine untuk memberi tanda agar servo segera menutup. setelah melewati corong. gabah akan masuk ke ruangan pertama yang berfungsi untuk mendeteksi kelembapan serta suhu gabah. jika gabah yang dimasukan memiliki kelembapan yang terlalu tinggi serta suhu yang terlalu rendah maka otomatis DHT22 akan mendeteksinya dan memerintahkan fan DC untuk aktif. kemudian gabah yang telah dikontrol tadi akan lanjut ke ruangan selanjutnya yang akan membawa gabah menuju Load Cell untuk melakukan penimbangan. Ketika gabah sudah melewati kapasitas Load Cell maka Load Cell akan membuka jalan pada Gabah untuk menuju ke tempat penampungan terakhir melewati corong yang sudah menggunakan ultrasonic sensor untuk mendeteksi adanya gabah yang melewati corong dan mentrigger motor servo membuka tutup bawah untuk menyalurkan gabah ke tempat penampungan eksternal

2. Mikrokontroler 

Raspberry Pi Pico adalah papan rangkaian elektronik yang di dalamnya terdapat komponen utama chip mikrokontroler RP2040, yang dirancang dan diproduksi oleh Raspberry Pi Foundatio. Tidak seperti komputer mini raspberry Pi lainnya yang menjalankan sistem operasi seperti Linux, Pico dirancang untuk tugas-tugas yang lebih sederhana dan langsung (embedded system), seperti membaca sensor, mengontrol perangkat, atau melakukan pengolahan data pada tingkat hardware. Adapun spesifikasi dari Raspberry Pi Pico adalah sebagai berikut:


Gambar 1. Arduino Uno



Microcontroller

RP2040

Operating Voltage

3.3 V

Input Voltage (recommended)

5 V via USB

Input Voltage (limit)

1.8–5.5 V

Digital I/O Pins

26 GPIO pins

PWM Digital I/O Pins  

16

Analog Input Pins

3

DC Current per I/O Pin

16 mA

DC Current for 3.3V Pin

300mA

Flash Memory                              

2 MB on-board QSPI Flash

SRAM

264 KB

Clock Speed

Hingga 133 MHz       

 

3. Komunikasi

3.1. Universal Asynchronous Receiver Transmitter (UART)

 UART (Universal Asynchronous Receiver-Transmitter) adalah bagian perangkat keras komputer yang menerjemahkan antara bit-bit paralel data dan bit-bit serial. UART biasanya berupa sirkuit terintegrasi yang digunakan untuk komunikasi serial pada komputer atau port serial perangkat periperal.

Cara Kerja Komunikasi UART :

 Data dikirimkan secara paralel dari data bus ke UART1. Pada UART1 ditambahkan start bit, parity bit, dan stop bit kemudian dimuat dalam satu paket data. Paket data ditransmisikan secara serial dari Tx UART1 ke Rx UART2. UART2 mengkonversikan data dan menghapus bit tambahan, kemudian ditransfer secara parallel ke data bus penerima.

3.2. Serial Peripheral Interface (SPI)

 Serial Peripheral Interface (SPI) merupakan salah satu mode komunikasi serial synchrounous kecepatan tinggi yang dimiliki oleh ATmega 328. Komunikasi SPI membutuhkan 3 jalur yaitu MOSI, MISO, dan SCK. Melalui komunikasi ini data dapat saling dikirimkan baik antara mikrokontroler maupun antara mikrokontroler dengan peripheral lain di luar mikrokontroler.

        MOSI : Master Output Slave Input artinya jika dikonfigurasi sebagai master maka pin MOSI sebagai output tetapi jika dikonfigurasi sebagai slave maka pin MOSI sebagai input.

        MISO : Master Input Slave Output artinya jika dikonfigurasi sebagai master maka pin MISO sebagai input tetapi jika dikonfigurasi sebagai slave maka pin MISO sebagai output.

        SCLK : Clock jika dikonfigurasi sebagai master maka pin CLK berlaku sebagai output tetapi jika dikonfigurasi sebagai slave maka pin CLK berlaku sebagai input.

        SS/CS : Slave Select / Chip Select adalah jalur master memilih slave mana yang akan dikirimkan data.


Cara Kerja Komunikasi SPI :

 Sinyal clock dialirkan dari master ke slave yang berfungsi untuk sinkronisasi. Master dapat memilih slave mana yang akan dikirimkan data melalui slave select, kemudian data dikirimkan dari master ke slave melalui MOSI. Jika master butuh respon data maka slave akan mentransfer data ke master melalui MISO.

3.3. Inter-Integrated Circuit (I2C)

 Inter Integrated Circuit atau sering disebut I2C adalah standar komunikasi serial dua arah menggunakan dua saluran yang didisain khusus untuk mengirim maupun menerima data. Sistem I2C terdiri dari saluran SCL (Serial Clock) dan SDA (Serial Data) yang membawa informasi data antara I2C dengan pengontrolnya.

Cara Kerja Komunikasi I2C :

 Pada I2C, data ditransfer dalam bentuk message yang terdiri dari kondisi start, Address Frame, R/W bit, ACK/NACK bit, Data Frame 1, Data Frame 2,  dan kondisi Stop.

        Kondisi start dimana saat pada SDA beralih dari logika high ke low sebelum SCL.

        Kondisi stop dimana saat pada SDA beralih dari logika low ke high sebelum SCL.

        R/W bit berfungsi untuk menentukan apakah master mengirim data ke slave atau meminta data dari slave. (logika 0 = mengirim data ke slave, logika 1 = meminta data dari slave)

        ACK/NACK bit berfungsi sebagai pemberi kabar jika data frame ataupun address frame telah diterima receiver.

 

4. Sensor

4.1. Infrared Sensor (IR sensor)

IR sensor adalah sensor elektronik yang menggunakan sinar inframerah (infrared) untuk mendeteksi keberadaan objek tanpa menyentuhnya. Sensor ini bekerja dengan memancarkan sinyal IR dari IR LED, dan mendeteksi pantulannya menggunakan photodiode atau phototransistor. Ketika ada objek di depan sensor, pantulan sinar akan diterima dan diubah menjadi sinyal output.


Spesifikasi Umum IR Sensor Modul (Obstacle Detection):

ParameterSpesifikasi
Tegangan Operasi3.3V – 5V DC
Arus Konsumsi± 20 mA
Jarak Deteksi2 cm – 30 cm (tergantung permukaan objek)
OutputDigital: LOW (objek terdeteksi), HIGH (tidak ada objek)
Waktu Respons< 1 ms (cepat)
Frekuensi IR~38 kHz (modul IR receiver umum)
Sudut Deteksi± 35° (modul standar)
Ukuran Modul± 3 cm x 1.5 cm
Komponen UtamaIR LED + Photodiode / Phototransistor
Aplikasi UmumDeteksi objek, robot line follower, penghitung barang, sistem anti-pencurian


Kurva Perbandingan Respon Sensor: Resistansi dan jarak

 

4.2. Sensor Ultrasonik HC-SR04 

Sensor ultrasonik HC-SR04 adalah suatu sensor yang fungsinya mengubah besaran fisis bunyi menjadi besaran listrik maupun sebaliknya. Fungsi sensor ultrasonik HC-SR04 biasa digunakan untuk mendeteksi objek yang ada di depannya dengan memanfaatkan gelombang ultrasonik.

Cara Kerja Sensor Ultrasonic HC-SR04 Arduino

    Sensor ultrasonik HC SR04 memiliki sepasang transduser ultrasonik yang berfungsi sebagai transmitter (memancarkan gelombang) dan receiver (menerima pantulan gelombang). Cara kerja sensor HC SR04 berawal dari gelombang ultrasonik berfrekuensi 40 kHz (sesuai osilator) yang dibangkitkan oleh piezoelektrik sebagai transmitter-nya. Kemudian gelombang yang terbentuk dipancarkan mengenai target. Hasil pantulan gelombang tersebut nantinya akan diterima oleh receiver piezoelektrik untuk dikalkulasikan waktu pengiriman dan waktu diterimanya gelombang pantul tersebut.

    Hasil pengalkulasian itulah nanti yang akan kita peroleh sebagai nilai jarak.Prinsip kerja sensor ultrasonik HC-SR04 kurang lebih hampir sama dengan contoh gambar kelelawar yang mendeteksi buah di depannya. Kira-kira bentuk ilustrasi cara kerja HC SR04 seperti ini.


Cara Kerja Sensor Ultrasonic HC-SR04 Arduino

    Rumus sensor ultrasonik diambil dari rumus kecepatan. Karena sudah diketahui kecepatan rambat bunyi berada di kisaran 340 m/s, maka rumus menghitung jarak sensor ultrasonik adalah:

S = 340.t / 2

Keterangan :

S= Jarak objek

t= Selisih waktu dipancarkan dan diterimanya gelombang


Spesifikasi Sensor Ultrasonik HC-SR04 Arduino

Jarak Deteksi2 - 300 cm
Akurasi Jarak3 mm
Tegangan Operasi5 Volt
Sudut Pantul< 15 derajat
Konsumsi Arus15 mA
Panjang4,5 cm
Lebar2 cm
Tinggi1,5 cm

Datasheet Sensor Ultrasonik HC-SR04

  • Pin Trig (Trigger), trigpin Arduino berfungsi untuk memicu pemancaran gelombang ultrasonik. Gelombang akan terpancarkan saat pin ini diberikan logika HIGH.
  • Pin Echo, berfungsi untuk mendeteksi pantulan gelombang ultrasonik apakah sudah diterima atau belum. Pin Echo bernilai HIGH jika gelombang pantulan belum diterima dan bernilai LOW jika pantulan sudah diterima.
  • Pin VCC, berfungsi untuk mengoneksikan sensor ke power supply 5 volt Arduino. Jadi kamu bisa langsung mengoneksikan pin VCC ke pin 5V di Arduino.
  • Pin GND, berfungsi untuk mengoneksikan sensor ke power supply ground. Sama dengan pin VCC, kamu juga bisa langsung menghubungkan pin GND ini ke pin GND Arduino
Komponen Sensor Ultrasonik HC-SR04
  • Piezoelektrik, fungsi dari komponen ini adalah mengubah energi listrik menjadi energi mekanik yang menghasilkan gelombang ultrasonik maupun sebaliknya.
  • Transmitter, yaitu komponen yang berfungsi untuk memancarkan gelombang ultrasonik yang dihasilkan oleh piezoelektrik ke objek yang ingin diukur jaraknya.
  • Receiver, berfungsi untuk menerima pantulan gelombang ultrasonik dari objek yang ingin diukur jaraknya.

4.3. Sensor Suhu dan Kelembapak DHT22

DHT22, juga dikenal sebagai AM2302, adalah sensor digital yang mampu mengukur suhu dan kelembaban dengan akurasi tinggi. Sensor ini telah dikalibrasi di pabrik dan mengeluarkan data suhu dalam °C dan kelembaban relatif (RH%) dalam bentuk digital. DHT22 sangat cocok untuk aplikasi pemantauan iklim dalam ruangan, sistem HVAC, otomasi rumah, serta proyek-proyek berbasis mikrokontroler seperti Arduino dan STM32.


Komunikasi dan Daya

DHT22 berkomunikasi menggunakan protokol komunikasi satu jalur (single-wire proprietary protocol), namun bukan protokol 1-Wire Dallas seperti pada DS18B20. Protokol ini melibatkan urutan start signal dari mikrokontroler, diikuti oleh respons dan pengiriman data 40-bit dari sensor.

Sensor ini memerlukan waktu tunggu minimum antar pembacaan (sekitar 2 detik), karena memiliki kecepatan sampling rendah dibandingkan sensor suhu digital murni.


Konfigurasi Pin DHT22 (4 pin):

PinNamaFungsi
1VCCTegangan kerja 3.3V – 6V (umumnya 5V)
2DATAJalur data satu arah (single-wire)
3NCTidak digunakan (kosong / No Connect)
4GNDGround

Catatan: Pin DATA biasanya perlu ditarik ke atas (pull-up resistor) 4.7k – 10kΩ ke VCC.



Format Suhu dan Hubungan Data

  • Suhu disimpan dalam format positif atau negatif 16-bit (bit tanda digunakan untuk menunjukkan nilai negatif).

  • Jika suhu negatif, bit paling signifikan (MSB) dari byte integer suhu di-set ke 1.

  • Contoh:

    • 0x01 0x2C → 30.0°C (positif)

    • 0x81 0x2C → -30.0°C (negatif)


Kinerja Umum DHT22

ParameterNilai
Tegangan Operasi3.3V – 6.0V DC
Arus Operasi± 1.5 mA saat mengukur
Jarak Sampling2 detik (0.5 Hz)
Rentang Suhu-40°C sampai +80°C
Akurasi Suhu± 0.5°C
Rentang Kelembaban0% – 100% RH
Akurasi Kelembaban± 2% RH
Resolusi Suhu0.1°C
Resolusi Kelembaban0.1% RH
Waktu Respons< 5 detik (kelembaban)
Ukuran Modul± 15.1 x 25 x 7.7 mm
Protokol KomunikasiDigital (proprietary single-wire)


Grafik Respon Sensor : Perbandingan Suhu & Kelembapan dengan Temperature & Persentase Kelembapan Relatif



5. OLED



OLED (Organic Light-Emitting Diode) atau diode cahaya organik adalah sebuah semikonduktor sebagai pemancar cahaya yang terbuat dari lapisan organik. OLED digunakan dalam teknologi elektroluminensi, seperti pada aplikasi tampilan layar. Teknologi ini terkenal fleksibel karena ketipisannya.

Spesifikasi:

• Format tampilan: 128 x 64 piksel

• Tipe tampilan: Monokrom (biasanya putih, biru, atau hijau di atas latar belakang hitam)

• Driver/Pengontrol bawaan: SSD1306 (atau kompatibel)

• Interface: I2C (juga tersedia versi SPI)

• Supply Tegangan: +3.3 V hingga +5 V

• Ukuran titik (dot matrix): Mampu menampilkan font 5x8 piksel per karakter (mirip LCD)

• Kontras tinggi: Tidak memerlukan backlight karena OLED menghasilkan cahaya sendiri

• Pin koneksi umum: VCC, GND, SDA, SCL (untuk versi I2C)

• Daya rendah: Konsumsi daya rendah dibandingkan dengan LCD backlight

• Ukuran layar fisik umum: Sekitar 0.96 inci (untuk versi populer)

 

6. Breadboard

    Breadboard Arduino adalah sejenis papan roti yang biasanya digunakan untuk membuat prototype rangkaian elektronik. Beberapa orang kadang menyebutnya project board atau bahkan  protoboard (prototype board). Pada dasarnya breadboard adalah board yang digunakan untuk membuat rangkaian elektronik tanpa harus merepotkan pengguna untuk menyolder. Biasanya papan breadboard ini digunakan untuk membuat rangkaian elektronik sementara untuk tujuan uji coba atau prototype.

Fungsi Breadboard :

    Kegunaan breadboard yaitu sebagai media penghantar (konduktor listrik) sekaligus tempat kabel jumper dilekatkan. Sehingga arus dari satu komponen bisa terdistribusi dengan baik sesuai keinginan ke komponen lain tanpa harus merepotkan pengguna untuk melakukan penyolderan atau melakukan bongkar pasang.

    Salah satu kelebihan tersendiri dari penggunaan breadboard adalah komponen-komponen yang telah dirakit tak akan rusak dan mudah untuk dibongkar pasang. Ini karena papan breadboard merupakan papan tanpa solder (solderless).
gambar breadboard

Cara Kerja Breadboard :

    Breadboard bisa dideskripsikan sebagai papan yang memiliki lubang koneksi berdasarkan pola tertentu. Untuk menghubungkan antara satu lubang dengan lubang yang lain, maka di bagian bawah lubang tersebut terdapat logam konduktor listrik yang diposisikan secara khusus. Ini berguna untuk memudahkan pengguna dalam membuat rangkaian. Logam konduktor yang ada di dalam breadboard umumnya seperti ini:

Cara Kerja Breadboard

Kira-kira posisi logam jalur breadboard bisa digambarkan sebagai berikut:

prinsip kerja breadboard

Berdasarkan gambar di atas, fungsi dari masing-masing jalur koneksi pada breadboard dengan keterangan warnanya yaitu sebagai berikut:
  • Jalur warna merah, digunakan untuk menempatkan pin 5V atau kutub positif dari arduino untuk dihubungkan ke kutub positif komponen lain.
  • Jalur warna biru, digunakan untuk menempatkan pin GND atau kutub negatif dari arduino untuk dihubungkan ke kutub negatif komponen lain.
  • Jalur warna hijau, digunakan untuk menempatkan pin digital dari Arduino untuk dihubungkan ke komponen lain.
Selain itu, di bagian tengah papan breadboard terdapat ruang kosong yang masing-masing pinggirannya terdapat ujung jalur vertikal. Fungsi dari ruang kosong ini adalah untuk menancapkan langsung ic component.

Jenis-jenis Breadboard

Beberapa ukuran breadboard yang tersedia di pasaran antara lain:
  • Mini Breadboard, yaitu jenis yang paling kecil diantara semua breadboard dan memiliki sekitar 170 titik koneksi.
mini breadboard
  • Medium Breadboard, yaitu jenis breadboard ukuran sedang yang kadang juga disebut half breadboard karena memiliki ukuran dan jumlah titik koneksinya setengah dari jumlah titik koneksi breadboard ukuran besar. Yaitu 400 titik koneksi.
medium breadboard
  • Large Breadboard, yaitu jenis yang ukurannya paling besar diantara semua jenis breadboard dan memiliki sekitar 830 titik koneksi.
large breadboard

7. Fan DC 5V

 Fan DC 5V adalah sebuah kipas berukuran kecil yang beroperasi menggunakan arus searah (DC) dengan tegangan kerja sebesar 5 volt. Komponen ini memiliki dua kabel utama, yaitu kabel positif dan kabel negatif, yang dihubungkan ke sumber daya bertegangan 5V. Saat dialiri listrik, motor di dalam fan akan memutar baling-baling sehingga menghasilkan aliran udara. Fan ini dirancang untuk bekerja dengan konsumsi daya rendah dan menghasilkan putaran stabil untuk membantu sirkulasi udara. Biasanya fan jenis ini memiliki ukuran fisik kecil dan tidak menimbulkan kebisingan berlebih saat beroperasi.

Spesifikasi :

  • Nominal voltage: DC 5V.
  • Nominal current: 0.14A.
  • Power: 1.75W.
  • Blast capacity: 4.59CFM.
  • Shell material: PBT & 30% fiberglass & V0 retarder.
  • Blade: 5015S.
  • Turbine diameter: 48mm.
  • Wire length: about 20cm.
  • Rotation speed: 5000 rpm.
  • Net Weight: about 30g.
  • Size: 60x60x15 mm
  • Frame: Plastic (black) 94V-0
  • Impeller: Plastic (black) 94V-0
  • Lead wires: UL type or equivalent, red +, black –
  • Operating temperature: -10℃ ~ +70℃, 5% ~ 90%RH
  • Storage temperature: -40℃ ~ +80℃, 5% ~ 90%RH
  • Optional bearing types: Ball bearing(B)/sleeve bearing(S)/hydraulic bearing(R)

8. Relay 3 Channel 5V

Relay adalah komponen elektronik berupa saklar elektronik yang digerakkan oleh arus listrik. Secara prinsip, relay merupakan tuas saklar dengan lilitan kawat pada batang besi (solenoid) di dekatnya, ketika solenoid dialiri arus listrik, tuas akan tertarik karena adanya gaya magnet yang terjadi pada solenoid sehingga kontak saklar akan menutup. Pada saat arus dihentikan, gaya magnet akan hilang, tuas akan kembali keposisi semula dan kontak saklar kembali terbuka. Relay biasanya digunakan untuk menggerakkan arus/tegangan yang besar (misalnya peralatan listrik 4 A/AC 220V) dengan memakai arus/tegangan yang kecil (misalnya 0.1 A/12 volt DC).

Relay adalah komponen listrik yang bekerja berdasarkan prinsip induksi medan elektromagnetis. Jika sebuah penghantar sialiri oleh arus listrik, maka disekitar penghantar tersebut timbul medan magnet. Medan magnet yang dihasilkan oleh arus listrik tersebut selanjutnya diinduksikan ke logam ferromagnetis. 

4. Flowchart dan Listing Program[Kembali] 

Flowchart:



Flowchart Hardware

Flowchart Pico 1


Flowchar Pico 2







LISTING PROGRAM :

// ================= STM32F103C8T6 (Using HAL Library) =================

// Function: Read load cell (HX711), control motor (via PWM), and UART comm

#include "main.h"

#include <stdio.h>

#include <string.h>

 

// HX711 pins

#define HX711_DT_Pin GPIO_PIN_12

#define HX711_SCK_Pin GPIO_PIN_13

#define HX711_GPIO_Port GPIOB

 

// Peripheral pins

#define LIMIT_SWITCH_Pin GPIO_PIN_0

#define LIMIT_SWITCH_GPIO_Port GPIOB

#define BUZZER_Pin GPIO_PIN_1

#define BUZZER_GPIO_Port GPIOB

#define LED_STATUS_Pin GPIO_PIN_15

#define LED_STATUS_GPIO_Port GPIOA

 

// Handles for HAL Libraries

UART_HandleTypeDef huart2; // UART2 for communication to Pico

TIM_HandleTypeDef htim1;   // For PWM motor control

 

/**

  * @brief  Reads a 24-bit value from the HX711.

  * @retval The raw 24-bit value from the load cell.

  */

long HX711_Read(void) {

    long count = 0;

    // Wait for the DT pin to go low

    HAL_GPIO_WritePin(HX711_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);

    while (HAL_GPIO_ReadPin(HX711_GPIO_Port, HX711_DT_Pin));

 

    // Clock out 24 bits of data

    for (int i = 0; i < 24; i++) {

        HAL_GPIO_WritePin(HX711_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET);

        count = count << 1;

        HAL_GPIO_WritePin(HX711_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);

        if (HAL_GPIO_ReadPin(HX711_GPIO_Port, HX711_DT_Pin)) {

            count++;

        }

    }

 

    // Set gain for the next reading (1 pulse for gain 128)

    HAL_GPIO_WritePin(HX711_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET);

    count = count ^ 0x800000; // Convert to 2's complement

    HAL_GPIO_WritePin(HX711_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);

   

    return count;

}

 

/**

  * @brief  Controls the motor direction and PWM speed.

  * @param  status: 1 for ON, 0 for OFF.

  * @retval None

  */

void Motor_Control(int status) {

    if (status == 1) {

        // Set direction (e.g., forward)

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);  // IN1

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET); // IN2

        // Set PWM duty cycle (speed)

        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 800);

    } else {

        // Stop the motor

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);

        // Set PWM to 0

        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);

    }

}

 

/**

  * @brief  Activates or deactivates the buzzer.

  * @param  active: 1 to activate, 0 to deactivate.

  * @retval None

  */

void Buzzer_Alert(int active) {

    HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, active ? GPIO_PIN_SET : GPIO_PIN_RESET);

}

 

/**

  * @brief  Activates or deactivates the status LED.

  * @param  active: 1 to activate, 0 to deactivate.

  * @retval None

  */

void LED_Status(int active) {

    HAL_GPIO_WritePin(LED_STATUS_GPIO_Port, LED_STATUS_Pin, active ? GPIO_PIN_SET : GPIO_PIN_RESET);

}

 

/**

  * @brief  Sends formatted sensor data over UART.

  * @param  weight: The calculated weight.

  * @param  motor_state: Current state of the motor ("ON" or "OFF").

  * @param  limit_state: Current state of the limit switch ("PRESSED" or "RELEASED").

  * @retval None

  */

void send_sensor_data(float weight, const char* motor_state, const char* limit_state) {

    char msg[128];

    sprintf(msg, "<WEIGHT:%.2f;MOTOR:%s;LIMIT:%s>\n", weight, motor_state, limit_state);

    HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);

}

 

// Global variables

int motor_manual_control = 0; // Flag for manual control from Pico

float threshold_weight = 2.0; // Kg, batas minimal stok

 

/**

  * @brief  The main application loop for the STM32.

  * @retval None

  */

void loop_STM32() {

    // Read and calculate weight

    long raw = HX711_Read();

    float weight = (raw - 8388608) / 1000.0; // Kalibrasi, perlu disesuaikan

 

    // Read limit switch

    int limit_pressed = HAL_GPIO_ReadPin(LIMIT_SWITCH_GPIO_Port, LIMIT_SWITCH_Pin);

    const char* limit_state = limit_pressed == GPIO_PIN_RESET ? "PRESSED" : "RELEASED";

 

    // Alert if stock is low

    if (weight < threshold_weight) {

        Buzzer_Alert(1);

        LED_Status(1);

    } else {

        Buzzer_Alert(0);

        LED_Status(0);

    }

 

    // Control motor based on manual flag

    if (motor_manual_control == 1) {

        Motor_Control(1);

    } else {

        Motor_Control(0);

    }

 

    // Send data to Pico

    send_sensor_data(weight, motor_manual_control ? "ON" : "OFF", limit_state);

    HAL_Delay(1000);

}

 

// UART receive buffer

char rx_buffer[64];

 

/**

  * @brief  UART Receive Complete Callback. Triggered by HAL_UART_Receive_IT.

  * @param  huart: UART handle.

  * @retval None

  */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {

    if (huart->Instance == USART2) {

        // Check for motor control commands

        if (strstr((char*)rx_buffer, "MOTOR:1")) {

            motor_manual_control = 1;

        } else if (strstr((char*)rx_buffer, "MOTOR:0")) {

            motor_manual_control = 0;

        }

        // Re-arm the UART receive interrupt

        HAL_UART_Receive_IT(&huart2, (uint8_t*)rx_buffer, sizeof(rx_buffer));

    }

}

 

Kode raspberry pi
# ================= Raspberry Pi Pico (RP2040 - MicroPython) =================

# Function: Read sensor inputs, display data, send commands via UART

 

from machine import Pin, I2C, UART

import ssd1306

import time

import dht

 

# --- Hardware Setup ---

 

# OLED setup (I2C)

i2c = I2C(0, scl=Pin(1), sda=Pin(0))

oled = ssd1306.SSD1306_I2C(128, 64, i2c)

 

# Digital Input Sensors

leak_sensor = Pin(4, Pin.IN)

vibration_sensor = Pin(5, Pin.IN)

prox_inductive = Pin(6, Pin.IN)

prox_capacitive = Pin(7, Pin.IN)

 

# DHT22 sensor

dht_sensor = dht.DHT22(Pin(10))

 

# Manual control keypad

key_1 = Pin(2, Pin.IN, Pin.PULL_UP)  # ON

key_0 = Pin(3, Pin.IN, Pin.PULL_UP)  # OFF

 

# UART to STM32

uart1 = UART(1, baudrate=9600, tx=Pin(8), rx=Pin(9))

 

# --- Global Variables ---

buffer = b""

 

# --- Functions ---

 

def receive_data():

    """

    Reads from UART and assembles a complete line ending with a newline character.

    Returns the line as a string, or None if no complete line is received.

    """

    global buffer

    while uart1.any():

        buffer += uart1.read(1)

        if buffer.endswith(b"\n"):

            line = buffer.decode().strip()

            buffer = b""

            return line

    return None

 

def display_data(text_lines):

    """

    Clears the OLED and displays a list of strings, each on a new line.

    """

    oled.fill(0)

    oled.text("Dispenser Mini", 0, 0)

    for i, line in enumerate(text_lines):

        # Display each line with a 12-pixel vertical spacing

        oled.text(line[:16], 0, 16 + (i * 12))

    oled.show()

 

# --- Main Loop ---

while True:

    # Receive data from STM32

    line_from_stm32 = receive_data()

    

    oled_lines_to_display = []

 

    if line_from_stm32:

        # If data is received, parse and add it to the display list

        parts = line_from_stm32.replace("<", "").replace(">", "").split(';')

        for part in parts:

             oled_lines_to_display.append(part)

 

    # Read DHT22 sensor data

    try:

        dht_sensor.measure()

        temp = dht_sensor.temperature()

        hum = dht_sensor.humidity()

        dht_string = "T:%.1fC H:%.1f%%" % (temp, hum)

        oled_lines_to_display.append(dht_string)

    except Exception as e:

        oled_lines_to_display.append("DHT22 Error")

 

    # Update the display with all collected information

    if oled_lines_to_display:

        display_data(oled_lines_to_display)

 

    # Check for manual keypad input and send commands to STM32

    if not key_1.value():

        uart1.write("MOTOR:1\n")

    if not key_0.value():

        uart1.write("MOTOR:0\n")

 

    # Check local environmental sensors and display alerts (overwrites the screen temporarily)

    alert_message = None

    if leak_sensor.value() == 1:

        alert_message = ["WARNING:", "Leak Detected!"]

    elif vibration_sensor.value() == 1:

        alert_message = ["Vibration Alert"]

    elif prox_inductive.value() == 0:

        alert_message = ["Metal Detected"]

    elif prox_capacitive.value() == 0:

        alert_message = ["Non-metal Detected"]

 

    if alert_message:

        display_data(alert_message)

        time.sleep(1) # Show alert for 1 second

 

    time.sleep(0.1)

5. Video [Kembali]

Teori dan Prinsip Kerja



Video Demo 

Video Demo (Code)







6. Gambar Rangkaian [Kembali]

Gambar Rangkaian Simulasi :

Gambar Rangkaian alat :





7. Download File[Kembali]


Download Project Unduh
Download Video Unduh
Datasheet Raspberry Pi Pico [Unduh]
Datasheet LCD 20x4 [Unduh]
Download Datasheet  STM32F103C8T6 [Unduh]
Download Datasheet Sensor IR [Unduh]
Download Datasheet Ultrasonic sensor [Unduh]
Download Datasheet sensor DHT22 [Unduh]
Download Datasheet Fan DC 5V [Unduh]
Download Datasheet motor Servo [Unduh]
Download Datasheet relay [Unduh]
Download Datasheet Load Cell[Unduh]
Download DataSheet HX711 [Unduh] 


Komentar

Postingan populer dari blog ini

Tugas Besar (Parkir Otomatis)