Časovane spinaní pinu
Úvodní stránka › Fórum › Vaše projekty › Arduino › Časovane spinaní pinu
- Toto téma obsahuje celkem 31 odpovědí. Do diskuze (5 diskutujících) se naposledy zapojil uživatel
posjirka a poslední změna proběhla před 7 roky a 5 měsíci.
-
AutorPříspěvky
-
26.2.2016 v 13:03 #6166
posjirka
Účastníknemusíš to nulovat, stačí když budeš dál odpočítávát millis od old-millis. Stejně to nepustí v rámci proměnné více než je její rozsah a bude ti počítat od nuly. když dáš byte a jeho max hodnotu 255 a příčteš 1 tak máš zase 1 a né 256.
27.3.2017 v 23:44 #10899hogen
ÚčastníkDobrý den,jsem začátečník v programování Arduina a mám problém.
Váše časové spínání pinu se mi moc zamlouvá ,ale potřeboval bych aby to spínalo tří nastavené časy v programu.Tudíž třemi tlačítky ovládat jeden výstup.Zkoušel jsem modifikovat Váš program,ale bez úspěchu.Myslíte,če by jste mne moh nějak poradit.Děkuji za jakou koliv odpověď.
Hog.28.3.2017 v 8:40 #10901posjirka
Účastníkhod sem ten program co jsi napsal a mrkenem na to …
28.3.2017 v 10:01 #10903hogen
ÚčastníkNo já jsem nic nenapsal,jen jsem se pokoušel upravit ten program z tvého příspěvku ze dne 22.2.2016 (20:53),ale bez úspěchu.Asi je to prozatím pro mně nadlidský úkol.Hog.
28.3.2017 v 22:08 #10906posjirka
Účastníknení to tak složité. Nadefinuješ si 3 sady proměnných:
OLD_TIMEx
CEKAMx
MYTIMEx
kde „x“ je číslo sady.
Pak rozkopíruješ a poupraviš celý obsah ve smyčce LOOP()
to je vše …
Případně to vyřešíš pomocí funkcí
Jestlit o nedáš, nezoufej a dej tomu čas, nikdo neví všechno hned.
Chce to čas s zkušenosti. Já se taky pořád učím a zřejmě tomu nebude konec 🙂29.3.2017 v 12:36 #10910hogen
ÚčastníkTak jsem to zkoušel,ale moc jsem to nepochopil.Můžeš prosím na to mrknout,jestli to má alespoň trochu hlavu a patu,nebo je tu úplnej nesmysl.Díky
// zpozdeni tlacitka
// v1
// by JP 2016
// program po stisku tlačítka rozsvítí LED diodu a nechá jí 5s rozsvícenou, pak ji zhasne a opět čeká na stisk tlačítkaconst int LED = 13; // led dioda
const int TLACITKO = 10; // tlacitko proti zemi
const int TLACITKO1 = 11; // tlacitko proti zemi
const int TLACITKO2 = 12; // tlacitko proti zemiboolean CEKAM = false; // kdyz je true tak ceka na zhasnuti.
unsigned long OLDTIME = 0; // strojní čas posledního stitku tlačítka
unsigned long ZPOZDENI = 5000; // čas zpoždění zahsnutí LED diody v ms.
unsigned long MYTIME = 0; // aktuální čas -zpožděníunsigned long OLDTIME1= 0; // strojní čas posledního stitku tlačítka
unsigned long ZPOZDENI1 = 10000; // čas zpoždění zahsnutí LED diody v ms.
unsigned long MYTIME1 = 0; // aktuální čas -zpožděníunsigned long OLDTIME2= 0; // strojní čas posledního stitku tlačítka
unsigned long ZPOZDENI2 = 15000; // čas zpoždění zahsnutí LED diody v ms.
unsigned long MYTIME2 = 0; // aktuální čas -zpoždění
void setup()
{
pinMode(LED, OUTPUT); // nastaveni jako vystup
pinMode(TLACITKO, INPUT_PULLUP); // nastaveni jako vystup
OLDTIME = millis();// zapamatuj si aktuální strojní čas
pinMode(TLACITKO1, INPUT_PULLUP); // nastaveni jako vystup
OLDTIME1 = millis();// zapamatuj si aktuální strojní čas
pinMode(TLACITKO2, INPUT_PULLUP); // nastaveni jako vystup
OLDTIME2 = millis();// zapamatuj si aktuální strojní čas
}void loop()
{
digitalWrite(LED, CEKAM); // zapis stav na LED
if (digitalRead(TLACITKO) == 0) { // při stisku tlačitka
if (CEKAM == false) { // a zhasnuté LED diodě
CEKAM = true; // změn stav
OLDTIME = millis(); // zapamatuj aktuální strojový časif (digitalRead(TLACITKO1) == 0) { // při stisku tlačitka
if (CEKAM == false) { // a zhasnuté LED diodě
CEKAM = true; // změn stav
OLDTIME = millis(); // zapamatuj aktuální strojový časif (digitalRead(TLACITKO2) == 0) { // při stisku tlačitka
if (CEKAM == false) { // a zhasnuté LED diodě
CEKAM = true; // změn stav
OLDTIME = millis(); // zapamatuj aktuální strojový čas
}
}
}}}}}29.3.2017 v 14:15 #10912posjirka
Účastník1. máš tam chybu, že jsou všechny podmínky vnořené do sebe a vlastně se na ně nikdy nedostane. Musíš si navyknout, že se páry složených závorek dávají do stejné úrovně aby si získla přehled co je co
když uděláš např.:loop(){ {{ } }
tak nezjistíš, které z nich tvoří pár. udělej to takto:
loop(){ { { } }
a hned vidíš, co je s čím.
2. používej tady párvoou značku CODE pro vkládání kodu, jinak se ti rozhodí jak stylizace, tak je tu problém s některými znaky (přepisují se ne jiné a pak je kod nečitelný).
3. neměl jsi v kodu vyhodnocení tohot času, jen podmínky
4. nesprávně jsem si přečetl tvůj požadavek. Takto to nepůjde. musíš si říct co to má dělat ve chvíli když je navolen nějáký čas, evětlo svítí a ty zmáčkenš předvolbu jiného času. Má přestat, prodloužit čas o převolbu, nebo nereagovat?
Je to důležite k rozhodnutí stavby programu ..29.3.2017 v 23:35 #10917hogen
ÚčastníkUplně z toho nejsem chytrej hlavně bod 3.
Můj požadavek je ,aby po stisknutí některého tlačítka času např 5,10,nebo15sec seplo výstup na zadaný čas a pří opětovném sepnutí nějakého tlačítka to nereagovalo,nebo v lepším případě ukončilo odpočítávání a vypnulo výstup(rozepne relé).
Ještě kdyby to umnělo po skončení odpočtu zvukový signál ,tak by to bylu super,ale to již není podstatné.Díky za tvůj čas. Hog30.3.2017 v 14:07 #10921posjirka
Účastníkrozmysli si, jestli má v pruběhu časování po stisku tlačítka skončit, nebo ignorovat.
Každé má jiné řešení …30.3.2017 v 17:20 #10922hogen
ÚčastníkPo stisku tlačítka skončit.
1.4.2017 v 1:16 #10937BlindP
ÚčastníkNapsal jsem jednu třídu, sice určenou pro časování čerpadel, ale pořád je to jen zpožděné vypnutí – pak by to mohlo být
Pump p(vystupni_pin); if(!digitalRead(pin_tlacitka)) { p.Start(20); } zbyva = p.State(); atd..
BP
1.4.2017 v 22:25 #10945posjirka
Účastníkměl jsem trochu honku, ale viděl bych to takto:
// casovac s 3 predvolbou casu // by JP. 2017 // v01 #define LED 13 // led dioda #define TLACITKO1 10 // tlacitko proti zemi #define TLACITKO2 11 // tlacitko proti zemi #define TLACITKO3 12 // tlacitko proti zemi void setup() { pinMode(LED, OUTPUT); pinMode(TLACITKO1, INPUT); pinMode(TLACITKO2, INPUT); pinMode(TLACITKO3, INPUT); } void loop() { if(digitalRead(TLACITKO1) == 0){ // po stistku tlacitka 1 volej funkci caosvace se zpozdenim 5s casovac(TLACITKO1, 5000); } if(digitalRead(TLACITKO2) == 0){ // po stistku talcitka 2 volej funkci caosvace se zpozdenim 10s casovac(TLACITKO2, 10000); } if(digitalRead(TLACITKO3) == 0){ // po stistku tlacitka 3 volej funkci caosvace se zpozdenim 15s casovac(TLACITKO3, 15000); } } void casovac(int TLACITKO, unsigned long ZPOZDENI) { // rozsvit LED a zapis si cas startu unsigned long OLDTIME = millis(); digitalWrite(LED, HIGH); // cekej dokud neni uvolnene tlacitko while(digitalRead(TLACITKO) == 0) { delay(100); // odstraneni zakmitu tlacitka } // cekej dokud nepretece nastaveny cas while(millis() < (OLDTIME + ZPOZDENI)) { // pokud stisknu nejake tlacitko ukonci casovac tim ze vynulujes nastavenou dobu zpozdeni if(digitalRead(TLACITKO1) == 0 || digitalRead(TLACITKO2) == 0 || digitalRead(TLACITKO3) == 0) { ZPOZDENI = 0; } } // zhasni LED digitalWrite(LED, LOW); delay(1000); // zabraneni nechtenemu startu noveho cesovani }
1.4.2017 v 22:30 #10946posjirka
Účastníkje to trochu primitivní řešení, ale aspoň se na něm můžeš něco naučit. Popisy jsou snad jasné a je tam odstraněno hned několik zvláštoností ze základů programování (zákmity tlačítek, nechtěné nastarotvání nového časování atd. spíš jde o věci, které by tě možná v začátku nenapadly, ale pak by ti způsobovali problémy …snad jsem pomohl
2.4.2017 v 0:21 #10947hogen
ÚčastníkJirko děkuji moc,pravě jsem to zkusil nakrmit,ale na vystupu ,to je loterie,myslim,že to je absencí pullUp v programu,mrknu na to,pokusím se to dopsát,pokud to nedám tak to dám hardwarově.(jen doufám ,že neplácám hlouposti).Dnes už to nedám,byl jsem na maltě a nějak mně to zmohlo :-).Dobrou
2.4.2017 v 13:59 #10954posjirka
Účastníkmáš pravdu. v poslední době používám simulator arduina místo HW řešení a nedocvaklo mě, že používá pro vstupy tlačítek přímo log.1/0, nikoliv spínače na zem.
Patří tam do setup() při nastavení modu pinu použít „INPUT_PULLUP“ místo „INPUT“ u všech tlačítek.// casovac s 3 predvolbou casu // by JP. 2017 // v02 - doplnení pull up interních odporu #define LED 13 // led dioda #define TLACITKO1 10 // tlacitko proti zemi #define TLACITKO2 11 // tlacitko proti zemi #define TLACITKO3 12 // tlacitko proti zemi void setup() { pinMode(LED, OUTPUT); pinMode(TLACITKO1, INPUT_PULLUP);// v02 pinMode(TLACITKO2, INPUT_PULLUP);// v02 pinMode(TLACITKO3, INPUT_PULLUP);// v02 } void loop() { if(digitalRead(TLACITKO1) == 0){ // po stistku tlacitka 1 volej funkci caosvace se zpozdenim 5s casovac(TLACITKO1, 5000); } if(digitalRead(TLACITKO2) == 0){ // po stistku talcitka 2 volej funkci caosvace se zpozdenim 10s casovac(TLACITKO2, 10000); } if(digitalRead(TLACITKO3) == 0){ // po stistku tlacitka 3 volej funkci caosvace se zpozdenim 15s casovac(TLACITKO3, 15000); } } void casovac(int TLACITKO, unsigned long ZPOZDENI) { // rozsvit LED a zapis si cas startu unsigned long OLDTIME = millis(); digitalWrite(LED, HIGH); // cekej dokud neni uvolnene tlacitko while(digitalRead(TLACITKO) == 0) { delay(100); // odstraneni zakmitu tlacitka } // cekej dokud nepretece nastaveny cas while(millis() < (OLDTIME + ZPOZDENI)) { // pokud stisknu nejake tlacitko ukonci casovac tim ze vynulujes nastavenou dobu zpozdeni if(digitalRead(TLACITKO1) == 0 || digitalRead(TLACITKO2) == 0 || digitalRead(TLACITKO3) == 0) { ZPOZDENI = 0; } } // zhasni LED digitalWrite(LED, LOW); delay(1000); // zabraneni nechtenemu startu noveho cesovani }
snad tě to někam posunulo a budeš mít z čeho čerpat.
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.