Založen: May 10, 2004 Příspěvky: 4513 Bydliště: Košice
Zaslal: pá prosinec 08 2017, 8:03 Předmět:
0 a 1 su inak rx tx pre programovanie takze ked tam nahravas program.
Na zakmity by som sa vybodol. Ked tam budes mat displej alebo niecocpodobne kym sa znova otestuju tlacidla prejde 50ms, ak nie kludne tam daj taky delay nic sa nestane obsluha to nezisti.
Navyse pre kludne pouzivanie by si mal vstupycosetrit RC clenom tak ze zakmity uz budu nepodstatne.
Založen: Feb 17, 2017 Příspěvky: 642 Bydliště: Staré Město (UH)
Zaslal: pá prosinec 08 2017, 21:33 Předmět:
No tlačítka jsem teda nějak vyřešil. Dnes jsem se pokoušel to přepsat do jedné funkce abych nemusel psát pro každé tlačítko víceméně to samé, jen s jinými hodnotami, ale nejde mi to. Vycházel jsem ze znalosti PHP a zkoušel to takto:
kód:
const int G = A0; // 3x LED
const int Y = A1;
const int B = A2;
int zelena;
int modra;
const int Tl1 = 2; // tlačítka
const int Tl2 = 3;
int ledState = LOW;
int gState = LOW;
int bState = LOW;
unsigned long previousMillis = 0;
const long interval = 500;
unsigned long times;
unsigned long prevtime = 0;
int Tl1State;
int Tl2State;
int lastTl1State = LOW;
int lastTl2State = LOW;
int out = LOW;
long lastDebounceTime = 0;
long debounceDelay = 50;
Snad se ten kód dá trochu pochopit...
Prostě pokud zavolám funkci
buttons("zapni", "LED");
tak se v příslušné funkci buttons(X,Y) dosadí X=zapni a Y= LED.
Čímdál víc vidím, že to nebude tak jednoduché jak se to na první pohled zdálo...
Pokud chci něco rozumného "vygooglit", tak najdu max jak blikat z ledkou nebo jak se připojovat k internetu. Jedno je pro naprosté začátečníky a to druhé pro "normální" používání k ničemu... Nechápu proč by se všechno muselo hned připojovat k internetu... No ale to už jsem zašel mimo...
Poradí někdo jak jít na ty vlastní funkce a přiřazovat ty proměnné?
Díky
EDIT: v tom kódu je definovaných víc věcí, zkouším to na jednom programu co mi funguje...
Založen: Nov 20, 2012 Příspěvky: 1453 Bydliště: Praha
Zaslal: pá prosinec 08 2017, 21:53 Předmět:
Upřímně, teď tomu kódu vůbec nerozumím. To přece nemůže jít ani přeložit. Zkus prosím namalovat stavový automat, který si představuješ (třeba jako vývojový diagram) a dej ho sem.
Založen: May 17, 2004 Příspěvky: 582 Bydliště: Kosice
Zaslal: so prosinec 09 2017, 12:06 Předmět:
Doporucujem najprv trocha pocvicit nejake programy v C, programovanie mikrokontrolerov ma svoje specifika, ale ak nespravis architekturu programu spravne ale budes vsetko placat hlava nehlava do hlavnej slucky, ta zabudni na pouzitelny vysledok..
Založen: Feb 17, 2017 Příspěvky: 642 Bydliště: Staré Město (UH)
Zaslal: so prosinec 09 2017, 12:51 Předmět:
No dobrá jak sem si to přestavoval, to zřejmě nepůjde. V tom případě jiný dotaz. Mám dvě tlačítka, jedno rozsvítí jen diodu, druhé rozsvítí diodu + spustí podprogram, kde další dioda bliká. Pokud to ovšem dalším klikem chci ukončit, tak jsou u té blikací diody dva stavy. Pokud to vypnu když dioda nesvítí, tak se nic neděje, pokud to ovšem ukončím když blikající dioda zrovna svítí, tak zůstane svítit (ne blikat) i když je tlačítko ve stavu "vypnuto". Jak ošetřit kód aby ten podprogram vypnul taky?
kód:
const int G = A0; // LED
const int Y = A1;
const int B = A2;
int zelena, modra;
int ledState, gState, bState = LOW;
unsigned long previousMillis = 0; // čas
const long interval = 500;
unsigned long times;
unsigned long prevtime = 0;
const int Tl1 = 2; // tlačítka
const int Tl2 = 3;
int Tl1State, Tl2State;
int lastTl1State,lastTl2State = LOW;
long lastDebounceTime = 0;
long debounceDelay = 50;
// program co se spustí po zapnutí druhého tlačítka (blikající dioda)...
void HlavniProg() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
Založen: May 17, 2004 Příspěvky: 582 Bydliště: Kosice
Zaslal: so prosinec 09 2017, 15:03 Předmět:
kazdy program je v podstate stavovy automat, ktory v zavislosti v akom stave sa nachadza tak moze nejake tlacitko robit nieco uplne ine. Uvediem priklad z tvojho programu, posledna podmienka if (bState == HIGH) { HlavniProgram}, teda ak nejaka premenna odrazajuca stav premennej bState je High tak to zacne volat funkciu v podmienke. A ty uz zacinas narazat na to ze tvoj stavovy automat zacina mat dalsi stav a chces nieco vykonat len ked ledka nesvieti, alebo ked svieti, taka by zhasla....a ty nad tym uz nevies udrzat mentalnu kontrolu. Este dopises 10 riadkov a si strateny.. Takze sa vratim s5 ku architekture. CPU je dostatocne rychle aby vykonavalo kazdu ulohu nejaku chvilu a tebe sa to bude javit ako keby vsetko islo plynule... takze ty potrebujes zopar veci:
1) snimat klavesnicu
2) blikat s ledkou
takze snimanie klavesnice je periodicky dej, ktory chces vykonavat v pravidelnych intervaloch, blikanie ledky je napodobne velmi jednoducha cinnost, staci aby v spravny okamih procesor zdvihol stav na drote a potom ho zas zhodil.. zvysok casu procak nema co robit...V zasade CPU vacsinu casu otaca hlavnou sluckou a periodicky si odskoci do prerusenia, kde sa pozrie na stav tlacidiel a napise to (ak je stlacene alebo pustene) do nejakych premennych. Tieto premenne su potom kontrolovane hlavnou sluckou a vykonaju akciu...Periodicke prerusenie je dobry sposob ako robit nieco v presne stanovenych casovych okamzikoch. Priklad chcem blikas s LEDkou tak ze pol sekundy bude zasvietena a pol sekundy bude zhasnuta..
Urobis jednu globalnu premennu typu integer - pocitadlo preruseni. Ked ti prerusenie chodi kazdych 50ms, tak musis naratat do 10 aby presla pol sekunda, vtedy zmenis stav ledky na opacny
stavy celeho automatu si znacim bitovo a potom ich aj bitovo testujem.
(zopar globalnych bytov) Mozes si to pisat aj do bytov to ti zozere troska viac ramky.. NEPOUZIVAT ZIADNE FUNKCIE DELAY. Snimanie klavesnice som popisal skor (pripadne si to precitaj este raz, a pogoogli, porozmyslaj ako som to myslel)
priklad: uzivatel stlaci tlacidlo 1) a chcem aby sa o pol sekundy nieco stalo.
uint_8 status = 0; //inicializaciu toho treba dat do init
uint_8 timer_counter;
#define POL_SEC_FLAG 0b00000001
//toto spravis v hlavnej slucke ako reakciu na tlacidlo 1
//je to signal preruseniu, ze ma zacat ratat do 10 povedzme
timer_counter = 10;
status |= POL_SEC_FLAG;
//v preruseni bude napisane:
if (status & POL_SEC_FLAG){
if (timer_counter >0){
timer_counter--;
}else{
//ZASVIET LEDKU
status = &~POL_SEC_FLAG; //akcia bola spravena, zhodime vlajocku
}
}
Používej k debouncování jednoduchý delay().
Počítám, že bude ještě dlouho trvat, než ti zpoždění bude vadit.
Teď v začátcích by ti to jenom komplikovalo život.
Nenazývej svoji vlastní funkci Hlavní().
Za hlavní funkci se tady považuje smyčka loop().
Podívej se na příklad níže.
(po stisku tlačítka Led bliká, po dalším zhasne, atd.)
kód:
#define Yellow_led 13
#define TL2 12
unsigned long currentMillis, previousMillis;
unsigned int interval=500;
boolean TL2_state;
Založen: Feb 17, 2017 Příspěvky: 642 Bydliště: Staré Město (UH)
Zaslal: so prosinec 09 2017, 21:27 Předmět:
Hoši moc díky za rady. Moc si toho cením...
Co se týká "hlavní" funkce, tak je to jen začátek celého projektu. Pak to bude pojmenované přímo funkcí, kterou to bude dělat (pokud se mi to teda podaří)...
Ve výsledku tam blikat nic nebude. Mám to jen na zkoušku. V podstatě by to jedno tlačítko mělo sepnout dva výstupy. Jeden by měl být sepnutý cca 60 minut a druhý jen 40 sekund.
Jinak jsem se díval i na to přerušení, což by asi (určitě) bylo nejlepší řešení, protože pokud bude nějaká "externí" akce (tlačítka), tak by se měl hlavní program (časové spínání relé a hlídání teploty) přerušit a běžet program co je pod tím tlačítkem...
Založen: Feb 17, 2017 Příspěvky: 642 Bydliště: Staré Město (UH)
Zaslal: ne prosinec 10 2017, 9:36 Předmět:
Mám dotaz ještě ohledně těch tlačítek. Když vynechám programové ošetření zákmitů a udělám ho HW tak to bude lepší ne? Z toho pak vyplývá další otázka ohledně zapojení.
1/ každé tlačítko má svůj pin - fungovat bude bez problému
2/ všechny tlačítka jsou na "jednom" drátu - dají se nějak adresovat?
Založen: May 17, 2004 Příspěvky: 582 Bydliště: Kosice
Zaslal: ne prosinec 10 2017, 9:52 Předmět:
To druhe je znacna blbost:) ked mas len zopar tlacidiel, a nie je problem s poctom pinov, ta pouzi zapojenie c.1...spravne HW osetrenie zakmitov tlacidiel sa robi schmitovym ko.
http://www.ct2.wz.cz/Studium/schmitt.htm
Ak mas vela tlacidiel a malo drotov pouziva sa matica, zopar drotov z CPU vysiela a zopar prijima a su prekrizene do matice, kod daneho tlacidla je potom kombinaciu vysielacich a prijimanych drotikov. Ale to ti netreba.
Edit: pozeram lepsie na tvoje zapojenie, ha zvyknem tlacidla nejakym pull up odporom opriet o 5v, aby si procakom v pripade nezatlacenia nemal len tak drotik v lufte (zbyknu byt v cpu pull upy) ale na mojom poslednom projekte s tym bol problem, kazdopadne 5k6 oproti log "1" neuskodi..
Založen: May 10, 2004 Příspěvky: 4513 Bydliště: Košice
Zaslal: ne prosinec 10 2017, 12:55 Předmět:
Lenze tie interne nemusia byt dostatocne tvrde.
Ide klavesnicu pripojit na AD prevodnik 2 vodicmi. Stlacenim tlacidla sa meni odporovy delic a tym nasnimane napatie. Jednotlivym napatiem priradis hodnoty tlacidiel.
Bezne sa to na arduine vyuziva.
Časy uváděny v GMT + 1 hodina Jdi na stránku Předchozí1, 2, 3, 4Další
Strana 2 z 4
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.