Stránka 1 z 1

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

Napsal: 24 úno 2019, 20:17
od lubo1
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ý.

Re: Pomoc

Napsal: 25 úno 2019, 06:50
od pavel1tu
ú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

Re: Pomoc

Napsal: 25 úno 2019, 18:05
od lubo1
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

Re: Pomoc

Napsal: 25 úno 2019, 22:00
od jankop

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

Re: Pomoc

Napsal: 25 úno 2019, 22:46
od jankop
Ten výraz pro periodu blikání T=2*DELAY*10 je pochopitelně špatně. Má být T = DELAY/50

Re: Pomoc

Napsal: 25 úno 2019, 23:08
od petan
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);
 }
}
 
 

Re: Pomoc

Napsal: 26 úno 2019, 07:10
od jankop
Š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.

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

Napsal: 27 úno 2019, 17:21
od lubo1
Dobrý den, funkční prototyp je na stole, proto bych chtěl všem zůčastněným moc poděkovat.

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

Napsal: 27 úno 2019, 17:45
od jankop
Tak teď už jen udělat ten traktůrek :lol: