Stopwatch Arduino yang Mudah Dibangun: Kromometer Aktifkan Tombol
Komponen dan Perlengkapan
Arduino UNO
board Arduino apa saja, kadang juga yang lain
×
1
tombol (non-latching)
dengan resistor pulldown (saya pakai 1kohm)
×
1
Resistor 10k ohm
×
1
Aplikasi dan Layanan Online
Arduino IDE
Tentang Proyek Ini
Saya sedang mengerjakan proyek menyenangkan dan membutuhkan kromometer Arduino yang berfungsi setiap kali saya menekan tombol. Konsepnya tidak rumit, namun saya yakin potongan kode ini akan berguna bagi banyak orang dalam proyek mereka.
Dengan panduan ini, Anda dapat menghemat sekitar satu jam waktu pengkodean.
EEPROM
EEPROM adalah memori Arduino yang tidak kehilangan datanya saat daya diputuskan atau board di-reset. Saya menggunakan library #include <EEPROM.h> yang secara default sudah terinstal dan menangani hampir semua operasi memori non-volatile.
Interrupts
Interrupt memungkinkan Arduino menghentikan tugas yang sedang dijalankan untuk segera menanggapi fungsi ISR ketika suatu pin diarahkan ke HIGH, misalnya. Tidak diperlukan library tambahan untuk fitur ini.
Kita menyertakan library EEPROM dan menentukan pin tombol (pin 2).
Saya memilih alamat 0 dari memori EEPROM untuk menyimpan waktu (float = 4 byte). Arduino UNO memiliki 1024 byte (chip ATmega328), tetapi saya memilih alamat 0 untuk tetap terorganisir.
setup()
void setup() { Serial.begin(9600); while (!Serial) { ; // tunggu port serial terhubung. Hanya diperlukan untuk port USB asli } Serial.println("Serial comms are ready sir!:.. bip bip"); attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE); }
Inisialisasi komunikasi serial antara Arduino dan PC (9600 baud):
Fungsi attachInterrupt mengaktifkan fungsi saat level logika interruptPin berubah: (____________-HERE------------------_HERE____________).
Dengan cara ini, interrupt terpicu dua kali: saat awal penekanan tombol dan saat akhir. Jika tidak ada aktivitas, nilai interruptPin tetap LOW karena resistor pulldown "memaksa" agar tetap rendah.
loop()
void loop() { }
Tidak ada yang perlu ditambahkan di sini. Tempelkan logika tambahan Anda di dalam fungsi ini.
Fungsi ini dieksekusi ketika interupt terjadi pada pin interruptPin.
Interrupt terpicu setiap kali status di interruptPin berubah (HIGH ke LOW atau sebaliknya). Blok if(...) digunakan untuk mendeteksi apakah perubahan tersebut adalah HIGH->LOW atau LOW->HIGH.
Fungsi menyimpan waktu yang tercatat oleh jam internal Arduino millis() dan menghitung selisihnya untuk mendapatkan waktu hasil. Pada akhirnya, informasi baru disimpan ke EEPROM:
void WhatsNewEeprom(){ Serial.println("-----------checking eeprom"); EEPROM.get( eeAddress, oldresulttime ); Serial.print("oldresulttime");Serial.println(oldresulttime); Serial.print("resulttime");Serial.println(resulttime); if(resulttime!=oldresulttime){ EEPROM.put( eeAddress, resulttime); Serial.print("-----Ding!Waktu baru tercatat di eeprom: ");Serial.println(resulttime); }else{ Serial.println("Tidak ada waktu baru ditemukan, eeprom tidak terganggu"); }
Fungsi ini memeriksa apakah nilai waktu yang tersimpan di EEPROM sama dengan variabel "resulttime". Jika sama, tidak ada perubahan dan tidak perlu melakukan apa-apa.
Extra! Debouncing Tombol
Manusia sangat lambat dibandingkan waktu pemrosesan Arduino. Satu penekanan tombol terasa cepat bagi kita, tetapi bagi Arduino terlalu lambat, sehingga sinyal bisa "mambret" (berpindah-pindah high-low-high-low) beberapa kali sebelum status benar terdeteksi.
Jika diinginkan (saya tidak melakukannya), ini dapat diperbaiki melalui hardware atau software:
Debounce melalui software
Debounce melalui hardware, gunakan kapasitor!!! :D
Saya hanya menambahkan kapasitor 220nF secara paralel (dari sensepin ke GND).
Kapasitor "serap" fluktuasi tegangan yang cepat.
Kode
arduino chronometer
arduino chronometerArduino
Menggunakan EEPROM dan interupt, mudah dikembangkan kembali.
//coded by Javier Muñoz 23/10/2017 //questions and singed telegrams to javimusama@gmail.com #include <EEPROM.h> #define interruptPin 2 #define eeAddress 0 //ADDRESS FOR THE ARDUINO´S EEPROM (internal non volatile memory) float starttime = 0; //Variables to do the math float endtime=0; float resulttime=0, oldresulttime=0; void setup() { Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println("Serial comms are ready sir!:.. bip bip"); attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);//activates the function when the logic level of interruptPin changes so: (__-HERE------------------_HERE____)this way it stores the time our finger was pressing the button } void loop() { //your stuff here //(eeprom stored) last time measured in miliseconds "float resulttime" } void refreshTime(){ if(digitalRead(interruptPin)){ starttime=millis(); Serial.print("Start time: "); Serial.println(starttime); }else if(digitalRead(interruptPin)==LOW){ endtime=millis(); resulttime=endtime-starttime; Serial.print("End time: "); Serial.println(endtime); Serial.print("Result time: "); Serial.println(resulttime); WhatsNewEeprom(); } } void WhatsNewEeprom(){ Serial.println("-----------checking eeprom"); EEPROM.get( eeAddress, oldresulttime ); Serial.print("oldresulttime");Serial.println(oldresulttime); Serial.print("resulttime");Serial.println(resulttime); if(resulttime!=oldresulttime){ EEPROM.put( eeAddress, resulttime); Serial.print("-----Ding!New time recorded in eeprom: ");Serial.println(resulttime); }else{ Serial.println("No new time found, eeprom was not disturbed"); } }
Skematik
Koneksi sederhana tombol dengan resistor pulldown.chronometer_APM32Y9FoM.fzz