Funkce PushButton se strukturou

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
Sniker
Příspěvky: 1
Registrován: 28 zář 2017, 15:35
Reputation: 0

Funkce PushButton se strukturou

Příspěvek od Sniker » 28 zář 2017, 15:45

Zdravím všechny nadšence.
Jsem v programování Arduina / C / C++ nováčkem a své programy bastlím z toho co najdu na netu. Mám rozdělaný program, ve kterém se snažím vytvořit funkci s parametry ve struktuře. Součástí funkce by měl být filtr špiček a detekce náběžné hrany stisknutí tlačítka. Pro otestování funkčnosti jsem zapojil malý OLED display na kterém zobrazuji počítadlo stisknutí tlačítka. V projektu je také zapojená zelená LED pro indikaci a kontrolu stisknutí tlačítka mimo OLED display.

Problém je, že pro dvě tlačítka vše funguje, ale pro více jak dvě už ne. Dokázal by mi s tím někdo poradit?

Děkuji za nápady.

Kód: Vybrat vše

//------------------------------------------------
// OLED displej přes I2C
// řadič SSD1306
// připojení knihovny U8glib
#include <U8glib.h>
// inicializace OLED displeje z knihovny U8glib
U8GLIB_SSD1306_128X64 OLED(U8G_I2C_OPT_NONE);

//------------------------------------------------
// promenne pro uchovani casu posledni akce
long runtime = 0;

//------------------------------------------------
// Definice promennych
int pLEDg = 7;        // cislo pinu
int pTL = 11;


// definice struktury
struct tlacitka{
  int pin;        // cislo pinu
  long dly;        // pamet casu od posledniho stisnuti
  byte cnt;        // citac sepnuti
  bool mem;    // pamet signalu (detekce hrany)
  bool pushed; 
}; 

tlacitka TL1, TL2, TL3, TL4;

//**************************************************
void setup(void) {

TL1.pin = 11;
TL1.cnt = 0;
TL2.pin = 10;
TL2.cnt = 0;
TL3.pin = 9;
TL3.cnt = 0;
TL4.pin = 8;
TL4.cnt = 0;

  //------------------------------------------------
  // Definice IO
  pinMode(pLEDg, OUTPUT);
  pinMode(TL1.pin, INPUT_PULLUP);
  pinMode(TL2.pin, INPUT_PULLUP);
  pinMode(TL3.pin, INPUT_PULLUP);
  pinMode(TL4.pin, INPUT_PULLUP);

  digitalWrite(pLEDg, LOW);


}

//**************************************************
void loop(void) {

TL1 = PushButton(TL1.pin, TL1);
 if (TL1.pushed == true) { ++TL1.cnt; }
TL2 = PushButton(TL2.pin, TL2);
 if (TL2.pushed == true) { ++TL2.cnt; }
TL3 = PushButton(TL3.pin, TL3);
 if (TL3.pushed == true) { ++TL3.cnt; }
TL4 = PushButton(TL4.pin, TL4);
 if (TL4.pushed == true) { ++TL4.cnt; }
  
  //------------------------------------------------
  // porovnání uloženého a aktuálního času
  // při rozdílu větším než 100 ms se provede
  // obnovení displeje, čas můžeme nastavit dle potřeby
  if (millis() - runtime > 100) {
    // následující skupina příkazů
    // obnoví obsah OLED displeje
    OLED.firstPage();
    do {
      // funkce vykresli vykreslí žádaný obsah
      vykresli();
    } while( OLED.nextPage() );
    // uložení posledního času obnovení
    runtime = millis();
  }
  
  // zde je místo pro další příkazy pro Arduino
  //------------------------------------------------

digitalWrite(pLEDg, (digitalRead(pTL) == false));

}
// funkce vykresli pro nastavení výpisu informací na OLED
//**************************************************
void vykresli(void) 
{
    // nastavení písma, toto písmo umožní vypsat
    // přibližně 15x4 znaků (8x16 pix/znak)
  OLED.setFont(u8g_font_unifont);
    // nastavení pozice výpisu v pixelech
    // souřadnice 0, 0 je v levém horní rohu
    // OLED displeje, maximum je 128, 64
  OLED.setPrintPos(0, 10);
  OLED.print(millis()/1000);
  
  OLED.setPrintPos(0, 26);        // souřadnice jsou ve tvaru x, y
  OLED.print("T1:");              // výpis textu na zadanou souřadnici
    OLED.setPrintPos(32, 26);
    OLED.print(TL1.cnt);
  OLED.setPrintPos(0, 42);
  OLED.print("T2:");
    OLED.setPrintPos(32, 42);
    OLED.print(TL2.cnt);
  OLED.setPrintPos(64, 26);
  OLED.print("T3:");
    OLED.setPrintPos(96, 26);
    OLED.print(TL3.cnt);
  OLED.setPrintPos(64, 42);
  OLED.print("T4:");
    OLED.setPrintPos(96, 42);
    OLED.print(TL4.cnt);
}

//**************************************************
struct tlacitka PushButton(int pin, struct tlacitka) 
{
  struct tlacitka tl;
  long SPdly = 20;
  
  if (digitalRead(pin) == LOW)
  {
    if ((millis() - tl.dly) > SPdly)
    {
      if (tl.mem == false)
      {
        tl.mem = true;
        tl.pushed = true;
      }
      else
      {
        tl.pushed = false;  
      }
    }
  }
  else
  {
    tl.dly = millis();
    tl.mem = false;
    tl.pushed = false; 
  }
  
  return tl;
}

Odpovědět

Kdo je online

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