Debounce tlačidla - pin 8

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

martinius96

Debounce tlačidla - pin 8

Príspevok od používateľa martinius96 » 06 Sep 2017, 22:03

Ahojte, skúšal som Debounce príklad na tlačidlo na pine 8 ale nefunguje to ani po stlačení sa mi kód ďalej nespustí, ako predtým. Vedeli by ste mi pomôcť? Ďakujem!

Kód: Vybrať všetko

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR    0x3F  // Define I2C Address where the PCF8574A is
                          // Address can be changed by soldering A0, A1, or A2
                          // Default is 0x27

// map the pin configuration of LCD backpack for the LiquidCristal class
#define BACKLIGHT_PIN 3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

LiquidCrystal_I2C lcd(I2C_ADDR,
                      En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin,
                      BACKLIGHT_PIN, POSITIVE);
void setup()
{
  lcd.begin(20, 4);                // intialise the LCD.
     lcd.setBacklight(HIGH); // Turn on backlight, LOW for off
  
  Serial.begin(9600);
  
  pinMode(8, INPUT);
  digitalWrite(8, LOW);
  pinMode(9, LOW);
  digitalWrite(9, LOW);
  pinMode(10, INPUT);
  digitalWrite(10, LOW);

}
double i = 0;
double a = millis();
double c ;
void loop()
{
lcd.clear();
lcd.print("press start");
delay(100);
  
 if(digitalRead(8) == HIGH)
 {

    lcd.clear();
 a = millis();
   while(digitalRead(9) == LOW)
   {
   
     c = millis();
   i = (c - a) / 1000;
   lcd.print(i);
   lcd.setCursor(11,0);
   lcd.print("Sec's");
   lcd.setCursor(0,0);
   Serial.println(c);
   Serial.println(a);
   Serial.println(i);
   Serial.println("......");
   delay(100);
   }
   
   if(digitalRead(9) == HIGH)
   {
     while(digitalRead(8) == LOW)
     {
       lcd.setCursor(0,0);
       lcd.print(i);
       lcd.setCursor(11,0);
       lcd.print("Sec's");
       lcd.setCursor(0,0);
       delay(100);
     }
   }

 }
  
  

}

alidedko
Ultimate člen
Ultimate člen
Príspevky: 3963
Dátum registrácie: 04 Feb 2013, 22:04
Bydlisko: U alibabky v Poprade
Vek: 32

Re: Debounce tlačidla - pin 8

Príspevok od používateľa alidedko » 06 Sep 2017, 22:17

Ale ved pri kazdom vykonani hlavnej slucky sa ti spravi lcd.clear ... Co by si tam chcel mat vypisane :D

Pokus sa pochopit kodu, ktory lepis. Hladaj logicke suvislosti. Rozpis si podmienky na papier.

Nerob len copy a paste ...
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Debounce tlačidla - pin 8

Príspevok od používateľa peterple » 06 Sep 2017, 22:24

Máš tam rozbehaný Serial, tak ho používaj na debugovanie.
Inak tu platia slová klasika:
Je to marný, je to marný, je to marný.
Prečo si myslíš že ti vždy niekto opraví tvoj kód, alebo ho rovno napíše za teba?
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

martinius96

Re: Debounce tlačidla - pin 8

Príspevok od používateľa martinius96 » 07 Sep 2017, 01:18

Nakoniec som to zvládol po niekoľkých pokusoch.. Prosím ale o radu. Potrebujem jedným tlačidlom zapnúť jednu/druhú funkciu. Jedna funkcia odštartuje odpočet pri stlačení a pri ďalšom stlačení potrebujem aby mi spustilo druhú funkciu, ktorá všetko vynuluje.
Táto funkcia skúma, či som stlačil tlačidlo pre začiatok výpisu na displej.

Kód: Vybrať všetko

void zapnutie() {
 
  if(spustacresettlacidloState != spustacresettlacidloCurrState) {    //Check if the button state has changed
    if(spustacresettlacidloState == HIGH && (millis()-lastPressedspustacresettlacidlo) > 100 || lastPressedspustacresettlacidlo == 0) {
      lastPressedspustacresettlacidlo = millis();
      lavy=true;
      pravy=true;
      
  
      
    }    
  }
  spustacresettlacidloCurrState = spustacresettlacidloState;    //Set the current state equals the button state
}

Následne ale potrebujem, že ak tlačidlo stlačím druhý krát, spustí to toto:

Kód: Vybrať všetko

void vymazatvsetko() {
  lavy = false;
  pravy = false;
  second = 0;
  minute = 0;
  tenth = 0;
   sekundy = 0;
  minuty = 0;
  stotiny = 0;
  updateLCD(); 

}
Skúšal som tam dať counter, ktorý sa vždy pripočítal o 1, ale po kompilácii sa mi nerozbehne ani odpočet po stlačení tlačidla. Nejaký tip?

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Debounce tlačidla - pin 8

