NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Eduard Veselský:8.12.2017 9:46

Ahoj,
pracuji na takovém mnnším projektu a potřebuji udělat časovač. Měl by fungovat tak, že si načte čas z NTP serveru (to mám vyřešené) a potom v určité časy zapne a poté opět vypne pin. Těch časových intervalů pro zapnutí bude max. 5. Umím to udělat pro jeden, ale jak udělat ty další?
Díky.

 
Odpovědět
8.12.2017 9:46
Avatar
Odpovídá na Eduard Veselský
Erik Šťastný:8.12.2017 10:07

Tak v určitých intervalech nebo v určitých časech? Trochu rozdíl :)

Máš 5 různých časů nebo máš jeden čas a pak 4 časové konstanty tipu 5 minut delay?

Editováno 8.12.2017 10:07
 
Nahoru Odpovědět
8.12.2017 10:07
Avatar
Roman
Člen
Avatar
Roman:8.12.2017 10:37

Nebylo by spis dulezitejsi/lepsi, aby tazatel sdelil platformu? PIC/x86/Arduino... A v cem pise asm/C/...

 
Nahoru Odpovědět
8.12.2017 10:37
Avatar
Odpovídá na Roman
Erik Šťastný:8.12.2017 11:14

Na přesný kód určitě jo, na daní postupu jak na to je to fuk :)

 
Nahoru Odpovědět
8.12.2017 11:14
Avatar
Eduard Veselský:17.12.2017 12:38

Ahoj,
omlouvám se, psal jsem to narychlo a asi jsem neposkytl dostatek informací... Zároveň se omlouvám, že to doplňuji až nyní.

Používám microcontroler ATmega328p s Arduino bootloaderem, tedy platforma Arduino.

Jsou to dané časy. Intervalem jsem myslel rozmezí dvou časů, po které bude pin zapnutý. Ty časy by měli být uložené v nějaké proměnné, ideálně asi poli, později je budu chtít měnit přes webové rozhraní. Ale nevím přesně, jak časy ukládat, stačí to s přesností na minuty. Napadlo mě jako dvě pole – jedno pro hodiny, druhé pro minuty, a nebo ukládat např. počet minut od začátku dne...
Díky.

 
Nahoru Odpovědět
17.12.2017 12:38
Avatar
ostrozan
Tvůrce
Avatar
ostrozan:17.12.2017 14:13

Řešení je jistě víc - já používám toto :

typedef struct
{
int startTime ;
int stopTime ;
} TimeInterval;

TimeInterval intervals[5];

intervals[1].startTime = 525;//atd....

Hodnoty jsou, tak jak jsi uvažoval v minutách - tedy v rozmezí 0-1440 pro 24h
A to celé samozřejmě zálohovat v eeprom

Editováno 17.12.2017 14:14
 
Nahoru Odpovědět
17.12.2017 14:13
Avatar
Odpovídá na ostrozan
Eduard Veselský:17.12.2017 17:10

Díky, co je to to typedef struct? To je nějaký zvláštní typ pole?
A kam v tom dám kód pro zapnutí/vypnutí pinu? Do těch {} za stopTime něco takového:?

digitalWrite(pin, !digitalRead(pin));
 
Nahoru Odpovědět
17.12.2017 17:10
Avatar
ostrozan
Tvůrce
Avatar
ostrozan:17.12.2017 21:18

A jéje - mělo mně napadnout , že jsi C-čkem (téměř) nepolíbený :)

Ale v podstatě jsi jen obětí Arduinovského "instantního" přístupu k programování.

Nejdřív ti teda vysvětlím, a co se ptáš :

typedef struct znamená, že si definuješ vlastní datový typ a že to bude struktura - a ano, v jistém smyslu se dá říct,že struktura je jistý "zvláštní" typ pole jen se k jednotlivým položkám nepřistupuje pomocí jejich indexu, ale pomocí jejich jména

v té struktuře máš pojmenované dvě proměnné typu int kam se ukládají požadované časy - podle tvého zadání je to interval "od-do"

dále

TimeInterval intervals[5];

je už skutečné pole výše definovaných struktur a pomocí

intervals[1].startTime = 525;

int cas_x =intervals[2].stopTime ;

můžeš zapisovat/číst jejich hodnoty

a výstupy budeš ovládat

if(time_now == intervals[1].startTime )digitalWrite(pin, HIGH);
else if(time_now == intervals[1].stopTime )digitalWrite(pin, LOW);

přičemž time_now bude nějaký čas generovaný nějakým obvodem reálného času který tam jistě máš abys věděl, kdy spínat výstupy

na druhou stranu ale nečekej, že ti tu budeme dávat školení ze základů jazyka C - v případě arduina dokonce C++
na to je spousta hotových tutoriálů - třeba právě zde

já osobně ti od této chvíle jsem ochotný pomoct s jakýmkoliv tvým řešením či pokusem o něj případně otázky spojené s hardwarem - na otázky "jak mám udělat ?" už reagovat nebudu

 
Nahoru Odpovědět
17.12.2017 21:18
Avatar
DarkCoder
Člen
Avatar
Odpovídá na ostrozan
DarkCoder:17.12.2017 22:34

a ano, v jistém smyslu se dá říct,že struktura je jistý "zvláštní" typ pole jen se k jednotlivým položkám nepřistupuje pomocí jejich indexu, ale pomocí jejich jména

zajímavě podaná definice struktury :-)

Nahoru Odpovědět
17.12.2017 22:34
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
ostrozan
Tvůrce
Avatar
ostrozan:17.12.2017 23:43

Pokud máš lepší vysvětlení pro někoho, kdo do dneška neměl o existenci struktury tušení tak prosím. :)
Když se nad tím zamyslíš, tak struktura je fyzicky jen "pole" (chápej jako oblast) bajtů v paměti

a tedy

int cislo[2];

a

struct
{
int cislo1;
int cislo2;
} cislo;

jedno jest a můžeš na to aplikovat co jsem napsal

 
Nahoru Odpovědět
17.12.2017 23:43
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Eduard Veselský
DarkCoder:18.12.2017 13:32

Struktura je sdružený datový typ složený ze dvou nebo více proměnných nazývaných prvky (členy, složky) struktury. Na rozdíl od pole, kde jsou všechny prvky stejného typu, může mít každý prvek struktury svůj vlastní datový typ platný v jazyce C, který se může lišit od typu ostatních prvků.

Obecný formát definice struktury:

struct jmeno_typu {
   typ prvek1;
   typ prvek2;
   ...
   typ prvekN;
} seznam_promennych;

Položka jmeno_typu a seznam_promennych není povinná, ale musí vždy být uvedena alespon jedna z nich. Pro pevný počet struktur není potřeba zadávat jmeno_typu. Uvedeme-li jmeno_typu, můžeme deklarovat proměnné zvlášt dle potřeby následujícím způsobem:

struct jmeno_typu seznam_promennych;
Nahoru Odpovědět
18.12.2017 13:32
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.