Reakční doba při stisku tlačítka

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
zixie
Příspěvky: 2
Registrován: 27 črc 2022, 14:14
Reputation: 0

Reakční doba při stisku tlačítka

Příspěvek od zixie » 27 črc 2022, 14:27

Ahoj,

rád bych se zeptal. Mám menší projekt s časovačem a doba stisknutí tlačítka, aby se resetovala časomíra je delší než bych si představoval, jde o cca 1s a já bych potřeboval okamžitý reset při stisku tlačítka. Existuje nějaký způsob, aby Arduino zareagovalo ihned po stisku tlačítka?

Díky.

Zde je můj program:

Kód: Vybrat vše

// Display TM1637

// Library
#include <Arduino.h>
#include <TM1637Display.h>

//setting numbers of pins for connecting with Arduino
#define CLK 3
#define DIO 4

//variable of button for reset timer and power supply for sensor
int Button1 = 2;
int Sensor = 8;

//instance of display from library TM1637
TM1637Display displej(CLK, DIO);

void setup() {
  pinMode(Button1,INPUT_PULLUP);
  pinMode(Sensor,OUTPUT); 
 
  // setting of brightness 8-15
  displej.setBrightness(12);


}
// Reset function
void(*resetFunc) (void) = 0;
void loop()
{

  
  //create a variable "vypis" for saving information about individual symbols
  uint8_t vypis[] = { 0, 0, 0, 0 };
  
  long cas = millis()/1000;

  //recalculate minutes and seconds
  vypis[0] = displej.encodeDigit((cas/60)/10);
  vypis[1] = displej.encodeDigit((cas/60)%10);
  vypis[2] = displej.encodeDigit((cas%60)/10);
  vypis[3] = displej.encodeDigit((cas%60)%10);
  
  //writing information on display
  displej.setSegments(vypis);
  delay(500);
  
 //function of colon between numbers
 // is necessary to add 1 to value 128
  vypis[1] = vypis[1]+128;
  displej.setSegments(vypis);
  delay(500);

// Reset condition
if(digitalRead(Button1) == LOW)
{
digitalWrite(Sensor , HIGH); //Power supply of sensor
resetFunc();

  }

}

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Reakční doba při stisku tlačítka

Příspěvek od kiRRow » 27 črc 2022, 14:30

Ano. Externí přerušení https://uart.cz/271/arduino-a-preruseni/ .. to zpoždění ti dělají ty dva delay(500)

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: Reakční doba při stisku tlačítka

Příspěvek od peterple » 27 črc 2022, 21:34

Ľahko sa to dá aj bez prerušenia. Zásadné je nepoužívať delay, ale millis. Tu máš máličko upravný príklad samotného Arduina
BlinkWithoutDelay. Miesto vypisovania displeja blikám ledkou. A tú tvoju reset fičúru som si tam zapoznámkoval. Ma to takú jednu malú chybku ale to asi zbadáš a dá sa to ľahko napraviť.

Kód: Vybrat vše

const int ledPin =  LED_BUILTIN;// the number of the LED pin

int vypisStav = 0;             
unsigned long vypisaneVcase = 0;
const long interval = 500;

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
}

void loop() {
  unsigned long teraz = millis();

  if (teraz - vypisaneVcase >= interval) {
    vypisaneVcase = teraz;
    if (vypisStav){
      digitalWrite(ledPin, HIGH); // prvy vypis
    } else {
      digitalWrite(ledPin, LOW); // druhy vypis
    }
    vypisStav ^= 1;
  }

//  if(digitalRead(Button1) == LOW)
//  {
//  digitalWrite(Sensor , HIGH); //Power supply of sensor
//  resetFunc();
//  
//  }

}

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Reakční doba při stisku tlačítka

Příspěvek od martinius96 » 28 črc 2022, 21:34

Neskúmal som tvoj program, ale vidím tam ako zbytočnosť napríklad:

Kód: Vybrat vše

digitalWrite(Sensor , HIGH); //Power supply of sensor
Pred reštartom dosky dáš na pin Sensor HIGH a chceš aby ti tam tento stav ostal aj po reštarte dosky, lebo si GPIO nenastavil na inú (počitatočnú) úroveň? Po prvom stlačení tlačidla bude ten výstup nastavený na HIGH navždy, až pokým neodpojíš a nepripojíš napájanie. Nepasuje mi tam to použitie...

No a čo sa týka kódu, tak ako napísal kiRRow, využiješ externé prerušenie, ktoré bude reagovať na FALLING hranu, keďže využívaš INPUT_PULLUP:

Kód: Vybrat vše

// Display TM1637

// Library
#include <Arduino.h>
#include <TM1637Display.h>

//setting numbers of pins for connecting with Arduino
#define CLK 3
#define DIO 4

//variable of button for reset timer and power supply for sensor
const int Button1 = 2;
const int Sensor = 8;

//instance of display from library TM1637
TM1637Display displej(CLK, DIO);

void setup() {
  pinMode(Button1, INPUT_PULLUP);
  pinMode(Sensor, OUTPUT);

  // setting of brightness 8-15
  displej.setBrightness(12);
  attachInterrupt(digitalPinToInterrupt(Button1), resetFunc, FALLING);     // attach interrupt handler to input pin.
  sei();
  //UŽ TERAZ TI REŠTARTUJE DOSKU AK STLACIS TLACIDLO ESTE AJ PRED LOOP()
}
// Reset function
void(*resetFunc) (void) = 0;
void loop()
{
  //create a variable "vypis" for saving information about individual symbols
  uint8_t vypis[] = { 0, 0, 0, 0 };

  unsigned long cas = millis() / 1000;

  //recalculate minutes and seconds
  vypis[0] = displej.encodeDigit((cas / 60) / 10);
  vypis[1] = displej.encodeDigit((cas / 60) % 10);
  vypis[2] = displej.encodeDigit((cas % 60) / 10);
  vypis[3] = displej.encodeDigit((cas % 60) % 10);

  //writing information on display
  displej.setSegments(vypis);
  delay(500);

  //function of colon between numbers
  // is necessary to add 1 to value 128
  vypis[1] = vypis[1] + 128;
  displej.setSegments(vypis);
  delay(500);
}

zixie
Příspěvky: 2
Registrován: 27 črc 2022, 14:14
Reputation: 0

Re: Reakční doba při stisku tlačítka

Příspěvek od zixie » 29 črc 2022, 08:43

Každá odpověď mi moc pomohla, děkuji.

Co se týče té podmínky, ano udělal jsem to nešikovně, protože jsem potřeboval na sensor neustálých 5V spolu s podminkou else, kterou jsem tady nedával. Každopádně spraveno :)

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů