Fetal Heart Simulator Berbasis ATMega 328p dengan Interface Arduino Uno

 

HEARTBEAT SIMULATOR UNTUK MENSIMULASIKAN DETAK JANTUNG JANIN BERBASIS MIKROKONTROLLER

Benaya Revanico H*), Frisca Syaharani**), Nasfa Tri Utama***), Salsabila Chairunisa****)



Jurusan Teknik Elektro, Prodi Teknologi Rekayasa Elektronika, Politeknik Negeri Semarang 2024
Jl. Prof. Soedarto, Tembalang, Kec. Tembalang, Kota Semarang, Jawa Tengah, 50275

Abstrak Proyek ini bertujuan merancang dan membuat alat kalibrasi portabel berbasis mikrokontroler Arduino Uno R3 untuk mendeteksi dan mensimulasikan detak jantung janin pada frekuensi 30-240 bpm. Alat ini menggunakan komponen seperti relay, LCD 16x2, dan baterai lithium untuk menghasilkan simulasi detak jantung yang akurat sesuai nilai bpm yang ditampilkan. Dengan desain sederhana dan portabel, alat ini dirancang untuk menguji akurasi perangkat medis seperti fetal doppler dan kardiotokografi (CTG), terutama di fasilitas kesehatan daerah terpencil. Hasil pengujian menunjukkan bahwa alat ini mampu menghasilkan simulasi detak jantung yang sesuai dengan nilai referensi, menawarkan solusi ekonomis untuk proses kalibrasi yang lebih efektif, terjangkau, dan mendukung peningkatan kualitas layanan kesehatan ibu dan janin.

 

Keywords: Arduino Uno R3, heart simulator, relay driver 5V, portable calibration, LCD\


I.    PENDAHULUAN

1.1  Latar Belakang

Pemantauan detak jantung janin merupakan bagian penting dalam perawatan antenatal. Salah satu alat yang umum digunakan untuk tujuan ini adalah Doppler fetal monitor, yang memungkinkan tenaga medis mendeteksi dan memonitor detak jantung janin secara non-invasif. Namun, untuk memastikan akurasi dan keandalan alat ini, diperlukan proses kalibrasi secara berkala. Kalibrasi yang tepat sangat penting untuk mencegah kesalahan pembacaan yang dapat berakibat pada diagnosis yang kurang akurat.  

Saat ini, belum banyak tersedia perangkat yang dirancang khusus untuk kebutuhan kalibrasi Doppler fetal monitor. Oleh karena itu, diperlukan pengembangan alat yang mampu mensimulasikan sinyal detak jantung janin secara realistis. Alat ini, yang disebut fetal doppler simulator, dapat digunakan untuk memastikan bahwa Doppler fetal monitor bekerja dengan akurasi optimal. Dengan adanya simulator ini, proses kalibrasi dapat dilakukan secara lebih efisien, akurat, dan hemat biaya, sehingga membantu menjaga kualitas layanan kesehatan maternal dan janin.

Dengan adanya alat ini, proses kalibrasi perangkat medis dapat dilakukan dengan lebih mudah, cepat, dan akurat, mendukung peningkatan kualitas layanan kesehatan ibu dan janin. Berdasarkan kebutuhan tersebut, penulis merancang alat dengan judul “Alat Kalibrasi Deteksi Detak Jantung Janin Portabel Berbasis Mikrokontroler”.

1.2  Perumusan Masalah

Bagaimana cara kerja alat tombol sebagai masukan?

Bagaimana cara kerja lcd sebagai luaran?

Apa fungsi relay sebagai luaran?

Bagaimana cara kerja alat tersebut?

Bisakah fetal doppler simulator mengkalibrasi fetal doppler monitor?

1.     1.3  Tujuan

Tujuan dari pembuatan alat ini adalah sebagai berikut:

1.     Meningkatkan keakuratan dan keandalan perangkat medis seperti fetal doppler dan kardiotokografi(CTG) sehingga memberikan hasil pengukuran detak janin yang akurat dengan proses kalibrasi yang efektif.

2.     Menghadirkan alternatif terjangkau alat kalibrasi yang ekonomis dibandingkan dengan perangkat kalibrasi yang ada di pasaran, sehingga dapat diakses oleh fasilitas kesehatan dengan keterbatasan anggaran.

2.     METODE PENELITIAN

Metode yang dilakukan dalam penelitian ini terdiri dari beberapa tahap, yaitu: perancangan hardware, perancangan software.

2.1  Perancangan Hardware

Perancangan hardware pada alat ini menggunakan beberapa modul rangkaian diantaranya adalah rangkaian microcontroller ATMega328p , sedangkan perangkat lunak yang digunakan adalah software pemrograman CV AVR sebagai pengelolah data pada alat.

2.2   Rangkaian Microcontroller

2.2.1       Arduino UNO:

a.      Pin 5 (Relay): Pin ini terhubung ke pin kontrol relay pada modul relay untuk mengendalikan perangkat eksternal (seperti motor atau lampu). Pin ini akan memberikan sinyal HIGH atau LOW untuk mengaktifkan atau menonaktifkan relay.

b.     Pin 2, 3, 4 (Tombol): Pin ini terhubung ke tiga tombol (berwarna hijau, kuning, dan merah) yang digunakan sebagai input untuk sistem. Masing-masing tombol berfungsi untuk memberikan perintah atau sinyal tertentu kepada sistem.

c.      Pin A0 (LCD): Pin ini menghubungkan Arduino ke layar LCD, dimana data atau informasi akan ditampilkan, seperti pesan selamat datang ("Welcome Heart Simulator").

2.2.2       LCD (Liquid Crystal Display):

LCD digunakan untuk menampilkan pesan kepada pengguna, seperti "Welcome Heart Simulator." LCD ini dihubungkan ke pin A0 untuk pengendalian tampilan.

2.2.3       Relay:

Relay digunakan sebagai keluaran (output) untuk mengontrol perangkat lain (misalnya, motor atau lampu) berdasarkan perintah dari tombol atau kondisi yang ditentukan pada sistem. Relay dihubungkan ke pin 5 pada Arduino, yang memberikan sinyal untuk mengaktifkan atau menonaktifkan relay.

2.2.4       Tombol:

a.      Tombol Hijau (Pin 2): Tombol ini terhubung ke pin 2 dan digunakan untuk memberikan sinyal input pada sistem.

b.      Tombol Kuning (Pin 3): Tombol ini terhubung ke pin 3 dan juga memberikan sinyal input pada sistem.

c.      Tombol Merah (Pin 4): Tombol ini terhubung ke pin 4 dan digunakan untuk memberikan sinyal input, memungkinkan pengguna mengendalikan sistem atau memilih mode tertentu.

2.2.5        Sensor Daya (Battery atau Power Supply):

Daya untuk sistem ini disuplai dari sumber eksternal yang terhubung dengan Arduino untuk menjalankan seluruh rangkaian, termasuk sensor dan komponen lainnya.

Gambar Pengawatan
2.3 Program  Versi Arduino

#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>

// Inisialisasi LCD
hd44780_I2Cexp lcd;

// Definisi pin dan data
const int tombolKurangi = 2;   // Tombol 1 untuk mengurangi BPM
const int tombolTambah = 3;    // Tombol 2 untuk menambah BPM
const int tombolStartStop = 4; // Tombol 3 untuk start/stop relay
const int relayPin = 7;

int BPM = 90;                 // Nilai BPM awal
bool relayStatus = false;     // Status relay

// Karakter hati untuk animasi
byte heart1[8] = {
  0b00000,
  0b01010,
  0b11111,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000
};

byte heart2[8] = {
  0b00000,
  0b01010,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000,
  0b00000
};

void setup() {
  lcd.begin(16, 2);
  lcd.backlight();

  lcd.createChar(0, heart1);
  lcd.createChar(1, heart2);

  lcd.print("Heart Simulator");
  lcd.setCursor(0, 1);
  lcd.print("    Portable");
  delay(3000);
  lcd.clear();

  pinMode(tombolKurangi, INPUT_PULLUP);
  pinMode(tombolTambah, INPUT_PULLUP);
  pinMode(tombolStartStop, INPUT_PULLUP);
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW); // Relay mati pada kondisi awal

  tampilkanMenu();
}

void loop() {
  // Tombol 1 (mengurangi BPM)
  if (digitalRead(tombolKurangi) == LOW) {
    if (BPM > 30) { // Batas minimum BPM
      BPM -= 30;
      tampilkanMenu();
    }
    delay(200); // Debounce tombol
  }

  // Tombol 2 (menambah BPM)
  if (digitalRead(tombolTambah) == LOW) {
    if (BPM < 240) { // Batas maksimum BPM
      BPM += 30;
      tampilkanMenu();
    }
    delay(200); // Debounce tombol
  }

  // Tombol 3 (start/stop relay)
  if (digitalRead(tombolStartStop) == LOW) {
    relayStatus = !relayStatus; // Toggle status relay
    if (relayStatus) {
      aktifkanRelay();
    } else {
      matikanRelay();
    }
    delay(200); // Debounce tombol
  }

  // Jika relay aktif, animasi hati dan flip-flop relay
  if (relayStatus) {
    unsigned long intervalDetak = 60000 / BPM ; // Interval detak hati
    static unsigned long waktuTerakhirAnimasi = 0;
    static bool detakHati = false; // Status detak hati
    unsigned long waktuSekarang = millis();

    if (waktuSekarang - waktuTerakhirAnimasi >= intervalDetak) {
      waktuTerakhirAnimasi = waktuSekarang;
      detakHati = !detakHati; // Toggle status detak hati

      // Animasi hati di bawah "RUN"
      lcd.setCursor(12, 1); // Tepat di bawah "RUN"
      if (detakHati) {
        lcd.write((byte)0); // Animasi hati penuh
      } else {
        lcd.write((byte)1); // Animasi hati kecil
      }

      // Flip-flop relay
      digitalWrite(relayPin, !digitalRead(relayPin));
    }
  }
}

void tampilkanMenu() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SET BPM"); // Judul menu
  lcd.setCursor(0, 1);
  lcd.print("BPM = ");
  lcd.print(BPM); // Tampilkan nilai BPM yang dipilih

  if (relayStatus) { // Jika relay aktif, tampilkan "RUN"
    lcd.setCursor(12, 0); // Letakkan "RUN" di pojok kanan atas
    lcd.print("RUN");
    lcd.setCursor(12, 1); // Awal animasi hati
    lcd.write((byte)1); // Tampilkan hati kecil default
  }
}

void aktifkanRelay() {
  digitalWrite(relayPin, LOW); // Mulai dengan relay mati
  tampilkanMenu();
}

void matikanRelay() {
  digitalWrite(relayPin, LOW); // Matikan relay
  tampilkanMenu();
}

2.4 Program dengan AVR

#include <mega328p.h>  // Header untuk ATmega328P
#include <delay.h>     // Header untuk fungsi delay

#include <stdio.h>     // Untuk konversi integer ke string (sprintf)

// Definisi manual simbol port

#define PD0 (1 << 0)  // Pin 0 PORTD
#define PD1 (1 << 1)  // Pin 1 PORTD

#define PD2 (1 << 2)  // Pin 2 PORTD
#define PD3 (1 << 3)  // Pin 3 PORTD

#define PD4 (1 << 4)  // Pin 4 PORTD
#define PD5 (1 << 5)  // Pin 5 PORTD

#define PD6 (1 << 6)  // Pin 6 PORTD
#define PD7 (1 << 7)  // Pin 7 PORTD


#define PB0 (1 << 0)  // Pin 0 PORTB

#define PB1 (1 << 1)  // Pin 1 PORTB

// Definisi pin LCD

#define RS PD0
#define EN PD1

#define D4 PD2
#define D5 PD3

#define D6 PD4
#define D7 PD5


// Definisi pin tombol dan relay

#define tombolKurangi PD6
#define tombolTambah PD7

#define tombolStartStop PB0
#define relayPin PB1


// Variabel global

int BPM = 90;               // Nilai BPM awal
unsigned char relayStatus = 0; // Status relay (0: mati, 1: aktif)


// Prototipe fungsi

void initLCD();
void sendCommand(unsigned char cmd);

void sendData(unsigned char data);
void sendString(const char *str);

void tampilkanMenu();  // Tidak ada parameter lagi
void aktifkanRelay();

void matikanRelay();

// Fungsi utama

void main(void) {
    // Deklarasi variabel bpmStr sebelum digunakan

    char bpmStr[5]; // Buffer untuk string BPM
    

    // Inisialisasi pin LCD sebagai output
    DDRD |= RS | EN | D4 | D5 | D6 | D7; // Atur pin LCD sebagai output

    PORTD &= ~(RS | EN); // RS dan EN diatur LOW

    // Inisialisasi pin tombol sebagai input dengan pull-up

    DDRD &= ~(tombolKurangi | tombolTambah); // Input tombol
    PORTD |= tombolKurangi | tombolTambah;  // Aktifkan pull-up

    DDRB &= ~tombolStartStop;               // Input tombol
    PORTB |= tombolStartStop;               // Aktifkan pull-up


    // Inisialisasi pin relay sebagai output

    DDRB |= relayPin;          // Output relay
    PORTB &= ~relayPin;        // Relay mati awalnya


    // Inisialisasi LCD dan tampilkan menu awal

    initLCD();
    tampilkanMenu();  // Panggil fungsi tampilkanMenu tanpa argumen


    while (1) {

        // Deteksi tombol kurangi
        if (!(PIND & tombolKurangi)) {

            if (BPM > 30) BPM -= 30; // Kurangi BPM jika lebih besar dari 30
            tampilkanMenu();  // Panggil fungsi tampilkanMenu

            delay_ms(200); // Debounce tombol
        }


        // Deteksi tombol tambah

        if (!(PIND & tombolTambah)) {
            if (BPM < 240) BPM += 30; // Tambah BPM jika kurang dari 240

            tampilkanMenu();  // Panggil fungsi tampilkanMenu
            delay_ms(200); // Debounce tombol

        }

        // Deteksi tombol start/stop

        if (!(PINB & tombolStartStop)) {
            relayStatus = !relayStatus; // Toggle status relay

            if (relayStatus) {
                aktifkanRelay();

            } else {
                matikanRelay();

            }
            delay_ms(200); // Debounce tombol

        }

        // Animasi relay aktif

        if (relayStatus) {
            unsigned int interval = 60000 / BPM; // Interval detak berdasarkan BPM

            delay_ms(interval / 2);             // Delay sesuai interval
            PORTB ^= relayPin;                  // Toggle relay

        }
    }

}

// Fungsi untuk inisialisasi LCD

void initLCD() {
    delay_ms(20);        // Tunggu LCD siap

    sendCommand(0x02);   // Mode 4-bit
    sendCommand(0x28);   // 2 baris, mode 4-bit

    sendCommand(0x0C);   // Display ON, cursor OFF
    sendCommand(0x06);   // Auto increment

    sendCommand(0x01);   // Clear display
    delay_ms(2);         // Tunggu perintah selesai

}

// Fungsi untuk mengirim perintah ke LCD

void sendCommand(unsigned char cmd) {
    PORTD &= ~RS; // RS = 0 untuk perintah

    PORTD = (PORTD & 0x0F) | (cmd & 0xF0); // Kirim nibble atas
    PORTD |= EN; // EN = 1

    delay_us(1);        // Delay pendek
    PORTD &= ~EN; // EN = 0


    PORTD = (PORTD & 0x0F) | ((cmd << 4) & 0xF0); // Kirim nibble bawah

    PORTD |= EN; // EN = 1
    delay_us(1);

    PORTD &= ~EN; // EN = 0

    delay_ms(2);         // Tunggu perintah selesai

}

// Fungsi untuk mengirim data ke LCD

void sendData(unsigned char data) {
    PORTD |= RS; // RS = 1 untuk data

    PORTD = (PORTD & 0x0F) | (data & 0xF0); // Kirim nibble atas
    PORTD |= EN; // EN = 1

    delay_us(1);
    PORTD &= ~EN; // EN = 0


    PORTD = (PORTD & 0x0F) | ((data << 4) & 0xF0); // Kirim nibble bawah

    PORTD |= EN; // EN = 1
    delay_us(1);

    PORTD &= ~EN; // EN = 0

    delay_ms(2); // Tunggu data selesai

}

// Fungsi untuk mengirim string ke LCD

void sendString(const char *str) {
    while (*str) {

        sendData(*str++);
    }

}

// Fungsi untuk menampilkan menu

void tampilkanMenu() {
    char bpmStr[5]; // Buffer untuk string BPM

    sendCommand(0x01); // Clear display
    sendString("SET BPM");

    sendCommand(0xC0); // Pindah ke baris kedua
    sendString("BPM = ");

    
    // Konversi BPM ke string dan tampilkan

    sprintf(bpmStr, "%d", BPM); // Konversi BPM ke string
    sendString(bpmStr); // Tampilkan BPM


    if (relayStatus) {

        sendString(" RUN");
    }

}

// Fungsi untuk mengaktifkan relay

void aktifkanRelay() {
    PORTB |= relayPin; // Aktifkan relay

    tampilkanMenu(); // Tampilkan menu
}


// Fungsi untuk mematikan relay

void matikanRelay() {
    PORTB &= ~relayPin; // Matikan relay

    tampilkanMenu(); // Tampilkan menu
}


2.5 Program dengan bahasa Assembly


;CodeVisionAVR C Compiler V3.36 Evaluation
;(C) Copyright 1998-2019 Pavel Haiduc, HP InfoTech s.r.l.
;http://www.hpinfotech.com

;Build configuration    : Debug
;Chip type              : ATmega328P
;Program type           : Application
;Clock frequency        : 8.000000 MHz
;Memory model           : Small
;Optimize for           : Size
;(s)printf features     : int, width
;(s)scanf features      : int, width
;External RAM size      : 0
;Data Stack size        : 512 byte(s)
;Heap size              : 0 byte(s)
;Promote 'char' to 'int': Yes
;'char' is unsigned     : Yes
;8 bit enums            : Yes
;Global 'const' stored in FLASH: No
;Enhanced function parameter passing: Mode 2
;Enhanced core instructions: On
;Automatic register allocation for global variables: On
;Smart register allocation: On

#define _MODEL_SMALL_

#pragma AVRPART ADMIN PART_NAME ATmega328P
#pragma AVRPART MEMORY PROG_FLASH 32768
#pragma AVRPART MEMORY EEPROM 1024
#pragma AVRPART MEMORY INT_SRAM SIZE 2048
#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x100

#define CALL_SUPPORTED 1

.LISTMAC
.EQU EERE=0x0
.EQU EEWE=0x1
.EQU EEMWE=0x2
.EQU UDRE=0x5
.EQU RXC=0x7
.EQU EECR=0x1F
.EQU EEDR=0x20
.EQU EEARL=0x21
.EQU EEARH=0x22
.EQU SPSR=0x2D
.EQU SPDR=0x2E
.EQU SMCR=0x33
.EQU MCUSR=0x34
.EQU MCUCR=0x35
.EQU WDTCSR=0x60
.EQU UCSR0A=0xC0
.EQU UDR0=0xC6
.EQU SPL=0x3D
.EQU SPH=0x3E
.EQU SREG=0x3F
.EQU GPIOR0=0x1E

.DEF R0X0=R0
.DEF R0X1=R1
.DEF R0X2=R2
.DEF R0X3=R3
.DEF R0X4=R4
.DEF R0X5=R5
.DEF R0X6=R6
.DEF R0X7=R7
.DEF R0X8=R8
.DEF R0X9=R9
.DEF R0XA=R10
.DEF R0XB=R11
.DEF R0XC=R12
.DEF R0XD=R13
.DEF R0XE=R14
.DEF R0XF=R15
.DEF R0X10=R16
.DEF R0X11=R17
.DEF R0X12=R18
.DEF R0X13=R19
.DEF R0X14=R20
.DEF R0X15=R21
.DEF R0X16=R22
.DEF R0X17=R23
.DEF R0X18=R24
.DEF R0X19=R25
.DEF R0X1A=R26
.DEF R0X1B=R27
.DEF R0X1C=R28
.DEF R0X1D=R29
.DEF R0X1E=R30
.DEF R0X1F=R31

.EQU __SRAM_START=0x0100
.EQU __SRAM_END=0x08FF
.EQU __DSTACK_SIZE=0x0200
.EQU __HEAP_SIZE=0x0000
.EQU __CLEAR_SRAM_SIZE=__SRAM_END-__SRAM_START+1

.MACRO __CPD1N
CPI  R30,LOW(@0)
LDI  R26,HIGH(@0)
CPC  R31,R26
LDI  R26,BYTE3(@0)
CPC  R22,R26
LDI  R26,BYTE4(@0)
CPC  R23,R26
.ENDM

.MACRO __CPD2N
CPI  R26,LOW(@0)
LDI  R30,HIGH(@0)
CPC  R27,R30
LDI  R30,BYTE3(@0)
CPC  R24,R30
LDI  R30,BYTE4(@0)
CPC  R25,R30
.ENDM

.MACRO __CPWRR
CP   R@0,R@2
CPC  R@1,R@3
.ENDM

.MACRO __CPWRN
CPI  R@0,LOW(@2)
LDI  R30,HIGH(@2)
CPC  R@1,R30
.ENDM

.MACRO __ADDB1MN
SUBI R30,LOW(-@0-(@1))
.ENDM

.MACRO __ADDB2MN
SUBI R26,LOW(-@0-(@1))
.ENDM

.MACRO __ADDW1MN
SUBI R30,LOW(-@0-(@1))
SBCI R31,HIGH(-@0-(@1))
.ENDM

.MACRO __ADDW2MN
SUBI R26,LOW(-@0-(@1))
SBCI R27,HIGH(-@0-(@1))
.ENDM

.MACRO __ADDW1FN
SUBI R30,LOW(-2*@0-(@1))
SBCI R31,HIGH(-2*@0-(@1))
.ENDM

.MACRO __ADDD1FN
SUBI R30,LOW(-2*@0-(@1))
SBCI R31,HIGH(-2*@0-(@1))
SBCI R22,BYTE3(-2*@0-(@1))
.ENDM

.MACRO __ADDD1N
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
SBCI R22,BYTE3(-@0)
SBCI R23,BYTE4(-@0)
.ENDM

.MACRO __ADDD2N
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
SBCI R24,BYTE3(-@0)
SBCI R25,BYTE4(-@0)
.ENDM

.MACRO __SUBD1N
SUBI R30,LOW(@0)
SBCI R31,HIGH(@0)
SBCI R22,BYTE3(@0)
SBCI R23,BYTE4(@0)
.ENDM

.MACRO __SUBD2N
SUBI R26,LOW(@0)
SBCI R27,HIGH(@0)
SBCI R24,BYTE3(@0)
SBCI R25,BYTE4(@0)
.ENDM

.MACRO __ANDBMNN
LDS  R30,@0+(@1)
ANDI R30,LOW(@2)
STS  @0+(@1),R30
.ENDM

.MACRO __ANDWMNN
LDS  R30,@0+(@1)
ANDI R30,LOW(@2)
STS  @0+(@1),R30
LDS  R30,@0+(@1)+1
ANDI R30,HIGH(@2)
STS  @0+(@1)+1,R30
.ENDM

.MACRO __ANDD1N
ANDI R30,LOW(@0)
ANDI R31,HIGH(@0)
ANDI R22,BYTE3(@0)
ANDI R23,BYTE4(@0)
.ENDM

.MACRO __ANDD2N
ANDI R26,LOW(@0)
ANDI R27,HIGH(@0)
ANDI R24,BYTE3(@0)
ANDI R25,BYTE4(@0)
.ENDM

.MACRO __ORBMNN
LDS  R30,@0+(@1)
ORI  R30,LOW(@2)
STS  @0+(@1),R30
.ENDM

.MACRO __ORWMNN
LDS  R30,@0+(@1)
ORI  R30,LOW(@2)
STS  @0+(@1),R30
LDS  R30,@0+(@1)+1
ORI  R30,HIGH(@2)
STS  @0+(@1)+1,R30
.ENDM

.MACRO __ORD1N
ORI  R30,LOW(@0)
ORI  R31,HIGH(@0)
ORI  R22,BYTE3(@0)
ORI  R23,BYTE4(@0)
.ENDM

.MACRO __ORD2N
ORI  R26,LOW(@0)
ORI  R27,HIGH(@0)
ORI  R24,BYTE3(@0)
ORI  R25,BYTE4(@0)
.ENDM

.MACRO __DELAY_USB
LDI  R24,LOW(@0)
__DELAY_USB_LOOP:
DEC  R24
BRNE __DELAY_USB_LOOP
.ENDM

.MACRO __DELAY_USW
LDI  R24,LOW(@0)
LDI  R25,HIGH(@0)
__DELAY_USW_LOOP:
SBIW R24,1
BRNE __DELAY_USW_LOOP
.ENDM

.MACRO __GETD1S
LDD  R30,Y+@0
LDD  R31,Y+@0+1
LDD  R22,Y+@0+2
LDD  R23,Y+@0+3
.ENDM

.MACRO __GETD2S
LDD  R26,Y+@0
LDD  R27,Y+@0+1
LDD  R24,Y+@0+2
LDD  R25,Y+@0+3
.ENDM

.MACRO __PUTD1S
STD  Y+@0,R30
STD  Y+@0+1,R31
STD  Y+@0+2,R22
STD  Y+@0+3,R23
.ENDM

.MACRO __PUTD2S
STD  Y+@0,R26
STD  Y+@0+1,R27
STD  Y+@0+2,R24
STD  Y+@0+3,R25
.ENDM

.MACRO __PUTDZ2
STD  Z+@0,R26
STD  Z+@0+1,R27
STD  Z+@0+2,R24
STD  Z+@0+3,R25
.ENDM

.MACRO __CLRD1S
STD  Y+@0,R30
STD  Y+@0+1,R30
STD  Y+@0+2,R30
STD  Y+@0+3,R30
.ENDM

.MACRO __POINTB1MN
LDI  R30,LOW(@0+(@1))
.ENDM

.MACRO __POINTW1MN
LDI  R30,LOW(@0+(@1))
LDI  R31,HIGH(@0+(@1))
.ENDM

.MACRO __POINTD1M
LDI  R30,LOW(@0)
LDI  R31,HIGH(@0)
LDI  R22,BYTE3(@0)
LDI  R23,BYTE4(@0)
.ENDM

.MACRO __POINTW1FN
LDI  R30,LOW(2*@0+(@1))
LDI  R31,HIGH(2*@0+(@1))
.ENDM

.MACRO __POINTD1FN
LDI  R30,LOW(2*@0+(@1))
LDI  R31,HIGH(2*@0+(@1))
LDI  R22,BYTE3(2*@0+(@1))
LDI  R23,BYTE4(2*@0+(@1))
.ENDM

.MACRO __POINTB2MN
LDI  R26,LOW(@0+(@1))
.ENDM

.MACRO __POINTW2MN
LDI  R26,LOW(@0+(@1))
LDI  R27,HIGH(@0+(@1))
.ENDM

.MACRO __POINTD2M
LDI  R26,LOW(@0)
LDI  R27,HIGH(@0)
LDI  R24,BYTE3(@0)
LDI  R25,BYTE4(@0)
.ENDM

.MACRO __POINTW2FN
LDI  R26,LOW(2*@0+(@1))
LDI  R27,HIGH(2*@0+(@1))
.ENDM

.MACRO __POINTD2FN
LDI  R26,LOW(2*@0+(@1))
LDI  R27,HIGH(2*@0+(@1))
LDI  R24,BYTE3(2*@0+(@1))
LDI  R25,BYTE4(2*@0+(@1))
.ENDM

.MACRO __POINTBRM
LDI  R@0,LOW(@1)
.ENDM

.MACRO __POINTWRM
LDI  R@0,LOW(@2)
LDI  R@1,HIGH(@2)
.ENDM

.MACRO __POINTBRMN
LDI  R@0,LOW(@1+(@2))
.ENDM

.MACRO __POINTWRMN
LDI  R@0,LOW(@2+(@3))
LDI  R@1,HIGH(@2+(@3))
.ENDM

.MACRO __POINTWRFN
LDI  R@0,LOW(@2*2+(@3))
LDI  R@1,HIGH(@2*2+(@3))
.ENDM

.MACRO __GETD1N
LDI  R30,LOW(@0)
LDI  R31,HIGH(@0)
LDI  R22,BYTE3(@0)
LDI  R23,BYTE4(@0)
.ENDM

.MACRO __GETD2N
LDI  R26,LOW(@0)
LDI  R27,HIGH(@0)
LDI  R24,BYTE3(@0)
LDI  R25,BYTE4(@0)
.ENDM

.MACRO __GETB1MN
LDS  R30,@0+(@1)
.ENDM

.MACRO __GETB1HMN
LDS  R31,@0+(@1)
.ENDM

.MACRO __GETW1MN
LDS  R30,@0+(@1)
LDS  R31,@0+(@1)+1
.ENDM

.MACRO __GETD1MN
LDS  R30,@0+(@1)
LDS  R31,@0+(@1)+1
LDS  R22,@0+(@1)+2
LDS  R23,@0+(@1)+3
.ENDM

.MACRO __GETBRMN
LDS  R@0,@1+(@2)
.ENDM

.MACRO __GETWRMN
LDS  R@0,@2+(@3)
LDS  R@1,@2+(@3)+1
.ENDM

.MACRO __GETWRZ
LDD  R@0,Z+@2
LDD  R@1,Z+@2+1
.ENDM

.MACRO __GETD2Z
LDD  R26,Z+@0
LDD  R27,Z+@0+1
LDD  R24,Z+@0+2
LDD  R25,Z+@0+3
.ENDM

.MACRO __GETB2MN
LDS  R26,@0+(@1)
.ENDM

.MACRO __GETW2MN
LDS  R26,@0+(@1)
LDS  R27,@0+(@1)+1
.ENDM

.MACRO __GETD2MN
LDS  R26,@0+(@1)
LDS  R27,@0+(@1)+1
LDS  R24,@0+(@1)+2
LDS  R25,@0+(@1)+3
.ENDM

.MACRO __PUTB1MN
STS  @0+(@1),R30
.ENDM

.MACRO __PUTW1MN
STS  @0+(@1),R30
STS  @0+(@1)+1,R31
.ENDM

.MACRO __PUTD1MN
STS  @0+(@1),R30
STS  @0+(@1)+1,R31
STS  @0+(@1)+2,R22
STS  @0+(@1)+3,R23
.ENDM

.MACRO __PUTB1EN
LDI  R26,LOW(@0+(@1))
LDI  R27,HIGH(@0+(@1))
CALL __EEPROMWRB
.ENDM

.MACRO __PUTW1EN
LDI  R26,LOW(@0+(@1))
LDI  R27,HIGH(@0+(@1))
CALL __EEPROMWRW
.ENDM

.MACRO __PUTD1EN
LDI  R26,LOW(@0+(@1))
LDI  R27,HIGH(@0+(@1))
CALL __EEPROMWRD
.ENDM

.MACRO __PUTBR0MN
STS  @0+(@1),R0
.ENDM

.MACRO __PUTBMRN
STS  @0+(@1),R@2
.ENDM

.MACRO __PUTWMRN
STS  @0+(@1),R@2
STS  @0+(@1)+1,R@3
.ENDM

.MACRO __PUTBZR
STD  Z+@1,R@0
.ENDM

.MACRO __PUTWZR
STD  Z+@2,R@0
STD  Z+@2+1,R@1
.ENDM

.MACRO __GETW1R
MOV  R30,R@0
MOV  R31,R@1
.ENDM

.MACRO __GETW2R
MOV  R26,R@0
MOV  R27,R@1
.ENDM

.MACRO __GETWRN
LDI  R@0,LOW(@2)
LDI  R@1,HIGH(@2)
.ENDM

.MACRO __PUTW1R
MOV  R@0,R30
MOV  R@1,R31
.ENDM

.MACRO __PUTW2R
MOV  R@0,R26
MOV  R@1,R27
.ENDM

.MACRO __ADDWRN
SUBI R@0,LOW(-@2)
SBCI R@1,HIGH(-@2)
.ENDM

.MACRO __ADDWRR
ADD  R@0,R@2
ADC  R@1,R@3
.ENDM

.MACRO __SUBWRN
SUBI R@0,LOW(@2)
SBCI R@1,HIGH(@2)
.ENDM

.MACRO __SUBWRR
SUB  R@0,R@2
SBC  R@1,R@3
.ENDM

.MACRO __ANDWRN
ANDI R@0,LOW(@2)
ANDI R@1,HIGH(@2)
.ENDM

.MACRO __ANDWRR
AND  R@0,R@2
AND  R@1,R@3
.ENDM

.MACRO __ORWRN
ORI  R@0,LOW(@2)
ORI  R@1,HIGH(@2)
.ENDM

.MACRO __ORWRR
OR   R@0,R@2
OR   R@1,R@3
.ENDM

.MACRO __EORWRR
EOR  R@0,R@2
EOR  R@1,R@3
.ENDM

.MACRO __GETWRS
LDD  R@0,Y+@2
LDD  R@1,Y+@2+1
.ENDM

.MACRO __PUTBSR
STD  Y+@1,R@0
.ENDM

.MACRO __PUTWSR
STD  Y+@2,R@0
STD  Y+@2+1,R@1
.ENDM

.MACRO __MOVEWRR
MOV  R@0,R@2
MOV  R@1,R@3
.ENDM

.MACRO __INWR
IN   R@0,@2
IN   R@1,@2+1
.ENDM

.MACRO __OUTWR
OUT  @2+1,R@1
OUT  @2,R@0
.ENDM

.MACRO __CALL1MN
LDS  R30,@0+(@1)
LDS  R31,@0+(@1)+1
ICALL
.ENDM

.MACRO __CALL1FN
LDI  R30,LOW(2*@0+(@1))
LDI  R31,HIGH(2*@0+(@1))
CALL __GETW1PF
ICALL
.ENDM

.MACRO __CALL2EN
PUSH R26
PUSH R27
LDI  R26,LOW(@0+(@1))
LDI  R27,HIGH(@0+(@1))
CALL __EEPROMRDW
POP  R27
POP  R26
ICALL
.ENDM

.MACRO __CALL2EX
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
CALL __EEPROMRDD
ICALL
.ENDM

.MACRO __GETW1STACK
IN   R30,SPL
IN   R31,SPH
ADIW R30,@0+1
LD   R0,Z+
LD   R31,Z
MOV  R30,R0
.ENDM

.MACRO __GETD1STACK
IN   R30,SPL
IN   R31,SPH
ADIW R30,@0+1
LD   R0,Z+
LD   R1,Z+
LD   R22,Z
MOVW R30,R0
.ENDM

.MACRO __NBST
BST  R@0,@1
IN   R30,SREG
LDI  R31,0x40
EOR  R30,R31
OUT  SREG,R30
.ENDM


.MACRO __PUTB1SN
LDD  R26,Y+@0
LDD  R27,Y+@0+1
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST   X,R30
.ENDM

.MACRO __PUTW1SN
LDD  R26,Y+@0
LDD  R27,Y+@0+1
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST   X+,R30
ST   X,R31
.ENDM

.MACRO __PUTD1SN
LDD  R26,Y+@0
LDD  R27,Y+@0+1
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
CALL __PUTDP1
.ENDM

.MACRO __PUTB1SNS
LDD  R26,Y+@0
LDD  R27,Y+@0+1
ADIW R26,@1
ST   X,R30
.ENDM

.MACRO __PUTW1SNS
LDD  R26,Y+@0
LDD  R27,Y+@0+1
ADIW R26,@1
ST   X+,R30
ST   X,R31
.ENDM

.MACRO __PUTD1SNS
LDD  R26,Y+@0
LDD  R27,Y+@0+1
ADIW R26,@1
CALL __PUTDP1
.ENDM

.MACRO __PUTB1PMN
LDS  R26,@0
LDS  R27,@0+1
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST   X,R30
.ENDM

.MACRO __PUTW1PMN
LDS  R26,@0
LDS  R27,@0+1
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST   X+,R30
ST   X,R31
.ENDM

.MACRO __PUTD1PMN
LDS  R26,@0
LDS  R27,@0+1
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
CALL __PUTDP1
.ENDM

.MACRO __PUTB1PMNS
LDS  R26,@0
LDS  R27,@0+1
ADIW R26,@1
ST   X,R30
.ENDM

.MACRO __PUTW1PMNS
LDS  R26,@0
LDS  R27,@0+1
ADIW R26,@1
ST   X+,R30
ST   X,R31
.ENDM

.MACRO __PUTD1PMNS
LDS  R26,@0
LDS  R27,@0+1
ADIW R26,@1
CALL __PUTDP1
.ENDM

.MACRO __PUTB1RN
MOVW R26,R@0
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST   X,R30
.ENDM

.MACRO __PUTW1RN
MOVW R26,R@0
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST   X+,R30
ST   X,R31
.ENDM

.MACRO __PUTD1RN
MOVW R26,R@0
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
CALL __PUTDP1
.ENDM

.MACRO __PUTB1RNS
MOVW R26,R@0
ADIW R26,@1
ST   X,R30
.ENDM

.MACRO __PUTW1RNS
MOVW R26,R@0
ADIW R26,@1
ST   X+,R30
ST   X,R31
.ENDM

.MACRO __PUTD1RNS
MOVW R26,R@0
ADIW R26,@1
CALL __PUTDP1
.ENDM

.MACRO __PUTB1RON
MOV  R26,R@0
MOV  R27,R@1
SUBI R26,LOW(-@2)
SBCI R27,HIGH(-@2)
ST   X,R30
.ENDM

.MACRO __PUTW1RON
MOV  R26,R@0
MOV  R27,R@1
SUBI R26,LOW(-@2)
SBCI R27,HIGH(-@2)
ST   X+,R30
ST   X,R31
.ENDM

.MACRO __PUTD1RON
MOV  R26,R@0
MOV  R27,R@1
SUBI R26,LOW(-@2)
SBCI R27,HIGH(-@2)
CALL __PUTDP1
.ENDM

.MACRO __PUTB1RONS
MOV  R26,R@0
MOV  R27,R@1
ADIW R26,@2
ST   X,R30
.ENDM

.MACRO __PUTW1RONS
MOV  R26,R@0
MOV  R27,R@1
ADIW R26,@2
ST   X+,R30
ST   X,R31
.ENDM

.MACRO __PUTD1RONS
MOV  R26,R@0
MOV  R27,R@1
ADIW R26,@2
CALL __PUTDP1
.ENDM


.MACRO __GETB1SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
LD   R30,Z
.ENDM

.MACRO __GETB1HSX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
LD   R31,Z
.ENDM

.MACRO __GETW1SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
LD   R0,Z+
LD   R31,Z
MOV  R30,R0
.ENDM

.MACRO __GETD1SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
LD   R0,Z+
LD   R1,Z+
LD   R22,Z+
LD   R23,Z
MOVW R30,R0
.ENDM

.MACRO __GETB2SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
LD   R26,X
.ENDM

.MACRO __GETW2SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
LD   R0,X+
LD   R27,X
MOV  R26,R0
.ENDM

.MACRO __GETD2SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
LD   R0,X+
LD   R1,X+
LD   R24,X+
LD   R25,X
MOVW R26,R0
.ENDM

.MACRO __GETBRSX
MOVW R30,R28
SUBI R30,LOW(-@1)
SBCI R31,HIGH(-@1)
LD   R@0,Z
.ENDM

.MACRO __GETWRSX
MOVW R30,R28
SUBI R30,LOW(-@2)
SBCI R31,HIGH(-@2)
LD   R@0,Z+
LD   R@1,Z
.ENDM

.MACRO __GETBRSX2
MOVW R26,R28
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
LD   R@0,X
.ENDM

.MACRO __GETWRSX2
MOVW R26,R28
SUBI R26,LOW(-@2)
SBCI R27,HIGH(-@2)
LD   R@0,X+
LD   R@1,X
.ENDM

.MACRO __LSLW8SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
LD   R31,Z
CLR  R30
.ENDM

.MACRO __PUTB1SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
ST   X,R30
.ENDM

.MACRO __PUTW1SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
ST   X+,R30
ST   X,R31
.ENDM

.MACRO __PUTD1SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
ST   X+,R30
ST   X+,R31
ST   X+,R22
ST   X,R23
.ENDM

.MACRO __CLRW1SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
ST   X+,R30
ST   X,R30
.ENDM

.MACRO __CLRD1SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
ST   X+,R30
ST   X+,R30
ST   X+,R30
ST   X,R30
.ENDM

.MACRO __PUTB2SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
ST   Z,R26
.ENDM

.MACRO __PUTW2SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
ST   Z+,R26
ST   Z,R27
.ENDM

.MACRO __PUTD2SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
ST   Z+,R26
ST   Z+,R27
ST   Z+,R24
ST   Z,R25
.ENDM

.MACRO __PUTBSRX
MOVW R30,R28
SUBI R30,LOW(-@1)
SBCI R31,HIGH(-@1)
ST   Z,R@0
.ENDM

.MACRO __PUTWSRX
MOVW R30,R28
SUBI R30,LOW(-@2)
SBCI R31,HIGH(-@2)
ST   Z+,R@0
ST   Z,R@1
.ENDM

.MACRO __PUTB1SNX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
LD   R0,X+
LD   R27,X
MOV  R26,R0
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST   X,R30
.ENDM

.MACRO __PUTW1SNX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
LD   R0,X+
LD   R27,X
MOV  R26,R0
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST   X+,R30
ST   X,R31
.ENDM

.MACRO __PUTD1SNX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
LD   R0,X+
LD   R27,X
MOV  R26,R0
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST   X+,R30
ST   X+,R31
ST   X+,R22
ST   X,R23
.ENDM

.MACRO __MULBRR
MULS R@0,R@1
MOVW R30,R0
.ENDM

.MACRO __MULBRRU
MUL  R@0,R@1
MOVW R30,R0
.ENDM

.MACRO __MULBRR0
MULS R@0,R@1
.ENDM

.MACRO __MULBRRU0
MUL  R@0,R@1
.ENDM

.MACRO __MULBNWRU
LDI  R26,@2
MUL  R26,R@0
MOVW R30,R0
MUL  R26,R@1
ADD  R31,R0
.ENDM

;NAME DEFINITIONS FOR GLOBAL VARIABLES ALLOCATED TO REGISTERS
.DEF _BPM=R3
.DEF _BPM_msb=R4
.DEF _relayStatus=R6

;GPIOR0 INITIALIZATION VALUE
.EQU __GPIOR0_INIT=0x00

.CSEG
.ORG 0x00

;START OF CODE MARKER
__START_OF_CODE:

;INTERRUPT VECTORS
JMP  __RESET
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00
JMP  0x00

_tbl10_G100:
.DB  0x10,0x27,0xE8,0x3,0x64,0x0,0xA,0x0
.DB  0x1,0x0
_tbl16_G100:
.DB  0x0,0x10,0x0,0x1,0x10,0x0,0x1,0x0

;GLOBAL REGISTER VARIABLES INITIALIZATION
__REG_VARS:
.DB  0x5A,0x0,0x0,0x0

_0x0:
.DB  0x53,0x45,0x54,0x20,0x42,0x50,0x4D,0x0
.DB  0x42,0x50,0x4D,0x20,0x3D,0x20,0x0,0x25
.DB  0x64,0x0,0x20,0x52,0x55,0x4E,0x0

__GLOBAL_INI_TBL:
.DW  0x04
.DW  0x03
.DW  __REG_VARS*2

.DW  0x08
.DW  _0x12
.DW  _0x0*2

.DW  0x07
.DW  _0x12+8
.DW  _0x0*2+8

.DW  0x05
.DW  _0x12+15
.DW  _0x0*2+18

_0xFFFFFFFF:
.DW  0

#define __GLOBAL_INI_TBL_PRESENT 1

__RESET:
CLI
CLR  R30
OUT  EECR,R30

;INTERRUPT VECTORS ARE PLACED
;AT THE START OF FLASH
LDI  R31,1
OUT  MCUCR,R31
OUT  MCUCR,R30

;CLEAR R2-R14
LDI  R24,(14-2)+1
LDI  R26,2
CLR  R27
__CLEAR_REG:
ST   X+,R30
DEC  R24
BRNE __CLEAR_REG

;CLEAR SRAM
LDI  R24,LOW(__CLEAR_SRAM_SIZE)
LDI  R25,HIGH(__CLEAR_SRAM_SIZE)
LDI  R26,LOW(__SRAM_START)
LDI  R27,HIGH(__SRAM_START)
__CLEAR_SRAM:
ST   X+,R30
SBIW R24,1
BRNE __CLEAR_SRAM

;GLOBAL VARIABLES INITIALIZATION
LDI  R30,LOW(__GLOBAL_INI_TBL*2)
LDI  R31,HIGH(__GLOBAL_INI_TBL*2)
__GLOBAL_INI_NEXT:
LPM  R24,Z+
LPM  R25,Z+
SBIW R24,0
BREQ __GLOBAL_INI_END
LPM  R26,Z+
LPM  R27,Z+
LPM  R0,Z+
LPM  R1,Z+
MOVW R22,R30
MOVW R30,R0
__GLOBAL_INI_LOOP:
LPM  R0,Z+
ST   X+,R0
SBIW R24,1
BRNE __GLOBAL_INI_LOOP
MOVW R30,R22
RJMP __GLOBAL_INI_NEXT
__GLOBAL_INI_END:

;GPIOR0 INITIALIZATION
LDI  R30,__GPIOR0_INIT
OUT  GPIOR0,R30

;HARDWARE STACK POINTER INITIALIZATION
LDI  R30,LOW(__SRAM_END-__HEAP_SIZE)
OUT  SPL,R30
LDI  R30,HIGH(__SRAM_END-__HEAP_SIZE)
OUT  SPH,R30

;DATA STACK POINTER INITIALIZATION
LDI  R28,LOW(__SRAM_START+__DSTACK_SIZE)
LDI  R29,HIGH(__SRAM_START+__DSTACK_SIZE)

JMP  _main

.ESEG
.ORG 0x00

.DSEG
.ORG 0x300

