Простой секундомер на Arduino с кнопкой и EEPROM
Компоненты и материалы
| Arduino UNO (или совместимая плата) | 1 |
| Кнопка (не фиксирующаяся) с подтягивающим резистором 1 кОм | 1 |
| Резистор 10 кОм | 1 |
Программное обеспечение
- Arduino IDE
О проекте
Простой хронометр, который засекает время нажатия кнопки и сохраняет результат в EEPROM (невиолатильная память). Используются прерывания для точного фиксирования моментов нажатия и отпускания.
EEPROM
Встроенная память Arduino, сохраняющая данные при отключении питания. Используется библиотека EEPROM.h (входит в стандартную поставку). Адрес 0 выбран для хранения 4-байтового float.
Прерывания
Функция attachInterrupt() вызывает обработчик при смене уровня на пине 2 (CHANGE). Это позволяет зафиксировать начало и конец нажатия. Подтягивающий резистор держит пин в LOW до нажатия.
Код проекта
Подключения и определения
#include <EEPROM.h>
#define interruptPin 2
#define eeAddress 0
float starttime = 0;
float endtime = 0;
float resulttime = 0, oldresulttime = 0;
setup()
void setup() {
Serial.begin(9600);
while (!Serial) { ; }
Serial.println("Serial comms are ready sir!:.. bip bip");
attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);
}
loop()
void loop() {
// основной цикл пуст, вся работа в прерывании
}
Обработчик прерывания refreshTime()
void refreshTime() {
if (digitalRead(interruptPin)) { // нажатие (HIGH)
starttime = millis();
Serial.print("Start time: "); Serial.println(starttime);
} else { // отпускание (LOW)
endtime = millis();
resulttime = endtime - starttime;
Serial.print("End time: "); Serial.println(endtime);
Serial.print("Result time: "); Serial.println(resulttime);
WhatsNewEeprom();
}
}
Запись в 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! New time recorded in eeprom: "); Serial.println(resulttime);
} else {
Serial.println("No new time found, eeprom was not disturbed");
}
}
Подавление дребезга контактов
Механические кнопки дают многократные переключения при нажатии. Можно устранить программно (задержка/фильтр) или аппаратно — конденсатором 220 нФ параллельно кнопке (от пина к GND). Конденсатор сглаживает быстрые скачки напряжения.
Схемы
Простая схема: кнопка с подтягивающим резистором к GND, пин 2 — вход прерывания.
Производственный процесс
- Стильные настенные часы на четырех кольцах Adafruit Neopixel 60 LED и Arduino
- Слово-часы (Word Clock) на Arduino — DIY-часы с текстовой индикацией времени
- Создание осциллографа на Arduino Nano с дисплеем Nokia 5110 (20 кГц): простое DIY-руководство
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Простой ИК-датчик препятствий на Arduino: ИК-светодиод и фотодиод
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Надёжные будильник на DS1302 RTC и Arduino UNO — сборка и код