casomiera na smykacku

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
jozinecko
Příspěvky: 7
Registrován: 17 bře 2018, 15:02
Reputation: 0

casomiera na smykacku

Příspěvek od jozinecko » 17 bře 2018, 15:14

Ahojte, prosim o pomoc, som v arduinu novy a chcem vytvorit casomieru na smykacku, cokolvek som nasiel neriesi zakladny problem a to ze na smykacku moze vojst dalsie dieta kym prve este neukoncilo "jazdu" a teda nema ukoncene meranie casu.

napadly mi teda dve alternativy a to bud sa spusti cas ktory bezi v cykle a teda pri vstupe na smykacku (aktivacia btn1) prvym dietatom sa ulozi do premennej n cas v ktorom voslo, cize btn1 pressed = nejaky cas t

ked sa stlaci tlacidlo btn 2 (vystup zo smykacky) ulozi sa tento cas do t1

neskor sa odcita a dieta s indexom n ma vysledny cas.

Lenze ak vojde dalsie dieta kym prve nevyslo potrebujem aby aj jemu pocitalo cas.

tak mi napadlo ze by vzdy pri stlaceni btn1 (vstup na smykacku) sa zaznamenala hodnota aktualneho casu a pri kazdom sa zmenil index dieta cize n+1

tak isto aj pri stlaceni btn2 by sa zaznamenavala hodnota a bolo by to t+1 vzdy by sa to vyminusilo a zobrazilo (zatial staci vystup print na monitore portu) cize nx - tx

lenze toto neviem ako naprogramovat

ale mam aj inu alternativu ktoru neviem naprogramovat a to je vzdy pri stlaceni btn1 by sa vytvoril novy task ktory by cakal na stlacenie btn2 v tomto tasku by bola samostatna funkcia na pocitanie casu a zobrazenie. po stlaceni btn 2 by zobrazilo cas a ukoncilo task zatial co by dalsie pripadne tasky bezali

to uz vobec neviem ako naprogramovat.

viete mi prosim niekto pomoct ale ako uplnemu zaciatocnikovi.
Rad samozrejme aj poslem nieco na pivo/kavu a podobne lebo uz som precital vsetko mozne a bud nerozumiem alebo to neni to co hladam.

dakujem velmi pekne
jozo

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

Re: casomiera na smykacku

Příspěvek od AstroMiK » 17 bře 2018, 16:36

Tady je takový rychlý nástřel kódu.
Časy startů a v cíli jsou v milisekundách od zapnutí Arduina.
Rozdíl časů v cíli je také v milisekundách.
Není tam ošetřeno přetečení funkce millis() po 50 dnech provozu.
Program je nastaven tak, že maximální počet dětí, které mohou být v jednom okamžiku někde na trati mezi startem a cílem je 10.

Kód: Vybrat vše

#define pin_start  2     // startovaci tlacitko
#define pin_stop   3     // stopovaci tlacitko



unsigned long pole_startu[10];        // maximalni teoreticky pocet deti na skluzavce
byte index_start;                     // pocet stisku startovaciho tlacitka
byte index_stop;                      // pocet stisku stopovaciho tlacitka
boolean minuly_stav_start;            // znacka pro zjisteni, ze prave doslo ke stisku tlacitka start
boolean minuly_stav_stop;             // znacka pro zjisteni, ze prave doslo ke stisku tlacitka stop


void setup(void)
  {
    pinMode(pin_start,INPUT_PULLUP);   // nastaveni smeru pinu s tlacitky
    pinMode(pin_stop,INPUT_PULLUP);

    Serial.begin(9600);

    minuly_stav_start = true;      // znacky, ze jsou obe tlacitka rozepnuta 
    minuly_stav_stop = true;

    index_start = 0;               // poradove cislo ditete na startu
    index_stop = 0;                // poradove cislo ditete v cili
  }



