Простой хронометр Arduino
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Приложения и онлайн-сервисы
|
Об этом проекте
Я занимаюсь интересным проектом, и мне нужен хронометр Arduino, который срабатывает всякий раз, когда я нажимаю кнопку. Это несложная вещь, но я подумал, что этот фрагмент кода будет полезен для других проектов.
Я, наверное, сэкономил тебе 1 час жизни на программировании.
EEPROM:
Память Arduino, которая не теряет свою информацию при отключении питания или перезагрузке платы (информация). Я использую #include
библиотека, которая в основном делает все, и она уже установлена по умолчанию.
ПРЕРЫВАНИЯ:
Что-то происходит внутри нашего Arduino, но мы хотим, чтобы он перестал делать то, что происходило, и уделил внимание нашей функции ISR, например, когда какой-то вывод вытягивается ВЫСОКО. Никакой дополнительной библиотеки здесь не требуется:
Код проекта:
- Определяет и включает:
#include #define interruptPin 2 #define eeAddress 0 // АДРЕС ДЛЯ EEPROM ARDUINO´S (внутренняя энергонезависимая память) float starttime =0; // Переменные для вычисления float endtime =0; float resulttime =0, oldresulttime =0;
Здесь нет ничего нового, мы включаем библиотеку EEPROM, мы решаем, где будет прикреплена кнопка (pin2).
Затем я решил использовать адрес 0 нашей памяти EEPROM для хранения нашего времени (float =4 байта). Arduino UNO имеет 1024 байта (чип ATmega328), но я выбрал адрес 0, потому что хоть раз в жизни пытался организовать.
- setup ()
void setup () {Serial.begin (9600); в то время как (! серийный) {; // ждем подключения последовательного порта. Требуется только для собственного порта USB} Serial.println ("Последовательная связь готова, сэр!:.. bip bip"); attachInterrupt (digitalPinToInterrupt (interruptPin), refreshTime, CHANGE);}
Обычно мы инициируем последовательную связь между Arduino и нашим ПК (9600 бод):
attachInterrupt (digitalPinToInterrupt (interruptPin), refreshTime, CHANGE);
Attachinterrupt активирует функцию, когда логический уровень interruptPin изменяется так: (____________- ЗДЕСЬ ------------------_ ЗДЕСЬ____________).
Таким образом, он срабатывает два раза в начале нашего нажатия и в конце. Если ничего не происходит, наше значение interruptPin остается НИЗКИМ, потому что наш понижающий резистор «заставляет» его оставаться на низком уровне.
- цикл ()
void loop () {}
Ничего такого. Положите туда свои вещи!
- Другие функции:
void refreshTime () {если (digitalRead (interruptPin)) {starttime =millis (); Serial.print ("Время начала:"); Serial.println (время начала); } иначе, если (digitalRead (interruptPin) ==LOW) {endtime =millis (); resulttime =время окончания-время начала; Serial.print ("Время окончания:"); Serial.println (время окончания); Serial.print ("Время результата:"); Serial.println (время результата); WhatsNewEeprom (); // хранит eeprom}
Это функция, которая будет выполняться при прерывании вывода (interruptPin).
Прерывание запускается каждый раз, когда статус в interruptPin изменяется (с высокого на низкий или с низкого на высокий), те if (...) предназначены для определения того, изменяется ли его значение HIGH-> LOW или LOW-> high.
Сохраняет время, записанное внутренними часами Arduino millis (), и имеет значение для того, чтобы время нашего результата было готово. В конце концов, он сохраняет новую информацию в EEPROM:
void WhatsNewEeprom () {Serial.println ("----------- проверка eeprom"); EEPROM.get (eeAddress, oldresulttime); Serial.print ("oldresulttime"); Serial.println (oldresulttime); Serial.print ("время результата"); Serial.println (время результата); if (resulttime! =oldresulttime) {EEPROM.put (eeAddress, resulttime); Serial.print ("----- Ding! Новое время, записанное в eeprom:"); Serial.println (время результата); } else {Serial.println ("Новое время не найдено, EEPROM не был нарушен"); }
Он проверяет, совпадает ли значение времени, хранящееся в eeprom, у нас в переменной "resulttime", если это так, мы не меняли его, поэтому ничего не делать.
Дополнительный! Отказ от нашей кнопки:
Мы, люди, очень медлительны для времени обработки Arduino, одно нажатие кнопки кажется нам быстрым, но для Arduino действительно медленным, что заставляет сигнал «отскакивать», как пару раз переключение highlowhighlowhighlow перед установкой истинного статуса.>
Если мы хотим (я этого не делал), мы могли бы исправить это с помощью оборудования или программного обеспечения:
- Устранение отказов с помощью программного обеспечения
- Аппаратное устранение дребезга, используйте конденсатор !!! :D
Я просто добавлю 220 нФ параллельно (от сенсорного вывода до заземления)
Конденсатор «съедает» быстрое изменение напряжения.
Код
- хронометр arduino
хронометр arduino Arduino
использует eeprom и прерывания, легко взломать// закодировано Хавьером Муньосом 23.10.2017 // вопросы и подписанные телеграммы на [email protected]#include#define interruptPin 2 # define eeAddress 0 // АДРЕС ДЛЯ EEPROM ARDUINO (внутренняя энергонезависимая память) float starttime =0; // Переменные для вычисления float endtime =0; float resulttime =0, oldresulttime =0; void setup () {Serial.begin (9600); в то время как (! серийный) {; // ждем подключения последовательного порта. Требуется только для собственного порта USB} Serial.println ("Последовательная связь готова, сэр!:.. bip bip"); attachInterrupt (digitalPinToInterrupt (interruptPin), refreshTime, CHANGE); // активирует функцию при изменении логического уровня interruptPin так:(__- ЗДЕСЬ ------------------_ ЗДЕСЬ ____) таким образом он сохраняет время, в течение которого наш палец нажимал кнопку} void loop () {// здесь ваши данные // (память EEPROM) в последний раз измеряется в миллисекундах "float resulttime"} void refreshTime () {if (digitalRead (interruptPin) ) {время начала =миллис (); Serial.print ("Время начала:"); Serial.println (время начала); } иначе, если (digitalRead (interruptPin) ==LOW) {endtime =millis (); resulttime =время окончания-время начала; Serial.print ("Время окончания:"); Serial.println (время окончания); Serial.print ("Время результата:"); Serial.println (время результата); WhatsNewEeprom (); }} void WhatsNewEeprom () {Serial.println ("----------- проверка eeprom"); EEPROM.get (eeAddress, oldresulttime); Serial.print ("oldresulttime"); Serial.println (oldresulttime); Serial.print ("время результата"); Serial.println (время результата); if (resulttime! =oldresulttime) {EEPROM.put (eeAddress, resulttime); Serial.print ("----- Ding! Новое время, записанное в eeprom:"); Serial.println (время результата); } else {Serial.println ("Новое время не найдено, EEPROM не был нарушен"); }}
Схема
простое соединение кнопки с понижающим резистором chronometer_APM32Y9FoM.fzzПроизводственный процесс
- Простые настенные часы с использованием Adafruit 1/4 60 Ring Neopixel
- Простые часы со словами (Arduino)
- DIY Простой осциллограф Arduino 20 кГц на ЖК-дисплее Nokia 5110
- Arduino Spybot
- FlickMote
- Самодельный телевизор B-Gone
- Основные часы
- Простой датчик препятствий с Arduino
- Найди меня
- Простой будильник с DS1302 RTC