1. Foto Hardware dan Diagram Blok [Kembali]
Diagram Blok:
2. Prosedur Percobaan [Kembali]
- Rangkai semua komponen
- Buat program di aplikasi arduino IDE
- Setelah selesai masukkan program ke arduino
- Jalankan program pada simulasi dan cobakan dengan modul
Prinsip Kerja
Pada rangkaian ini menggunakan komponen antara lain yaitu mikrokontroler (ATMEGA328P-PU), dip switch, resistor, dan display 7 segment.
Mikrokontroler ATMEGA328P-PU adalah inti rangkaian, yang mengelola pengoperasian dip switch dan display 7 segment. Dip switch terhubung ke mikrokontroler melalui pin input analog pada arduino yaitu pin A0 - A4, sedangkan 7 segment terhubung ke pin output arduino yaitu pin 4-13, dimana d1 & d2 terpasang resistor lalu terhubung ke pin 4 & 5, serta pin A hingga DP pada display terhubung secara berurutan dari 6-13. pin D1 dan D2 berperan sebagai display satuan dan puluhan, dan pin A-DP berperan sebagai LED dalam display yang berfungsi dalam membentuk karakter yang diinginkan.
Ketika total ada 2 push button yang ditekan, pin input yang terpasang di Arduino mendeteksi perubahan tegangan dan mengirimkan sinyal ke mikrokontroler. Mikrokontroler kemudian mengaktifkan pin output untuk menjalankan program dengan menghidupkan display 7 segment dan mulai menghitung mundur dari 15 hingga 0.
4. Flowchart dan Listing Program [Kembali]
Listing Program:
// Mendefinisikan nomor pin untuk segmen-segmen a sampai g dan titik desimal (dp) pada display 7-segmen
#define a 6
#define b 7
#define c 8
#define d 9
#define e 10
#define f 11
#define g 12
#define dp 13
// Mendefinisikan nomor pin untuk dua digit (D1 dan D2) pada display 7-segmen
#define D1 4
#define D2 5
// Mendefinisikan nomor pin untuk empat tombol switch (Dsw1 sampai Dsw4)
#define Dsw1 A0
#define Dsw2 A1
#define Dsw3 A2
#define Dsw4 A3
// Inisialisasi array dengan nomor pin segmen-segmen untuk memudahkan kontrol segmen
int segments[] = {a, b, c, d, e, f, g};
// Membuat array dua dimensi untuk menentukan pola yang dinyalakan (1) atau dimatikan (0) untuk masing-masing angka 0-9, dp, dan kondisi kosong
byte digitPatterns[16][7] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1}, // 9
{0, 0, 0, 0, 0, 0, 1}, // dp (titik desimal)
{0, 0, 0, 0, 0, 0, 0}, // kondisi kosong
};
void setup() {
// Mengatur pin-pin segmen sebagai OUTPUT
for (int i = 0; i < 7; i++) {
pinMode(segments[i], OUTPUT);
}
// Mengatur pin dp dan digit sebagai OUTPUT
pinMode(dp, OUTPUT);
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
// Mengatur pin-pin switch sebagai INPUT_PULLUP (menggunakan resistor pull-up internal)
pinMode(Dsw1, INPUT_PULLUP);
pinMode(Dsw2, INPUT_PULLUP);
pinMode(Dsw3, INPUT_PULLUP);
pinMode(Dsw4, INPUT_PULLUP);
// Memulai komunikasi serial pada baud rate 9600 untuk debugging
Serial.begin(9600);
}
void displayDigit(int digit, int digitPosition) {
// Menyalakan segmen-segmen berdasarkan pola digit yang diinginkan
for (int i = 0; i < 7; i++) {
digitalWrite(segments[i], digitPatterns[digit][i]);
}
// Mengaktifkan digit yang sesuai berdasarkan posisi yang diinginkan
if (digitPosition == D1) {
digitalWrite(D1, HIGH); // Aktifkan digit 1
digitalWrite(D2, LOW); // Pastikan digit 2 non-aktif
} else if (digitPosition == D2) {
digitalWrite(D1, LOW); // Pastikan digit 1 non-aktif
digitalWrite(D2, HIGH); // Aktifkan digit 2
}
}
void displayNumber(int number) {
// Fungsi untuk menampilkan angka pada display 7-segmen
if (number < 10) {
// Jika angka kurang dari 10, tampilkan hanya pada digit pertama
digitalWrite(D1, HIGH);
digitalWrite(D2, LOW);
displayDigit(0, D2); // Menampilkan angka 0 pada digit kedua
displayDigit(number, D1); // Menampilkan angka pada digit pertama
} else {
// Jika angka 10 atau lebih, pecah menjadi dua digit dan tampilkan secara bergantian
int tensDigit = number / 10; // Digit puluhan
int unitsDigit = number % 10; // Digit satuan
displayDigit(tensDigit, D2); // Tampilkan digit puluhan pada digit kedua
delay(200); // Tunda untuk visibility
displayDigit(unitsDigit, D1); // Tampilkan digit satuan pada digit pertama
}
delay(1000); // Tunda untuk memastikan angka terlihat dengan jelas
}
void loop() {
// Membaca status dari tombol-tombol dan menentukan apakah tombol ditekan (LOW karena menggunakan INPUT_PULLUP)
bool sw1 = digitalRead(Dsw1) == LOW;
bool sw2 = digitalRead(Dsw2) == LOW;
bool sw3 = digitalRead(Dsw3) == LOW;
bool sw4 = digitalRead(Dsw4) == LOW;
// Menghitung jumlah tombol yang ditekan
int pressedCount = sw1 + sw2 + sw3 + sw4;
// Variabel untuk menyimpan waktu terakhir tombol ditekan dan counter untuk angka yang ditampilkan
static unsigned long lastTime = 0;
static int count = 15;
if (pressedCount == 2) {
// Jika ada dua tombol yang ditekan secara bersamaan, kurangi nilai counter dan tampilkan angka
if (millis() - lastTime > 1000) { // Menggunakan debounce time 1 detik
lastTime = millis();
if (count >= 10) {
// Jika counter >= 10, gunakan fungsi displayNumber untuk menampilkan angka
displayNumber(count);
} else {
// Jika counter < 10, cukup gunakan displayDigit untuk menampilkan angka pada digit pertama
displayDigit(0, D2); // Menampilkan 0 pada digit kedua sebagai placeholder
displayDigit(count, D1); // Menampilkan angka pada digit pertama
delay(1000); // Tunda untuk visibility
}
count--;
if (count < 0) {
count = 15; // Reset counter ke 15 setelah mencapai 0
}
}
} else {
count = 15; // Reset counter jika tidak ada dua tombol yang ditekan secara bersamaan
}
}
Percobaan 3 Kondisi 2 : "ketika 2 switch aktif, 7-Segment menghitung mundur dari 15"
- HTML↠ klik disini
- File Rangkaian↠ klik disini
- Video Percobaan↠ klik disini
- Listing Program↠ klik disini
- Datasheet Arduino↠ klik disini
- Datasheet 7 segment↠ klik disini
- Datasheet Dipswitch↠ klik disini
0 Komentar