Arduino - dva programy

Odpovědět
Kopeck

Arduino - dva programy

Příspěvek od Kopeck »

Dobrý den,
začal jsem se seznamovat s arduienem a narazil jsem na tento problém:
U vedu to na jednoduchém příkladu:
mám 2 LED diody, jedna bliká např. každou 1s a druhá každých 5s, pomocí tlačítek chci měnit rychlost blikání u každé diody zvlášť, ale tak, aby když budu měnit nastavení blikání u jedné diody chci, aby druhá dioda blikala v řežimu, tak jak to má nastavené. Pro jednu diodu napsat program je jednoduché, ale pro ovládání dvou nezvládám.
Prosím poradí mi někdo z Vás zkušenějších jak tento problém vyřešit?
Předem Vám moc děkuji a přeji hezký den.
MartinL
Příspěvky: 252
Registrován: 24 úno 2013, 14:13
Kontaktovat uživatele:

Re: Arduino - dva programy

Příspěvek od MartinL »

Předpokládám, že vaše řešení s jednou led využívá časovou prodlevu (touto cestou pro řízení více současných akcí nelze jít).
Tento typ úloh lze řešit různými způsoby, doporučuji začít jednoduchou cestou - využití "běžícího" času v arduinu (funkce millis() vrací počet ms od "spuštění" programu).

Př. pro jednu led:
1. vytvořím si proměnnou (časovou značku), ve které mám čas při kterém má nastat nějaká akce
2. ve smyčce Loop kontroluji, zda "reálný" čas už dosáhl časové značky
3. pokud ano, provedu akci a posunu časovou značku o požadovanou periodu

pro více současných akcí, mám pro každou událost vlastní časovou značku, jinak vše stejné.

Přikládám kód pro blikání dvou led, frekvence blikání je dána hodnotou v proměnné dT1 (dT2), což je hodnota o kterou se posouvá časová značka. Takže pro změnu frekvence blikání stačí měnit příslušnou hodnotu dT.

Kód: Vybrat vše

#define LED1  12
#define LED2  13

unsigned long Time1, dT1;
unsigned long Time2, dT2;

void setup() 
{
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  
  dT1 = 1000 / 2;
  dT2 = 5000 / 2;    
  Time1 = Time2 = millis();
}

void loop() 
{ 
  if(millis() >= Time1)
  { 
    digitalWrite(LED1, !digitalRead(LED1));
    Time1 += dT1;
  }

  if(millis() >= Time2)
  { 
    digitalWrite(LED2, !digitalRead(LED2));
    Time2 += dT2;
  }
}
Kopeck

Re: Arduino - dva programy

Příspěvek od Kopeck »

Děkuji za vysvětlení a ještě bych se zeptal, jeden známý mi říkal, že by se to dalo řešit pomocí přerušení, ale moc jsem ho nepochopil. Byl by jsete tak hodný a popsal mi to způsobem pro tupce? ;)
Jinak ty LEDky, to byl takový rychlý nápad pro nastítění problému, ve skutečnosti chci ovládat nezávisle nabíjení a vybíjení dvou baterií.
MartinL
Příspěvky: 252
Registrován: 24 úno 2013, 14:13
Kontaktovat uživatele:

Re: Arduino - dva programy

Příspěvek od MartinL »

Samozřejmě to lze řešit s využitím přerušení, ale jak jsem pochopil, tak jste začátečník, proto jsem doporučil řešení, které pokud nejde o časově kritické věci, je velmi jednoduché a jasné. Lze to bez problémů upravit pro jakékoliv úlohy (nejen blikání led).
Pro použití přerušení je nutné trochu něco vědět o použitém hardwaru (nastudovat použitý mikrokontroler), neboť v základní knihovně arduina není přerušení od "času" implementováno. Existují i knihovny pro práci s přerušením o časovače. Ale i tak bude nutné souběžné úlohy řešit obdobně, jak jsem nastínil, protože mikrokontroler v arduinu má pouze 3 nezávislé časovače (a jeden je použit pro generování času) a další pro generování PWM signálu.
Kopeck

Re: Arduino - dva programy

Příspěvek od Kopeck »

Moc děkuji za vysvětlení, hold, se mám co učit. ;)
Na závěr ať nezakládám další vlákno, zkoušel jsem zobrazování na LCD displeji dle příkladu http://arduino8.webnode.cz/news/lekce-4 ... ovy-vstup/ ale to číslo jsem převáděl na volty a nevím jak to číslo upravit pouze na jedno nebo dvě desetiná místa.
Předem moc děkuji.
Odpovědět