Kamis, 19 Juni 2025

LAPORAN AKHIR DEMO PROJECT PRAKTIKUM MIKROPROSESOR & MIKROKONTROLER



SMART EGG INCUBATOR

Sistem Kontrol dan Monitoring Mesin

Tetas Telur Ayam Close House


1. Pendahuluan[Kembali]

   
  1. Latar Belakang

Proses pengeraman telur oleh induk ayam secara alami memang telah berlangsung sejak lama, namun metode ini memiliki berbagai keterbatasan yang menyebabkan efisiensi penetasan telur menjadi rendah. Salah satu permasalahan utama adalah ketergantungan terhadap kondisi lingkungan yang tidak selalu stabil. Suhu dan kelembaban yang dibutuhkan untuk mendukung perkembangan embrio telur sering kali tidak dapat dijaga secara konstan oleh induk ayam, terutama ketika terjadi perubahan cuaca ekstrem atau gangguan dari lingkungan sekitar.

Selain itu, induk ayam hanya mampu mengerami dalam jumlah terbatas, dan sangat rentan terhadap stres yang dapat mengganggu proses pengeraman. Ketika induk terganggu oleh suara bising, predator, atau aktivitas manusia, ia cenderung meninggalkan sarangnya dan menghentikan pengeraman, yang pada akhirnya berdampak pada kegagalan penetasan. Pengeraman alami juga tidak memungkinkan proses pemantauan secara menyeluruh terhadap kondisi telur, seperti suhu optimal, kelembaban udara, atau potensi kegagalan akibat kerusakan fisik pada telur.

Berdasarkan permasalahan tersebut, diperlukan suatu inovasi teknologi untuk menciptakan sistem penetasan telur yang efisien, stabil, dan dapat di monitor secara real-time. Oleh karena itu, penulis mencetuskan ide alat "Smart Egg Incubator", sebuah mesin tetas telur berbasis close house yang dirancang dengan sistem kontrol otomatis dan pemantauan cerdas menggunakan berbagai sensor serta mikrokontroler.

Alat ini akan menggunakan dua buah Raspberry Pi Pico yang saling berkomunikasi untuk membagi tugas pengolahan dan kontrol, sehingga proses dapat berjalan secara paralel dan efisien. Sensor DHT22 digunakan untuk mengukur dan menjaga kestabilan suhu serta kelembaban dalam inkubator. Gas sensor MQ-2 berperan penting dalam mendeteksi keberadaan gas berbahaya seperti asap atau amonia, yang dapat membahayakan embrio. Sementara itu, sensor LDR (photoresistor) digunakan untuk memantau intensitas cahaya di dalam inkubator, yang akan dikendalikan oleh LED sebagai pengatur pencahayaan agar menyerupai kondisi alami.

Untuk mendeteksi perubahan massa telur, terutama saat proses penetasan atau potensi kerusakan, digunakan sensor load cell HX711, yang akan memberikan sinyal ke sistem apabila terjadi perubahan signifikan pada berat telur. Semua data dari sensor akan ditampilkan secara real-time melalui LCD I2C, sehingga pengguna dapat memantau kondisi inkubator dengan mudah. Sebagai kontrol otomatis, sistem ini dilengkapi motor servo yang akan membuka atau menutup katup ventilasi udara, buzzer sebagai alarm peringatan bila terjadi anomali, serta LED untuk penyesuaian intensitas cahaya di dalam ruang inkubasi.

Dengan integrasi sistem ini, Smart Egg Incubator diharapkan dapat meningkatkan tingkat keberhasilan penetasan telur secara signifikan, mengurangi ketergantungan pada induk ayam, serta memberikan kemudahan dan efisiensi dalam pemantauan dan pengendalian lingkungan inkubasi secara otomatis dan presisi.


  1. Rumusan Masalah 

Rumusan masalah dalam proyek ini adalah sebagai berikut:

  1. Bagaimana merancang dan membangun sistem inkubator telur otomatis berbasis Raspberry Pi Pico dengan pemantauan dan pengendalian kondisi lingkungan secara real-time?

  2. Bagaimana mengintegrasikan berbagai sensor (DHT22, MQ-2, LDR, HX711) untuk mendeteksi dan menjaga kestabilan suhu, kelembapan, gas berbahaya, pencahayaan, dan berat telur?

  3. Bagaimana memanfaatkan aktuator (motor servo, buzzer, LED) sebagai sistem kontrol otomatis terhadap ventilasi, alarm, dan pencahayaan di dalam inkubator?

  4. Bagaimana merancang komunikasi antar dua Raspberry Pi Pico untuk membagi fungsi monitoring dan kontrol secara efisien?


  1. Tujuan Project

Tujuan dari proyek Smart Egg Incubator ini adalah:

  1. Merancang dan mengembangkan sistem inkubator telur ayam otomatis berbasis Raspberry Pi Pico dengan konsep close house.

  2. Membangun sistem pemantauan lingkungan inkubator menggunakan sensor DHT22, MQ-2, LDR, dan HX711 secara real-time.

  3. Menerapkan sistem kontrol otomatis terhadap ventilasi, alarm, dan pencahayaan dengan menggunakan motor servo, buzzer, dan LED.

  4. Mengimplementasikan komunikasi antar mikrokontroler (Raspberry Pi Pico) untuk membagi tugas antara sistem monitoring dan sistem kontrol secara efektif.

  5. Menampilkan informasi kondisi inkubator secara langsung melalui LCD I2C agar pengguna dapat melakukan pemantauan dengan mudah.


  1. Manfaat Project

Adapun manfaat yang diharapkan dari pengembangan proyek ini meliputi:

  1. Meningkatkan efisiensi dan keberhasilan penetasan telur dengan menciptakan lingkungan inkubasi yang stabil dan terkendali.

  2. Mengurangi ketergantungan terhadap induk ayam dalam proses pengeraman, sehingga dapat meningkatkan kapasitas produksi.

  3. Memberikan solusi otomatisasi yang cerdas dan terjangkau bagi peternak kecil hingga menengah dalam mengembangkan sistem penetasan mandiri.

  4. Menjadi sarana pembelajaran teknologi embedded system dan Internet of Things (IoT) dalam dunia peternakan modern.

Mendeteksi secara dini kondisi abnormal, seperti kenaikan suhu ekstrem, keberadaan gas berbahaya, atau kerusakan telur, melalui sistem alarm dan pemantauan real-time.

2. Tujuan[Kembali]

Tujuan dari proyek Smart Egg Incubator ini adalah:

  1. Merancang dan mengembangkan sistem inkubator telur ayam otomatis berbasis Raspberry Pi Pico dengan konsep close house.

  2. Membangun sistem pemantauan lingkungan inkubator menggunakan sensor DHT22, MQ-2, LDR, dan HX711 secara real-time.

  3. Menerapkan sistem kontrol otomatis terhadap ventilasi, alarm, dan pencahayaan dengan menggunakan motor servo, buzzer, dan LED.

  4. Mengimplementasikan komunikasi antar mikrokontroler (Raspberry Pi Pico) untuk membagi tugas antara sistem monitoring dan sistem kontrol secara efektif.

  5. Menampilkan informasi kondisi inkubator secara langsung melalui LCD I2C agar pengguna dapat melakukan pemantauan dengan mudah.




3. Alat dan Komponen[Kembali]


1.Mikrokontroler Raspberry



Raspberry Pi Pico adalah papan mikrokontroler berbiaya rendah dan berkinerja tinggi dengan antarmuka digital yang fleksibel. Fitur-fitur utamanya meliputi:

  • Chip mikrokontroler RP2040 yang dirancang oleh Raspberry Pi di Inggris Raya

  • Prosesor Arm Cortex M0+ dual-core, clock fleksibel hingga 133 MHz

  • 264KB SRAM, dan 2MB memori flash on-board

  • USB 1.1 dengan dukungan perangkat dan host

  • Mode tidur dan dorman berdaya rendah

  • Pemrograman drag-and-drop menggunakan penyimpanan massal melalui USB

  • 26 × pin GPIO multifungsi

  • 2 × SPI, 2 × I2C, 2 × UART, 3 × ADC 12-bit, 16 × saluran PWM yang dapat dikontrol

  • Jam dan pengatur waktu yang akurat pada chip

  • Sensor suhu

  • Pustaka floating-point yang dipercepat pada chip

  • 8 × Mesin status I/O yang dapat diprogram (PIO) untuk dukungan periferal khusus

Raspberry Pi Pico hadir sebagai modul berbenteng yang memungkinkan penyolderan langsung ke papan pembawa

2. Mikrokontroller STM32



STM32F103C8T6 adalah sebuah mikrokontroler 32-bit berbasis ARM Cortex-M3 buatan STMicroelectronics, termasuk dalam seri STM32F1 yang dikenal sebagai mainstream line. Mikrokontroler ini banyak digunakan dalam sistem tertanam (embedded system), IoT, robotika, dan pengontrol industri karena harganya yang murah, performa baik, serta ekosistem pengembangan yang luas.
Prinsip kerjanya secara garis besar adalah: a. Power-up dan Reset Saat diberi tegangan (biasanya 3.3V), chip akan di-reset dan memulai booting dari alamat awal Flash. b. Eksekusi Program Program yang sudah ditanam di Flash memory dijalankan oleh CPU ARM Cortex-M3. Program bisa melakukan pembacaan sensor, logika kontrol, pengaturan PWM, komunikasi serial, dan sebagainya. c. Peripheral & Interrupt STM32 dilengkapi dengan banyak peripheral (GPIO, ADC, UART, SPI, Timer, dll). Perangkat ini juga mampu merespons kejadian eksternal melalui sistem interrupt, yang dikelola oleh NVIC (Nested Vectored Interrupt Controller). d. Komunikasi & Kontrol Dapat berkomunikasi dengan perangkat lain (sensor, modul, motor, dll) melalui GPIO, UART, SPI, I2C, dan mengatur keluaran berupa PWM, sinyal digital, dll. Pin Pin :


Spesifikasi :




2.Sensor DHT22

Sensor DHT22 digunakan untuk mengukur suhu dan kelembapan dalam inkubator penetas telur ayam, yang penting
untuk proses penetasan yang optimal. Sensor ini dapat digunakan bersama dengan mikrokontroler
untuk memantau dan mengontrol suhu serta kelembapan, sehingga menciptakan lingkungan yang sesuai untuk
perkembangan embrio. Sedangkan hasil pengujian untuk suhu dan kelembaban pada rancangan yang diusulkan
untuk pagi hari berada pada range 37 - 38 0C dan 51,10 – 53,50%. Siang hari diperoleh range 37 - 38 0C dan
50,00 – 53,10%. Sedangkan untuk malam hari diperoleh range 37 - 38 0C dan 51,10 – 55,00%.


Sensor Load Cell

Sensor load cell dapat digunakan sebagai sensor berat pada inkubator penetas telur ayam untuk beberapa keperluan, seperti 

mengidentifikasi jenis telur atau mengontrol jumlah telur yang dimasukkan. Sensor ini bekerja dengan mengukur berat yang

diberikan pada plat, dan dapat diintegrasikan dengan sistem pengontrol suhu dan kelembapan inkubator untuk menyesuaikan

kondisi yang optimal bagi penetasan telur. 








3.Sensor Gas MQ-2

Sensor MQ2 berfungsi sebagai sensor pendukung untuk mendeteksi gas H2S yang dihasilkan oleh telur.

data sheet

  • Operating Voltage is +5V

  • Can be used to Measure or detect LPG, Alcohol, Propane, Hydrogen, CO and even methane

  • Analog output voltage: 0V to 5V

  • Digital Output Voltage: 0V or 5V (TTL Logic)

  • Preheat duration 20 seconds

  • Can be used as a Digital or analog sensor

  • The Sensitivity of Digital pin can be varied using the potentiometer




4.Sensor LDR

LDR Module - LM393

Secara internal, LDR tersusun dari bahan semikonduktor fotokonduktif (biasanya cadmium sulfide CdS) yang resistansinya berubah tergantung jumlah foton (cahaya) yang diterima

data sheet

  • Can be used to sense Light

  • Easy to use on Breadboard or Perf Board

  • Easy to use with Microcontrollers or even with normal Digital/Analog IC

  • Small, cheap and easily available

  • Available in PG5 ,PG5-MP, PG12, PG12-MP, PG20 and PG20-MP series





5. LED

LED (Light Emitting Diode) adalah dioda semikonduktor yang bisa memancarkan cahaya ketika dialiri arus listrik maju (forward bias).

Ketika arus listrik mengalir dari anoda ke katoda, elektron dari pita konduksi bertemu dengan hole (lubang elektron) → menghasilkan energi dalam bentuk cahaya (foton)

Ciri utama:

  • Membutuhkan arus maju (DC).

  • Polaritas penting → salah pasang → tidak menyala.

Pin LED

Data sheet

6.Buzzer

Buzzer adalah komponen elektromekanis atau elektronik yang menghasilkan suara ketika dialiri arus listrik.


Terdapat 2 jenis buzzer:

Jenis Buzzer

Prinsip Kerja

Active Buzzer

Memiliki osilator internal → langsung berbunyi saat diberi tegangan.

Passive Buzzer

Tidak memiliki osilator → perlu sinyal frekuensi (PWM) agar berbunyi.

Active Buzzer lebih mudah dipakai untuk bunyi sederhana.
Passive Buzzer cocok untuk suara dengan nada/melodi.

Pin 

Data sheet

6. OLED 1306


LCD 16x2 I2C adalah modul tampilan karakter yang memiliki 2 baris × 16 karakter per baris, menggunakan protokol I2C agar jumlah pin lebih sedikit.

Prinsip kerja:

  • Mikrokontroler mengirimkan data karakter melalui I2C ke chip I2C backpack (biasanya PCF8574).

  • Chip PCF8574 akan menerjemahkan data tersebut menjadi sinyal untuk mengontrol LCD (menggantikan 8-bit parallel biasa → jadi cukup 2 kabel: SDA & SCL).

Data sheet

• Resolution: 128 x 64 dot matrix panel 

• Power supply o VDD = 1.65V to 3.3V for IC logic o VCC = 7V to 15V for Panel driving 

• For matrix display o OLED driving output voltage, 15V maximum o Segment maximum source current: 100uA o Common maximum sink current: 15mA o 256 step contrast brightness current control 

• Embedded 128 x 64 bit SRAM display buffer 

• Pin selectable MCU Interfaces: o 8-bit 6800/8080-series parallel interface o 3 /4 wire Serial Peripheral Interface o I2C Interface 

• Screen saving continuous scrolling function in both horizontal and vertical direction 

• RAM write synchronization signal Programmable Frame Rate and Multiplexing Ratio Row Re-mapping and Column Re-mapping On-Chip Oscillator 

• Chip layout for COG & COF 

• Wide range of operating temperature: -40°C to 85°C

LCD akan menampilkan karakter alfanumerik atau simbol sesuai kode ASCII yang dikirim.

PIN

Bagian utama LCD 16x2 I2C:

  1. LCD 16x2 → Layar dengan 16 karakter per baris × 2 baris.

  2. Driver IC HD44780 → Kontrol karakter di LCD.

  3. I2C Backpack (PCF8574) → Konversi dari I2C ke parallel 8-bit untuk LCD.

  4. Potensiometer trimpot → Mengatur kontras layar.

  5. Resistor + LED → Untuk backlight.

Data sheet

7. Motor Servo

Motor servo adalah aktuator berputar yang digunakan untuk mengontrol posisi sudut dengan presisi tinggi. Di dalamnya

terdapat motor DC kecil, gearbox, dan rangkaian kontrol elektronik.

TowerPro SG-90 Features

  • Operating Voltage is +5V typically

  • Torque: 2.5kg/cm

  • Operating speed is 0.1s/60°

  • Gear Type: Plastic

  • Rotation : 0°-180°

  • Weight of motor : 9gm

  • Package includes gear horns and screw



8. Resistor

Resistor adalah komponen elektronika pasif yang berfungsi menghambat arus listrik dalam suatu rangkaian. Nilainya dinyatakan dalam Ohm (Ω), dan ditentukan oleh kode warna atau ditulis langsung (pada jenis SMD).




  • Secara Seri: Nilai total = R1 + R2 + R3 ...

  • Secara Paralel: Nilai total = 1 / (1/R1 + 1/R2 + ...)

9. Push Button

Push button (tombol tekan) adalah sakelar (switch) mekanis yang menghubungkan atau memutuskan arus listrik saat ditekan. Umumnya digunakan dalam proyek mikrokontroler (Arduino, Raspberry Pi, dsb) sebagai input digital.



10.Battery Socket

Battery socket atau battery holder adalah wadah atau konektor khusus untuk menempatkan dan menyambungkan baterai ke rangkaian listrik. Fungsinya adalah mempermudah penggantian baterai dan menyambungkan daya ke perangkat elektronik dengan aman.




4. Landasan Teori[Kembali]


4.1 General Input Output 

        Input adalah semua data dan perintah yang dimasukkan ke dalam memori untuk diproses lebih lanjut oleh mikroprosesor. Sebuah perangkat input adalah komponen piranti keras yang memungkinkan user atau pengguna memasukkan data ke dalam mikroprosesor. Output adalah data hasil yang telah diproses. Perangkat output adalah semua komponen piranti keras yang menyampaikan informasi kepada orang-orang yang menggunakannya.

        Pada STM32 dan Raspberry Pi Pico pin input/output terdiri dari digital dan analog yang jumlah pin-nya tergantung jenis mikrokontroller yang digunakan. Input digital digunakan untuk mendeteksi perubahan logika biner pada pin tertentu. Adanya input digital memungkinkan mikrokontroler untuk dapat menerjemahkan 0V menjadi logika LOW dan 5V menjadi logika HIGH. Membaca sinyal digital pada mikrokontroller dapat menggunakan sintaks digitalRead(pin);

        Output digital terdiri dari dua buah logika, yaitu kondisi logika HIGH dan kondisi logika LOW. Untuk menghasilkan output kita dapat menggunakan sintaks digitalWrite(pin,nilai); yang sebelumnya pin sudah diset ke mode OUTPUT, lalu parameter kedua adalah set nilai HIGH atau LOW. Apabila pin diset dengan nilai HIGH, maka voltase pin tersebut akan diset ke 5V atau 3.3V dan bila pin diset ke LOW, maka voltase pin tersebut akan diset ke 0V

4.2 PWM

    PWM (Pulse Width Modulation) adalah salah satu teknik modulasi dengan mengubah lebar pulsa (duty cylce) dengan nilai amplitudo dan frekuensi yang tetap. Satu siklus pulsa merupakan kondisi high kemudian berada di zona transisi ke kondisi low. Lebar pulsa PWM berbanding lurus dengan amplitudo sinyal asli yang belum termodulasi.

    Duty Cycle adalah perbandingan antara waktu ON (lebar pulsa High) dengan perioda. Duty Cycle biasanya dinyatakan dalam bentuk persen (%).

Gambar 1. Duty Cycle

Duty Cycle = tON / ttotal
Ton = Waktu ON atau Waktu dimana tegangan keluaran berada pada posisi tinggi (high atau 1)
Toff = Waktu OFF atau Waktu dimana tegangan keluaran berada pada posisi rendah (low atau 0)
Ttotal = Waktu satu siklus atau penjumlahan antara Ton dengan Toff atau disebut juga dengan “periode satu gelombang”
    PWM pada STM32 dihasilkan menggunakan timer internal yang berfungsi sebagai penghitung waktu dengan berbagai mode operasi. Mikrokontroler ini memiliki empat timer 16-bit (TIM1–TIM4), yang dapat dikonfigurasi untuk menghasilkan sinyal dengan frekuensi dan duty cycle tertentu. Timer bekerja dengan menghitung hingga nilai tertentu berdasarkan frekuensi clock, lalu mengubah status register untuk menghasilkan gelombang persegi.
    STM32 memiliki 15 pin yang mendukung PWM, beberapa di antaranya berasal dari timer tingkat lanjut seperti TIM1, yang memiliki fitur tambahan seperti complementary output. Selain menghasilkan sinyal PWM, timer juga bisa digunakan untuk mengukur sinyal eksternal (input capture), menghasilkan sinyal berbasis waktu (output compare), dan membuat satu pulsa berdasarkan trigger (one pulse mode). PWM sering digunakan untuk mengontrol kecepatan motor, mengatur kecerahan LED, dan berbagai aplikasi berbasis waktu lainnya.
    Pada Raspberry Pi Pico, terdapat blok PWM yang terdiri dari 8 unit (slice), dan masing-masing slice dapat mengendalikan dua sinyal PWM atau mengukur frekuensi serta duty cycle dari sinyal input. Dengan total 16 output PWM yang dapat dikontrol, semua 30 pin GPIO bisa digunakan untuk PWM. Setiap slice memiliki fitur utama seperti penghitung 16-bit, pembagi clock presisi, dua output independen dengan duty cycle 0–100%, serta mode pengukuran frekuensi dan duty cycle. PWM pada Raspberry Pi Pico juga mendukung pengaturan fase secara presisi serta dapat diaktifkan atau dinonaktifkan secara bersamaan melalui satu register kontrol global, sehingga memungkinkan sinkronisasi beberapa output untuk aplikasi yang lebih kompleks.

4.3 ADC
    ADC atau Analog to Digital Converter merupakan salah satu perangkat elektronika yang digunakan sebagai penghubung dalam pemrosesan sinyal analog oleh sistem digital. Fungsi utama dari fitur ini adalah mengubah sinyal masukan yang masih dalam bentuk sinyal analog menjadi sinyal digital dengan bentuk kode-kode digital.
    Pada mikrokontroler STM32, terdapat dua ADC (Analog-to-Digital Converter) 12-bit yang masing-masing memiliki hingga 16 kanal eksternal. ADC ini dapat beroperasi dalam mode single-shot atau scan mode. Pada scan mode, konversi dilakukan secara otomatis pada sekelompok input analog yang dipilih. Selain itu, ADC ini memiliki fitur tambahan seperti simultaneous sample and hold, interleaved sample and hold, serta single shunt. ADC juga dapat dihubungkan dengan DMA untuk meningkatkan efisiensi transfer data. Mikrokontroler ini dilengkapi dengan fitur analog watchdog yang memungkinkan pemantauan tegangan hasil konversi dengan akurasi tinggi, serta dapat menghasilkan interupsi jika tegangan berada di luar ambang batas yang telah diprogram. Selain itu, ADC dapat disinkronkan dengan timer internal (TIMx dan TIM1) untuk memulai konversi, pemicu injeksi, serta pemicu DMA, sehingga memungkinkan aplikasi untuk melakukan konversi ADC secara terkoordinasi dengan timer.
    Raspberry Pi Pico memiliki empat ADC (Analog-to-Digital Converter) 12-bit dengan metode SAR, tetapi hanya tiga kanal yang dapat digunakan secara eksternal, yaitu ADC0, ADC1, dan ADC2, yang terhubung ke pin GP26, GP27, dan GP28. Kanal keempat (ADC4) digunakan secara internal untuk membaca suhu dari sensor suhu bawaan. Konversi ADC dapat dilakukan dalam tiga mode: polling, interrupt, dan FIFO dengan DMA. Kecepatan konversi ADC adalah 2μs per sampel atau 500 ribu sampel per detik (500kS/s). Mikrocontroller RP2040 berjalan pada frekuensi 48MHz yang berasal dari USB PLL, dan setiap konversi ADC membutuhkan 96 siklus CPU, sehingga waktu samplingnya adalah 2μs per sampel.

4.4 INTERRUPT
    Interrupt adalah mekanisme yang memungkinkan suatu instruksi atau perangkat I/O untuk menghentikan sementara eksekusi normal prosesor agar dapat diproses lebih dulu seperti memiliki prioritas tertinggi. Misalnya, saat prosesor menjalankan tugas utama, ia juga dapat terus memantau apakah ada kejadian atau sinyal dari sensor yang memicu interrupt. Ketika terjadi interrupt eksternal, prosesor akan menghentikan sementara tugas utamanya untuk menangani interrupt terlebih dahulu, kemudian melanjutkan eksekusi normal setelah selesai menangani interrupt tersebut. Fungsi yang menangani interrupt disebut Interrupt Service Routine (ISR), yang dieksekusi secara otomatis setiap kali interrupt terjadi.
    Pada STM32F103C8, semua pin GPIO dapat digunakan sebagai pin interrupt, berbeda dengan Arduino Uno yang hanya memiliki pin tertentu (misalnya pin 2 dan 3). Untuk mengaktifkan interrupt di STM32 menggunakan Arduino IDE, digunakan fungsi attachInterrupt(digitalPinToInterrupt(pin), ISR, mode). Parameter pin menentukan pin mana yang digunakan untuk interrupt, ISR adalah fungsi yang dijalankan saat interrupt terjadi, dan mode menentukan jenis perubahan sinyal yang memicu interrupt. Mode yang tersedia adalah RISING (dari LOW ke HIGH), FALLING (dari HIGH ke LOW), dan CHANGE (baik dari LOW ke HIGH maupun HIGH ke LOW). Saat menggunakan lebih dari satu interrupt secara bersamaan, terkadang perlu memperhatikan batasan tertentu dalam pemrograman.
    Pada RP2040, setiap inti prosesor dilengkapi dengan ARM Nested Vectored Interrupt Controller (NVIC) yang memiliki 32 jalur interrupt. Namun, hanya 26 jalur pertama yang digunakan, sedangkan jalur IRQ 26 hingga 31 tidak aktif. Setiap NVIC menerima interrupt yang sama, kecuali untuk GPIO, di mana setiap bank GPIO memiliki satu interrupt per inti. Ini berarti, misalnya, core 0 dapat menerima interrupt dari GPIO 0 di bank 0, sementara core 1 menerima interrupt dari GPIO 1 di bank yang sama secara independen. Jika diperlukan, inti prosesor masih bisa dipaksa masuk ke interrupt handler dengan menulis bit 26 hingga 31 pada register NVIC ISPR.

4.5 MILLIS
    Fungsi millis() pada mikrokontroler, seperti pada platform Arduino dan STM32 (dengan HAL), digunakan untuk menghitung waktu dalam milidetik sejak perangkat mulai berjalan. Berbeda dengan delay(), yang menghentikan eksekusi program selama waktu tertentu, millis() memungkinkan sistem untuk menjalankan beberapa tugas secara bersamaan tanpa menghentikan proses lainnya. Hal ini berguna dalam aplikasi yang memerlukan multitasking berbasis waktu, seperti pengendalian sensor, komunikasi serial, atau implementasi sistem real-time. Dalam STM32 dengan HAL, millis() dapat diimplementasikan menggunakan HAL_GetTick(), yang mengandalkan interrupt timer internal untuk mencatat waktu yang terus berjalan sejak mikrokontroler diaktifkan.
    Sementara itu, pada platform seperti Raspberry Pi Pico yang sering diprogram menggunakan MicroPython, fungsi utime.ticks_ms() menyediakan fungsionalitas yang sepadan. Fungsi ini mengembalikan nilai penghitung milidetik yang bersifat monotonik (terus bertambah) sejak sistem dimulai atau modul utime dimuat. Sama seperti millis() dan HAL_GetTick(), nilai ticks_ms() juga akan mengalami wrap-around (kembali ke nol) setelah mencapai batasnya, sehingga penggunaan fungsi utime.ticks_diff() menjadi penting untuk perhitungan selisih waktu yang akurat dan aman terhadap overflow. Dengan demikian, utime.ticks_ms() memungkinkan implementasi pola penjadwalan dan delay non-blocking yang serupa untuk menciptakan aplikasi yang responsif di lingkungan MicroPython.

4.6 UART (Universal Asynchronous Receiver Transmitter)

    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.

   

Gambar 1. 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, kemudia di transfer secara parallel ke data bus penerima.

4.7 I2C (Inter-Integrated Circuit)
    
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.


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.8 Raspberry Pi Pico
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

1. RAM (Random Access Memory)
Raspberry Pi Pico dilengkapi dengan 264KB SRAM on-chip. Kapasitas RAM yang lebih besar ini memungkinkan Pico menjalankan aplikasi yang lebih kompleks dan menyimpan data lebih banyak.
2. Memori Flash Eksternal
Raspberry Pi Pico tidak memiliki ROM tradisional. Sebagai gantinya, ia menggunakan memori flash eksternal. Kapasitas memori flash ini dapat bervariasi, umumnya antara 2MB hingga 16MB, tergantung pada konfigurasi. Memori flash ini digunakan untuk menyimpan firmware dan program pengguna. Penggunaan memori flash eksternal pada Pico memberikan fleksibilitas lebih besar dalam hal kapasitas penyimpanan program.
3. Crystal Oscillator
Raspberry Pi Pico menggunakan crystal oscillator untuk menghasilkan sinyal clock yang stabil. Sinyal clock ini penting untuk mengatur kecepatan operasi mikrokontroler dan komponen lainnya.
4. Regulator Tegangan
Untuk memastikan pasokan tegangan yang stabil ke mikrokontroler.
5. Pin GPIO (General Purpose Input/Output):
Untuk menghubungkan Pico ke berbagai perangkat eksternal seperti sensor, motor, dan LED.


4.9 STM32F103C8
    STM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini sering digunakan dalam pengembangan sistem tertanam karena kinerjanya yang baik, konsumsi daya yang rendah, dan kompatibilitas dengan berbagai protokol komunikasi. Pada praktikum ini, kita menggunakan STM32F103C8 yang dapat diprogram menggunakan berbagai metode, termasuk komunikasi serial (USART), SWD (Serial Wire Debug), atau JTAG untuk berhubungan dengan komputer maupun perangkat lain. Adapun spesifikasi dari STM32F4 yang digunakan dalam praktikum ini adalah sebagai berikut:
Gambar 3. STM32F103C8

1. RAM (Random Access Memory)
STM32F103C8 dilengkapi dengan 20KB SRAM on-chip. Kapasitas RAM ini
memungkinkan mikrokontroler menjalankan berbagai aplikasi serta menyimpan data sementara selama eksekusi program.
2. Memori Flash Internal
STM32F103C8 memiliki memori flash internal sebesar 64KB atau 128KB, yang digunakan untuk menyimpan firmware dan program pengguna. Memori ini memungkinkan penyimpanan kode program secara permanen tanpa memerlukan media penyimpanan eksternal.
3. Crystal Oscillator
STM32F103C8 menggunakan crystal oscillator eksternal (biasanya 8MHz) yang bekerja dengan PLL untuk meningkatkan frekuensi clock hingga 72MHz. Sinyal clock yang stabil ini penting untuk mengatur kecepatan operasi mikrokontroler dan komponen lainnya.
4. Regulator Tegangan
STM32F103C8 memiliki sistem pengaturan tegangan internal yang memastikan pasokan daya stabil ke mikrokontroler. Tegangan operasi yang didukung berkisar antara 2.0V hingga 3.6V.
5. Pin GPIO (General Purpose Input/Output)
STM32F103C8 memiliki hingga 37 pin GPIO yang dapat digunakan untuk menghubungkan berbagai perangkat eksternal seperti sensor, motor, LED, serta komunikasi dengan antarmuka seperti UART, SPI, dan I²C.

5. Flowchart dan Listing Program[Kembali]

Flowchart Smart Egg Incubator

Diagram Blok Smart Egg Incubator
















LISTING PROGRAM - RASPBERRY PI PICO (Software: Thonny IDE)

from machine import Pin, ADC, UART, PWM, I2C

from ssd1306 import SSD1306_I2C

import dht

import time

 

# --- OLED via I2C ---

i2c = I2C(1, scl=Pin(15), sda=Pin(14), freq=400000)

oled = SSD1306_I2C(128, 64, i2c)

 

# --- Sensor ---

ldr = ADC(Pin(26))                  # LDR on GP26 (ADC0)

dht_sensor = dht.DHT11(Pin(27))     # DHT11 on GP27

led_pwm = PWM(Pin(28))              # LED PWM on GP28

led_pwm.freq(1000)

buzzer = Pin(13, Pin.OUT)           # Buzzer on GP13

 

# --- UART to STM32 ---

uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))

 

# --- Thresholds ---

lux_threshold = 200

uart_connected = False

gas_ppm = 15.0

temp = 0

hum = 0

lux = 0

 

# --- OLED Display helper ---

def show_values_on_oled():

    oled.fill(0)

    oled.text("DATA INCUBATOR", 0, 0)

    oled.text("Gas : {:.1f} ppm".format(gas_ppm), 0, 16)

    oled.text("Temp: {} C".format(temp), 0, 32)

    oled.text("Hum : {} %".format(hum), 0, 40)

    oled.text("Lux : {}".format(lux), 0, 56)

    oled.show()

 

