resistor ladder buttons a TFT

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
Moribundus
Příspěvky: 2
Registrován: 13 dub 2020, 21:31
Reputation: 0

resistor ladder buttons a TFT

Příspěvek od Moribundus » 13 dub 2020, 22:28

Zdravím a prosím o radu.
Připravuji hru pro děti, která bude mít 4 "trasy" po 16-ti polích. Ke každému poli se bude vázat "vzkaz"/úkol pro hráče. Nyní pro simulaci polí používám resistor ladder s tlačítky. V podstatě 8 tl. klávesnice na analogovém vstupu. Problém nastal již při připojení další "trasy". Pokud použiji klasické podmínky, splním je na obou "trasách" zároveň, takže se "vzkazy" vázané na sepnutých polích na displeji neustále střídají. Nevím jak mám docílit zastavení ve "vzkazu" do doby, než na jiné trase dojde ke změně / opuštění tlačítka (tl. je do té doby stlačené). Zkoušel jsem Cse; While; for... ale vždy jsem skončil ve slepé ... Přikládám zjednodušenou verzi. Nakopne mě někdo? Díky

Kód: Vybrat vše

#include <UTFT.h>
UTFT lcd(ILI9325C, A5, A4, A3, A2); //pins used for TFT
//#include <SPI.h>
//#include <SdFat.h>
//#include <UTFT_SdRaw.h>

extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];


//#define SD_CHIP_SELECT  53  // SD chip select pin(Arduino Mega)
///SdFat sd;
//UTFT_SdRaw myFiles(&lcd);

int trasa1 = A6;
int trasa2 = A15;

int hodnotaPole1;
int hodnotaPole2;

void setup() {

  lcd.InitLCD();
  lcd.fillScr(0, 0, 0);

}

void loop()
{

  lcd.setColor(225, 110, 225);
  lcd.setFont(BigFont);
  hodnotaPole1 = analogRead(trasa1);
  hodnotaPole2 = analogRead(trasa2);


  if (hodnotaPole1 > 880) {
    vzkaz8();
  }

  else if (hodnotaPole1 > 780) {
    vzkaz7();
  }

  else if (hodnotaPole1 > 660) {
    vzkaz6();
  }

  else if (hodnotaPole1 > 560) {
    vzkaz5();
  }

  else if (hodnotaPole1 > 460) {
    vzkaz4();
  }

  else if (hodnotaPole1 > 360) {
    vzkaz3();
  }

  else if (hodnotaPole1 > 260) {
    vzkaz2();
  }

  else if (hodnotaPole1 > 160) {
    vzkaz1();
  }

  else if (hodnotaPole1 >= 0) {
    bezFigurky ();
  }



  if (hodnotaPole2 > 800) {
    vzkaz14();
  }

  else if (hodnotaPole2 > 630) {
    vzkaz13();
  }

  else if (hodnotaPole2 > 490) {
    vzkaz12();
  }

  else if (hodnotaPole2 > 350) {
    vzkaz11();
  }

  else if (hodnotaPole2 > 200) {
    vzkaz10();
  }

  else if (hodnotaPole2 > 61) {
    vzkaz9();
  }

  else if (hodnotaPole2 >= 0) {
    bezFigurky ();
  }


  delay (500);
}

void bezFigurky()
{

  lcd.clrScr();
  // myFiles.load(0, 0, 320, 240, "PIC303.RAW", 1, 0);
  delay (100);

}

void vzkaz1()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("1", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo jedna", CENTER, 100);

  lcd.print ("Tady je vzkaz", CENTER, 150);
}

void vzkaz2()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("2", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo dva", CENTER, 100);

  lcd.setFont(SmallFont);
  lcd.print ("tady se da napsat cokoliv na doplneni", CENTER, 150);
}
void vzkaz3()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("3", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo tri", CENTER, 100);
  lcd.print ("atd", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("a tak dale", CENTER, 150);
}

void vzkaz4()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("4", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo ctyri", CENTER, 100);
  lcd.print ("etc", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("adsfsdf", CENTER, 150);
}

void vzkaz5()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("5", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo pet", CENTER, 100);
  lcd.print ("Vdfsf", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("tfeefef", CENTER, 150);
}


void vzkaz6()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("6", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo sest", CENTER, 100);
  lcd.print ("thgerg", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("bla bla bla bla bla bla bla", CENTER, 150);
}

void vzkaz7()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("7", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo sedum", CENTER, 100);
  lcd.print ("aregar", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("aregar  rg ", CENTER, 150);
}
void vzkaz8()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("8", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo osum", CENTER, 100);
  lcd.print ("ergega", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("a ted se to konecne rymuje", CENTER, 150);
}
void vzkaz9()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("9", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo devet", CENTER, 100);
  lcd.print ("kdo mlci je nemec", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("a kdo jinemu jamu kopa ten je brigadnik", CENTER, 150);
}



void vzkaz10()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("10", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo deset", CENTER, 100);

  lcd.setFont(SmallFont);
  lcd.print ("tady se da napsat cokoliv na doplneni", CENTER, 150);
}
void vzkaz11()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("11", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo jedenact", CENTER, 100);
  lcd.print ("Prdel si vy3", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("a tak dale", CENTER, 150);
}

void vzkaz12()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("12", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo dvanact", CENTER, 100);
  lcd.print ("aergae", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("aergaeg", CENTER, 150);
}

void vzkaz13()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("13", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo trináct", CENTER, 100);
  lcd.print ("aergaega", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("aergaegr", CENTER, 150);
}


void vzkaz14()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("14", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo ctrnact", CENTER, 100);
  lcd.print ("aergaergae", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("bla bla bla bla bla bla bla", CENTER, 150);
}

Přílohy
BP20wpg.png
93371182_246321429838292_8948238871414439936_n.jpg

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: resistor ladder buttons a TFT

Příspěvek od pavel1tu » 14 dub 2020, 07:09

Asi jedině každé "zastávce" dát do nějaké proměnné že se aktivovala jako poslední,
podle toho detekovat že nenastala změna,
a nový "vzkaz" zobrazit, jen když bude změna v "1" a hned ji schodit do "0"
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Moribundus
Příspěvky: 2
Registrován: 13 dub 2020, 21:31
Reputation: 0

Re: resistor ladder buttons a TFT

Příspěvek od Moribundus » 14 dub 2020, 11:45

pavel1tu píše:
14 dub 2020, 07:09
Asi jedině každé "zastávce" dát do nějaké proměnné že se aktivovala jako poslední,
podle toho detekovat že nenastala změna,
a nový "vzkaz" zobrazit, jen když bude změna v "1" a hned ji schodit do "0"
Nakopnutí pomohlo... díky Pavle... Kód je takovej trochu "selskej", ale funkční ;)
Takže:
1. převod A vstupu na 0/1
2. detekce změny
3. detekci použít v každé podmínce tlačítka

Kód: Vybrat vše

#include <UTFT.h>
UTFT lcd(ILI9325C, A5, A4, A3, A2); //pins used for TFT
#include <SPI.h>
#include <SdFat.h>
#include <UTFT_SdRaw.h>

extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];


#define SD_CHIP_SELECT  53  // SD chip select pin(Arduino Mega)
SdFat sd;
UTFT_SdRaw myFiles(&lcd);

int trasa1 = A8;
int trasa2 = A15;

int hodnotaPole1;
int hodnotaPole2;

int kontrol1;
int kontrol2;

int stavtl1 = 0;         // současný stav tlačítka
int poslednistavtl1 = 0;     // předchozí stav tlačítka
int zmena1 = 0;

int stavtl2 = 0;         // současný stav tlačítka
int poslednistavtl2 = 0;     // předchozí stav tlačítka
int zmena2 = 0;




void setup() {

  lcd.InitLCD();
  lcd.fillScr(0, 0, 0);
  // Serial.begin(9600);

  bool mysd = 0;
  while (!mysd)
  {
    if (!sd.begin(SD_CHIP_SELECT, SPI_FULL_SPEED))
    {
      //Serial.println(F("Card failed, or not present"));
      //Serial.println(F("Retrying...."));
    }
    else
    {
      mysd = 1;
      //Serial.println(F("Card initialised."));
    }
  }

}

void loop()
{

  lcd.setColor(225, 110, 225);
  lcd.setFont(BigFont);
  hodnotaPole1 = analogRead(trasa1);
  hodnotaPole2 = analogRead(trasa2);

  if (hodnotaPole1 > 10) {  
    kontrol1 = 1;
  }
  else {
    kontrol1 = 0;
  }

  if (hodnotaPole2 > 30) {
    kontrol2 = 1;
  }
  else {
    kontrol2 = 0;
  }

  //Serial.print("ctrl1: "); Serial.print(kontrol1); Serial.print("      ctrl2: "); Serial.println(kontrol2);
  //Serial.print("zmena1: ");Serial.print(zmena1);Serial.print("      zmena2: "); Serial.println(zmena2);

  if (hodnotaPole1 > 880) {
    if (zmena1 == 1) {
      vzkaz8();
    }
  }

  else if (hodnotaPole1 > 780) {
    if (zmena1 == 1) {
      vzkaz7();
    }
  }

  else if (hodnotaPole1 > 660) {
    if (zmena1 == 1) {
      vzkaz6();
    }
  }

  else if (hodnotaPole1 > 560) {
    if (zmena1 == 1) {
      vzkaz5();
    }
  }

  else if (hodnotaPole1 > 460) {
    if (zmena1 == 1) {
      vzkaz4();
    }
  }

  else if (hodnotaPole1 > 360) {
    if (zmena1 == 1) {
      vzkaz3();
    }
  }

  else if (hodnotaPole1 > 260) {
    if (zmena1 == 1) {
      vzkaz2();
    }
  }
  else if (hodnotaPole1 > 160) {
    if (zmena1 == 1) {
      vzkaz1();
    }
  }

  else if (hodnotaPole1 >= 0) {
    if (zmena1 == 1) {
      bezFigurky ();
    }
  }


  if (hodnotaPole2 > 800) {
    if (zmena2 == 1) {
      // Serial.println ("jsem na vzkazu14");
      vzkaz14();
    }
  }
  else if (hodnotaPole2 > 630) {
    if (zmena2 == 1) {
      vzkaz13();
    }
  }
  else if (hodnotaPole2 > 490) {
    if (zmena2 == 1) {
      vzkaz12();
    }
  }
  else if (hodnotaPole2 > 350) {
    if (zmena2 == 1) {
      vzkaz11();
    }
  }
  else if (hodnotaPole2 > 200) {
    if (zmena2 == 1) {
      vzkaz10();
    }
  }
  else if (hodnotaPole2 > 61) {
    if (zmena2 == 1) {
      vzkaz9();
    }
  }
  else if (hodnotaPole2 >= 0) {
    if (zmena2 == 1) {
      // Serial.println ("jsem bez figurky2");
      bezFigurky ();
    }
  }
  state1();
  state2();
  delay (500);

}

void bezFigurky()
{

  lcd.clrScr();
  myFiles.load(0, 0, 320, 240, "PIC303.RAW", 1, 0);
  delay (100);

}

void state1 () {
  stavtl1 = kontrol1;
  if (stavtl1 != poslednistavtl1) {
    zmena1 = 1 ;
  }
  else {
    zmena1 = 0;
  }
  poslednistavtl1 = stavtl1;
}

void state2 () {
  stavtl2 = kontrol2;
  if (stavtl2 != poslednistavtl2) {
    zmena2 = 1 ;
  }
  else {
    zmena2 = 0;
  }
  poslednistavtl2 = stavtl2;
}



void vzkaz1()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("1", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo jedna", CENTER, 100);

  lcd.print ("Tady je vzkaz", CENTER, 150);
}

void vzkaz2()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("2", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo dva", CENTER, 100);

  lcd.setFont(SmallFont);
  lcd.print ("tady se da napsat cokoliv na doplneni", CENTER, 150);
}
void vzkaz3()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("3", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo tri", CENTER, 100);
  lcd.print ("atd", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("a tak dale", CENTER, 150);
}

void vzkaz4()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("4", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo ctyri", CENTER, 100);
  lcd.print ("etc", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("adsfsdf", CENTER, 150);
}

void vzkaz5()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("5", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo pet", CENTER, 100);
  lcd.print ("Vdfsf", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("tfeefef", CENTER, 150);
}


void vzkaz6()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("6", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo sest", CENTER, 100);
  lcd.print ("thgerg", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("bla bla bla bla bla bla bla", CENTER, 150);
}

void vzkaz7()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("7", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo sedum", CENTER, 100);
  lcd.print ("aregar", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("aregar  rg ", CENTER, 150);
}
void vzkaz8()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("8", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo osum", CENTER, 100);
  lcd.print ("ergega", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("a ted se to konecne rymuje", CENTER, 150);
}
void vzkaz9()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("9", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo devet", CENTER, 100);
  lcd.print ("kdo mlci je nemec", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("a kdo jinemu jamu kopa ten je brigadnik", CENTER, 150);
}



void vzkaz10()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("10", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo deset", CENTER, 100);

  lcd.setFont(SmallFont);
  lcd.print ("tady se da napsat cokoliv na doplneni", CENTER, 150);
}
void vzkaz11()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("11", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo jedenact", CENTER, 100);
  lcd.print ("Prdel si vy3", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("a tak dale", CENTER, 150);
}

void vzkaz12()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("12", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo dvanact", CENTER, 100);
  lcd.print ("aergae", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("aergaeg", CENTER, 150);
}

void vzkaz13()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("13", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo trináct", CENTER, 100);
  lcd.print ("aergaega", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("aergaegr", CENTER, 150);
}


void vzkaz14()

{

  lcd.setFont(SevenSegNumFont);
  lcd.print ("14", CENTER, 10);

  lcd.setFont(BigFont);
  lcd.print ("Pole cislo ctrnact", CENTER, 100);
  lcd.print ("aergaergae", CENTER, 120);

  lcd.setFont(SmallFont);
  lcd.print ("bla bla bla bla bla bla bla", CENTER, 150);
}

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: resistor ladder buttons a TFT

Příspěvek od pavel1tu » 14 dub 2020, 14:52

No, já nejsem programátor, spíše "sedlák" ;)

A dělám něco podobného v novém projektu "řízení" TT železnice,
kde jednou bude týdenní trafikon pro asi 5 vlaků, včetně grafikonu - poloh jednotlivých vlaků.
Jen místo odporů si vláčky vozí RFID čidlo ...

Takže si také, sice do "pole", ukládáme kde jaký vlak je - číslem vlaku.

PS: třeba někdo nahodí lepší nápad, více hlav ....
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Odpovědět

Kdo je online

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