void loop(void)
  {
    if (digitalRead(pin_start) == LOW and minuly_stav_start == true)    // prave doslo ke stisku tlacitka start
      {
        index_start ++;                                 // pocitani deti na startu
        if( index_start == 10) index_start = 1;         // po 10 detech se pocitadlo nuluje
        
        pole_startu[index_start] = millis();            // aktualni cas startu ulozit do pole

        Serial.print("Dite ");                          // vypis informaci o startu do serioveho monitoru
        Serial.print(index_start);
        Serial.print(" proslo startem v case:");
        Serial.println(pole_startu[index_start]);

        minuly_stav_start = false;                    // tlacitko start aktualne stisknute
        delay(20);                                    // debounce startovaciho tlacitka
      }

    if (digitalRead(pin_start) == HIGH)               // startovaci tlacitko je uvolneno, jeho dalsi stisk znamena dalsi dite
      {
        minuly_stav_start = true;          
      }


    if (digitalRead(pin_stop) == LOW and minuly_stav_stop == true)    // prave doslo ke stisku tlacitka stop
      {
        index_stop ++;                               // pocitani deti v cili
        if( index_stop == 10) index_stop = 1;        // po 10 detech se pocitadlo nuluje

        unsigned long cas_v_cili = millis();         // cas v cili do promenne
        
        Serial.print("Dite ");                       // vypis informaci o cili do serioveho monitoru
        Serial.print(index_stop);
        Serial.print(" proslo cilem v case:");
        Serial.print(cas_v_cili);
        Serial.print(". Rozdil casu je: ");
        Serial.println(cas_v_cili - pole_startu[index_stop] );
        
        minuly_stav_stop = false;                    // tlacitko STOP je aktualne sepnute
        delay(20);                                   // debounce stopovaciho tlacitka
      }

    if (digitalRead(pin_stop) == HIGH)               // stopovaci tlacitko je uvolneno, jeho dalsi stisk znamena dalsi dite v cili
      {
        minuly_stav_stop = true;
      }
    
  }
Přílohy
klouzacka.gif

jozinecko
Příspěvky: 7
Registrován: 17 bře 2018, 15:02
Reputation: 0

Re: casomiera na smykacku

Příspěvek od jozinecko » 17 bře 2018, 17:07

Wau ty si uplne geanialny. Veeelmi pekne ďakujem.

Skusim to pripadne aj upraviť na ir cidla. Ale mam sa od coho odrazit. Urcite dlzim minimalne pivo☺️☺️☺️👍🤩

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

Re: casomiera na smykacku

Příspěvek od AstroMiK » 17 bře 2018, 18:10

Ještě jedna verze programu.
Tentokrát s využitím interruptu (tlačítka musí být na pinech D2 a D3).
Tohle je trochu přehlednější, ale zase se tam trochu složitěji ošetřují zákmity tlačítek.

Kód: Vybrat vše

// verze programu s vyuzitim preruseni (interruptu)

#define pin_start  2     // startovaci tlacitko
#define pin_stop   3     // stopovaci tlacitko



volatile unsigned long pole_startu[10];        // maximalni teoreticky pocet deti na skluzavce
volatile byte index_start = 0;                 // pocet stisku startovaciho tlacitka
volatile byte index_stop  = 0;                 // pocet stisku stopovaciho tlacitka

volatile unsigned long minuly_cas_start_interruptu = 0;    // kvuli odruseni zakmitu tlacitka START pri interruptu
volatile unsigned long minuly_cas_stop_interruptu  = 0;    // kvuli odruseni zakmitu tlacitka STOP pri interruptu



void setup(void)
  {
    pinMode(pin_start,INPUT_PULLUP);   // nastaveni smeru pinu s tlacitky
    pinMode(pin_stop,INPUT_PULLUP);

    attachInterrupt(digitalPinToInterrupt(pin_start), fce_START, FALLING );
    attachInterrupt(digitalPinToInterrupt(pin_stop) , fce_STOP , FALLING );


    Serial.begin(9600);

  }

// -------------  podprogram pro stisk tlacitka START ---------
void fce_START(void)
  {
    // tahle podminka je kvuli odruseni zakmitu tlacitka pri rychlem snimani interruptu
    if (millis() - minuly_cas_start_interruptu > 500 )  // kdyz je mezi nasledujicimi stisky tlacitka kratsi interval nez 0.5s, preruseni se ignoruje
      {                                                 //          (nepredpoklada se, ze by deti vyjizdely v kratsich intervalech, nez 0.5s)
        minuly_cas_start_interruptu = millis();
        index_start ++;                                 // pocitani deti na startu
        if( index_start == 10) index_start = 1;         // po 10 detech se pocitadlo nuluje
        
        pole_startu[index_start] = millis();            // aktualni cas startu ulozit do pole
    
        Serial.print("Dite ");                          // vypis informaci o startu do serioveho monitoru
        Serial.print(index_start);
        Serial.print(" proslo startem v case:");
        Serial.println(pole_startu[index_start]);            
      }
  }


// -------------  podprogram pro stisk tlacitka STOP ---------
void fce_STOP(void)
  {
    // tahle podminka je kvuli odruseni zakmitu tlacitka pri rychlem snimani interruptu
    if (millis() - minuly_cas_stop_interruptu > 30 ) // kdyz je mezi nasledujicimi stisky tlacitka kratsi interval nez 30ms, preruseni se ignoruje
      {                                              //     (v cili uz by se mohlo stat, ze deti dojedou hodne brzo po sobe)           
        minuly_cas_stop_interruptu = millis();
        index_stop ++;                               // pocitani deti v cili
        if( index_stop == 10) index_stop = 1;        // po 10 detech se pocitadlo nuluje
    
        unsigned long cas_v_cili = millis();         // cas v cili do promenne
        
        Serial.print("Dite ");                       // vypis informaci o cili do serioveho monitoru
        Serial.print(index_stop);
        Serial.print(" proslo cilem v case:");
        Serial.print(cas_v_cili);
        Serial.print(". Rozdil casu je: ");
        Serial.println(cas_v_cili - pole_startu[index_stop] );
      }
  }


void loop(void)
  {
  }



jozinecko
Příspěvky: 7
Registrován: 17 bře 2018, 15:02
Reputation: 0

Re: casomiera na smykacku

Příspěvek od jozinecko » 17 bře 2018, 18:24

si super dakujem.

ja tam chcem pripojit infra snimanie, takze tam asi zakmit musim osetrit.

inak na tu smykacku vojdu max traja, mooozno 4, viac by uz asi bol vlacik :D

jozinecko
Příspěvky: 7
Registrován: 17 bře 2018, 15:02
Reputation: 0

Re: casomiera na smykacku

Příspěvek od jozinecko » 17 bře 2018, 23:33

Este sa opytam, mozno uplne trivialnu otazku ale nechcem odpalit arduino :/

spinanie pinu je je len voci zemi alebo je tam lepsie pouzit schemu z debounce a teda s 10k pripojenym na zem a spinanym voci 5V?

musim vymysliet nieco lepsie ako IR snimac lebo ten bere naozaj velmi casto vstup (skusal som len voci GND) cim pri stope urobi ze dalsie dieto uz doslo aj ked este neslo:D
ale asi tam dam nulovanie ak sa nespusti do 2min start vynuluje vzdy index dietata.
Akurat skusam dopisat este jednoduche svietenie ledky, ak je niekto na smykacke (spustil sa start) tak bude svietit cervena ak nie tak zelena (ak po spusteni sa ukoncil stopom. Predpokladam, ze to len pridam pin HIGH pre cervenu a low pre zelenu na zaciatok po starte a na uplny koniec, tzn ide loop naspat tak pridam pin low pre cervenu a high pre zelenu.

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

Re: casomiera na smykacku

Příspěvek od gilhad » 18 bře 2018, 02:26

U pinu si zadavas, jestli ma byt LOW (cili 0) nebo HIGH (cili 5V). proud dokaze prohnat stejny obema stavy, takze proti zemi, nebo proti plusu je to celkem jedno.
Pro cteni pinu zase mas moznost cist jak stav, kdy je nahore, tak stav kdy je dole.
Casto se pouziva toho, ze jdou zapnout vnitrni pullupy (INPUT_PULLUP misto INPUT) a pak je vstup tazeny prez nejakych 30k-50k nahoru k 5V a zvenku staci dat spinac proti zemi. Pokud das jen INPUT a zvenku nejakych 30-50k proti zemi, tak muzes snimat tlacitkem proti napajeni.

Az na ten pull-up, kdy uvnitr je jen k 5V a k zemi musis dat vnejsi, to je vlastne symetricke.

Takze vesele spinam proti cemu mi to zrovna vyhovuje konstrukcne lip, klidne kazdy pin jinak, jen pak v programu musim vedet, co znamena HIGH a co LOW (tedy co je sepnuto a co rozepnuto).

Jako pullup/pulldown muzes dat asi tak cokoli od 1k do 200k a bude to fungovat bez problemu pro cteni. Rozsvecet jednu ledku prez takovych 330-500 Ohmu zase proti cemu chces, pokud bys chtel vic ledek, nebo neco vykonejsiho, tak radsi prez nejaky tranzistor a pokud extra silne, tak rele prez tranzistor, nebo nejaky silovy modul.

Svitit diodou (samozrejme prez odpor) je tak jednoduche, jak rikas.

jozinecko
Příspěvky: 7
Registrován: 17 bře 2018, 15:02
Reputation: 0

Re: casomiera na smykacku

Příspěvek od jozinecko » 24 lis 2018, 13:14

Ahojte, chcel by som velmi pekne poprosit este o pomoc, nakolko sa chybou nenatiahli kable k infra branam, tak by som to chcel aspon na skusku spravit cez wifi, len rozmyslam nad opozdenim, ci by nebolo jednoduchsie, ze by obe arduina (nna zaciatku aj na konci smykacky) boli pripojene cez wifi a bud si synchronizovali RTC a pri kazdom prejdeni cez barieru by mi odoslalo aktualny cas prerusenia niekam do databazy a az v databaze by prebehol vypocet casu.

viete mi s tym nejako pomoct?

alebo mi napada aj moznost len prepojit cez wifi obe arduina a v jednom z nich by prebiehal vypocet, len si neviem predstavit co by robilo oneskorenie pri pouziti wifi.

Vedel by mi s tym niekto prosim pomoct? chcel by som to dokoncit do mikulasa.

dakujem velmi pekne

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Bing [Bot], Google [Bot] a 16 hostů