# --- Read DHT11 ---

def read_dht_sensor():

    try:

        dht_sensor.measure()

        t = dht_sensor.temperature()

        h = dht_sensor.humidity()

        return t, h

    except Exception as e:

        print("DHT11 Error:", e)

        return None, None

 

# --- Read LDR ---

def read_lux():

    raw = ldr.read_u16()

    return int((raw / 65535) * 1000)

 

# --- LED brightness controller ---

def control_led(lux_val):

    if lux_val > lux_threshold:

        duty = int((lux_threshold - lux_val) / lux_threshold * 65535)

        led_pwm.duty_u16(duty)

    else:

        led_pwm.duty_u16(0)

 

# --- Startup Display ---

oled.fill(0)

oled.text("HELLO GUYS", 0, 0)

oled.text("SMART EGG", 0, 16)

oled.text("INCUBATOR", 0, 32)

oled.text("STARTING...", 0, 48)

oled.show()

time.sleep(3)

 

# --- Check UART on startup ---

uart.write("PING\n")

t_start = time.ticks_ms()

while time.ticks_diff(time.ticks_ms(), t_start) < 2000:

    if uart.any():

        line = uart.readline()

        if line and b"PONG" in line:

            uart_connected = True

            print("UART connected!")

            break

 

if not uart_connected:

    print("UART not responding")

 

# --- Main Loop ---

while True:

    # 1. LDR

    lux = read_lux()

    control_led(lux)

 

    # 2. DHT

    temp, hum = read_dht_sensor()

    if temp is None or hum is None:

        temp, hum = 0, 0

 

    # 3. Kirim ke STM32

    if uart_connected:

        uart.write("TEMP_HUM:{},{}\n".format(temp, hum))

        uart.write("LUX:{}\n".format(lux))

 

    # 4. Baca dari STM32 (Gas PPM)

    if uart.any():

        try:

            line = uart.readline()

            if line:

                decoded = line.decode().strip()

                print("UART:", decoded)

                if decoded.startswith("GAS_PPM:"):

                    gas_ppm = float(decoded.split(":")[1])

                    if gas_ppm > 0:

                        buzzer.value(1)

                        time.sleep(1)

                        buzzer.value(0)

        except Exception as e:

            print("UART Read Error:", e)

 

    # 5. OLED Update

    show_values_on_oled()

    time.sleep(2)


- STM32F103C8T6 (Software: Arduino IDE)

#include <U8g2lib.h>
#include <Servo.h>

// OLED I2C
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

// Servo
Servo myServo;
const int SERVO_PIN = PA8;

// MQ-2 Gas Sensor
const int MQ2_ANALOG_PIN = PA0;
float calibrationFactorMQ2 = 1.0;
float gasThreshold = 15.0; // ppm

// Tombol kontrol sistem
const int BUTTON_PIN = PA11;
volatile bool systemOn = false;

// UART ke Raspberry Pi Pico
#define serialComm Serial1

// Status data
bool uartConnected = false;
bool gasBahayaAktif = false;
String gasStatus = "Aman";
String tempStatus = "-";
String humStatus  = "-";
String luxStatus  = "-";

// Batas normal sensor
float minTemp = 32.0;
float maxTemp = 39.0;
float minHumidity = 20.0;
float maxHumidity = 80.0;
int luxThreshold = 200;

void setup() {
  Serial.begin(9600);
  serialComm.begin(9600);

  // OLED
  u8g2.begin();
  u8g2.setFont(u8g2_font_ncenB08_tr);

  // Tampilan awal
  u8g2.clearBuffer();
  u8g2.drawStr(0, 10, "HELLO GUYS");
  u8g2.drawStr(0, 25, "SMART EGG");
  u8g2.drawStr(0, 40, "INCUBATOR");
  u8g2.drawStr(0, 55, "STARTING...");
  u8g2.sendBuffer();
  delay(2000);

  // Servo awal
  myServo.attach(SERVO_PIN);
  myServo.write(0);

  // Tombol
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), toggleSystem, FALLING);

  // Tampilkan status awal
  u8g2.clearBuffer();
  u8g2.drawStr(0, 10, "System OFF. Press BTN");
  u8g2.sendBuffer();
}

void loop() {
  // Baca data dari Pi Pico jika ada
  if (serialComm.available()) {
    String received = serialComm.readStringUntil('\n');
    Serial.println("From Pi Pico: " + received);

    if (received.startsWith("TEMP_HUM:")) {
      String data = received.substring(received.indexOf(':') + 1);
      int idx = data.indexOf(',');
      float temp = data.substring(0, idx).toFloat();
      float hum = data.substring(idx + 1).toFloat();

      if (temp < minTemp) tempStatus = "Rendah";
      else if (temp > maxTemp) tempStatus = "Tinggi";
      else tempStatus = "Normal";

      if (hum < minHumidity) humStatus = "Rendah";
      else if (hum > maxHumidity) humStatus = "Tinggi";
      else humStatus = "Normal";
    } else if (received.startsWith("LUX:")) {
      int luxVal = received.substring(received.indexOf(':') + 1).toInt();
      luxStatus = (luxVal < luxThreshold) ? "Rendah" : "Normal";
    }
  }

  if (systemOn) {
    // Baca MQ2
    int analogValue = analogRead(MQ2_ANALOG_PIN);
    float ppm = map(analogValue, 0, 4095, 0, 500) * calibrationFactorMQ2;

    if (ppm > gasThreshold) {
      gasStatus = "Bahaya";
      if (!gasBahayaAktif) {
        myServo.write(90);
        gasBahayaAktif = true;
      }

      String msg = "GAS_PPM:" + String(ppm, 2);
      serialComm.println(msg);
    } else {
      gasStatus = "Aman";
      if (gasBahayaAktif) {
        myServo.write(0);
        gasBahayaAktif = false;
      }
    }

    // Tampilkan ke OLED
    u8g2.clearBuffer();
    u8g2.drawStr(0, 0, "Status Incubator:");
    u8g2.setCursor(0, 12); u8g2.print("Gas       : "); u8g2.print(gasStatus);
    u8g2.setCursor(0, 24); u8g2.print("Suhu      : "); u8g2.print(tempStatus);
    u8g2.setCursor(0, 36); u8g2.print("Kelembapan: "); u8g2.print(humStatus);
    u8g2.setCursor(0, 48); u8g2.print("Kecerahan : "); u8g2.print(luxStatus);
    u8g2.sendBuffer();

  } else {
    // Saat sistem OFF
    u8g2.clearBuffer();
    u8g2.drawStr(0, 10, "System OFF. Press BTN");
    u8g2.sendBuffer();
  }

  delay(500);
}

void toggleSystem() {
  static unsigned long lastPress = 0;
  unsigned long now = millis();
  if (now - lastPress > 200) {
    systemOn = !systemOn;
    Serial.println(systemOn ? "System ON" : "System OFF");

    if (!systemOn) {
      myServo.write(0);
      gasBahayaAktif = false;
    } else {
      // Cek koneksi UART saat nyala
      u8g2.clearBuffer();
      u8g2.drawStr(0, 10, "Cek koneksi UART...");
      u8g2.sendBuffer();

      serialComm.println("UART_TEST");
      uartConnected = false;

      unsigned long startTime = millis();
      while (millis() - startTime < 3000) {
        if (serialComm.available()) {
          String msg = serialComm.readStringUntil('\n');
          if (msg.length() > 0) {
            uartConnected = true;
            break;
          }
        }
      }

      u8g2.clearBuffer();
      if (uartConnected) {
        u8g2.drawStr(0, 10, "UART CONNECTED!");
      } else {
        u8g2.drawStr(0, 10, "UART NOT CONNECTED");
        u8g2.drawStr(0, 30, "Check Wiring!");
      }
      u8g2.sendBuffer();
      delay(2000);
    }

    lastPress = now;
  }
}

6. Rangkaian Simulasi dan Prinsip Kerja[Kembali]

Rangkaian Skematik Smart Egg Incubator



Rangkaian Fisik Smart Egg Incubator



PRINSIP KERJA:

Pada rangkaian demo project bernama "Smart Egg incubator", dimana akan melakukan monitoring dan kontrol sistem dengan komunikasi UART dari 2 mikrokontroler Raspberry Pi Pico dan STM32F103C8.


- Komponen dan kondisi Node STM32F103C8T6 (Software: Arduino IDE)

1. Gas sensor Mq-2 : Memberi ambang batas nilai ppm di 120ppm, jika melebihi itu, buzzer pada raspberry akan aktif. Pada OLED di STM32 akan memberikan notifikasi "terdapat gas berbahaya". Sementara pada OLED di Raspberry akan memberikan data nilai PPM di baris ketiga-nya. Dan juga memberikan kontrol pada servo motor, dimana melakukan pergeseran lengan nya sebesar

Jadi pada node ini: 

Input Sensor Gas Mq-2,
Output berupa motor servo dan OLED


- Sensor dan Output pada Raspberry Pi pico (software: Thonny IDE)

1. LDR photoresistor sensor: Mengindikasikan bahwa tingkat kecerahan pada incubator terpenuhi (set default = 200lux). Jika tingkat kecerahan incubator kurang, maka memberikan data pada OLED di Raspberry memberikan data nilai LUX nya, lalu pada LED nya akan menambahkan kecerahannya seiring kebutuhan lux.

2. DHT11 Sensor: Mendeteksi tingkatan suhu incubator (32-39 derajat celcius). Lalu untuk kelembapan berada pada 0-20%, jika di luar itu maka akan tampilkan pada OLED STM32 berupa "Suhu terlalu rendah/suhu terlalu tinggi" lalu pada OLED raspberry akan menuunjukkan data berapa suhu dan kelembapan yang terukur. Dan ketika suhu terlalu rendah atau terlalu tinggi maka akan menggerakkan servo agar ventilasi terbuka dengan menggeser lengannya 90 derajat searah jarum jam (dari 0 derajat ke 270 derajat)

Jadi pada node ini terdiri dari: 

Input: Sensor DHT11, Sensor LDR,
Output: Buzzer, LED-Kuning, dann OLED


7. Video Simulasi[Kembali]


Datasheet Raspberry Pi Pico RP2040 [Download]
Datasheet STM32F103C8T6 [Download]
Datasheet Sensor Gas MQ-2 [Download]
Datasheet LDR photoresistor [Download]
Datasheet LED [Download]
Datasheet Buzzer [Download]
Datasheet OLED 1306 [Download]
Datasheet Motor Servo SG90 [Download]
Datasheet Resistor [Download]
Datasheet Push Button [Download]
Download Html [Download]
Download Video [Download]
Download Skematik [Download]
Download Program Raspberry Pi Pico [Download]
Download Program STM32F103C8 [Download]










LAPORAN AKHIR DEMO PROJECT PRAKTIKUM MIKROPROSESOR & MIKROKONTROLER

[KEMBALI KE MENU SEBELUMNYA] DAFTAR ISI 1. Pendahuluan 2. Tujuan 3. Alat dan Komponen 4. Landasan Teori 5. Flowchart dan ...