Close

posjirka

Vytvořené odpovědi

Aktuálně je na stránce zobrazeno 15 příspěvků - 286. až 300. (celkem z 481)
  • Autor
    Příspěvky
  • odpověď na: Přerušení #8283
    posjirka
    Účastník

    Přerušení to pravděpodobně neovlivňuje.
    Spíš bych to viděl na nevhodně strukturovaný program.
    celá tato logika je postavena na principu, že všechno jde přesně po sobě.
    To bohužel není pravda a v reálném světě je tu spousta zpoždění, zákmitů a vůlí, které to narušují.
    Nakreslil jsem do hrubého diagramu jak chápu tvůj požadavek.
    prosím podívej se na to a pokud to souhlasí tak bych zkusil navrhnou jiný program a můžeme to odzkoušet.
    Je to jen opis toho co jsi mi poslal, logika programu bude potom jiná.
    Určitě budu na začátku definovat výchozí stav (vysuň všechny válce), průběžněš kontrolovat celkový stav zařízení a vyhodnocovat případnou odchylku od požadovaného stavu (porucha).

    Ještě mě napadá jaké používáš čidla detekce koncových stavů válců? podle popisu mi to připadá jako kontrola svítí/nesvití signálka automatu.
    Máš tam i nějáké „STOP“ tlačítko? Pamatuj na bezpečnost ….

    odpověď na: Nahrání bootloaderu do atmega328 #8282
    posjirka
    Účastník

    je kouzelné jak se kruh uzavřel a na konci jsem se vrátili k updatu firmware přes arduino 🙂

    odpověď na: Přerušení #8279
    posjirka
    Účastník

    no možná ještě jeden bod:
    5. když to te´d sjíždím ten tvůj kod tak ty se snažíš „krokovat“ na základě nějákých opakujících se podmínek. šlo by napsat popis funkce toho stroje ně jednotlivých kroků?
    např. krok č.1 – kontrola že všechny písty jsou vysunuté, pokud ne všechny vsuň.
    krok č.2 – dávkování == 1
    krok č.3 ….

    a pak si jen uděláme proměnnou „krok“ a na základně aktuálního stavu budeme postupně celý proces krokovat ….

    odpověď na: Přerušení #8278
    posjirka
    Účastník

    zkusím se do toho vložit.
    Přerušení je proces, kdy dojde k dočasnému přerušení hlavní smyčky programu, provede se nějáká událost a po její ukončení pokračuje dále.
    Přerušení je více typů a je třeba s nim jednat opatrně. Může být nejen od pinů, ale i od přetečení registru, příchodu seriové komunikace na UART nebo I2C sběrnici, …
    Arduino má v základu nastavené pro UNO pouze 2 piny na přerušení, ale můžeš si je změnit, nebo detekovat celý 1 port (A, B, C nebo D). Rozhodně to není nic pro začátk.V tomto případě je to funkce řekl bych zbytečná.
    Mnohem užitečnější bude nezdržovat smyčku funkci delay a radši pracovat s rychlou smyčkou.

    Delay je totiž jen symčka plná „NOP“ takže procesor vlastně jen počítá jak dlouho dělá/nedělá nic.

    Rádi ti pomůžeme ale pojdmě na vše popořádku:
    1, napiš nám prosím co má program přesně dělat (trochu podrobněji)
    2, je třeba to zjednodušit a trochu si vypomoct pomocnými proměnými (např. si definuj proměnou „vysun_pist_1“, kde její hodnoty 1 např.znamena vysuń, hodnota 0 nic nedělej, 2 zasuň.) dá se pak mnohem lépe reagovat na podmínky.
    3. zbytečně si dubluješ stejné podmínky např. „digitalRead(dvereVysunute) == HIGH “ Vykašli se na to a použij vnořené podmínky:
    if (……){
    if (….) {
    } else {
    }
    }
    prostě se snaž si 1 podmínku vkládat pouze 1x a neopakovat.
    4. není špatné si to nakreslit na papír do jednoduchého vývojového diagramu, pak ti spoustu věcí dojde za pochodu.

    Co ty na to?

    posjirka
    Účastník

    není zač ….

    posjirka
    Účastník

    zkus jako zaklad toto:

    // program pro ovladani 2 rele pomoci 2 tlacitek
    // v01 by JP 9/2016
    // program ovlada 2 rele s tím, ze:
    // - stiskem tlacitka 1 se na nastavenou dobu sepne rele 1
    // - stiskem tlacitka 2 se na nastavenou dobu sepne rele 2
    // - kdyz behem sepnuti rele 1 stisknu tlacitko 2 tak se rele 1 vypne a sepne se rele 2
    // - kdyz behem sepnuti rele 2 stisknu tlacitko 1 tak se rele 2 vypne a sepne se rele 1
    
    int RELE_1 = 10; // pin pro  rele 1
    int RELE_2 = 11; // pin pro rele 2
    int TLACITKO_1 = 4; // pin pro tlacitko 1
    int TLACITKO_2 = 3; // pin pro tlacitko 2
    int ZAPNI_RELE_1 = 0; // 0 - vypnuto
    int ZAPNI_RELE_2 = 0; // 0 - vypnuto
    unsigned long CAS_VYPNUTI_RELE_1 = 0; // kdy ma rele 1 vypnout (nastavuje se v době sepnuti tlacitka)
    unsigned long CAS_VYPNUTI_RELE_2 = 0; // kdy ma rele 2 vypnout (nastavuje se v době sepnuti tlacitka)
    unsigned long DELKA_SEPNUTI_RELE = 3000; // jak dlouho maji byt rele sepnute (v milisekundach )
    
    void setup()
    {
    	pinMode(RELE_1, OUTPUT); // nastaveni pinu jako vystup
    	pinMode(RELE_2, OUTPUT); // nastaveni pinu jako vystup
    	pinMode(TLACITKO_1, INPUT_PULLUP);  // nastaveni pinu jako vstup s interním pullup odporem
    	pinMode(TLACITKO_2, INPUT_PULLUP);  // nastaveni pinu jako vstup s interním pullup odporem
    }
    
    void loop()
    {
    	// ovladani tlacitka 1
    	if (digitalRead(TLACITKO_1) == 0 ){	// když je stisknuto tlačtíko 1 
    		CAS_VYPNUTI_RELE_1 = millis() + DELKA_SEPNUTI_RELE;
    		ZAPNI_RELE_1 = 1; // povoleni k sepnuti rele 1
    		ZAPNI_RELE_2 = 0; // preventivne zakaz zapnuti rele 2
    	}
    	if (ZAPNI_RELE_1 == 1) {	// rele 1 ma byt sepnute
    		if (millis() > CAS_VYPNUTI_RELE_1) {	// uz pretekl cas zapnuti rele 1
    			ZAPNI_RELE_1 = 0;		// zrus pozadavek na zapnuti rele 1
    			digitalWrite(RELE_1, LOW); // vypni rele 1
    		} 
    		else {
    			digitalWrite(RELE_1, HIGH); // zapni rele 1
    		}
    		
    	} 
    	else {
    		digitalWrite(RELE_1, LOW); // vypni rele 1
    	}
    	
    	// ovladani tlacitka 2
    	if (digitalRead(TLACITKO_2) == 0 ){	// když je stisknuto tlačtíko 2 
    		CAS_VYPNUTI_RELE_2 = millis() + DELKA_SEPNUTI_RELE;
    		ZAPNI_RELE_2 = 1; // povoleni k sepnuti rele 2
    		ZAPNI_RELE_1 = 0; // preventivne zakaz zapnuti rele 1
    	}
    	if (ZAPNI_RELE_2 == 1) {	// rele 2 ma byt sepnute
    		if (millis() > CAS_VYPNUTI_RELE_2) {	// uz pretekl cas zapnuti rele 2
    			ZAPNI_RELE_2 = 0;		// zrus pozadavek na zapnuti rele 2
    			digitalWrite(RELE_2, LOW); // vypni rele 2
    		} 
    		else {
    			digitalWrite(RELE_2, HIGH); // zapni rele 2
    		}
    		
    	} 
    	else {
    		digitalWrite(RELE_2, LOW); // vypni rele 1
    	} 
    } 
    posjirka
    Účastník

    něco podobného jsme už řešili na jiném foru …
    http://duinozone.cz/index.php/topic,177.0.html

    odpověď na: Co se děje v paměti? #8187
    posjirka
    Účastník

    obávám se, že to bude tím /0 … Arduino potřebuje mít zadanou hodnotu. Empty je pro něj hazardní. Zkus mu dát hodnotu 0 nebo „“… Jestli budu mít zítra čas podívam se na to a vyzkouším to na UNO.

    odpověď na: Co se děje v paměti? #8183
    posjirka
    Účastník

    sice mám IQ 156, ale z tvého popisu opravdu nejsem moudrý 🙂
    Není jasné co vlastně zapisuješ za pole, resp jaké hodnoty/typy hodnot tam vkládáš.
    to pole musí být 1 typu proměnných. pokud tam vkládáš unsig long a char tak ti to nepůjde, resp bude ti to vyhazovat blbosti.
    Buď vše převe´d na max. možný typ proměnné, nebo holt musíš pracovat s pamětí po jednotlivých byte.

    odpověď na: Bezdrátové ovládání světel #8000
    posjirka
    Účastník

    přímo univerzální řešení neexistuje. jedná se většinou o konkrétní aplikaci pro konkrétní použití.
    S těmi světly bych to viděl přesně obráceně. Použil bych zapojení se spínači po drátech a dálkově bych ovládal paralelní spínače po např.433 Mhz někde v rozvodnici.
    Za mě: já bych se na to … použiješ spoustu drátu (i když to bude blbá JYTY 4×1), budeš mít rozkopané všechy stěny, řešit decentralizované ovladače a doufat, že se něco nepose.e nebo něco nezahoří.

    odpověď na: Nahrání bootloaderu do atmega328 #7997
    posjirka
    Účastník

    o pár vláken před jsem něco podobného řešil:

    Arduino jako ISP programator

    Tak jak jsem to popsal, tak používám porgramování čipů i bootloaderu tak cca 10x ročně a vždy mi funguje.

    odpověď na: Nahrání bootloaderu do atmega328 #7973
    posjirka
    Účastník

    Ten konenzátor patří mezi GND a RESET. právě zabraňuje svévolnému resetu arduina při programování ..

    odpověď na: Komín z shieldů #7932
    posjirka
    Účastník

    tak si vypši jaké piny využívá který shield.
    Stejně se asi neubráníš vylstnímu shieldu třeba pro ty čidla.
    Když už tak bych použil Arduino Mega a na ně navázal všechno co se nevešli na UNO (ty UNO by měli jít i na MEGA jen použiješ méně pinů).
    Takže bych si být tebou koupil univerzální shield pro MEGU (možná 2 desky) a pak teprve dal ty z UNO. WIFI použiváš jaký?, nemá náhodou na sobě i slot na SD kartu? …

    odpověď na: Prosim o pomoc s termostatom #7929
    posjirka
    Účastník

    to není drobná úprava, ale napsat nový program.
    1, pokud chceš MENU, je třeba si zvolit jaké parametry a v jakých hodnotách to budeš ovládat. Proto pak existují knihovny, které to řeší, Případně si musíš napsat menu sám. Pak se to objevuje otázka zda ukládat hodnoty, kam je ukládat a kdy. Pamatuj, že EEPROm mám max 100 000 zápisu, což vypadá usměvně, ale při ukládání každou 1s je to něco přes 1 den, než zničích EEPROM….

    2, někdy je lepší použít potenciometr/trimr na analogovém vstupu spíš, než složitě řešit menu. Stejně to budeš nastavovat 5x za život, tak proč ztrácet čas.
    Dokonce můžeš nastavit i třeba 2 parametry přes 1 AI. Inspirovat se můžeš když si najdeš one wire keypad a místo tlačítka dáš piny + jumper.

    3, přidat další senzor, není problém spíš si třeba v excelu zkus navrhnout jak by to mělo vypadat na LCD. Zapomeň, že bys kombinoval 2 znaky na 1 pozici a máš max. 16 vlastních znaků. Mezi nimi bude „stupeň“. Nakresli si nominální stav a pak 2-3 mezní stavy aby se ti to tam vešlo.

    4, Tlačítko bych dal pouze 1 na přepnutí zobrazení (stiskneš tlačítko a na LCD se ti objeví hodnoty které nastavuješ. Pustíš tlačítko a budeš mít normální zobrazení LCd. …

    odpověď na: Arduino jako ISP programator #7900
    posjirka
    Účastník

    cesta k poznání je stejně důležitá jako výsledek …. bastlení zdar

Aktuálně je na stránce zobrazeno 15 příspěvků - 286. až 300. (celkem z 481)