Začátečnický dotaz

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
czhory
Příspěvky: 4
Registrován: 13 črc 2019, 17:48
Reputation: 0

Začátečnický dotaz

Příspěvek od czhory » 21 črc 2019, 05:28

Dobrý den, poradíte mi prosím?

Chtěl bych jedním stiskem tlačítka zapnout dvě nezávislé LED, každou na jiný čas (2s a 3,5s). Kód přikládám níže.

Když teď zmáčknu tlačítko, 1.LED svítí asi 5 vteřin a 2.LED se k ní asi po 3 vteřinách přidá, svítí cca 2 vteřiny a pak společně zhasnou.

Co dělám špatně?



const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 7; // the number of the LED pin
const int ledPin1 = 6;

int buttonState = 0;

void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}

void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);

// check if the pushbutton is pressed. If it is, the buttonState is HIGH:

if (buttonState == HIGH)

{
digitalWrite(ledPin, HIGH);
delay(3500) ;
}
if (buttonState == HIGH)
{

digitalWrite(ledPin1, HIGH);
delay(2000) ;
}


else
{
{
digitalWrite(ledPin, LOW);

}

digitalWrite(ledPin1, LOW);
}
}

RomanB
Příspěvky: 90
Registrován: 04 zář 2017, 14:28
Reputation: 0
Bydliště: Havířov

Re: Začátečnický dotaz

Příspěvek od RomanB » 21 črc 2019, 07:38

Ahoj, mrkni na tento odkaz https://arduino.cz/arduino-zaklady-blik ... kce-delay/

Funkce delay() program na danou dobu zastaví, proto se ti po stisku tlačítka rozsvítí LEDka na 3.5s, pak se program rozjede a rozsvítí tu druhou na 2s až pak teprve zhasne obě.

czhory
Příspěvky: 4
Registrován: 13 črc 2019, 17:48
Reputation: 0

Re: Začátečnický dotaz

Příspěvek od czhory » 21 črc 2019, 12:02

Kouknu na to, děkuji Vám =)

Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Začátečnický dotaz

Příspěvek od Hanz » 21 črc 2019, 16:48

pokusil jsem se napsat sketch, vyzkoušej nahrát do Arduina tohle :

Kód: Vybrat vše

//tlačítkem zapne obě led, pak vypne LEDku a se spožděním LEDku2
//po opětovném stisku tlačítka zapne LEDky a postupně vypne LEDky atd.

int LEDka = 10; // LED připojena na pin 10
int LEDka2 = 11;
int Tlacitko = 7;  // Tlacitko pripojeno na pin 9
 
void setup()
  {
    pinMode(LEDka, OUTPUT);    // pin 10  nastaven jako výstup 
    pinMode(LEDka2,OUTPUT);
    pinMode(Tlacitko, INPUT);    // pin 7  nastaven jako vstup
    digitalWrite(Tlacitko,HIGH);
  }
void loop()
{ 
 if ((digitalRead(Tlacitko)) == LOW) {
        
      // zapne LED:    
    digitalWrite(LEDka, HIGH);
    digitalWrite(LEDka2,HIGH);
    delay(2000);
    digitalWrite(LEDka,LOW);
    delay(1500);
    digitalWrite(LEDka2,LOW);
    delay (1000);         
    }
  }
Nejdříve svítí obě led po 2sec zhasne na pinu 10 LEDka a po další 1,5sec zhasne na pinu 11 LEDka2. Když se stiskne Tlacítko cyklus proběhne znova.
Jo a tlačítko je zapojeno jednou stranou na pin 7 a druhou stranou ke GND nemusí se přidávat odpor, zapnutý je odpor v Arduinu

Woyta
Příspěvky: 16
Registrován: 17 črc 2019, 17:04
Reputation: 0

Re: Začátečnický dotaz

Příspěvek od Woyta » 23 črc 2019, 13:36

Já bych spíše použil příkaz milis() pro přečtení aktuálního času v mili sekundách.
ten bych uložil do proměně. CasZapnuti
Pak bych měl dvě proměnné s dobou rozsvícení led. Například led1 a led2


if ((digitalRead(Tlacitko)) == LOW) CasZapnuti =milis() ;


if ((CasZapnuti +Led1) <milis() ) digitalWrite(LEDka, HIGH);
else digitalWrite(LEDka, LOW);

if ((CasZapnuti +Led2) <milis() ) digitalWrite(LEDka2, HIGH);
else digitalWrite(LEDka2, LOW);

Program pak nikde na nic nečeká kvůli delay a může provádět další operace a není ani nutno sčítat dobu rozsvícení ledek.

Woyta
Příspěvky: 16
Registrován: 17 črc 2019, 17:04
Reputation: 0

Re: Začátečnický dotaz

Příspěvek od Woyta » 23 črc 2019, 21:11

unsigned long CurrentMillis=millis();

if ((digitalRead(Tlacitko)) == LOW) CasZapnuti =CurrentMillis ;


if ((CasZapnuti +Led1) <CurrentMillis ) digitalWrite(LEDka, HIGH);
else digitalWrite(LEDka, LOW);

if ((CasZapnuti +Led2) <CurrentMillis) digitalWrite(LEDka2, HIGH);
else digitalWrite(LEDka2, LOW);

Takhle by to melo spis vypadat.

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

Re: Začátečnický dotaz

Příspěvek od gilhad » 24 črc 2019, 00:33

Mas tam problem s pretecenim (kdyz CasZapnuti +Led1 pretece, tak bude okamzite mensi, nez CurrentMillis ).

Prave proto se to zapisuje jako (CurrentMillis - CasZapnuti) < Led1, protoze i kdyz ti pretece citac, tak ti zaroven pretece i ten rozdil a tim dostanes stejne spravny vysledek.

https://www.gammon.com.au/millis

Woyta
Příspěvky: 16
Registrován: 17 črc 2019, 17:04
Reputation: 0

Re: Začátečnický dotaz

Příspěvek od Woyta » 24 črc 2019, 01:19

Tohle nevypadá jako věc co poběží déle než 50dni v kuse takže jsem to neřešil.

CurrentMillis - CasZapnuti mi může dát poměrně velké záporné číslo pokud se náhodou trefime do doby přetečení. Což taky není ideální.

Budeme ho trápit tvorbou vlastního časovače a jeho resetovanim při stisku ať máme jistotu že tahle eventualita nenastane?

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

Re: Začátečnický dotaz

Příspěvek od gilhad » 24 črc 2019, 05:09

Vzhledem k tomu, ze je to stejne slozite napsat a horsi zapis neprinasi zadnout vyhodu, je lepsi si od zacatku zvyknout na spravny zapis.

Pomerne velke zaporne cislo je v pripade UNsigned pomerne male kladne cislo a navic zde spravna a presna hodnota. Cili to naopak idealni je (ostatne ten odkaz v predchozim prispevku to podrobne rozebira a presne kvuli tomu se to dela odectenim dvou unsigned a pak porovnanim, nikoli pricitanim a pak porovnanim).

Odpovědět

Kdo je online

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