Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Začátečník arduino - pomoct s tlačítky - bazén (přesunuto)
Jdi na stránku Předchozí  1, 2, 3, 4  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další)
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Atlan



Založen: May 10, 2004
Příspěvky: 4507
Bydliště: Košice

PříspěvekZaslal: pá prosinec 08 2017, 8:03    Předmět: Citovat

0 a 1 su inak rx tx pre programovanie takze ked tam nahravas program.
Na zakmity by som sa vybodol. Ked tam budes mat displej alebo niecocpodobne kym sa znova otestuju tlacidla prejde 50ms, ak nie kludne tam daj taky delay nic sa nestane obsluha to nezisti.
Navyse pre kludne pouzivanie by si mal vstupycosetrit RC clenom tak ze zakmity uz budu nepodstatne.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Rellik



Založen: Feb 17, 2017
Příspěvky: 636
Bydliště: Staré Město (UH)

PříspěvekZaslal: pá prosinec 08 2017, 21:33    Předmět: Citovat

No tlačítka jsem teda nějak vyřešil. Dnes jsem se pokoušel to přepsat do jedné funkce abych nemusel psát pro každé tlačítko víceméně to samé, jen s jinými hodnotami, ale nejde mi to. Vycházel jsem ze znalosti PHP a zkoušel to takto:

kód:

const int G = A0; // 3x LED
const int Y = A1;
const int B = A2;
int zelena;
int modra;
const int Tl1 = 2; // tlačítka
const int Tl2 = 3;
int ledState = LOW;
int gState = LOW;
int bState = LOW;
unsigned long previousMillis = 0;
const long interval = 500;
unsigned long times;
unsigned long prevtime = 0;


int Tl1State;
int Tl2State;
int lastTl1State = LOW;
int lastTl2State = LOW;
int out = LOW;

long lastDebounceTime = 0; 
long debounceDelay = 50;


void setup() {
    Serial.begin(9600);
    pinMode(G,OUTPUT);
    pinMode(Y,OUTPUT);
    pinMode(B,OUTPUT);
    pinMode(Tl1,INPUT_PULLUP);
    pinMode(Tl2,INPUT_PULLUP);
}

void loop(){
buttons("zelena", "Tl1", "Tl1State", "lastTl1State", "G");
}

//buttons("zelena", "Tl1", "Tl1State", "lastTl1State", "G");
void buttons(String barva, String input, String inputState, String lastInputState, String output) {
 
  barva = digitalRead(input);
// zelená dioda
   if(barva != HIGH) {
              barva = LOW;
   }
                       
   if(barva != lastInputState) {
              lastDebounceTime = millis();
              if (inputState == HIGH) {
                            out = !out;
                                     }
   }
                               
   if ((millis() - lastDebounceTime) > debounceDelay) {
                 inputState = barva;
 }

 //
digitalWrite(output, out);
lastInputState = barva;
}
digitalWrite(output, out);
lastInputState = barva;
}


Snad se ten kód dá trochu pochopit... Smile
Prostě pokud zavolám funkci
buttons("zapni", "LED");

tak se v příslušné funkci buttons(X,Y) dosadí X=zapni a Y= LED.
Čímdál víc vidím, že to nebude tak jednoduché jak se to na první pohled zdálo...
Pokud chci něco rozumného "vygooglit", tak najdu max jak blikat z ledkou nebo jak se připojovat k internetu. Jedno je pro naprosté začátečníky a to druhé pro "normální" používání k ničemu... Nechápu proč by se všechno muselo hned připojovat k internetu... No ale to už jsem zašel mimo...

Poradí někdo jak jít na ty vlastní funkce a přiřazovat ty proměnné?
Díky Smile

EDIT: v tom kódu je definovaných víc věcí, zkouším to na jednom programu co mi funguje...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: pá prosinec 08 2017, 21:53    Předmět: Citovat

Upřímně, teď tomu kódu vůbec nerozumím. To přece nemůže jít ani přeložit. Zkus prosím namalovat stavový automat, který si představuješ (třeba jako vývojový diagram) a dej ho sem.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Rellik



Založen: Feb 17, 2017
Příspěvky: 636
Bydliště: Staré Město (UH)

PříspěvekZaslal: pá prosinec 08 2017, 22:24    Předmět: Citovat

Zjednoduším to bez definicí a setupu:

kód:

void loop(){
// zavolání funkce s parametry
funkce("zapni", "LED");

}

funkce(X, Y){
Serial.print(X); // vypíše zapni
Serial.print(Y); // vypíše LED
}


Teď už to snad bude pochopitelnější... Smile Jak říkám vycházím z mě známého jazyka PHP a myslím tím něco takového: https://www.itnetwork.cz/php/zaklady/tutorial-zaklady-php-tvorba-vlastnich-funkci
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
AB1



Založen: Nov 23, 2009
Příspěvky: 312

PříspěvekZaslal: so prosinec 09 2017, 8:29    Předmět: Citovat

V definici funkce musí být její typ.
Pokud nic nevrací, tak je typu void.

Předávané parametry musí mít uvedený typ.
(to, myslím, platí i v php)

kód:

void setup()
{
   Serial.begin(9600);
   // zavolání funkce s parametry
   funkce("zapni\n", "LED\n");
}
//----------------------------
void loop()
{
}
//----------------------------
void funkce(char* X, char* Y)
{
   Serial.print(X); // vypíše zapni
   Serial.print(Y); // vypíše LED
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: so prosinec 09 2017, 11:45    Předmět: Citovat

Zapomeň na PHP Smile Wiring je "dialektem" C/C++ a na rozdíl od PHP je to typový programovací jazyk.

Proto nejde

void buttons(... String input ...
{
barva = digitalRead(input);
...

funkce digitalRead() očekává jako parametr int.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
fero_b



Založen: May 17, 2004
Příspěvky: 582
Bydliště: Kosice

PříspěvekZaslal: so prosinec 09 2017, 12:06    Předmět: Citovat

Doporucujem najprv trocha pocvicit nejake programy v C, programovanie mikrokontrolerov ma svoje specifika, ale ak nespravis architekturu programu spravne ale budes vsetko placat hlava nehlava do hlavnej slucky, ta zabudni na pouzitelny vysledok..
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Rellik



Založen: Feb 17, 2017
Příspěvky: 636
Bydliště: Staré Město (UH)

PříspěvekZaslal: so prosinec 09 2017, 12:51    Předmět: Citovat

No dobrá jak sem si to přestavoval, to zřejmě nepůjde. V tom případě jiný dotaz. Mám dvě tlačítka, jedno rozsvítí jen diodu, druhé rozsvítí diodu + spustí podprogram, kde další dioda bliká. Pokud to ovšem dalším klikem chci ukončit, tak jsou u té blikací diody dva stavy. Pokud to vypnu když dioda nesvítí, tak se nic neděje, pokud to ovšem ukončím když blikající dioda zrovna svítí, tak zůstane svítit (ne blikat) i když je tlačítko ve stavu "vypnuto". Jak ošetřit kód aby ten podprogram vypnul taky?

kód:
const int G = A0; // LED
const int Y = A1;
const int B = A2;
int zelena, modra;
int ledState, gState, bState = LOW;

unsigned long previousMillis = 0; // čas
const long interval = 500;
unsigned long times;
unsigned long prevtime = 0;

const int Tl1 = 2; // tlačítka
const int Tl2 = 3;
int Tl1State, Tl2State;
int lastTl1State,lastTl2State = LOW;
long lastDebounceTime = 0; 
long debounceDelay = 50;


void setup() {
    Serial.begin(9600);
    pinMode(G,OUTPUT);
    pinMode(Y,OUTPUT);
    pinMode(B,OUTPUT);
    pinMode(Tl1,INPUT_PULLUP);
    pinMode(Tl2,INPUT_PULLUP);
}

void loop() {
  zelena = digitalRead(Tl1);
  modra = digitalRead(Tl2);
//--------------------První tlačítko---------------
// zelená dioda
   if(zelena != HIGH) {
              zelena = LOW;
   }
                       
   if(zelena != lastTl1State) {
              lastDebounceTime = millis();
              if (Tl1State == HIGH) {
                            gState = !gState;
                                     }
   }
                               
   if ((millis() - lastDebounceTime) > debounceDelay) {
                 Tl1State = zelena;
 }

digitalWrite(G, gState);
lastTl1State = zelena;
//-------------------Druhé tlačítko---------------
// modrá dioda
   if(modra != HIGH) {
              modra = LOW;
              }
                       
   if(modra != lastTl2State) {
              lastDebounceTime = millis();
              if (Tl2State == HIGH) {
                            bState = !bState;
                                     }
              }
                               
   if ((millis() - lastDebounceTime) > debounceDelay) {
                 Tl2State = modra;
                  }

digitalWrite(B, bState);
lastTl2State = modra;

if(bState == HIGH) {
      HlavniProg();
    }

}

// program co se spustí po zapnutí druhého tlačítka (blikající dioda)...
void HlavniProg() {
 unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(Y, ledState);
  }
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
fero_b



Založen: May 17, 2004
Příspěvky: 582
Bydliště: Kosice

PříspěvekZaslal: so prosinec 09 2017, 15:03    Předmět: Citovat

kazdy program je v podstate stavovy automat, ktory v zavislosti v akom stave sa nachadza tak moze nejake tlacitko robit nieco uplne ine. Uvediem priklad z tvojho programu, posledna podmienka if (bState == HIGH) { HlavniProgram}, teda ak nejaka premenna odrazajuca stav premennej bState je High tak to zacne volat funkciu v podmienke. A ty uz zacinas narazat na to ze tvoj stavovy automat zacina mat dalsi stav a chces nieco vykonat len ked ledka nesvieti, alebo ked svieti, taka by zhasla....a ty nad tym uz nevies udrzat mentalnu kontrolu. Este dopises 10 riadkov a si strateny.. Takze sa vratim s5 ku architekture. CPU je dostatocne rychle aby vykonavalo kazdu ulohu nejaku chvilu a tebe sa to bude javit ako keby vsetko islo plynule... takze ty potrebujes zopar veci:

1) snimat klavesnicu
2) blikat s ledkou

takze snimanie klavesnice je periodicky dej, ktory chces vykonavat v pravidelnych intervaloch, blikanie ledky je napodobne velmi jednoducha cinnost, staci aby v spravny okamih procesor zdvihol stav na drote a potom ho zas zhodil.. zvysok casu procak nema co robit...V zasade CPU vacsinu casu otaca hlavnou sluckou a periodicky si odskoci do prerusenia, kde sa pozrie na stav tlacidiel a napise to (ak je stlacene alebo pustene) do nejakych premennych. Tieto premenne su potom kontrolovane hlavnou sluckou a vykonaju akciu...Periodicke prerusenie je dobry sposob ako robit nieco v presne stanovenych casovych okamzikoch. Priklad chcem blikas s LEDkou tak ze pol sekundy bude zasvietena a pol sekundy bude zhasnuta..
Urobis jednu globalnu premennu typu integer - pocitadlo preruseni. Ked ti prerusenie chodi kazdych 50ms, tak musis naratat do 10 aby presla pol sekunda, vtedy zmenis stav ledky na opacny


stavy celeho automatu si znacim bitovo a potom ich aj bitovo testujem.
(zopar globalnych bytov) Mozes si to pisat aj do bytov to ti zozere troska viac ramky.. NEPOUZIVAT ZIADNE FUNKCIE DELAY. Snimanie klavesnice som popisal skor (pripadne si to precitaj este raz, a pogoogli, porozmyslaj ako som to myslel)

priklad: uzivatel stlaci tlacidlo 1) a chcem aby sa o pol sekundy nieco stalo.


