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;
}