6x nezávislý časovač v Arduinu nano

Sem pište, hledáte-li někoho, kdo pro vás něco naprogramuje, či sestaví.
Uživatelský avatar
RR_cz
Příspěvky: 15
Registrován: 21 úno 2018, 15:36
Reputation: 0

6x nezávislý časovač v Arduinu nano

Příspěvek od RR_cz » 10 dub 2018, 12:25

Ahoj,
pouštím se do druhého projektu a bez vaší pomoci to nedám :(
Potřebuji do "nana" naprogramovat 6 na sobě nezávislých časovačů.
Vstupy a výstupy aktivní na GND.
Vstup D0 a jeho výstup D1, další časovač vstup D2 a jeho výstup D3 atd.
Všechny budou mít reakci na náběžnou hranu na GND a časování se ukončí i když nestihl doběhnout čas ukončením aktivace vstupu.

Po aktivaci časovače na náběžnou hranu na GND výstup nebude nic dělat, jen se spustí příslušný odpočet. Po dočasování sepne výstup na GND a tam zůstane až do ukončení aktivace vstupu.
1, Zpožděný rozběh 4m30s
2, Zpožděný rozběh 30s
3,Zpožděný rozběh 10m35s

Po aktivaci časovačena náběžnou hranou výstup nebude nic dělat, jen se spustí příslušný odpočet. Po dočasování sepne výstup na GND jen na 1s. Další odpočet se spustí až po uvolnění vstupu a opětovné aktivaci.
4, Zpožděný rozběh 30s
5, Zpožděný rozběh 5m25s

Po aktivaci časovače na náběžnou hranou výstup nebude nic dělat, jen se spustí příslušný odpočet. Po dočasování sepne výstup na GND na 1s, po 30s opět výstup na 1s a to do doby ukončení aktivace vstupu.
6, Asymetrický cyklovač začínající mezerou 30s/1s.

Ještě drobnost, jdou v programu dát časy do hlavičky na jedno místo? Možná bude nutné časy upravit až to spustím, děkuji.
Můj mladej (19 let) - prej to nejde:(
Já věřím, že to jde. Pomůžete mi s tím někdo?

Děkuji.
RR
První velkou akci jsem zvládl už v 8 letech. Vyrazil jsem hlavni jistič pro panelák.
Životní moudro: Ještě se nestalo, aby to nějak nedopadlo.

Uživatelský avatar
gilhad
Příspěvky: 786
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: 6x nezávislý časovač v Arduinu nano

Příspěvek od gilhad » 11 dub 2018, 01:29

Jestli se nepletu, tak D0 a D1 jsou serial a krome problemu s ladenim ti to i zkomplikuje zivot s nahravanim programu.

Casovacu jako takovych ma nano tusim tak 3, ale to se da snadno obejit (kdyz ti bezi na 16MHz, tak pruchod loop() trva z lidskeho pohledu zanedbatelne kratko). Zvlast pokud ty hrany budes brat z tlacitek, co nekdo macka :)

Do hlavicky to snadno das pomoci

Kód: Vybrat vše

#define
nebo jako promenne ci konstanty.

Zakladni myslenka (pisu z hlavy a nepresne)

Kód: Vybrat vše

int vstupy[6]={2,4,6,8,10,12}; // D2, D4, ...
int vystupy[6]={3,5,7,9,11,13}; // D3, D5 ....
int posledni_stav[6]={1,1,1,1,1,1}; // vsechno je na zacatku HIGH
bool aktivovan[6]={false,false,false,false,false,false}; //  na zacatku neni nic aktivni
bool deaktivovan[6]= {true,true,true,true,true,true};  // nejsme aktivni
unsigned long int posledni_zmena_v[6] = {0,0,0,0,0,0}; // cas posledniho sepnuti
unsigned long int zpozdeni[6]={(4*60+30)*1000,30*1000,(10*60+35)*1000,30*1000,(5*60+25)*1000,30*1000}; // tady jsou ty casy

void setup(){
  for (int i =0 i<6;++i) {
    pinMode(vstupy[i],INPUT_PULLUP);
    pinMode(vystupy[i],OUTPUT);
    digitalWrite(vystupy[i],HIGH); // zaciname s vystupy nahore
  };
};

void loop() {
   for (int i =0 i<6;++i) {
   	if (digitalRead(vstupy[i]) == LOW) {
           if (posledni_stav[i]==1) {
  	          // presli jsme do nuly, zacneme odpocet
  	          posledni_stav[i]=0;
  	          posledni_zmena_v[i]=millis();
  	          aktivovan[i]=false;  // nase chvile jeste neprisla
  	          deaktivovan[i]=false; // natoz aby skoncila
           } else {  // posledni stav ==0
   	        // uz v nule jsme, nemame se aktivovat?
   		// https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
   		unsigned long currentMillis = millis();
   		if (! aktivovan[i] && ! deaktivovan[i]) {
     	              if (currentMillis - posledni_zmena_v[i] >= zpozdeni[i]) {
   		         // uz jsme cekali dost dlouho, aktivujme se
   		         digitalWrite(vystup[i],LOW);
   		         aktivovan[i]=true;
   		         posledni_zmena_v[i]=millis();
   		        };
   		} else if (aktivovan[i] && ! deaktivovan[i]) {
   		       // uz jsme mozna aktivni dost dlouho
   		        if (currentMillis - posledni_zmena_v[i] >= 1000) {
   		           // utekla sekunda, deaktivujme se
   		           digitalWrite(vystup[i],HIGH);
   		           deaktivovan[i]=true;
   		           };
   		};
   	    };
        } else { //digitalRead(vstupy[i]) == HIGH
   		       if (posledni_stav[i]==0) { // nasilne se deaktivujeme a rusime casovani
   		         posledni_stav[i]=1;
   		         aktivovan[i]=false;
   		         deaktivovan[i]=true;
   		         digitalWrite(vystup[i],HIGH);
   		       };
   		}; // konec for cyklu           
}; // konec loop


Uživatelský avatar
RR_cz
Příspěvky: 15
Registrován: 21 úno 2018, 15:36
Reputation: 0

Re: 6x nezávislý časovač v Arduinu nano

Příspěvek od RR_cz » 11 dub 2018, 14:38

Ahoj,
jasně tak od D2 v pohodě,ano vstup je z kontaktu, taková přesnost není třeba.
Jen to nemůžu nahrát :(
Okopírované chybové zprávy.
Napíše to:

Arduino: 1.8.6 Hourly Build 2018/01/03 03:33 (Windows 10), Vývojová deska: "Arduino Nano, ATmega168"

C:\Users\spravce\Documents\Arduino\sketch_apr11a\sketch_apr11a.ino:7:41: warning: integer overflow in expression [-Woverflow]

unsigned long int zpozdeni[6]={(4*60+30)*1000,30*1000,(10*60+35)*1000,30*1000,(5*60+25)*1000,30*1000}; // tady jsou ty casy

^

C:\Users\spravce\Documents\Arduino\sketch_apr11a\sketch_apr11a.ino:7:65: warning: integer overflow in expression [-Woverflow]

unsigned long int zpozdeni[6]={(4*60+30)*1000,30*1000,(10*60+35)*1000,30*1000,(5*60+25)*1000,30*1000}; // tady jsou ty casy

^

C:\Users\spravce\Documents\Arduino\sketch_apr11a\sketch_apr11a.ino:7:88: warning: integer overflow in expression [-Woverflow]

unsigned long int zpozdeni[6]={(4*60+30)*1000,30*1000,(10*60+35)*1000,30*1000,(5*60+25)*1000,30*1000}; // tady jsou ty casy

^

C:\Users\spravce\Documents\Arduino\sketch_apr11a\sketch_apr11a.ino:7:101: warning: narrowing conversion of '7856' from 'int' to 'long unsigned int' inside { } [-Wnarrowing]

unsigned long int zpozdeni[6]={(4*60+30)*1000,30*1000,(10*60+35)*1000,30*1000,(5*60+25)*1000,30*1000}; // tady jsou ty casy

^

C:\Users\spravce\Documents\Arduino\sketch_apr11a\sketch_apr11a.ino:7:101: warning: narrowing conversion of '-20360' from 'int' to 'long unsigned int' inside { } [-Wnarrowing]

C:\Users\spravce\Documents\Arduino\sketch_apr11a\sketch_apr11a.ino:7:101: warning: narrowing conversion of '-2680' from 'int' to 'long unsigned int' inside { } [-Wnarrowing]

C:\Users\spravce\Documents\Arduino\sketch_apr11a\sketch_apr11a.ino: In function 'void setup()':

sketch_apr11a:10: error: expected ';' before 'i'

for (int i =0 i<6;++i) {

^

C:\Users\spravce\Documents\Arduino\sketch_apr11a\sketch_apr11a.ino: In function 'void loop()':

sketch_apr11a:18: error: expected ';' before 'i'

for (int i =0 i<6;++i) {

^

sketch_apr11a:33: error: 'vystup' was not declared in this scope

digitalWrite(vystup,LOW);

^

sketch_apr11a:41: error: 'vystup' was not declared in this scope

digitalWrite(vystup,HIGH);

^

sketch_apr11a:51: error: 'vystup' was not declared in this scope

digitalWrite(vystup,HIGH);

^

sketch_apr11a:54: error: expected '}' at end of input

}; // konec loop

^

exit status 1
expected ';' before 'i'

Nalezena neplatná knihovna v C:\Users\spravce\Documents\Arduino\libraries\sketch_feb21a: C:\Users\spravce\Documents\Arduino\libraries\sketch_feb21a
Nalezena neplatná knihovna v C:\Users\spravce\Documents\Arduino\libraries\sketch_feb21a: C:\Users\spravce\Documents\Arduino\libraries\sketch_feb21a

Táto zpráva by měla mít víc informacií v
"Zobrazení podrobného výstupu při kompilaci"
podle zapnuté volby v Soubor -> Nastavení.
První velkou akci jsem zvládl už v 8 letech. Vyrazil jsem hlavni jistič pro panelák.
Životní moudro: Ještě se nestalo, aby to nějak nedopadlo.

Uživatelský avatar
SkullKeep
Příspěvky: 290
Registrován: 23 srp 2017, 18:51
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: 6x nezávislý časovač v Arduinu nano

Příspěvek od SkullKeep » 11 dub 2018, 15:37

Bylo tam pár drobných chyb, ale ty jsem opravil.

Kód: Vybrat vše

int vstupy[6] = {2, 4, 6, 8, 10, 12}; // D2, D4, ...
int vystupy[6] = {3, 5, 7, 9, 11, 13}; // D3, D5 ....
int posledni_stav[6] = {1, 1, 1, 1, 1, 1}; // vsechno je na zacatku HIGH
bool aktivovan[6] = {false, false, false, false, false, false}; //  na zacatku neni nic aktivni
bool deaktivovan[6] = {true, true, true, true, true, true}; // nejsme aktivni
unsigned long int posledni_zmena_v[6] = {0, 0, 0, 0, 0, 0}; // cas posledniho sepnuti
unsigned long int zpozdeni[6] = {(4 * 60 + 30) * 1000, 30 * 1000, (10 * 60 + 35) * 1000, 30 * 1000, (5 * 60 + 25) * 1000, 30 * 1000}; // tady jsou ty casy

void setup() {
  for (int i = 0; i < 6; ++i) {
    pinMode(vstupy[i], INPUT_PULLUP);
    pinMode(vystupy[i], OUTPUT);
    digitalWrite(vystupy[i], HIGH); // zaciname s vystupy nahore
  }
}

void loop() {
  for (int i = 0; i < 6; ++i) {
    if (digitalRead(vstupy[i]) == LOW) {
      if (posledni_stav[i] == 1) {
        // presli jsme do nuly, zacneme odpocet
        posledni_stav[i] = 0;
        posledni_zmena_v[i] = millis();
        aktivovan[i] = false; // nase chvile jeste neprisla
        deaktivovan[i] = false; // natoz aby skoncila
      } else {  // posledni stav ==0
        // uz v nule jsme, nemame se aktivovat?
        // https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
        unsigned long currentMillis = millis();
        if (! aktivovan[i] && ! deaktivovan[i]) {
          if (currentMillis - posledni_zmena_v[i] >= zpozdeni[i]) {
            // uz jsme cekali dost dlouho, aktivujme se
            digitalWrite(vystupy[i], LOW);
            aktivovan[i] = true;
            posledni_zmena_v[i] = millis();
          }
        } else if (aktivovan[i] && ! deaktivovan[i]) {
          // uz jsme mozna aktivni dost dlouho
          if (currentMillis - posledni_zmena_v[i] >= 1000) {
            // utekla sekunda, deaktivujme se
            digitalWrite(vystupy[i], HIGH);
            deaktivovan[i] = true;
          }
        }
      }
    } else { //digitalRead(vstupy[i]) == HIGH
      if (posledni_stav[i] == 0) { // nasilne se deaktivujeme a rusime casovani
        posledni_stav[i] = 1;
        aktivovan[i] = false;
        deaktivovan[i] = true;
        digitalWrite(vystupy[i], HIGH);
      }
    }// konec for cyklu
  } // konec loop
}

toto by se mělo dát nahrát.
:twisted: :?: :arrow: :geek: P. Q. M.

Uživatelský avatar
gilhad
Příspěvky: 786
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: 6x nezávislý časovač v Arduinu nano

Příspěvek od gilhad » 11 dub 2018, 15:44

integer overflow - ty vypocty casu asi dela v int a potreboval by je v long int , takze prepsat casy treba do tvaru

Kód: Vybrat vše

unsigned long int zpozdeni[6]={(unsigned long int)1000*(4*60+30),(unsigned long int)1000*30,... 
opravit preklepy, jako je chybejici strednik ve

Kód: Vybrat vše

 for (int i =0; i<6;++i) {
a vsechny

Kód: Vybrat vše

digitalWrite(vystup,
maji samozrejme byt

Kód: Vybrat vše

digitalWrite(vystupy[i],
Jak rikam, psal jsem to z hlavy spis jako ukazku, jakym smerem uvazovat (cili pomoc jak zacit, nikoli hotove reseni)

Uživatelský avatar
RR_cz
Příspěvky: 15
Registrován: 21 úno 2018, 15:36
Reputation: 0

Re: 6x nezávislý časovač v Arduinu nano

Příspěvek od RR_cz » 11 dub 2018, 16:37

Děkuji za ochotu,
jsem bohužel jen spotřebitel :( mám nulovou praxi. Dokážu to jen do Arduina nahrát. Můj mladej až se vrátí z dnešní maturity zkoušky tak ho seřežu :lol: že se líp neučil. Protože jsem blbej, rád za hotovou práci zaplatím.
Děkuji moc.
RR
První velkou akci jsem zvládl už v 8 letech. Vyrazil jsem hlavni jistič pro panelák.
Životní moudro: Ještě se nestalo, aby to nějak nedopadlo.

Uživatelský avatar
gilhad
Příspěvky: 786
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: 6x nezávislý časovač v Arduinu nano

Příspěvek od gilhad » 11 dub 2018, 22:59

Nerez ho moc, ta moje kostra bude potrebovat jeste dodelat :lol:

Uživatelský avatar
RR_cz
Příspěvky: 15
Registrován: 21 úno 2018, 15:36
Reputation: 0

Re: 6x nezávislý časovač v Arduinu nano

Příspěvek od RR_cz » 20 dub 2018, 19:51

Tak nic :roll:
Kokam, ze to fakt nejde!
Mladej mel holt pravdu......
Dik a at se dari....
RR
První velkou akci jsem zvládl už v 8 letech. Vyrazil jsem hlavni jistič pro panelák.
Životní moudro: Ještě se nestalo, aby to nějak nedopadlo.

AstroMiK
Příspěvky: 593
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: 6x nezávislý časovač v Arduinu nano

Příspěvek od AstroMiK » 21 dub 2018, 20:49

Zdravím.

Jestli to ještě chcete vytvořit, tak bych měl dotaz k zadání.

Tyhle dvě věty se podle mne vylučují:
"... Vstupy a výstupy aktivní na GND ..."
"... Všechny budou mít reakci na náběžnou hranu na GND..."

Tak jak to je?
V klidu jsou všechny vstupní piny v LOW a čítače se aktivují náběžnou hranou, nebo jsou vstupní piny normálně v HIGH a čítače se aktivují sepnutím na GND?

Uživatelský avatar
RR_cz
Příspěvky: 15
Registrován: 21 úno 2018, 15:36
Reputation: 0

Re: 6x nezávislý časovač v Arduinu nano

Příspěvek od RR_cz » 22 dub 2018, 06:12

Ahoj,
je to stejne jako posledni projekt. Jak dam na vstup GND tak se to spusti. Vystupy jsou v klidu high, po skoncenem odpoctu na low(GND).
Moooc ti dekuji.
RR
První velkou akci jsem zvládl už v 8 letech. Vyrazil jsem hlavni jistič pro panelák.
Životní moudro: Ještě se nestalo, aby to nějak nedopadlo.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů