Začátečnický dotaz
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Začátečnický dotaz
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);
}
}
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
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ě.
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
Kouknu na to, děkuji Vám =)
Re: Začátečnický dotaz
pokusil jsem se napsat sketch, vyzkoušej nahrát do Arduina tohle :
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
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);
}
}
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
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.
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
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.
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
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
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
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?
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
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).
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).
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 15 hostů