Stránka 1 z 1
Začátečnický dotaz
Napsal: 21 črc 2019, 05:28
od czhory
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);
}
}
Re: Začátečnický dotaz
Napsal: 21 črc 2019, 07:38
od RomanB
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ě.
Re: Začátečnický dotaz
Napsal: 21 črc 2019, 12:02
od czhory
Kouknu na to, děkuji Vám =)
Re: Začátečnický dotaz
Napsal: 21 črc 2019, 16:48
od Hanz
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
Re: Začátečnický dotaz
Napsal: 23 črc 2019, 13:36
od Woyta
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.
Re: Začátečnický dotaz
Napsal: 23 črc 2019, 21:11
od Woyta
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.
Re: Začátečnický dotaz
Napsal: 24 črc 2019, 00:33
od gilhad
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
Re: Začátečnický dotaz
Napsal: 24 črc 2019, 01:19
od Woyta
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?
Re: Začátečnický dotaz
Napsal: 24 črc 2019, 05:09
od gilhad
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).