Пребарување код

Лекција 14/31-3: Arduino кодирање millis() пример 3 со копче

Лекција 14/31-3: Arduino кодирање millis() пример 3 со копче

Дали некогаш сте требале вашиот Arduino да запомни кога се случило нешто—како притискање на копче—и потоа да преземе акција точно одредено време подоцна, сè додека остатокот од вашата програма работи непречено? Ова е класичен предизвик во Arduino програмирањето, а решението е функцијата millis(). Овој туторијал, дел од Robojax Arduino курсот, демонстрира практичен пример: откривање дали копче е притиснато втор пат по истекот на 5-секундно доцнење од првото притискање. Оваа техника е основна за создавање одговорни, неблокирачки проекти каде времето е критично.

Составен Sunfounder автомобил

Овој модел на користење на millis() за следење на времето без запирање на програмата е суштински за широк опсег на реални апликации. Еве неколку идеи за да ги инспирирате вашите сопствени проекти:

  • Интерфејси со копчиња со дебаунсинг: Имплементирајте систем каде копчето мора да се држи одредено време (на пр., 3 секунди) за да се вклучи уред, спречувајќи случајни притискања.
  • Секвенцијални акции: Креирајте систем каде еден настан, како активирање на сензор за движење, подготвува секундарна акција што се случува само ако друг настан се појави во одреден временски прозорец.
  • Тајмери за корисничка интеракција: Изградете проект што бара „потврден“ влез (како второ притискање на копче) во одредено време за да изврши критична функција, како испраќање команда или стартување мотор.
  • Портање на сензори: Користете прв сигнал од сензор за да започнете временски прозорец, во кој читањето на втор, различен сензор се смета за валидно или се игнорира.

Потребен хардвер

Овој проект користи компоненти од SunFounder 3-во-1 Arduino комплетот, кој е одличен ресурс за учење. Ќе ви требаат:

  • Arduino плоча (Uno, Nano, итн.)
  • Моментално притисно копче
  • Поврзувачки жици

Водич за поврзување

Поврзувањето за овој пример е многу едноставно, благодарение на внатрешните pull-up отпорници на Arduino, што ја елиминира потребата за надворешен отпорник. (Во видеото на 08:29)

  • Поврзете една нога од копчето на GND пинот на Arduino.
  • Поврзете ја другата нога од копчето на дигиталниот пин 2 на Arduino.

Со користење на INPUT_PULLUP, пинот е внатрешно поврзан на 5V, па нормално чита HIGH. Кога копчето е притиснато, го поврзува пинот со GND, предизвикувајќи читање на LOW. Ова е логиката што ќе ја користиме во кодот.

Објаснување на кодот

Јадрото на овој проект е логиката што го следи првото притискање на копчето и потоа проверува за второ притискање по одреден временски интервал. Кодот е дизајниран да биде неблокирачки, што значи дека нема да ја паузира извршувањето на други задачи во вашата loop().

На врвот на скицата, ќе ги најдете клучните променливи што може да ги конфигурирате и што го контролираат временското однесување:

unsigned long event = 5000;// 5 секунди
unsigned long buttonPushed =0;
  • event: Ова е клучната временска променлива. Ја поставува должината на доцнењето во милисекунди. Во овој пример, поставена е на 5000, што е еднакво на 5 секунди. Можете да ја промените оваа вредност во било која друга должина за да одговара на потребите на вашиот проект.
  • buttonPushed: Оваа променлива се користи како знаме и временска ознака. Започнува на 0 и се ажурира на вредноста на millis() првиот пат кога копчето е притиснато. Ова зачувано време потоа се користи за пресметување на разликата за проверка на второто притискање.

Логиката во функцијата loop() работи во две фази. Прво, го чита состојбата на копчето и, ако е притиснато за прв пат (pb == LOW && buttonPushed == 0), го запишува моменталното време преку millis() во променливата buttonPushed. Втората фаза проверува дали копчето е сè уште притиснато и дали е забележано прво притискање. Ако е така, ја пресметува временската разлика помеѓу моменталното време и времето на првото притискање. Ако оваа разлика е поголема или еднаква на вашето време event, ја извршува акцијата—во овој случај, печати порака на Serial Monitor-от.

Демонстрација на жив проект

Во видеото, кодот е поставен на Arduino, и Serial Monitor-от е отворен за да се набљудува однесувањето. (Во видеото на 16:03) Ќе ја видите вредноста на millis() како континуирано се печати, покажувајќи го времето од стартувањето на програмата. Кога ќе го притиснете копчето за прв пат, се печати порака како Прво притискање на:5019. Ако го притиснете копчето повторно и го држите повеќе од 5 секунди од првото притискање, се печати пораката Акција по 5 секунди од првото притискање. Ова демонстрира дека акцијата се активира само кога второто притискање се случува по истекот на одреденото доцнење.

Моќта на овој пристап е што линијата Serial.println(millis()) на врвот на циклусот продолжува да работи без прекин, докажувајќи дека временската логика не го блокира извршувањето на другиот код. Ова е основната предност на користењето millis() наместо функцијата delay().

Поврзани проекти од ова видео

Поглавја

  • [00:00] Вовед во millis() и курсот
  • [01:19] Што е millis() и зошто да се користи?
  • [03:06] Прв практичен пример: печатење на millis()
  • [05:46] Користење на millis() за активирање на настан по 5 секунди
  • [08:29] Пример 2: Акција со копче со 5-секундно одложување
  • [12:14] Пример 3: Детектирање на второ притискање на копче по одложување
  • [17:20] Вовед во map() функцијата
  • [19:47] Практичен пример за мапирање на проценти на осветленост на LED

Слики

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
918-Lesson 14/31-3: Arduino coding millis() example 3 with push button
Јазик: C++
/*
Lesson 14/31: Arduino coding millis() example 3 with push button
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
 
  
 * 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/>.
 */


unsigned long event = 5000;// 5 seconds
unsigned long buttonPushed =0;

void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // ilmoFan.com example-2 millis()
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW && buttonPushed ==0)
  {
    buttonPushed =millis();
    Serial.print("First push at:");
    Serial.println(buttonPushed);
  }
  if( pb ==LOW &&  buttonPushed >0 )
  {
   unsigned long difference = millis()- buttonPushed;
      if( difference >= event)
      {
        Serial.println("Action after 5 seconds of first push");
      }
  }
  
}

Ресурси и референци

Датотеки📁

Упатство за корисникот