uint_8 status = 0; //inicializaciu toho treba dat do init
uint_8 timer_counter;


#define POL_SEC_FLAG 0b00000001


//toto spravis v hlavnej slucke ako reakciu na tlacidlo 1
//je to signal preruseniu, ze ma zacat ratat do 10 povedzme

timer_counter = 10;
status |= POL_SEC_FLAG;


//v preruseni bude napisane:

if (status & POL_SEC_FLAG){
if (timer_counter >0){
timer_counter--;
}else{
//ZASVIET LEDKU
status = &~POL_SEC_FLAG; //akcia bola spravena, zhodime vlajocku
}
}

}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
AB1



Založen: Nov 23, 2009
Příspěvky: 312

PříspěvekZaslal: so prosinec 09 2017, 19:03    Předmět: Citovat

Používej k debouncování jednoduchý delay().
Počítám, že bude ještě dlouho trvat, než ti zpoždění bude vadit.
Teď v začátcích by ti to jenom komplikovalo život.

Nenazývej svoji vlastní funkci Hlavní().
Za hlavní funkci se tady považuje smyčka loop().

Podívej se na příklad níže.
(po stisku tlačítka Led bliká, po dalším zhasne, atd.)

kód:
#define Yellow_led 13
#define TL2        12
 
unsigned long currentMillis, previousMillis;
unsigned int  interval=500;
boolean       TL2_state;

//-------------------------------
void setup()
{
    pinMode(Yellow_led,OUTPUT);
    pinMode(TL2,INPUT_PULLUP);
}
//-------------------------------
void loop()
{
  currentMillis = millis();
 
  if (currentMillis - previousMillis >= interval)
  {
     blink();                         //call blink() every 500 ms
     previousMillis = currentMillis;
  }
 
  if ((digitalRead(TL2) == 0))        //if button pressed
  {
     delay(50);                       //debounce
     TL2_state = !TL2_state;          //toggle the state
     while((digitalRead(TL2) == 0));  //wait for button released
     delay(50);                       //debounce
   }
}   
//----------------------------

void blink()
{
    if(TL2_state == 1)
       digitalWrite(Yellow_led,(!digitalRead(Yellow_led)) ); //toggle Led
    else
       digitalWrite(Yellow_led, LOW);
 } 
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Rellik



Založen: Feb 17, 2017
Příspěvky: 636
Bydliště: Staré Město (UH)

PříspěvekZaslal: so prosinec 09 2017, 21:27    Předmět: Citovat

Hoši moc díky za rady. Moc si toho cením...
Co se týká "hlavní" funkce, tak je to jen začátek celého projektu. Pak to bude pojmenované přímo funkcí, kterou to bude dělat (pokud se mi to teda podaří)...

Ve výsledku tam blikat nic nebude. Mám to jen na zkoušku. V podstatě by to jedno tlačítko mělo sepnout dva výstupy. Jeden by měl být sepnutý cca 60 minut a druhý jen 40 sekund.

Jinak jsem se díval i na to přerušení, což by asi (určitě) bylo nejlepší řešení, protože pokud bude nějaká "externí" akce (tlačítka), tak by se měl hlavní program (časové spínání relé a hlídání teploty) přerušit a běžet program co je pod tím tlačítkem...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Rellik



Založen: Feb 17, 2017
Příspěvky: 636
Bydliště: Staré Město (UH)

PříspěvekZaslal: ne prosinec 10 2017, 9:36    Předmět: Citovat

Mám dotaz ještě ohledně těch tlačítek. Když vynechám programové ošetření zákmitů a udělám ho HW tak to bude lepší ne? Z toho pak vyplývá další otázka ohledně zapojení.
1/ každé tlačítko má svůj pin - fungovat bude bez problému
2/ všechny tlačítka jsou na "jednom" drátu - dají se nějak adresovat?

To druhé bude asi blbost co? Smile



Screenshot_20171210_092601.png
 Komentář:

Stáhnout
 Soubor:  Screenshot_20171210_092601.png
 Velikost:  9.97 kB
 Staženo:  140 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
fero_b



Založen: May 17, 2004
Příspěvky: 582
Bydliště: Kosice

PříspěvekZaslal: ne prosinec 10 2017, 9:52    Předmět: Citovat

To druhe je znacna blbost:) ked mas len zopar tlacidiel, a nie je problem s poctom pinov, ta pouzi zapojenie c.1...spravne HW osetrenie zakmitov tlacidiel sa robi schmitovym ko.
http://www.ct2.wz.cz/Studium/schmitt.htm

Ak mas vela tlacidiel a malo drotov pouziva sa matica, zopar drotov z CPU vysiela a zopar prijima a su prekrizene do matice, kod daneho tlacidla je potom kombinaciu vysielacich a prijimanych drotikov. Ale to ti netreba.

Edit: pozeram lepsie na tvoje zapojenie, ha zvyknem tlacidla nejakym pull up odporom opriet o 5v, aby si procakom v pripade nezatlacenia nemal len tak drotik v lufte (zbyknu byt v cpu pull upy) ale na mojom poslednom projekte s tym bol problem, kazdopadne 5k6 oproti log "1" neuskodi..
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: ne prosinec 10 2017, 12:07    Předmět: Citovat

Místo externích pull-up lze použít i zabudované interní. V Arduinu:

kód:
pinMode(pin,INPUT_PULLUP);
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Atlan



Založen: May 10, 2004
Příspěvky: 4507
Bydliště: Košice

PříspěvekZaslal: ne prosinec 10 2017, 12:55    Předmět: Citovat

Lenze tie interne nemusia byt dostatocne tvrde.

Ide klavesnicu pripojit na AD prevodnik 2 vodicmi. Stlacenim tlacidla sa meni odporovy delic a tym nasnimane napatie. Jednotlivym napatiem priradis hodnoty tlacidiel.
Bezne sa to na arduine vyuziva.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další) Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3, 4  Další
Strana 2 z 4

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.39 sekund