#include <LiquidCrystal_I2C.h>
#define NIM 21650097
#define BTN1 11
#define BTN2 12
#define BTN3 13
#define BUZ1 9
#define BUZ2 10
#define POT A0
#define LED A1
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Define pins for seven-segment display
const byte sevseg[] = {7, 8, 2, 3, 4, 6, 5};
bool btn1Pressed = false;
byte angka = 0;
volatile bool bunyi = false;
String n_ = String(NIM);
byte nim[8];
int mq2 = -1;
const uint8_t angka_sevseg[][8] = {
{0b01110, 0b10001, 0b10011, 0b10101, 0b11001, 0b10001, 0b01110, 0b00000},
{0b00100, 0b01100, 0b00100, 0b00100, 0b00100, 0b00100, 0b01110, 0b00000},
{0b01110, 0b10001, 0b00001, 0b00010, 0b00100, 0b01000, 0b11111, 0b00000},
{0b11111, 0b00010, 0b00100, 0b00010, 0b00001, 0b10001, 0b01110, 0b00000},
{0b00010, 0b00110, 0b01010, 0b10010, 0b11111, 0b00010, 0b00010, 0b00000},
{0b11111, 0b10000, 0b11110, 0b00001, 0b00001, 0b10001, 0b01110, 0b00000},
{0b00110, 0b01000, 0b10000, 0b11110, 0b10001, 0b10001, 0b01110, 0b00000},
{0b11111, 0b10001, 0b00001, 0b00010, 0b00100, 0b00100, 0b00100, 0b00000},
{0b01110, 0b10001, 0b10001, 0b01110, 0b10001, 0b10001, 0b01110, 0b00000},
{0b01110, 0b10001, 0b10001, 0b01111, 0b00001, 0b00010, 0b01100, 0b00000},
};
void setup() {
Serial.begin(9600);
Serial.flush();
lcd.init();
lcd.backlight();
lcd.clear();
pinMode(BTN1, INPUT_PULLUP);
pinMode(BTN2, INPUT_PULLUP);
pinMode(BTN3, INPUT_PULLUP);
pinMode(LED, OUTPUT);
pinMode(BUZ1, OUTPUT);
pinMode(BUZ2, OUTPUT);
// Set up pins for seven-segment display
for (byte i : sevseg) {
pinMode(i, OUTPUT);
digitalWrite(i, HIGH);
}
attachInterrupt(digitalPinToInterrupt(BTN3), tombolInterrupt, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nama:Andi Farhan");
for (byte i = 0; i < 8; i++) {
nim[i] = n_.charAt(i) - '0';
lcd.createChar(i+1, nullptr);
}
lcd.setCursor(0, 1);
lcd.print("NIM :\x01\x02\x03\x04\x05\x06\x07\x08");
delay(200);
}
void loop() {
// Check if BTN1 is pressed
if (digitalRead(BTN1) == LOW) {
tombol1:
delay(250);
matikanLcd();
angka = 0;
musik();
matikan();
nyalakanLcd();
bunyi = false;
}
// Check if BTN2 is pressed
if (digitalRead(BTN2) == LOW) {
tombol2:
delay(250);
matikanLcd();
// Blink the LED
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
nyalakanLcd();
bunyi = false;
}
// Check if BTN3 is pressed
if (digitalRead(BTN3) == LOW) {
tombol3:
delay(250);
matikanLcd();
bunyi = !bunyi;
digitalWrite(LED, HIGH);
delay(300);
digitalWrite(LED, LOW);
nyalakanLcd();
}
if (bunyi) {
int mq = analogRead(POT);
mq = map(mq, 0, 1023, 0, 100);
if (mq == mq2) goto langkahi_2;
mq2 = mq;
Serial.print("Intensitas Gas: ");
Serial.print(mq);
Serial.println("%");
if (mq < 50) goto langkahi;
langkahi_2:
tone(BUZ1, 200);
delay(100);
noTone(BUZ1);
delay(300);
}
langkahi:
// delay(100);
resetLcd();
uint8_t nim_2[8][8] = {{0}};
for (byte i = 0; i < 8; i++) {
for (byte j = 0; j < 8; j++) {
nim_2[j][i] = angka_sevseg[nim[j]][i];
lcd.createChar(j+1, nim_2[j]);
if (digitalRead(BTN1) == LOW) goto tombol1;
if (digitalRead(BTN2) == LOW) goto tombol2;
if (digitalRead(BTN3) == LOW) goto tombol3;
}
}
}
void tombolInterrupt() {
bunyi = false;
}
void musik() {
#define NOTE_D4 294
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_G4 392
#define NOTE_A4 440
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_D5 587
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_G5 784
#define NOTE_A5 880
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_D6 1175
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_G6 1568
#define NOTE_A6 1760
#define NOTE_B6 1976
#define REST 0
int melody[] = {
NOTE_A4, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_E5, NOTE_D5, NOTE_C5, NOTE_B4, NOTE_A4, NOTE_A4, NOTE_D5,
NOTE_E5, NOTE_F5, NOTE_E5, NOTE_D5, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_A4, NOTE_D5, NOTE_F5, NOTE_G5,
NOTE_A5, NOTE_G5, NOTE_F5, NOTE_E5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_E5,
NOTE_A5, NOTE_A5, NOTE_G5, NOTE_F5, NOTE_E5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_C5, NOTE_B4, NOTE_A4
};
int noteDurations[] = {
4, 8, 8, 4, 8, 8, 4, 4, 2, 4, 8,
8, 4, 8, 8, 4, 4, 2, 4, 8, 8, 4,
4, 4, 4, 8, 8, 8, 8, 4, 4, 2, 4,
8, 8, 8, 8, 4, 4, 2, 4, 8, 8, 4
};
for (int i = 0; i < sizeof(melody) / sizeof(melody[0]); i++) {
int duration = 1000 / noteDurations[i];
if (melody[i] != REST) {
tone(BUZ2, melody[i], duration);
tampilAngka(angka);
angka = (angka + 1) % 10;
} else {
noTone(BUZ2);
}
delay(duration * 1.1); // Add a small delay to avoid overlap
}
noTone(BUZ2); // Stop the tone after the melody is finished
}
void resetLcd() {
for (byte i = 0; i < 8; i++)
lcd.createChar(i+1, {0});
}
void matikanLcd() {
lcd.noDisplay();
lcd.noBacklight();
resetLcd();
}
void nyalakanLcd() {
lcd.display();
lcd.backlight();
}
void tampilAngka(byte num) {
switch (num) {
case 1: nyalakan("bc"); break;
case 2: nyalakan("abdeg"); break;
case 3: nyalakan("abcdg"); break;
case 4: nyalakan("bcfg"); break;
case 5: nyalakan("acdfg"); break;
case 6: nyalakan("acdefg"); break;
case 7: nyalakan("abc"); break;
case 8: nyalakan("abcdefg"); break;
case 9: nyalakan("abcdfg"); break;
default: nyalakan("abcdef"); break;
}
}
void nyalakan(String l) {
matikan();
for (char c : l)
digitalWrite(sevseg[convertToNumber(c)], LOW);
}
void matikan() {
for (byte e : sevseg)
digitalWrite(e, HIGH);
}
int convertToNumber(char input) {
switch (input) {
case 'a': return 0;
case 'b': return 1;
case 'c': return 2;
case 'd': return 3;
case 'e': return 4;
case 'f': return 5;
case 'g': return 6;
}
}