Ovládání blinkrů tlačítkem

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
lubo1
Příspěvky: 3
Registrován: 24 úno 2019, 19:59
Reputation: 0

Ovládání blinkrů tlačítkem

Příspěvek od lubo1 » 24 úno 2019, 20:17

Ahoj, potreboval bych pomoct s tvorbou programu, pro arduino nano. Ovládání led blinkrů tlacítkem. Jedním tlacítkem zapnout jeden výstup kontrolka led (svítí), druhý výstup led blinkr (bliká), stejným tlačítkem vypnout. Druhým tlačítkem druhý blinkr. Asi je to triviální, ale já to nezvládám.
Dokážu jeden výstup zapnout a vypnout, ale druhý nebliká. Pokud by to někdo napsal byl bych vděčný.

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

Re: Pomoc

Příspěvek od pavel1tu » 25 úno 2019, 06:50

úkol do školy ?

hoď sem co máš, napovíme - pokud to pochopíš - bude to lepší než když to jen obšlehneš

kod sem hoď pomocí

Kód: Vybrat vše

tohodle
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

lubo1
Příspěvky: 3
Registrován: 24 úno 2019, 19:59
Reputation: 0

Re: Pomoc

Příspěvek od lubo1 » 25 úno 2019, 18:05

Ahoj Chlapi, do školy jsem chodil před třiceti lety a tehdy byl v osobních počítačích výkřik techniky DIDAKTIK GAMA. Blinkry jsou na kutilský zahradní traktůrek. Takže, když pomůzete budu rád. Kód, který mám je jen grab z internetu. :D

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Pomoc

Příspěvek od jankop » 25 úno 2019, 22:00

Kód: Vybrat vše

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Piny pro tlacitka a LED je treba zadefinovat podle svych pozadavku a zapojeni
// !!!!!!!!!!!!!!!!!!1111111111111111!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define KONTROLKA1PIN 13  // pin kontrolky 1 - LED s rezistorem proti zemi
#define KONTROLKA2PIN 4   // pin kontrolky 2 - LED s rezistorem proti zemi
#define LED1BLINKRPIN 12  // pin blinkru 1   - LED s rezistorem proti zemi
#define LED2BLINKRPIN 9   // pin blinkru 2   - LED s rezistorem proti zemi
#define BUTTON1PIN    8   // tlacitko 1      - spinac proti zemi !!!!!!!!!
#define BUTTON2PIN    11  // tlacitko 2      - spinac proti zemi !!!!!!!!!
#define DELAY         50  // casova konstanta rychlosti blikani T=2*DELAY*10 [s]
// ma vliv i na cetnost cteni tlacitek
//****************** Globalni promenne *******************************************
bool Led1On = false;      // priznak pozadavku blikani LED1
bool Led2On = false;      // priznak pozadavku blikani LED2
bool Led1State = false;   // stav LED1 Vypnuto/Zapnuto
bool Led2State = false;   // stav LED2 Vypnuto/Zapnuto
bool Button1 = true;      // tlacitko 1 - zapojeno proti zemi, stisknuto = false
bool Button2 = true;      // tlacitko 2 - zapojeno proti zemi, stisknuto = false
bool Release1 = false;    // priznak uvolneni tlacitka 1
bool Release2 = false;    // priznak uvolneni tlacitka 2
uint8_t Button1Count = 0; // citac doby stisku tlacitka 1
uint8_t Button2Count = 0; // citac doby stisku tlacitka 2
//********************************************************************************
void setup() {
  /* nastaveni vstupu/vystupu */
  pinMode(KONTROLKA1PIN, OUTPUT);
  pinMode(KONTROLKA2PIN, OUTPUT);
  pinMode(LED1BLINKRPIN, OUTPUT);
  pinMode(LED2BLINKRPIN, OUTPUT);
  pinMode(BUTTON1PIN, INPUT_PULLUP);
  pinMode(BUTTON2PIN, INPUT_PULLUP);
  //*******************************************************************************
}
void loop() {
  // pokud je pozadavek na blikani, tak ovladej LED1
  if (Led1On)digitalWrite(LED1BLINKRPIN, Led1State);
  // pokud je pozadavek na blikani, tak ovladej LED2
  if (Led2On)digitalWrite(LED2BLINKRPIN, Led2State);
  Led1State = !Led1State; // priprav zmenu stavu LED1
  Led2State = !Led2State; // priprav zmenu stavu LED2
  ButtonAndDelay();
}
void ButtonAndDelay(void) {
  // funkce odmeruje pulperiodu blikani a zaroven periodicky
  // relativne rychle testuje tlacitka
  for (uint8_t i = 0; i < 10; i++) {
    /* pokud je tlacitko 1 drzeno alespon dva casove intervaly
       DELAY, pak se zmeni stav pozadavku na blikani Led1On,
       podle potreby se rozsviti kontrolka blikani 1 a pripravi se
       stav ON nebo OFF LED1. Release zajistuje, aby se pri podrzeni
       tlacitka blikani periodicky nevypinalo a nezapinalo */
    if (!digitalRead(BUTTON1PIN) && Release1) {
      Button1Count++;     // citani doby stisku tlacitka1
      if (Button1Count > 1) {
        Led1On = !Led1On; // zmena stavu pozadavku na blikani LED1
        digitalWrite(LED1BLINKRPIN, Led1On); // priprav LED1 blinkru
        digitalWrite(KONTROLKA1PIN, Led1On); // priprav kontrolku1
        Button1Count = 0; // nuluj  citac doby stisku tlacitka1
        Release1 = false; // nuluj priznak uvolneni tlacitka1
      }
    }
    /* ceka na uvolneni tlacitka 1 alespon po dobu tri period DELAY */
    if (digitalRead(BUTTON1PIN)) {
      Button1Count++;    // citani doby uvolneni tlacitka1
      if (Button1Count > 2) {
        Button1Count = 0;// nuluj  citac doby uvolneni tlacitka1
        Release1 = true; // nastav priznak uvolneni tlacitka1
      }
    }
    /* pokud je tlacitko 2 drzeno alespon dva casove intervaly
       DELAY pak se zmeni stav pozadavku na blikani Led1On,
       podle potreby se rozsviti kontrolka blikani 2 a pripravi se
       stav ON nebo OFF LED21. Release zajistuje, aby se pri podrzeni
       tlacitka blikani periodicky nevypinalo a nezapinalo */
    if (!digitalRead(BUTTON2PIN) && Release2) {
      Button2Count++;     // citani doby stisku tlacitka2
      if (Button2Count > 1) {
        Led2On = !Led2On; // zmena stavu pozadavku na blikani LED2
        digitalWrite(LED2BLINKRPIN, Led2On); // priprav LED2 blinkru
        digitalWrite(KONTROLKA2PIN, Led2On); // priprav kontrolku2
        Button2Count = 0; // nuluj  citac doby stisku tlacitka2
        Release2 = false; // nastav priznak uvolneni tlacitka2
      }
    }
    /* ceka na uvolneni tlacitka 2 alespon po dobu tri period DELAY */
    if (digitalRead(BUTTON2PIN)) {
      Button2Count++;    // citani doby uvolneni tlacitka2
      if (Button2Count > 2) {
        Button2Count = 0;// nuluj  citac doby uvolneni tlacitka2
        Release2 = true; // nastav priznak uvolneni tlacitka2
      }
    }
    /* urcuje frekvenci/periodu blikani */
    delay(DELAY);
  }
}

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Pomoc

Příspěvek od jankop » 25 úno 2019, 22:46

Ten výraz pro periodu blikání T=2*DELAY*10 je pochopitelně špatně. Má být T = DELAY/50

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Pomoc

Příspěvek od petan » 25 úno 2019, 23:08

Osobně bych logiku blikání řešil bez delay. Vytvořil bych si proměnnou, kterou bych si blikal pomocí millis a tuto proměnnou bych potom posílal na tu požadovanou LEDku. Asi nějak takhle:

Kód: Vybrat vše

unsigned long lastTime, presentTime;
bool ledActive;	//tato proměnná "bliká" v nastaveném intervalu
bool maBlikat; //aktivní režim blikání
bool maSvitit;	//aktivní režim svícení

void loop() { 
presentTime = millis();

if (presentTime - lastTime >= 250) { 
//cyklovač
  lastTime = presentTime;
  ledActive = !ledActive;
} 

if(maBlikat){
//blikani ledky
 digitalWrite(13; ledActive);
}

if(maSvitit){
//sviceni ledky
 digitalWrite(13; true);
}

if(!maBlikat && !maSvitit){
//zhasnuti ledky
 digitalWrite(13; false);
 }
}
 
 

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Pomoc

Příspěvek od jankop » 26 úno 2019, 07:10

Šlo by tlačítka kontrolovat přes interupt, časy řídit knihovnou Interval nebo přes mills(). Ale stejně základem je slušné ošetření tlačítek, které tvoří podstatnou část programu. Pojal jsem to primárně jako školní úlohu, nechtěl jsem aby to bylo dokonalé, sám bych použil tu knihovnu. Na druhé straně to zadání splňuje (pokud jsem ho správně pochopil) s tím, že se to rozsvítí a zhasne hned po stisku tlačítka, jak je běžně po blikačích požadováno.

lubo1
Příspěvky: 3
Registrován: 24 úno 2019, 19:59
Reputation: 0

Re: Ovládání blinkrů tlačítkem

Příspěvek od lubo1 » 27 úno 2019, 17:21

Dobrý den, funkční prototyp je na stole, proto bych chtěl všem zůčastněným moc poděkovat.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Ovládání blinkrů tlačítkem

Příspěvek od jankop » 27 úno 2019, 17:45

Tak teď už jen udělat ten traktůrek :lol:

Odpovědět

Kdo je online

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