Príspevok od používateľa jirka.jirka. » 07 Sep 2017, 09:23

Co třeba stiskem inkrementovat proměnnou, která je inicializovaná na 0?
Např: Stiskneš tlačítko a inkrementuješ proměnnou.

Kód: Vybrať všetko

stisk++;
A náesledně použít switch case?

Kód: Vybrať všetko

switch (stisk) {
	case 1:
		funkce A;
		break;
	case 2:
       funkce B;
       stisk = 0;
		break;
}
je to jenom myšlenka, třeba to fungovat nebude. :D Mám ještě draka, tak kdo ví. :finga:
0

Používateľov profilový obrázok
budvar10
Pokročilý člen
Pokročilý člen
Príspevky: 988
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Debounce tlačidla - pin 8

Príspevok od používateľa budvar10 » 07 Sep 2017, 09:35

@jirka.jirka
Mám ještě draka, tak kdo ví. :finga:
Aký je význam tohto slovného spojenia? :pain:
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Debounce tlačidla - pin 8

Príspevok od používateľa jirka.jirka. » 07 Sep 2017, 11:46

No včera jsem se ožral a následky dneska ještě nesu. :ignore: A nevím, jestli co jsem navrhl má hlavu a patu. :rolleyes:
0

Používateľov profilový obrázok
budvar10
Pokročilý člen
Pokročilý člen
Príspevky: 988
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Debounce tlačidla - pin 8

Príspevok od používateľa budvar10 » 07 Sep 2017, 12:05

Tak to mám aj ja draka. :(
Ale to riešenie dáva zmysel.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Debounce tlačidla - pin 8

Príspevok od používateľa peterple » 07 Sep 2017, 20:21

jirka: Ja by som to robil trochu inak

Kód: Vybrať všetko

stisk^=1;
if (stisk&1) {
..
} else {
..
}
Netreba potom nulovať premennú. A môžeš mať v jednom byte až 8 príznakov napr pre osem tlačidiel. Alebo iných napr. stavových bitov.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Debounce tlačidla - pin 8

Príspevok od používateľa jirka.jirka. » 08 Sep 2017, 07:02

Perteple:

Kód: Vybrať všetko

stisk^=1;
if (stisk&1) {
..
} else {
..
}
Velice pěkné řešení. Asi ho začnu používat. :thumbup:
0

Používateľov profilový obrázok
budvar10
Pokročilý člen
Pokročilý člen
Príspevky: 988
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Debounce tlačidla - pin 8

Príspevok od používateľa budvar10 » 08 Sep 2017, 07:28

No až na to, že sa ti bude vykonávať else aj keď tlačidlo nestlačíš.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Debounce tlačidla - pin 8

Príspevok od používateľa jirka.jirka. » 08 Sep 2017, 07:50

else se dá vynechat. ;)
0

Používateľov profilový obrázok
budvar10
Pokročilý člen
Pokročilý člen
Príspevky: 988
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Debounce tlačidla - pin 8

Príspevok od používateľa budvar10 » 08 Sep 2017, 08:43

No to je otázka, lebo chce spustiť druhú funkciu. Čo všetko má bežať v druhej funkcii? V každom prípade tie algoritmy nie sú ekvivalentné.

EDIT: Teraz pozerám tu druhú funkciu. Nuluje a robí obnovu displeja. Asi to môže tak ostať...
0

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12406
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: Debounce tlačidla - pin 8

Príspevok od používateľa boraicho » 08 Sep 2017, 14:49

peterple napísal:jirka: Ja by som to robil trochu inak

Kód: Vybrať všetko

stisk^=1;
if (stisk&1) {
..
} else {
..
}
Mozte mi niekto prelozit ako to funguje? Nechapem tym logickym operaciam, dakujem.
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2566
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Debounce tlačidla - pin 8

Príspevok od používateľa maskrtnik01 » 08 Sep 2017, 15:32

stisk^=1;

Je operácia XOR, ktorá nám invertuje prvý bit. ^=2 by bol druhý bit, ^=4 tretí bit....

A potom si v ife vyberieme n-tý bit operáciou AND a zaujíma nás, či je výsledok nula alebo nie.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Debounce tlačidla - pin 8

Príspevok od používateľa peterple » 08 Sep 2017, 19:52

budvar10:
Chápem o čo ti ide, ale keď sa zamyslíš tak je to to isté. Ten inkrement premennej tiež musíš robiť len pri stlačení a pustení tlačidla. Mimochodom na to sa dá tiež použiť xor.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok