Cari Kode

Pelajaran 17/31: Cara menginterupsi penundaan di Arduino dan Resistor Tergantung Cahaya LDR | Robojax

Pelajaran 17/31: Cara menginterupsi penundaan di Arduino dan Resistor Tergantung Cahaya LDR | Robojax

Dalam panduan ini, kita akan menjelajahi dua konsep penting Arduino: interupsi dan resistor bergantung cahaya (LDR). Anda akan belajar cara menginterupsi penundaan dalam kode Anda sehingga Arduino dapat merespons penekanan tombol secara instan, dan kemudian kita akan membangun sirkuit pendeteksi cahaya yang dapat secara otomatis menyalakan buzzer atau lampu di malam hari. Proyek ini sangat cocok bagi siapa saja yang ingin melampaui sketsa LED berkedip dasar dan mulai membangun proyek otomatisasi responsif di dunia nyata. Anda dapat menerapkan keterampilan ini untuk membuat lampu malam pintar untuk lorong Anda, alarm keamanan sederhana yang berbunyi saat pintu terbuka, lampu taman bertenaga surya yang aktif saat senja, atau tirai otomatis yang menutup saat matahari terbenam. Pelajaran ini didasarkan pada kit Arduino 3-in-1 SunFounder, tetapi konsepnya berlaku untuk papan Arduino standar apa pun.

LDR_12708_orig
LDR Illustration and symbol

Perangkat Keras & Komponen

Untuk mengikuti proyek ini, Anda akan memerlukan komponen berikut. Arduino Uno atau Nano standar sangat cocok untuk pembuatan ini.

  • Arduino Uno atau Nano
  • Resistor Bergantung Cahaya (LDR), seperti Kweeds KM601
  • Resistor 10k Ohm
  • Tombol Tekan
  • Buzzer
  • Papan Roti dan Kabel Penghubung

Memahami Interupsi Arduino

Dalam sketsa Arduino standar, fungsi loop() berjalan terus menerus, mengeksekusi tugas baris demi baris. Saat Anda menggunakan delay(), Arduino berhenti melakukan apa pun selama durasi tersebut. Ini menjadi masalah jika Anda perlu merespons peristiwa penting, seperti penekanan tombol, sementara tugas lain sedang berjalan. Misalnya, jika Anda memiliki penundaan satu detik untuk mengedipkan LED, penekanan tombol mungkin tidak terdaftar hingga satu detik, yang terasa tidak responsif (dalam video pada 08:13).

Interupsi Arduino memecahkan masalah ini. Interupsi adalah fitur perangkat keras yang memungkinkan pin tertentu untuk "menginterupsi" program utama, menjeda apa pun yang sedang dilakukan, dan menjalankan fungsi khusus yang disebut Rutin Layanan Interupsi (ISR). Ini memungkinkan Arduino Anda merespons peristiwa berprioritas tinggi secara instan, terlepas dari apa pun yang terjadi. Penting untuk dicatat bahwa tidak semua pin mendukung interupsi. Pada Arduino Uno dan Nano, hanya pin 2 dan 3 yang dapat digunakan untuk tujuan ini (dalam video pada 02:37). Papan lain seperti Mega memiliki lebih banyak opsi, tetapi untuk proyek ini, kita akan tetap menggunakan pin 2.

Interupsi dapat dipicu oleh perubahan status yang berbeda pada pin: LOW, CHANGE, RISING, dan FALLING. Mode CHANGE memicu interupsi setiap kali status pin berubah dari HIGH ke LOW atau LOW ke HIGH, yang sempurna untuk sakelar penekanan tombol.

Panduan Pengkabelan

buzzer_push_button_schematic
lcd1602_I2C_wiring_sunfounder

Kita akan membangun dua sirkuit dalam pelajaran ini. Yang pertama mendemonstrasikan interupsi dengan tombol dan buzzer, dan yang kedua menggunakan LDR untuk merasakan tingkat cahaya. Mari kita mulai dengan sirkuit interupsi.

Sirkuit 1: Tombol dan Buzzer untuk Demo Interupsi

Sirkuit ini sederhana. Tombol terhubung ke pin 2, yang merupakan pin interupsi kita. Resistor pull-down 10k Ohm memastikan pin membaca LOW saat tombol tidak ditekan, dan HIGH saat ditekan. Buzzer terhubung ke pin 8.

Untuk demo interupsi, hubungkan komponen sebagai berikut:

  • Tombol Tekan: Hubungkan satu kaki ke 5V dan kaki lainnya ke pin digital 2. Hubungkan resistor 10k Ohm dari pin 2 ke GND.
  • Buzzer: Hubungkan kabel negatif ke GND dan kabel positif ke pin digital 8.

Sirkuit 2: LDR dan Buzzer untuk Sensor Cahaya

Untuk sirkuit LDR, kita menggunakan konfigurasi pembagi tegangan. Resistansi LDR berubah dengan cahaya, yang mengubah tegangan pada pin analog. Saat gelap, LDR memiliki resistansi tinggi (sekitar 10k Ohm), dan saat terang, resistansi turun secara signifikan (dalam video pada 16:25). Perubahan resistansi inilah yang kita ukur.

Pembagi tegangan diperlukan karena Arduino hanya dapat membaca tegangan, bukan resistansi. Dengan menempatkan LDR secara seri dengan resistor tetap 10k Ohm, tegangan di titik di antara keduanya berubah secara proporsional dengan resistansi LDR. Tegangan ini kemudian dibaca oleh konverter analog-ke-digital (ADC) Arduino.

Untuk demo LDR, hubungkan komponen sebagai berikut:

  • LDR: Hubungkan satu kaki ke 5V dan kaki lainnya ke pin analog A0.
  • Resistor 10k Ohm: Hubungkan dari kaki LDR yang menuju A0 ke GND. Ini menciptakan pembagi tegangan.
  • Buzzer: Hubungkan kabel negatif ke GND dan kabel positif ke pin digital 8.

Catatan: Penugasan pin yang tepat didefinisikan dalam kode dan dapat diubah sesuai dengan pengaturan Anda.

Penjelasan Kode

Kita akan fokus pada bagian yang dapat dikonfigurasi pengguna dari kode yang disediakan yang mengontrol perilaku proyek. Program lengkap tersedia untuk diunduh di bawah artikel.

Kode dirancang agar mudah dimodifikasi. Di bagian atas sketsa, Anda akan menemukan variabel kunci yang dapat Anda sesuaikan.

const byte buzzerPin = 8;
const byte interruptPin = 2;
volatile byte state = LOW;
int count=0;

Di sini, buzzerPin diatur ke pin 8, yaitu tempat Anda menghubungkan buzzer. interruptPin diatur ke pin 2, yaitu pin yang akan mendengarkan penekanan tombol. Variabel state adalah byte volatile yang menyimpan status saat ini dari buzzer (HIGH atau LOW). Ini ditandai sebagai volatile karena dimodifikasi di dalam rutin layanan interupsi (ISR), dan kata kunci ini memastikan Arduino selalu membaca nilai terbaru. Variabel count adalah penghitung sederhana yang bertambah di loop utama untuk menunjukkan bahwa loop masih berjalan saat interupsi aktif.

Di fungsi setup(), pin buzzer diatur sebagai OUTPUT, dan pin interupsi diatur sebagai INPUT. Baris penting adalah attachInterrupt(), yang merupakan tempat Anda mengonfigurasi interupsi. Fungsi ini memberi tahu Arduino pin mana yang harus dipantau, fungsi mana yang harus dipanggil saat interupsi terjadi, dan kondisi pemicu apa yang digunakan.

attachInterrupt(digitalPinToInterrupt(interruptPin), noisy, CHANGE);

Baris ini melampirkan interupsi ke pin yang ditentukan. Fungsi digitalPinToInterrupt() mengonversi nomor pin ke nomor interupsi yang benar. noisy adalah nama fungsi yang akan dipanggil saat interupsi dipicu. Terakhir, CHANGE adalah mode, yang memicu interupsi pada setiap perubahan status pin. Anda dapat mengubahnya menjadi RISING, FALLING, atau LOW tergantung kebutuhan Anda.

Fungsi noisy() adalah ISR. Ini adalah fungsi toggle sederhana yang membalik status buzzer. Saat tombol ditekan, interupsi memicu fungsi ini, yang membalik variabel state dan menulisnya ke pin buzzer. Ini memungkinkan Anda menyalakan dan mematikan buzzer dengan setiap penekanan tombol, bahkan saat loop utama sibuk menghitung dan menunda.

Untuk mengubah perilaku proyek agar mengaktifkan buzzer di malam hari alih-alih siang hari, Anda akan memodifikasi logika kondisional di loop utama, menukar perintah digitalWrite() untuk status HIGH dan LOW.

Proyek Langsung & Demonstrasi

Dalam demonstrasi, Anda akan melihat dua eksperimen kunci. Pertama, rangkaian interupsi ditampilkan berjalan tanpa kode interupsi, di mana penundaan di loop membuat respons tombol menjadi lambat. Ini menyoroti masalah yang dipecahkan oleh interupsi.

Kemudian, dengan kode interupsi dimuat, monitor serial menunjukkan penghitung bertambah setiap detik. Saat tombol ditekan, buzzer menyala atau mati secara instan, terlepas dari penundaan di loop utama. Ini membuktikan bahwa interupsi berhasil melewati waktu tunggu dan menjalankan tugasnya segera (di video pada 14:07).

Untuk bagian LDR, monitor serial mencetak nilai analog mentah. Anda dapat melihat nilainya tinggi (sekitar 960) dalam cahaya terang dan turun signifikan (menjadi sekitar 400 atau lebih rendah) saat sensor ditutup. Ini menunjukkan bagaimana resistansi LDR berubah dengan intensitas cahaya. Kode kemudian menggunakan nilai ambang batas untuk menentukan apakah itu "siang" atau "malam" dan mengontrol buzzer sesuai. Dengan menutup sensor untuk mensimulasikan malam, Anda dapat memicu buzzer, dan dengan mengeksposnya ke cahaya, Anda dapat mematikannya.

Bab

  • [00:00] Pengenalan Interupsi Arduino dan LDR
  • [01:43] Masalah dengan Penundaan di Kode Arduino
  • [03:37] Memahami Pin dan Mode Interupsi
  • [04:20] Merangkai Rangkaian Tombol dan Buzzer
  • [06:22] Penjelasan Kode untuk Demo Penundaan
  • [07:48] Demonstrasi Masalah Penundaan
  • [09:26] Menerapkan dan Mengkodekan Interupsi
  • [11:50] Cara Kerja Fungsi Interupsi
  • [14:26] Pengenalan Resistor Tergantung Cahaya (LDR)
  • [15:44] Mengukur Resistansi LDR dengan Multimeter
  • [17:22] Merangkai Rangkaian LDR dan Buzzer
  • [19:55] Kode untuk Membaca Nilai LDR
  • [20:49] Demonstrasi Perubahan Nilai LDR
  • [22:08] Menetapkan Ambang Batas Siang dan Malam
  • [23:40] Kode untuk Mengontrol Buzzer dengan LDR
  • [25:21] Demonstrasi Lampu Malam Otomatis

Gambar

An LDR
An LDR
LDR Illustration and symbol
LDR Illustration and symbol
lcd1602_I2C_wiring_sunfounder
lcd1602_I2C_wiring_sunfounder
buzzer_push_button_schematic
buzzer_push_button_schematic
buzzer_push_button_wiring
buzzer_push_button_wiring
ldr
ldr
LDR_12708_orig
LDR_12708_orig
913-Lesson 17/31: interrupt a delay in Arduino and Light Dependent Resistor LDR
Bahasa: C++
/*
Lesson 20/31: interrupt a delay in Arduino and Light Dependent Resistor LDR
Get this code and watch video Download and resource page https://robojax.com/RJT600
YouTube video https://www.youtube.com/watch?v=N_L11m1v_yk
 
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
const byte buzzerPin = 8;
const byte interruptPin = 2;
volatile byte state = LOW;
int count=0;

void setup() {
  pinMode(buzzerPin, OUTPUT);
  pinMode(interruptPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(interruptPin), noisy, CHANGE);
  Serial.begin(9600);
  digitalWrite(buzzerPin, state);
}

void loop() {
  count++;
  Serial.println(count);
  delay(1000);
}

void noisy() {
  state = !state;
  digitalWrite(buzzerPin, state);
}

Sumber daya & referensi

Berkas📁

Pustaka Arduino (zip)