"Sistem Otomatisasi Gudang Gabah/Beras dengan Pemantauan Stok dan Deteksi gangguan Multi-Sensor"
Modul 4
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
3. Landasan Teori[Kembali]
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):
Parameter Spesifikasi Tegangan Operasi 3.3V – 5V DC Arus Konsumsi ± 20 mA Jarak Deteksi 2 cm – 30 cm (tergantung permukaan objek) Output Digital: 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 Utama IR LED + Photodiode / Phototransistor Aplikasi Umum Deteksi objek, robot line follower, penghitung barang, sistem anti-pencurian
Kurva Perbandingan Respon Sensor: Resistansi dan jarak
Parameter | Spesifikasi |
---|---|
Tegangan Operasi | 3.3V – 5V DC |
Arus Konsumsi | ± 20 mA |
Jarak Deteksi | 2 cm – 30 cm (tergantung permukaan objek) |
Output | Digital: 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 Utama | IR LED + Photodiode / Phototransistor |
Aplikasi Umum | Deteksi objek, robot line follower, penghitung barang, sistem anti-pencurian |
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.

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

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

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

- 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
- 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):
Pin Nama Fungsi 1 VCC Tegangan kerja 3.3V – 6V (umumnya 5V) 2 DATA Jalur data satu arah (single-wire) 3 NC Tidak digunakan (kosong / No Connect) 4 GND Ground
Catatan: Pin DATA biasanya perlu ditarik ke atas (pull-up resistor) 4.7k – 10kΩ ke VCC.
Pin | Nama | Fungsi |
---|---|---|
1 | VCC | Tegangan kerja 3.3V – 6V (umumnya 5V) |
2 | DATA | Jalur data satu arah (single-wire) |
3 | NC | Tidak digunakan (kosong / No Connect) |
4 | GND | Ground |
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)
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
Parameter Nilai Tegangan Operasi 3.3V – 6.0V DC Arus Operasi ± 1.5 mA saat mengukur Jarak Sampling 2 detik (0.5 Hz) Rentang Suhu -40°C sampai +80°C Akurasi Suhu ± 0.5°C Rentang Kelembaban 0% – 100% RH Akurasi Kelembaban ± 2% RH Resolusi Suhu 0.1°C Resolusi Kelembaban 0.1% RH Waktu Respons < 5 detik (kelembaban) Ukuran Modul ± 15.1 x 25 x 7.7 mm Protokol Komunikasi Digital (proprietary single-wire)
Parameter | Nilai |
---|---|
Tegangan Operasi | 3.3V – 6.0V DC |
Arus Operasi | ± 1.5 mA saat mengukur |
Jarak Sampling | 2 detik (0.5 Hz) |
Rentang Suhu | -40°C sampai +80°C |
Akurasi Suhu | ± 0.5°C |
Rentang Kelembaban | 0% – 100% RH |
Akurasi Kelembaban | ± 2% RH |
Resolusi Suhu | 0.1°C |
Resolusi Kelembaban | 0.1% RH |
Waktu Respons | < 5 detik (kelembaban) |
Ukuran Modul | ± 15.1 x 25 x 7.7 mm |
Protokol Komunikasi | Digital (proprietary single-wire) |
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).


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:

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

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.

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

- Large Breadboard, yaitu jenis yang ukurannya paling besar diantara semua jenis breadboard dan memiliki sekitar 830 titik koneksi.




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]
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));
}
}
# 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)
Komentar
Posting Komentar