Skip to content

Instantly share code, notes, and snippets.

@idriszmy
Last active May 10, 2019 02:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save idriszmy/7e0c074504e41ef975cbd617d963b3fa to your computer and use it in GitHub Desktop.
Save idriszmy/7e0c074504e41ef975cbd617d963b3fa to your computer and use it in GitHub Desktop.
Melaksanakan tugasan gangguan luaran melalui butang tekan di Maker UNO.
/*
Fungsi kod: Membaca pin butang tekan dan melaksanakan tugasan
gangguan luaran.
Penulis: Idris Zainal Abidin
Blog: https://idrisz.my
Kemaskini: 29 April 2019
*/
#define BUTTON 2 // Butang tekan bersambung pada pin 2
#define BUZZER 8 // Pembaz bersambung pada pin 8
#define NOTE_C4 262
#define NOTE_G4 392
#define playMelody1() playTone(melody1, melody1Dur, 1)
#define playMelody2() playTone(melody2, melody2Dur, 1)
int melody1[] = {NOTE_G4};
int melody1Dur[] = {12};
int melody2[] = {NOTE_C4};
int melody2Dur[] = {12};
int ledPin[6] = {3, 5, 6, 9, 10, 11}; // Pin keluaran analog disusun
// dalam bentuk pemboleh ubah array
// ledPin[0] merujuk pada LED pin 3
// ledPin[1] merujuk pada LED pin 5
// ledPin[2] merujuk pada LED pin 6
// ledPin[3] merujuk pada LED pin 9
// ledPin[4] merujuk pada LED pin 10
// ledPin[5] merujuk pada LED pin 11
int i = 0; // Pemboleh ubah i
int pwm = 0; // Pemboleh ubah pwm
boolean fadingMode = false; // Pemboleh ubah mod kecerahan
// Pemboleh ubah waktu menunggu untuk LED bertukar
// Perlu diletakkan volatile di hadapan jika pemboleh ubah
// tersebut ingin digunakan didalam fungsi kejadian gangguan luaran
volatile int ledDelay = 1000;
void setup()
{
// Tetapkan pin 3, 5, 6, 9, 10 dan 11 sebagai keluaran
for (i = 0; i < 6; i++) {
pinMode(ledPin[i], OUTPUT);
}
pinMode(BUTTON, INPUT_PULLUP); // Tetapkan butang tekan sebagai pin masukan pullup
pinMode(BUZZER, OUTPUT); // Tetapkan pembaz sebagai pin keluaran
// Tetapkan pin pada butang tekan sebagai gangguan luaran
// Namakan fungsi kejadian adalah buttonTrigger
// Gangguan akan berlaku setiap kali isyarat berubah dari HIGH ke LOW atau sebaliknya
attachInterrupt(digitalPinToInterrupt(BUTTON), buttonTrigger, CHANGE);
// LED3 akan semakin cerah perlahan-lahan
for (pwm = 0; pwm < 256; pwm++) { // Nilai pemboleh ubah pwm bermula dari 0
// dan naik dengan tambahan 1, sehingga 255
analogWrite(ledPin[0], pwm); // Menghantar isyarat analog (nilai pwm) ke pin LED3
delayMicroseconds(ledDelay); // Tunggu 1 mili saat
}
}
void loop()
{
// Melakukan corak LED berdasarkan contoh kod IsyaratKeluaranAnalog3
playMelody1();
for (i = 0; i < 5; i++) {
fadingMode = !fadingMode;
if (fadingMode == true) {
for (pwm = 255; pwm >= 0; pwm--) {
analogWrite(ledPin[i], pwm);
analogWrite(ledPin[i+1], 255-pwm);
delayMicroseconds(ledDelay);
}
}
else {
for (pwm = 0; pwm < 256; pwm++) {
analogWrite(ledPin[i], 255-pwm);
analogWrite(ledPin[i+1], pwm);
delayMicroseconds(ledDelay);
}
}
}
playMelody2();
for (i = 5; i > 0 ; i--) {
fadingMode = !fadingMode;
if (fadingMode == true) {
for (pwm = 255; pwm >= 0; pwm--) {
analogWrite(ledPin[i], pwm);
analogWrite(ledPin[i-1], 255-pwm);
delayMicroseconds(ledDelay);
}
}
else {
for (pwm = 0; pwm < 256; pwm++) {
analogWrite(ledPin[i], 255-pwm);
analogWrite(ledPin[i-1], pwm);
delayMicroseconds(ledDelay);
}
}
}
}
// Fungsi kejadian gangguan luaran
void buttonTrigger()
{
if (digitalRead(BUTTON) == LOW) { // Jika butang ditekan
ledDelay = 200; // Ubah waktu menunggu kepada 200us
}
else { // Jika butang dilepaskan
ledDelay = 1000; // Ubah waktu menunggu kepada 1000us
}
}
void playTone(int *melody, int *melodyDur, int notesLength)
{
for (int i = 0; i < notesLength; i++) {
int noteDuration = 1000/melodyDur[i];
tone(BUZZER, melody[i], noteDuration);
delay(noteDuration);
noTone(BUZZER);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment