posjirka
Vytvořené odpovědi
-
AutorPříspěvky
-
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 ….Attachments:
posjirkaÚčastníkje kouzelné jak se kruh uzavřel a na konci jsem se vrátili k updatu firmware přes arduino 🙂
posjirkaÚčastníkno 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 ….
posjirkaÚčastníkzkusí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?
5.9.2016 v 15:24 odpověď na: Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky #8265posjirkaÚčastníknení zač ….
5.9.2016 v 10:48 odpověď na: Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky #8263posjirkaÚčastníkzkus 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 } }
4.9.2016 v 23:06 odpověď na: Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky #8260posjirkaÚčastníkněco podobného jsme už řešili na jiném foru …
http://duinozone.cz/index.php/topic,177.0.htmlposjirkaÚčastníkobá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.
posjirkaÚčastníksice 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.posjirkaÚčastníkpří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ří.posjirkaÚčastníko pár vláken před jsem něco podobného řešil:
Tak jak jsem to popsal, tak používám porgramování čipů i bootloaderu tak cca 10x ročně a vždy mi funguje.
posjirkaÚčastníkTen konenzátor patří mezi GND a RESET. právě zabraňuje svévolnému resetu arduina při programování ..
posjirkaÚčastníktak 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? …posjirkaÚčastníkto 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. …
posjirkaÚčastníkcesta k poznání je stejně důležitá jako výsledek …. bastlení zdar
-
AutorPříspěvky