.CSEG
;#include <mega328p.h>  // Header untuk ATmega328P
#ifndef __SLEEP_DEFINED__
#define __SLEEP_DEFINED__
.EQU __se_bit=0x01
.EQU __sm_mask=0x0E
.EQU __sm_adc_noise_red=0x02
.EQU __sm_powerdown=0x04
.EQU __sm_powersave=0x06
.EQU __sm_standby=0x0C
.EQU __sm_ext_standby=0x0E
.SET power_ctrl_reg=smcr
#endif
;#include <delay.h>     // Header untuk fungsi delay
;#include <stdio.h>     // Untuk konversi integer ke string (sprintf)
;
;// Definisi manual simbol port
;#define PD0 (1 << 0)  // Pin 0 PORTD
;#define PD1 (1 << 1)  // Pin 1 PORTD
;#define PD2 (1 << 2)  // Pin 2 PORTD
;#define PD3 (1 << 3)  // Pin 3 PORTD
;#define PD4 (1 << 4)  // Pin 4 PORTD
;#define PD5 (1 << 5)  // Pin 5 PORTD
;#define PD6 (1 << 6)  // Pin 6 PORTD
;#define PD7 (1 << 7)  // Pin 7 PORTD
;
;#define PB0 (1 << 0)  // Pin 0 PORTB
;#define PB1 (1 << 1)  // Pin 1 PORTB
;
;// Definisi pin LCD
;#define RS PD0
;#define EN PD1
;#define D4 PD2
;#define D5 PD3
;#define D6 PD4
;#define D7 PD5
;
;// Definisi pin tombol dan relay
;#define tombolKurangi PD6
;#define tombolTambah PD7
;#define tombolStartStop PB0
;#define relayPin PB1
;
;// Variabel global
;int BPM = 90;               // Nilai BPM awal
;unsigned char relayStatus = 0; // Status relay (0: mati, 1: aktif)
;
;// Prototipe fungsi
;void initLCD();
;void sendCommand(unsigned char cmd);
;void sendData(unsigned char data);
;void sendString(const char *str);
;void tampilkanMenu();  // Tidak ada parameter lagi
;void aktifkanRelay();
;void matikanRelay();
;
;// Fungsi utama
;void main(void) {
; 0000 002E void main(void) {

.CSEG
_main:
; .FSTART _main
; 0000 002F     // Deklarasi variabel bpmStr sebelum digunakan
; 0000 0030     char bpmStr[5]; // Buffer untuk string BPM
; 0000 0031 
; 0000 0032     // Inisialisasi pin LCD sebagai output
; 0000 0033     DDRD |= RS | EN | D4 | D5 | D6 | D7; // Atur pin LCD sebagai output
SBIW R28,5
; bpmStr -> Y+0
IN   R30,0xA
ORI  R30,LOW(0x3F)
OUT  0xA,R30
; 0000 0034     PORTD &= ~(RS | EN); // RS dan EN diatur LOW
IN   R30,0xB
ANDI R30,LOW(0xFC)
OUT  0xB,R30
; 0000 0035 
; 0000 0036     // Inisialisasi pin tombol sebagai input dengan pull-up
; 0000 0037     DDRD &= ~(tombolKurangi | tombolTambah); // Input tombol
IN   R30,0xA
ANDI R30,LOW(0x3F)
OUT  0xA,R30
; 0000 0038     PORTD |= tombolKurangi | tombolTambah;  // Aktifkan pull-up
IN   R30,0xB
ORI  R30,LOW(0xC0)
OUT  0xB,R30
; 0000 0039     DDRB &= ~tombolStartStop;               // Input tombol
CBI  0x4,0
; 0000 003A     PORTB |= tombolStartStop;               // Aktifkan pull-up
SBI  0x5,0
; 0000 003B 
; 0000 003C     // Inisialisasi pin relay sebagai output
; 0000 003D     DDRB |= relayPin;          // Output relay
SBI  0x4,1
; 0000 003E     PORTB &= ~relayPin;        // Relay mati awalnya
CBI  0x5,1
; 0000 003F 
; 0000 0040     // Inisialisasi LCD dan tampilkan menu awal
; 0000 0041     initLCD();
RCALL _initLCD
; 0000 0042     tampilkanMenu();  // Panggil fungsi tampilkanMenu tanpa argumen
RCALL _tampilkanMenu
; 0000 0043 
; 0000 0044     while (1) {
_0x3:
; 0000 0045         // Deteksi tombol kurangi
; 0000 0046         if (!(PIND & tombolKurangi)) {
SBIC 0x9,6
RJMP _0x6
; 0000 0047             if (BPM > 30) BPM -= 30; // Kurangi BPM jika lebih besar dari 30
LDI  R30,LOW(30)
LDI  R31,HIGH(30)
CP   R30,R3
CPC  R31,R4
BRGE _0x7
__GETW1R 3,4
SBIW R30,30
__PUTW1R 3,4
; 0000 0048             tampilkanMenu();  // Panggil fungsi tampilkanMenu
_0x7:
RCALL SUBOPT_0x0
; 0000 0049             delay_ms(200); // Debounce tombol
; 0000 004A         }
; 0000 004B 
; 0000 004C         // Deteksi tombol tambah
; 0000 004D         if (!(PIND & tombolTambah)) {
_0x6:
SBIC 0x9,7
RJMP _0x8
; 0000 004E             if (BPM < 240) BPM += 30; // Tambah BPM jika kurang dari 240
LDI  R30,LOW(240)
LDI  R31,HIGH(240)
CP   R3,R30
CPC  R4,R31
BRGE _0x9
LDI  R30,LOW(30)
LDI  R31,HIGH(30)
__ADDWRR 3,4,30,31
; 0000 004F             tampilkanMenu();  // Panggil fungsi tampilkanMenu
_0x9:
RCALL SUBOPT_0x0
; 0000 0050             delay_ms(200); // Debounce tombol
; 0000 0051         }
; 0000 0052 
; 0000 0053         // Deteksi tombol start/stop
; 0000 0054         if (!(PINB & tombolStartStop)) {
_0x8:
SBIC 0x3,0
RJMP _0xA
; 0000 0055             relayStatus = !relayStatus; // Toggle status relay
MOV  R30,R6
RCALL __LNEGB1
MOV  R6,R30
; 0000 0056             if (relayStatus) {
TST  R6
BREQ _0xB
; 0000 0057                 aktifkanRelay();
RCALL _aktifkanRelay
; 0000 0058             } else {
RJMP _0xC
_0xB:
; 0000 0059                 matikanRelay();
RCALL _matikanRelay
; 0000 005A             }
_0xC:
; 0000 005B             delay_ms(200); // Debounce tombol
LDI  R26,LOW(200)
LDI  R27,0
RCALL _delay_ms
; 0000 005C         }
; 0000 005D 
; 0000 005E         // Animasi relay aktif
; 0000 005F         if (relayStatus) {
_0xA:
TST  R6
BREQ _0xD
; 0000 0060             unsigned int interval = 60000 / BPM; // Interval detak berdasarkan BPM
; 0000 0061             delay_ms(interval / 2);             // Delay sesuai interval
SBIW R28,2
; bpmStr -> Y+2
; interval -> Y+0
__GETW1R 3,4
LDI  R26,LOW(60000)
LDI  R27,HIGH(60000)
RCALL __DIVW21U
ST   Y,R30
STD  Y+1,R31
LSR  R31
ROR  R30
MOVW R26,R30
RCALL _delay_ms
; 0000 0062             PORTB ^= relayPin;                  // Toggle relay
IN   R30,0x5
LDI  R26,LOW(2)
EOR  R30,R26
OUT  0x5,R30
; 0000 0063         }
ADIW R28,2
; 0000 0064     }
_0xD:
RJMP _0x3
; 0000 0065 }
_0xE:
RJMP _0xE
; .FEND
;
;// Fungsi untuk inisialisasi LCD
;void initLCD() {
; 0000 0068 void initLCD() {
_initLCD:
; .FSTART _initLCD
; 0000 0069     delay_ms(20);        // Tunggu LCD siap
LDI  R26,LOW(20)
LDI  R27,0
RCALL _delay_ms
; 0000 006A     sendCommand(0x02);   // Mode 4-bit
LDI  R26,LOW(2)
RCALL _sendCommand
; 0000 006B     sendCommand(0x28);   // 2 baris, mode 4-bit
LDI  R26,LOW(40)
RCALL _sendCommand
; 0000 006C     sendCommand(0x0C);   // Display ON, cursor OFF
LDI  R26,LOW(12)
RCALL _sendCommand
; 0000 006D     sendCommand(0x06);   // Auto increment
LDI  R26,LOW(6)
RCALL _sendCommand
; 0000 006E     sendCommand(0x01);   // Clear display
LDI  R26,LOW(1)
RCALL _sendCommand
; 0000 006F     delay_ms(2);         // Tunggu perintah selesai
LDI  R26,LOW(2)
LDI  R27,0
RCALL _delay_ms
; 0000 0070 }
RET
; .FEND
;
;// Fungsi untuk mengirim perintah ke LCD
;void sendCommand(unsigned char cmd) {
; 0000 0073 void sendCommand(unsigned char cmd) {
_sendCommand:
; .FSTART _sendCommand
; 0000 0074     PORTD &= ~RS; // RS = 0 untuk perintah
ST   -Y,R17
MOV  R17,R26
; cmd -> R17
CBI  0xB,0
; 0000 0075     PORTD = (PORTD & 0x0F) | (cmd & 0xF0); // Kirim nibble atas
RJMP _0x2060003
; 0000 0076     PORTD |= EN; // EN = 1
; 0000 0077     delay_us(1);        // Delay pendek
; 0000 0078     PORTD &= ~EN; // EN = 0
; 0000 0079 
; 0000 007A     PORTD = (PORTD & 0x0F) | ((cmd << 4) & 0xF0); // Kirim nibble bawah
; 0000 007B     PORTD |= EN; // EN = 1
; 0000 007C     delay_us(1);
; 0000 007D     PORTD &= ~EN; // EN = 0
; 0000 007E 
; 0000 007F     delay_ms(2);         // Tunggu perintah selesai
; 0000 0080 }
; .FEND
;
;// Fungsi untuk mengirim data ke LCD
;void sendData(unsigned char data) {
; 0000 0083 void sendData(unsigned char data) {
_sendData:
; .FSTART _sendData
; 0000 0084     PORTD |= RS; // RS = 1 untuk data
ST   -Y,R17
MOV  R17,R26
; data -> R17
SBI  0xB,0
; 0000 0085     PORTD = (PORTD & 0x0F) | (data & 0xF0); // Kirim nibble atas
_0x2060003:
IN   R30,0xB
ANDI R30,LOW(0xF)
MOV  R26,R30
MOV  R30,R17
RCALL SUBOPT_0x1
; 0000 0086     PORTD |= EN; // EN = 1
; 0000 0087     delay_us(1);
; 0000 0088     PORTD &= ~EN; // EN = 0
; 0000 0089 
; 0000 008A     PORTD = (PORTD & 0x0F) | ((data << 4) & 0xF0); // Kirim nibble bawah
IN   R30,0xB
ANDI R30,LOW(0xF)
MOV  R26,R30
MOV  R30,R17
SWAP R30
RCALL SUBOPT_0x1
; 0000 008B     PORTD |= EN; // EN = 1
; 0000 008C     delay_us(1);
; 0000 008D     PORTD &= ~EN; // EN = 0
; 0000 008E 
; 0000 008F     delay_ms(2); // Tunggu data selesai
LDI  R26,LOW(2)
LDI  R27,0
RCALL _delay_ms
; 0000 0090 }
LD   R17,Y+
RET
; .FEND
;
;// Fungsi untuk mengirim string ke LCD
;void sendString(const char *str) {
; 0000 0093 void sendString(const char *str) {
_sendString:
; .FSTART _sendString
; 0000 0094     while (*str) {
ST   -Y,R17
ST   -Y,R16
MOVW R16,R26
; *str -> R16,R17
_0xF:
MOVW R26,R16
LD   R30,X
CPI  R30,0
BREQ _0x11
; 0000 0095         sendData(*str++);
__ADDWRN 16,17,1
LD   R26,X
RCALL _sendData
; 0000 0096     }
RJMP _0xF
_0x11:
; 0000 0097 }
LD   R16,Y+
LD   R17,Y+
RET
; .FEND
;
;// Fungsi untuk menampilkan menu
;void tampilkanMenu() {
; 0000 009A void tampilkanMenu() {
_tampilkanMenu:
; .FSTART _tampilkanMenu
; 0000 009B     char bpmStr[5]; // Buffer untuk string BPM
; 0000 009C     sendCommand(0x01); // Clear display
SBIW R28,5
; bpmStr -> Y+0
LDI  R26,LOW(1)
RCALL _sendCommand
; 0000 009D     sendString("SET BPM");
__POINTW2MN _0x12,0
RCALL _sendString
; 0000 009E     sendCommand(0xC0); // Pindah ke baris kedua
LDI  R26,LOW(192)
RCALL _sendCommand
; 0000 009F     sendString("BPM = ");
__POINTW2MN _0x12,8
RCALL _sendString
; 0000 00A0 
; 0000 00A1     // Konversi BPM ke string dan tampilkan
; 0000 00A2     sprintf(bpmStr, "%d", BPM); // Konversi BPM ke string
MOVW R30,R28
ST   -Y,R31
ST   -Y,R30
__POINTW1FN _0x0,15
ST   -Y,R31
ST   -Y,R30
__GETW1R 3,4
RCALL __CWD1
RCALL __PUTPARD1
LDI  R24,4
RCALL _sprintf
ADIW R28,8
; 0000 00A3     sendString(bpmStr); // Tampilkan BPM
MOVW R26,R28
RCALL _sendString
; 0000 00A4 
; 0000 00A5     if (relayStatus) {
TST  R6
BREQ _0x13
; 0000 00A6         sendString(" RUN");
__POINTW2MN _0x12,15
RCALL _sendString
; 0000 00A7     }
; 0000 00A8 }
_0x13:
ADIW R28,5
RET
; .FEND

.DSEG
_0x12:
.BYTE 0x14
;
;// Fungsi untuk mengaktifkan relay
;void aktifkanRelay() {
; 0000 00AB void aktifkanRelay() {

.CSEG
_aktifkanRelay:
; .FSTART _aktifkanRelay
; 0000 00AC     PORTB |= relayPin; // Aktifkan relay
SBI  0x5,1
; 0000 00AD     tampilkanMenu(); // Tampilkan menu
RJMP _0x2060002
; 0000 00AE }
; .FEND
;
;// Fungsi untuk mematikan relay
;void matikanRelay() {
; 0000 00B1 void matikanRelay() {
_matikanRelay:
; .FSTART _matikanRelay
; 0000 00B2     PORTB &= ~relayPin; // Matikan relay
CBI  0x5,1
; 0000 00B3     tampilkanMenu(); // Tampilkan menu
_0x2060002:
RCALL _tampilkanMenu
; 0000 00B4 }
RET
; .FEND
#ifndef __SLEEP_DEFINED__
#define __SLEEP_DEFINED__
.EQU __se_bit=0x01
.EQU __sm_mask=0x0E
.EQU __sm_adc_noise_red=0x02
.EQU __sm_powerdown=0x04
.EQU __sm_powersave=0x06
.EQU __sm_standby=0x0C
.EQU __sm_ext_standby=0x0E
.SET power_ctrl_reg=smcr
#endif

.CSEG
_put_buff_G100:
; .FSTART _put_buff_G100
RCALL __SAVELOCR6
MOVW R18,R26
LDD  R21,Y+6
ADIW R26,2
RCALL __GETW1P
SBIW R30,0
BREQ _0x2000016
MOVW R26,R18
ADIW R26,4
RCALL __GETW1P
MOVW R16,R30
SBIW R30,0
BREQ _0x2000018
__CPWRN 16,17,2
BRLO _0x2000019
MOVW R30,R16
SBIW R30,1
MOVW R16,R30
__PUTW1RNS 18,4
_0x2000018:
MOVW R26,R18
ADIW R26,2
RCALL SUBOPT_0x2
SBIW R30,1
ST   Z,R21
_0x2000019:
MOVW R26,R18
RCALL __GETW1P
TST  R31
BRMI _0x200001A
RCALL SUBOPT_0x2
_0x200001A:
RJMP _0x200001B
_0x2000016:
MOVW R26,R18
LDI  R30,LOW(65535)
LDI  R31,HIGH(65535)
ST   X+,R30
ST   X,R31
_0x200001B:
RCALL __LOADLOCR6
ADIW R28,7
RET
; .FEND
__print_G100:
; .FSTART __print_G100
ST   -Y,R27
ST   -Y,R26
SBIW R28,6
RCALL __SAVELOCR6
LDI  R17,0
LDD  R26,Y+12
LDD  R27,Y+12+1
LDI  R30,LOW(0)
LDI  R31,HIGH(0)
ST   X+,R30
ST   X,R31
_0x200001C:
LDD  R30,Y+18
LDD  R31,Y+18+1
ADIW R30,1
STD  Y+18,R30
STD  Y+18+1,R31
SBIW R30,1
LPM  R30,Z
MOV  R18,R30
CPI  R30,0
BRNE PC+2
RJMP _0x200001E
MOV  R30,R17
CPI  R30,0
BRNE _0x2000022
CPI  R18,37
BRNE _0x2000023
LDI  R17,LOW(1)
RJMP _0x2000024
_0x2000023:
RCALL SUBOPT_0x3
_0x2000024:
RJMP _0x2000021
_0x2000022:
CPI  R30,LOW(0x1)
BRNE _0x2000025
CPI  R18,37
BRNE _0x2000026
RCALL SUBOPT_0x3
RJMP _0x20000D2
_0x2000026:
LDI  R17,LOW(2)
LDI  R20,LOW(0)
LDI  R16,LOW(0)
CPI  R18,45
BRNE _0x2000027
LDI  R16,LOW(1)
RJMP _0x2000021
_0x2000027:
CPI  R18,43
BRNE _0x2000028
LDI  R20,LOW(43)
RJMP _0x2000021
_0x2000028:
CPI  R18,32
BRNE _0x2000029
LDI  R20,LOW(32)
RJMP _0x2000021
_0x2000029:
RJMP _0x200002A
_0x2000025:
CPI  R30,LOW(0x2)
BRNE _0x200002B
_0x200002A:
LDI  R21,LOW(0)
LDI  R17,LOW(3)
CPI  R18,48
BRNE _0x200002C
ORI  R16,LOW(128)
RJMP _0x2000021
_0x200002C:
RJMP _0x200002D
_0x200002B:
CPI  R30,LOW(0x3)
BREQ PC+2
RJMP _0x2000021
_0x200002D:
CPI  R18,48
BRLO _0x2000030
CPI  R18,58
BRLO _0x2000031
_0x2000030:
RJMP _0x200002F
_0x2000031:
LDI  R26,LOW(10)
MUL  R21,R26
MOV  R21,R0
MOV  R30,R18
SUBI R30,LOW(48)
ADD  R21,R30
RJMP _0x2000021
_0x200002F:
MOV  R30,R18
CPI  R30,LOW(0x63)
BRNE _0x2000035
RCALL SUBOPT_0x4
LDD  R30,Y+16
LDD  R31,Y+16+1
LDD  R26,Z+4
ST   -Y,R26
RCALL SUBOPT_0x5
RJMP _0x2000036
_0x2000035:
CPI  R30,LOW(0x73)
BRNE _0x2000038
RCALL SUBOPT_0x4
RCALL SUBOPT_0x6
RCALL _strlen
MOV  R17,R30
RJMP _0x2000039
_0x2000038:
CPI  R30,LOW(0x70)
BRNE _0x200003B
RCALL SUBOPT_0x4
RCALL SUBOPT_0x6
RCALL _strlenf
MOV  R17,R30
ORI  R16,LOW(8)
_0x2000039:
ORI  R16,LOW(2)
ANDI R16,LOW(127)
LDI  R19,LOW(0)
RJMP _0x200003C
_0x200003B:
CPI  R30,LOW(0x64)
BREQ _0x200003F
CPI  R30,LOW(0x69)
BRNE _0x2000040
_0x200003F:
ORI  R16,LOW(4)
RJMP _0x2000041
_0x2000040:
CPI  R30,LOW(0x75)
BRNE _0x2000042
_0x2000041:
LDI  R30,LOW(_tbl10_G100*2)
LDI  R31,HIGH(_tbl10_G100*2)
STD  Y+6,R30
STD  Y+6+1,R31
LDI  R17,LOW(5)
RJMP _0x2000043
_0x2000042:
CPI  R30,LOW(0x58)
BRNE _0x2000045
ORI  R16,LOW(8)
RJMP _0x2000046
_0x2000045:
CPI  R30,LOW(0x78)
BREQ PC+2
RJMP _0x2000077
_0x2000046:
LDI  R30,LOW(_tbl16_G100*2)
LDI  R31,HIGH(_tbl16_G100*2)
STD  Y+6,R30
STD  Y+6+1,R31
LDI  R17,LOW(4)
_0x2000043:
SBRS R16,2
RJMP _0x2000048
RCALL SUBOPT_0x4
LDD  R26,Y+16
LDD  R27,Y+16+1
ADIW R26,4
LD   R30,X+
LD   R31,X+
STD  Y+10,R30
STD  Y+10+1,R31
LDD  R26,Y+11
TST  R26
BRPL _0x2000049
RCALL __ANEGW1
STD  Y+10,R30
STD  Y+10+1,R31
LDI  R20,LOW(45)
_0x2000049:
CPI  R20,0
BREQ _0x200004A
SUBI R17,-LOW(1)
RJMP _0x200004B
_0x200004A:
ANDI R16,LOW(251)
_0x200004B:
RJMP _0x200004C
_0x2000048:
RCALL SUBOPT_0x4
LDD  R26,Y+16
LDD  R27,Y+16+1
ADIW R26,4
RCALL __GETW1P
STD  Y+10,R30
STD  Y+10+1,R31
_0x200004C:
_0x200003C:
SBRC R16,0
RJMP _0x200004D
_0x200004E:
CP   R17,R21
BRSH _0x2000050
SBRS R16,7
RJMP _0x2000051
SBRS R16,2
RJMP _0x2000052
ANDI R16,LOW(251)
MOV  R18,R20
SUBI R17,LOW(1)
RJMP _0x2000053
_0x2000052:
LDI  R18,LOW(48)
_0x2000053:
RJMP _0x2000054
_0x2000051:
LDI  R18,LOW(32)
_0x2000054:
RCALL SUBOPT_0x3
SUBI R21,LOW(1)
RJMP _0x200004E
_0x2000050:
_0x200004D:
MOV  R19,R17
SBRS R16,1
RJMP _0x2000055
_0x2000056:
CPI  R19,0
BREQ _0x2000058
SBRS R16,3
RJMP _0x2000059
LDD  R30,Y+6
LDD  R31,Y+6+1
LPM  R18,Z+
STD  Y+6,R30
STD  Y+6+1,R31
RJMP _0x200005A
_0x2000059:
LDD  R26,Y+6
LDD  R27,Y+6+1
LD   R18,X+
STD  Y+6,R26
STD  Y+6+1,R27
_0x200005A:
RCALL SUBOPT_0x3
CPI  R21,0
BREQ _0x200005B
SUBI R21,LOW(1)
_0x200005B:
SUBI R19,LOW(1)
RJMP _0x2000056
_0x2000058:
RJMP _0x200005C
_0x2000055:
_0x200005E:
LDI  R18,LOW(48)
LDD  R30,Y+6
LDD  R31,Y+6+1
RCALL __GETW1PF
STD  Y+8,R30
STD  Y+8+1,R31
LDD  R30,Y+6
LDD  R31,Y+6+1
ADIW R30,2
STD  Y+6,R30
STD  Y+6+1,R31
_0x2000060:
LDD  R30,Y+8
LDD  R31,Y+8+1
LDD  R26,Y+10
LDD  R27,Y+10+1
CP   R26,R30
CPC  R27,R31
BRLO _0x2000062
SUBI R18,-LOW(1)
LDD  R26,Y+8
LDD  R27,Y+8+1
LDD  R30,Y+10
LDD  R31,Y+10+1
SUB  R30,R26
SBC  R31,R27
STD  Y+10,R30
STD  Y+10+1,R31
RJMP _0x2000060
_0x2000062:
CPI  R18,58
BRLO _0x2000063
SBRS R16,3
RJMP _0x2000064
SUBI R18,-LOW(7)
RJMP _0x2000065
_0x2000064:
SUBI R18,-LOW(39)
_0x2000065:
_0x2000063:
SBRC R16,4
RJMP _0x2000067
CPI  R18,49
BRSH _0x2000069
LDD  R26,Y+8
LDD  R27,Y+8+1
SBIW R26,1
BRNE _0x2000068
_0x2000069:
RJMP _0x20000D3
_0x2000068:
CP   R21,R19
BRLO _0x200006D
SBRS R16,0
RJMP _0x200006E
_0x200006D:
RJMP _0x200006C
_0x200006E:
LDI  R18,LOW(32)
SBRS R16,7
RJMP _0x200006F
LDI  R18,LOW(48)
_0x20000D3:
ORI  R16,LOW(16)
SBRS R16,2
RJMP _0x2000070
ANDI R16,LOW(251)
ST   -Y,R20
RCALL SUBOPT_0x5
CPI  R21,0
BREQ _0x2000071
SUBI R21,LOW(1)
_0x2000071:
_0x2000070:
_0x200006F:
_0x2000067:
RCALL SUBOPT_0x3
CPI  R21,0
BREQ _0x2000072
SUBI R21,LOW(1)
_0x2000072:
_0x200006C:
SUBI R19,LOW(1)
LDD  R26,Y+8
LDD  R27,Y+8+1
SBIW R26,2
BRLO _0x200005F
RJMP _0x200005E
_0x200005F:
_0x200005C:
SBRS R16,0
RJMP _0x2000073
_0x2000074:
CPI  R21,0
BREQ _0x2000076
SUBI R21,LOW(1)
LDI  R30,LOW(32)
ST   -Y,R30
RCALL SUBOPT_0x5
RJMP _0x2000074
_0x2000076:
_0x2000073:
_0x2000077:
_0x2000036:
_0x20000D2:
LDI  R17,LOW(0)
_0x2000021:
RJMP _0x200001C
_0x200001E:
LDD  R26,Y+12
LDD  R27,Y+12+1
LD   R30,X+
LD   R31,X+
RCALL __LOADLOCR6
ADIW R28,20
RET
; .FEND
_sprintf:
; .FSTART _sprintf
PUSH R15
MOV  R15,R24
SBIW R28,6
RCALL __SAVELOCR6
MOVW R30,R28
RCALL __ADDW1R15
__GETWRZ 20,21,14
MOV  R0,R20
OR   R0,R21
BRNE _0x2000078
LDI  R30,LOW(65535)
LDI  R31,HIGH(65535)
RJMP _0x2060001
_0x2000078:
MOVW R26,R28
ADIW R26,8
RCALL __ADDW2R15
MOVW R16,R26
__PUTWSR 20,21,8
LDI  R30,LOW(0)
STD  Y+10,R30
STD  Y+10+1,R30
MOVW R26,R28
ADIW R26,12
RCALL __ADDW2R15
LD   R30,X+
LD   R31,X+
ST   -Y,R31
ST   -Y,R30
ST   -Y,R17
ST   -Y,R16
LDI  R30,LOW(_put_buff_G100)
LDI  R31,HIGH(_put_buff_G100)
ST   -Y,R31
ST   -Y,R30
MOVW R26,R28
ADIW R26,12
RCALL __print_G100
MOVW R18,R30
LDD  R26,Y+8
LDD  R27,Y+8+1
LDI  R30,LOW(0)
ST   X,R30
MOVW R30,R18
_0x2060001:
RCALL __LOADLOCR6
ADIW R28,12
POP  R15
RET
; .FEND

.CSEG

.CSEG
_strlen:
; .FSTART _strlen
ST   -Y,R27
ST   -Y,R26
    ld   r26,y+
    ld   r27,y+
    clr  r30
    clr  r31
strlen0:
    ld   r22,x+
    tst  r22
    breq strlen1
    adiw r30,1
    rjmp strlen0
strlen1:
    ret
; .FEND
_strlenf:
; .FSTART _strlenf
ST   -Y,R27
ST   -Y,R26
    clr  r26
    clr  r27
    ld   r30,y+
    ld   r31,y+
strlenf0:
lpm  r0,z+
    tst  r0
    breq strlenf1
    adiw r26,1
    rjmp strlenf0
strlenf1:
    movw r30,r26
    ret
; .FEND

.CSEG
;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS
SUBOPT_0x0:
RCALL _tampilkanMenu
LDI  R26,LOW(200)
LDI  R27,0
RJMP _delay_ms

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:5 WORDS
SUBOPT_0x1:
ANDI R30,LOW(0xF0)
OR   R30,R26
OUT  0xB,R30
SBI  0xB,1
__DELAY_USB 3
CBI  0xB,1
RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:2 WORDS
SUBOPT_0x2:
LD   R30,X+
LD   R31,X+
ADIW R30,1
ST   -X,R31
ST   -X,R30
RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 5 TIMES, CODE SIZE REDUCTION:18 WORDS
SUBOPT_0x3:
ST   -Y,R18
LDD  R26,Y+13
LDD  R27,Y+13+1
LDD  R30,Y+15
LDD  R31,Y+15+1
ICALL
RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 5 TIMES, CODE SIZE REDUCTION:14 WORDS
SUBOPT_0x4:
LDD  R30,Y+16
LDD  R31,Y+16+1
SBIW R30,4
STD  Y+16,R30
STD  Y+16+1,R31
RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 3 TIMES, CODE SIZE REDUCTION:6 WORDS
SUBOPT_0x5:
LDD  R26,Y+13
LDD  R27,Y+13+1
LDD  R30,Y+15
LDD  R31,Y+15+1
ICALL
RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:6 WORDS
SUBOPT_0x6:
LDD  R26,Y+16
LDD  R27,Y+16+1
ADIW R26,4
LD   R30,X+
LD   R31,X+
STD  Y+6,R30
STD  Y+6+1,R31
LDD  R26,Y+6
LDD  R27,Y+6+1
RET

;RUNTIME LIBRARY

.CSEG
__SAVELOCR6:
ST   -Y,R21
__SAVELOCR5:
ST   -Y,R20
__SAVELOCR4:
ST   -Y,R19
__SAVELOCR3:
ST   -Y,R18
__SAVELOCR2:
ST   -Y,R17
ST   -Y,R16
RET

__LOADLOCR6:
LDD  R21,Y+5
__LOADLOCR5:
LDD  R20,Y+4
__LOADLOCR4:
LDD  R19,Y+3
__LOADLOCR3:
LDD  R18,Y+2
__LOADLOCR2:
LDD  R17,Y+1
LD   R16,Y
RET

__ADDW1R15:
CLR  R0
ADD  R30,R15
ADC  R31,R0
RET

__ADDW2R15:
CLR  R0
ADD  R26,R15
ADC  R27,R0
RET

__ANEGW1:
NEG  R31
NEG  R30
SBCI R31,0
RET

__CWD1:
MOV  R22,R31
ADD  R22,R22
SBC  R22,R22
MOV  R23,R22
RET

__LNEGB1:
TST  R30
LDI  R30,1
BREQ __LNEGB1F
CLR  R30
__LNEGB1F:
RET

__DIVW21U:
CLR  R0
CLR  R1
LDI  R25,16
__DIVW21U1:
LSL  R26
ROL  R27
ROL  R0
ROL  R1
SUB  R0,R30
SBC  R1,R31
BRCC __DIVW21U2
ADD  R0,R30
ADC  R1,R31
RJMP __DIVW21U3
__DIVW21U2:
SBR  R26,1
__DIVW21U3:
DEC  R25
BRNE __DIVW21U1
MOVW R30,R26
MOVW R26,R0
RET

__GETW1P:
LD   R30,X+
LD   R31,X
SBIW R26,1
RET

__GETW1PF:
LPM  R0,Z+
LPM  R31,Z
MOV  R30,R0
RET

__PUTPARD1:
ST   -Y,R23
ST   -Y,R22
ST   -Y,R31
ST   -Y,R30
RET

_delay_ms:
adiw r26,0
breq __delay_ms1
__delay_ms0:
wdr
__DELAY_USW 0x7D0
sbiw r26,1
brne __delay_ms0
__delay_ms1:
ret

;END OF CODE MARKER
__END_OF_CODE:


II.     TINJAUAN PUSTAKA

Untuk mengetahui berbagai komponen dan peralatan yang dibutuhkan, maka disusunlah tinjauan pustaka sebagai acuan dalam merancang dan membuat aplikasi menggunakan mikrokontroler ARDUINO UNO R3 ini.

2.1  Mikrokontroler Arduino UNO R3

Arduino UNO adalah sebuah board mikrokontroler yang didasarkan pada ATmega328 (datasheet). Arduino UNO mempunyai 14 pin digital input/output (6 di antaranya dapat digunakan sebagai output PWM), 6 input analog, sebuah osilator Kristal 16 MHz, sebuah koneksi USB, sebuah power jack, sebuah ICSP header, dan sebuat tombol reset. Arduino UNO memuat semua yang dibutuhkan untuk menunjang mikrokontroler, mudah menghubungkannya ke sebuah computer dengan sebuah kabel USB atau mensuplainya dengan sebuah adaptor AC ke DC atau menggunakan baterai untuk memulainya.





Gambar 2.1 Arduino Uno R3

2.2  Driver relay

Relay adalah komponen elektronik berupa saklar elektronik yang digerakkan oleh arus listrik. Secara prinsip, relay merupakan tuas saklardengan lilitan kawat pada batang besi (solenoid) di dekatnya, ketika solenoiddialiri arus listrik, tuas akan tertarik karena adanya gaya magnet yang terjadipada solenoid sehingga kontak saklar akan menutup. Pada saat arusdihentikan, gaya magnet akan hilang, tuas akan kembali keposisi semula dan kontak saklar kembali terbuka.

Modul relay 5V adalah rangkaian elektronik lengkap yang mencakup relay serta komponen pendukung lainnya. Perangkat ini dapat menghidupkan dan mematikan perangkat bertegangan tinggi atau berarus tinggi menggunakan sinyal 5V dari Arduino. Modul ini dapat digunakan untuk mengendalikan perangkat seperti lampu, kipas, motor, solenoida, dll. Relai 5V memiliki tiga terminal bertegangan tinggi (NC, C, dan NO) yang terhubung ke perangkat yang ingin Anda kendalikan. Sisi lainnya memiliki tiga pin bertegangan rendah (Ground, Vcc, dan Signal) yang terhubung ke Arduino.

Gambar 2.2 Driver relay

2.3  Baterai 18650

Baterai 18650 adalah baterai lithium-ion berbentuk silinder yang umum digunakan pada perangkat elektronik. Baterai ini berukuran diameter 18 mm (0,71 in) dan panjang 65 mm (2,56 in), sehingga diberi nama 18650.  Baterai ini memiliki banyak voltase nominal, tergantung pada bahan kimia yang digunakan. Baterai lithium merupakan jenis baterai yang saat ini berkembang dengan sumber arus yang dapat diisi ulang. erkembangan dengan pesat. Baterai lithium memiliki beberap kelebihan, diantaranya dapat menyimpan energi listrik dalam waktu yang lama, memiliki daya yang tinggi, memiliki bobot yang ringan, dan memiliki siklus hidup yang panjang,

Gambar 2.3 Baterai 18650

2.4  Bms Step Up

Baterry Mangement System (BMS) merupakan sebuah modul elektronik yang

memiliki tujuan untuk mengatur kondisi kerja baterai khususnya lithium. BMS ini memiliki beberapa manfaat pada baterai, yaitu dapat melindungi sel baterai, manajemen temperatur sel baterai, akuisisi data, terdapat keseimbangan sel, mengontrol pengisian dan pengosongan baterai.

Gambar 2.4 BMS Step Up

2.5  LCD 16x2

Display LCD (Liquid Crystal Display) pada Arduino merupakan salah satu komponen yang sering digunakan untuk menampilkan informasi dari proyek-proyek Arduino. LCD ini memanfaatkan kristal cair yang berada di antara dua lapisan kaca konduktif. Ketika arus listrik diaplikasikan, kristal cair ini akan mengatur cahaya yang melewatinya, sehingga menciptakan gambar atau teks yang terlihat pada layar.

Ada berbagai jenis LCD yang kompatibel dengan Arduino, namun yang paling umum adalah tipe 16x2, yang berarti layarnya dapat menampilkan 16 karakter dalam 2 baris. LCD ini biasanya memiliki pin untuk power, ground, input data, dan beberapa kontrol lainnya.

Gambar 2.5 LCD 16x2

2.6  Tombol tekan (Push Button)

Push button adalah untuk memutus dan menyambungkan arus listrik. Dimana pemutusan dan pengaliran ini terjadi karena prinsip pengalihan dari satu konduktor ke konduktor lain. Caranya dengan pengoperasian langsung secara manual oleh pengguna.

Gambar 2.6 Push Button

2.7    Saklar

Saklar adalah komponen listrik yang berfungsi sebagai pemutus dan penyambung arus listrik dari sumber arus ke beban listrik pada rangkaian listrik tertutup. Berbagai jenis saklar tersedia dengan fungsi,jenis dan cara pemasangan nya. Saklar yang kami gunakan adalah Saklar Tunggal yang memiliki dua titik kontak . Masing-masing titik kontak dihubungkan pada saluran fasa dan saluran masukan beban.

Gambar 2.7 Saklar

III.     PERANCANGAN ALAT

3.1  Perangkat Keras dan Rangkaian Elektronika 

Adapun alat yang digunakan yaitu sebagai berikut:

1.     Arduino Uno R3

2.     Relay

3.     Driver relay

4. Baterai lithium

5. Bms step up

6. LCD 16x2

7. Push button

8. Saklar


 

3.2  Diagram Blok

Gambar 3.2 Diagram Blok

Keterangan:

1.      Tombol Tekan (Push button) digunakan untuk memulai program dengan mengatur nilai bpm yang diinginkan.

2.      Mikrokontroler yang digunakan adalah ARDUINO UNO R3 yang berfungsi untuk membaca sinyal dari tombol, memproses nilai bpm yang dimasukkan, dan mengontrol relay sesuai nilai bpm

3.      Luaran (output) pada sistem ini adalah driver relay 5v dan LCD. Relay bergerak sesuai kecepatan bpm yang diset dan LCD menampilkan nilaia bpm dan status operasi.

 

3.3 Perangkat Lunak

Perangkat lunak yang digunakan pada proyek ini adalah Arduino software sebagai aplikasi untuk menulis program Arduino serta sebagai downloader program ke board Arduino Uno R3.

3.4  Diagram Alir

Diagram alir dari sistem adalah sebagai berikut:

Gambar 3.4 Diagram Alir

IV.     PENGUJIAN ALAT

Alat sudah bekerja dengan baik. Keadaan awal setelah saklar dinyalakan akan menampilkan pesan pada LCD “Heartbeat Simulator” lalu akan menampilkan nilai bpm yang bisa diatur ketika menekan tombol kurang atau tombol tambah sesuai dengan nilai bpm yang ingin dikalibrasi. Nilai bpm yang tersedia dari 30-240 bpm detak per menit nya.

Setelah mengatur pada nilai bpm yang diinginkan, relay akan hidup seperti simulasi jantung yang berdenyut per menitnya. Tampilan di LCD menunjukkan bpm yang diset serta animasi hati yang ikut bergerak sesuai kecepatan bpm.

Kemudian , alat sudah siap untuk melakukan kalibrasi. Kami menggunakan fetal doppler atau alat pendeteksi jantung janin sebagai alat yang kami kalibrasi. Fetal doppler akan membaca detak simulasi pada relay dan meampilkan nya, nilai yang tertera di LCD akan sama dengan nilai yang dibaca pada fetal doppler. Hal tersebut menujuk kan bahwa alat fetal doppler masih berfungsi dengan baik.

Gambar Hasil Akhir Alat

HASIL DAN PEMBAHASAN

          Pada projek ini penulis melakukan pengujian pada alat fetal doppler. Namun, sebelum dilakukan pengujian, alat fetal doppler harus dilakukan kalibrasi terlebih dahulu dengan menggunakan alat fetal simulator. Setelah melakukan pengujian, alat simulator yang dibuat siap untuk melakukan pengukuran BPM menggunakan fetal doppler dengan dilakukannya pengukuran pada titik ukur 60, 90, 120, 150, 180, 210, dan 240.

Hasil Pengukuran setting 60 BPM

         Dari hasil pengukuran yang dilakukan pada Alat Heartbeat Simulator dan Alat Fetal Heart Detector, diperoleh nilai rata-rata masing-masing sebesar 60 BPM dan 60,5 BPM. Nilai error untuk Alat Heartbeat Simulator adalah 0%, sementara Alat Fetal Heart Detector memiliki error sebesar 0,83%. Error tersebut masih berada di bawah ambang batas yang dapat diterima, menunjukkan perbedaan antara kedua alat cukup kecil dan dalam batas toleransi.

Beberapa faktor yang dapat menyebabkan error antara lain perbedaan mekanisme antara alat, kesalahan saat pengambilan data karena perubahan nilai BPM yang cepat, dan toleransi alat yang memperbolehkan perbedaan kecil.

Tabel 2. Hasil Pengukuran Setting 60 bpm

Percobaan

Hasil Pengukuran pada alat heartbeat simulator

Hasil Pengukuran pada alat Fetal heart detector

1

60 BPM

60 BPM

2

60 BPM

60 BPM

3

60 BPM

60 BPM

4

60 BPM

61 BPM

5

60 BPM

60 BPM

Rata-rata (x)

60

60,5

Error (%)

0%

0.83%

 Hasil Pengukuran setting 90 BPM

         Dari hasil pengukuran yang dilakukan pada Alat Heartbeat Simulator dan Alat Fetal Heart Detector, diperoleh nilai rata-rata masing-masing sebesar 90 BPM dan 90,6 BPM. Nilai error untuk Alat Heartbeat Simulator adalah 0%, karena hasil pengukuran pada alat tersebut konsisten pada 90 BPM. Sedangkan Alat Fetal Heart Detector memiliki error sebesar 0,67%.

Error ini masih tergolong kecil dan berada dalam batas toleransi yang dapat diterima, menunjukkan bahwa perbedaan antara hasil pengukuran kedua alat cukup kecil. Faktor yang dapat menyebabkan error antara lain perbedaan mekanisme antara alat, toleransi alat, atau perubahan kecil dalam pengambilan data.

 Tabel 3. Hasil Pengukuran Setting 90 bpm

Percobaan

Hasil Pengukuran pada alat heartbeat simulator

Hasil Pengukuran pada alat Fetal heart detector

1

90 BPM

90 BPM

2

90 BPM

90 BPM

3

90 BPM

92 BPM

4

90 BPM

90 BPM

5

90 BPM

90 BPM

Rata-rata (x)

90

90,6

Error (%)

0%

0,67%

 Hasil Pengukuran setting 120 BPM

         Dari hasil pengukuran yang dilakukan pada Alat Heartbeat Simulator dan Alat Fetal Heart Detector, diperoleh nilai rata-rata masing-masing sebesar 120 BPM dan 119,5 BPM. Nilai error untuk Alat Heartbeat Simulator adalah 0%, karena hasil pengukuran pada alat tersebut konsisten pada 120 BPM. Sementara Alat Fetal Heart Detector memiliki error sebesar 0,42%.

Error tersebut masih berada dalam batas toleransi yang dapat diterima, menunjukkan bahwa perbedaan antara kedua alat relatif kecil. Beberapa faktor yang dapat menyebabkan error ini antara lain perbedaan mekanisme kerja antara alat-alat tersebut, ketelitian saat pengambilan data, atau toleransi alat yang memungkinkan perbedaan kecil dalam pengukuran.

Meskipun ada sedikit perbedaan antara hasil pengukuran kedua alat, error yang terdeteksi sangat kecil dan tidak signifikan, sehingga pengukuran ini dapat dianggap valid dalam rentang toleransi yang diperkenankan.

Tabel 4. Hasil Pengukuran Setting 120 bpm

Percobaan

Hasil Pengukuran pada alat heartbeat simulator

Hasil Pengukuran pada alat Fetal heart detector

1

120 BPM

119 BPM

2

120 BPM

120 BPM

3

120 BPM

120 BPM

4

120 BPM

120 BPM

5

120 BPM

120 BPM

Rata-rata (x)

120

119,5

Error (%)

0%

0,42%

 

Hasil Pengukuran setting 150 BPM

         Dari hasil pengukuran yang dilakukan pada Alat Heartbeat Simulator dan Alat Fetal Heart Detector, diperoleh nilai rata-rata alat Heartbeat Simulator sebesar 150 BPM dan rata-rata alat Fetal Heart Detector sebesar 149,8 BPM. Nilai error yang terdeteksi antara kedua alat adalah 0,13%.

Error yang sangat kecil ini menunjukkan bahwa kedua alat menghasilkan pengukuran yang sangat mendekati satu sama lain. Faktor-faktor yang dapat menyebabkan error ini termasuk perbedaan mekanisme kerja antara alat-alat tersebut atau toleransi kecil dalam pengukuran. Namun, error tersebut masih berada dalam batas toleransi yang dapat diterima, sehingga pengukuran dapat dianggap valid.

Tabel 5. Hasil Pengukuran Setting 150 bpm

Percobaan

 

Hasil Pengukuran pada alat heartbeat simulator

Hasil Pengukuran pada alat Fetal heart detector

1

150 BPM

149 BPM

2

150 BPM

150 BPM

3

150 BPM

150 BPM

4

150 BPM

150 BPM

5

150 BPM

150 BPM

Rata-rata (x)

150

149,8

Error (%)

0%

0,13%

 Hasil Pengukuran setting 180 BPM

         Dari hasil pengukuran yang dilakukan pada Alat Heartbeat Simulator dan Alat Fetal Heart Detector, diperoleh nilai rata-rata masing-masing sebesar 180 BPM untuk Alat Heartbeat Simulator dan 180,2 BPM untuk Alat Fetal Heart Detector. Nilai error yang terdeteksi adalah 0,11%.

Error ini sangat kecil, menunjukkan bahwa kedua alat menghasilkan pengukuran yang sangat mendekati satu sama lain. Perbedaan kecil ini masih dalam batas toleransi yang dapat diterima. Faktor-faktor yang dapat menyebabkan error ini termasuk perbedaan mekanisme pengukuran, variasi kecil dalam pengambilan data, atau toleransi alat. Secara keseluruhan, pengukuran ini dapat dianggap sangat akurat.

 Tabel 6. Hasil Pengukuran Setting 180 bpm

Percobaan

Hasil Pengukuran pada alat heartbeat simulator

Hasil Pengukuran pada alat Fetal heart detector

1

180 BPM

180 BPM

2

180 BPM

181 BPM

3

180 BPM

180 BPM

4

180 BPM

180 BPM

5

180 BPM

180 BPM

Rata-rata (x)

180

180,2

Error (%)

0%

0,11%

Hasil Pengukuran setting 210 BPM

         Dari hasil pengukuran yang dilakukan pada Alat Heartbeat Simulator dan Alat Fetal Heart Detector, diperoleh nilai rata-rata masing-masing sebesar 210 BPM untuk Alat Heartbeat Simulator dan 210,2 BPM untuk Alat Fetal Heart Detector. Nilai error yang terdeteksi adalah 0,095%.

Error ini sangat kecil, menunjukkan bahwa kedua alat menghasilkan pengukuran yang sangat mendekati satu sama lain. Perbedaan kecil ini masih dalam batas toleransi yang dapat diterima. Faktor-faktor yang dapat menyebabkan error ini termasuk perbedaan mekanisme pengukuran atau variasi kecil dalam pengambilan data. Secara keseluruhan, pengukuran ini dapat dianggap sangat akurat.

Tabel 7. Hasil Pengukuran Setting 210 bpm

Percobaan

Hasil Pengukuran pada alat heartbeat simulator

Hasil Pengukuran pada alat Fetal heart detector

1

210 BPM

210 BPM

2

210 BPM

210 BPM

3

210 BPM

210 BPM

4

210 BPM

211 BPM

5

210 BPM

210 BPM

Rata-rata (x)

210

210,2

Error (%)

0%

0,095%

Hasil Pengukuran setting 240 BPM

         Dari hasil pengukuran yang dilakukan pada Alat Heartbeat Simulator dan Alat Fetal Heart Detector, diperoleh nilai rata-rata masing-masing sebesar 240 BPM untuk Alat Heartbeat Simulator dan 239,6 BPM untuk Alat Fetal Heart Detector. Nilai error yang terdeteksi adalah 0,17%.

Error ini sangat kecil, menunjukkan bahwa kedua alat menghasilkan pengukuran yang sangat mendekati satu sama lain. Perbedaan kecil ini masih dalam batas toleransi yang dapat diterima. Faktor-faktor yang dapat menyebabkan error ini termasuk perbedaan mekanisme pengukuran atau variasi kecil dalam pengambilan data. Secara keseluruhan, pengukuran ini dapat dianggap sangat akurat.

Tabel 7. Hasil Pengukuran Setting 240 bpm

Percobaan

Hasil Pengukuran pada alat heartbeat simulator

Hasil Pengukuran pada alat Fetal heart detector

1

240 BPM

240 BPM

2

240 BPM

240 BPM

3

240 BPM

240 BPM

4

240 BPM

240 BPM

5

240 BPM

238 BPM

Rata-rata (x)

240

239,6

Error (%)

0%

0,17%

V.        KESIMPULAN

Proyek ini berhasil merancang dan merealisasikan alat kalibrasi portabel berbasis mikrokontroler Arduino Uno R3 untuk mendeteksi detak jantung janin. Alat ini mampu mensimulasikan detak jantung dengan frekuensi yang dapat disesuaikan (30-240 bpm) menggunakan relay sebagai penghasil simulasi denyut, sementara tampilan LCD menunjukkan nilai bpm yang disetel beserta animasi hati yang bergerak sesuai kecepatan denyut.

Pengujian dengan fetal doppler menunjukkan bahwa alat ini dapat menghasilkan nilai simulasi detak jantung yang sesuai dengan nilai yang ditampilkan pada layar LCD. Hal ini membuktikan bahwa alat ini efektif untuk menguji dan memastikan keakuratan perangkat medis seperti fetal doppler.

Keberhasilan alat ini menunjukkan potensinya sebagai solusi yang terjangkau dan portabel untuk kalibrasi perangkat medis, terutama di fasilitas kesehatan dengan keterbatasan sumber daya, mendukung peningkatan layanan kesehatan ibu dan janin.

VI.        PPT PROJEK

https://www.canva.com/design/DAGXcXxi9do/hnPnTTPZWH2mLovp0TtGpg/edit?utm_content=DAGXcXxi9do&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton

VII.        VIDEO PROJEK




VII.        FOTO PRESENTASI PROJEK


Presentasi kepada Dosen pengampu Dr. Samuel BETA K.K.; Ing-Tech.,M.T.

DAFTAR PUSTAKA

Fajrin, H. R., Maharani, S., & Fitriyah, A. (2021). Simulator Fetal Doppler. Medika Teknika: Jurnal Teknik Elektromedik Indonesia, Universitas Muhammadiyah Yogyakarta. Tersedia di: https://journal.umy.ac.id/index.php/mt/article/download/11212/pdf

Fernanda, A. (2022). Perancangan dan Implementasi Sistem Pemantau Detak Jantung Janin Menggunakan Fetal Doppler Berbasis Mikrokontroler. Skripsi. Universitas Wijaya Kusuma Surabaya. Tersedia di: https://eprints.uwhs.ac.id/2047/.

Fernanda, A. (2021). Pengujian dan Analisis Alat Fetal Doppler dalam Menentukan Akurasi Deteksi Detak Jantung Janin. Skripsi. Universitas Wijaya Kusuma Surabaya. Tersedia di: https://eprints.uwhs.ac.id/1549/

 PROFIL PENULIS

Penulis atas nama Benaya Revanico Harsono dilahirkan di Semarang, 2 April 2004.  Penulis telah menempuh pendidikan formal di SD Negeri Pleburan 03, SMP N 5 Semarang, dan SMKN 7 Semarang. Tahun 2023 penulis menyelesaikan pendidikannya di SMK. Pada tahun 2023 penulis mengikuti seleksi mahasiswa baru Sarjana Terapan (D4) dan diterima menjadi mahasiswa baru Sarjana Terapan (D4) di kampus Politeknik Negeri Semarang (Polines) dengan Program Studi D4 Tenologi Rekayasa Elektronika, Jurusan Teknik Elektro. Penulis terdaftar dengan NIM. 4.34.23.0.04.
Apabila ada kritik, saran dan pertanyaan mengenai penelitian ini, bisa via email: revanicobenaya@gmail.com



Penulis atas nama Nasfa Tri Utama dilahirkan di Kota Semarang, 8 Mei 2005.  Penulis telah menempuh pendidikan formal di SD Negeri Sumurrejo 01, SMP N 24 Semarang, dan SMA N 12 Semarang. Tahun 2023 penulis menyelesaikan pendidikannya di SMA. Pada tahun 2023 penulis mengikuti seleksi mahasiswa baru sarjana terapan (D4) dan diterima menjadi mahasiswa baru sarjana terapan (D4) di kampus Politeknik Negeri Semarang (Polines) dengan Program Studi D4  Teknologi Reakayasa Elektronika Jurusan Teknik Elektro. Penulis terdaftar dengan NIM. 4.34.23.0.16. Apabila ada kritik, saran dan pertanyaan mengenai penelitian ini, bisa via email: nasfatriutama08@gmail.com



Penulis atas nama Frisca Syaharani dilahirkan di Kabupaten Semarang 29 September 2005.  Penulis telah menempuh pendidikan formal di SMK N 2 Salatiga. Tahun 2023 penulis menyelesaikan pendidikannya di SMK. Pada tahun 2023 penulis mengikuti seleksi mahasiswa baru diploma (D4) dan diterima menjadi mahasiswa baru diploma (D4) di kampus Politeknik Negeri Semarang (Polines) dengan Program Studi D4 Teknik Elektronika, Jurusan Rekayasa Teknik Elektro. Penulis terdaftar dengan NIM. 4.34.23.0.09. Apabila ada kritik, saran dan pertanyaan mengenai penelitian ini, bisa via email: syharanifrsca@gmail.com.




Penulis atas nama Salsabila Chairunisa dilahirkan di Salatiga 15 mei 2004. Penulis telah menempuh  pendidikan formal di SMKN 3 Salatiga. Tahun 2023 penulis menyelesaikan pendidikannya di SMK. Pada tahun 2023 penulis mengikuti seleksi mahasiswa baru diploma (D4) dan diterima menjadi mahasiswa baru diploma (D4) di kampus Politeknik Negeri Semarang (Polines) dengan Program studi D4 Teknologi Rekayasa Elektronika, jurusan Teknik Elektro. Penulis terdaftar dengan NIM 4.34.23.0.22. Apabila ada kritik, saran dan pertanyaan mengenai penelitian ini, bisa via email: salsabilachairunisa05@gmail.com








Komentar

Posting Komentar

Postingan populer dari blog ini

SISTEM LAMPU PENERANGAN JALAN OTOMATIS DENGAN SENSOR LDR BERBASIS ATMega8535

SISTEM PEMANTAUAN SUHU DAN KELEMBABAN PADA SUATU RUANGAN MENGGUNAKAN SENSOR DHT22 BERBASIS MIKROKONTROLLER ARDUINO UNO ATMEGA328P

ATAP OTOMATIS DENGAN SENSOR HUJAN BERBASIS ATMEGA 8535