Ovládání blinkrů tlačítkem
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, ...)
Ovládání blinkrů tlačítkem
Ahoj, potreboval bych pomoct s tvorbou programu, pro arduino nano. Ovládání led blinkrů tlacítkem. Jedním tlacítkem zapnout jeden výstup kontrolka led (svítí), druhý výstup led blinkr (bliká), stejným tlačítkem vypnout. Druhým tlačítkem druhý blinkr. Asi je to triviální, ale já to nezvládám.
Dokážu jeden výstup zapnout a vypnout, ale druhý nebliká. Pokud by to někdo napsal byl bych vděčný.
Dokážu jeden výstup zapnout a vypnout, ale druhý nebliká. Pokud by to někdo napsal byl bych vděčný.
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Pomoc
úkol do školy ?
hoď sem co máš, napovíme - pokud to pochopíš - bude to lepší než když to jen obšlehneš
kod sem hoď pomocí
hoď sem co máš, napovíme - pokud to pochopíš - bude to lepší než když to jen obšlehneš
kod sem hoď pomocí
Kód: Vybrat vše
tohodle
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Pomoc
Ahoj Chlapi, do školy jsem chodil před třiceti lety a tehdy byl v osobních počítačích výkřik techniky DIDAKTIK GAMA. Blinkry jsou na kutilský zahradní traktůrek. Takže, když pomůzete budu rád. Kód, který mám je jen grab z internetu.
-
- Příspěvky: 1030
- Registrován: 06 zář 2017, 20:04
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: Pomoc
Kód: Vybrat vše
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Piny pro tlacitka a LED je treba zadefinovat podle svych pozadavku a zapojeni
// !!!!!!!!!!!!!!!!!!1111111111111111!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define KONTROLKA1PIN 13 // pin kontrolky 1 - LED s rezistorem proti zemi
#define KONTROLKA2PIN 4 // pin kontrolky 2 - LED s rezistorem proti zemi
#define LED1BLINKRPIN 12 // pin blinkru 1 - LED s rezistorem proti zemi
#define LED2BLINKRPIN 9 // pin blinkru 2 - LED s rezistorem proti zemi
#define BUTTON1PIN 8 // tlacitko 1 - spinac proti zemi !!!!!!!!!
#define BUTTON2PIN 11 // tlacitko 2 - spinac proti zemi !!!!!!!!!
#define DELAY 50 // casova konstanta rychlosti blikani T=2*DELAY*10 [s]
// ma vliv i na cetnost cteni tlacitek
//****************** Globalni promenne *******************************************
bool Led1On = false; // priznak pozadavku blikani LED1
bool Led2On = false; // priznak pozadavku blikani LED2
bool Led1State = false; // stav LED1 Vypnuto/Zapnuto
bool Led2State = false; // stav LED2 Vypnuto/Zapnuto
bool Button1 = true; // tlacitko 1 - zapojeno proti zemi, stisknuto = false
bool Button2 = true; // tlacitko 2 - zapojeno proti zemi, stisknuto = false
bool Release1 = false; // priznak uvolneni tlacitka 1
bool Release2 = false; // priznak uvolneni tlacitka 2
uint8_t Button1Count = 0; // citac doby stisku tlacitka 1
uint8_t Button2Count = 0; // citac doby stisku tlacitka 2
//********************************************************************************
void setup() {
/* nastaveni vstupu/vystupu */
pinMode(KONTROLKA1PIN, OUTPUT);
pinMode(KONTROLKA2PIN, OUTPUT);
pinMode(LED1BLINKRPIN, OUTPUT);
pinMode(LED2BLINKRPIN, OUTPUT);
pinMode(BUTTON1PIN, INPUT_PULLUP);
pinMode(BUTTON2PIN, INPUT_PULLUP);
//*******************************************************************************
}
void loop() {
// pokud je pozadavek na blikani, tak ovladej LED1
if (Led1On)digitalWrite(LED1BLINKRPIN, Led1State);
// pokud je pozadavek na blikani, tak ovladej LED2
if (Led2On)digitalWrite(LED2BLINKRPIN, Led2State);
Led1State = !Led1State; // priprav zmenu stavu LED1
Led2State = !Led2State; // priprav zmenu stavu LED2
ButtonAndDelay();
}
void ButtonAndDelay(void) {
// funkce odmeruje pulperiodu blikani a zaroven periodicky
// relativne rychle testuje tlacitka
for (uint8_t i = 0; i < 10; i++) {
/* pokud je tlacitko 1 drzeno alespon dva casove intervaly
DELAY, pak se zmeni stav pozadavku na blikani Led1On,
podle potreby se rozsviti kontrolka blikani 1 a pripravi se
stav ON nebo OFF LED1. Release zajistuje, aby se pri podrzeni
tlacitka blikani periodicky nevypinalo a nezapinalo */
if (!digitalRead(BUTTON1PIN) && Release1) {
Button1Count++; // citani doby stisku tlacitka1
if (Button1Count > 1) {
Led1On = !Led1On; // zmena stavu pozadavku na blikani LED1
digitalWrite(LED1BLINKRPIN, Led1On); // priprav LED1 blinkru
digitalWrite(KONTROLKA1PIN, Led1On); // priprav kontrolku1
Button1Count = 0; // nuluj citac doby stisku tlacitka1
Release1 = false; // nuluj priznak uvolneni tlacitka1
}
}
/* ceka na uvolneni tlacitka 1 alespon po dobu tri period DELAY */
if (digitalRead(BUTTON1PIN)) {
Button1Count++; // citani doby uvolneni tlacitka1
if (Button1Count > 2) {
Button1Count = 0;// nuluj citac doby uvolneni tlacitka1
Release1 = true; // nastav priznak uvolneni tlacitka1
}
}
/* pokud je tlacitko 2 drzeno alespon dva casove intervaly
DELAY pak se zmeni stav pozadavku na blikani Led1On,
podle potreby se rozsviti kontrolka blikani 2 a pripravi se
stav ON nebo OFF LED21. Release zajistuje, aby se pri podrzeni
tlacitka blikani periodicky nevypinalo a nezapinalo */
if (!digitalRead(BUTTON2PIN) && Release2) {
Button2Count++; // citani doby stisku tlacitka2
if (Button2Count > 1) {
Led2On = !Led2On; // zmena stavu pozadavku na blikani LED2
digitalWrite(LED2BLINKRPIN, Led2On); // priprav LED2 blinkru
digitalWrite(KONTROLKA2PIN, Led2On); // priprav kontrolku2
Button2Count = 0; // nuluj citac doby stisku tlacitka2
Release2 = false; // nastav priznak uvolneni tlacitka2
}
}
/* ceka na uvolneni tlacitka 2 alespon po dobu tri period DELAY */
if (digitalRead(BUTTON2PIN)) {
Button2Count++; // citani doby uvolneni tlacitka2
if (Button2Count > 2) {
Button2Count = 0;// nuluj citac doby uvolneni tlacitka2
Release2 = true; // nastav priznak uvolneni tlacitka2
}
}
/* urcuje frekvenci/periodu blikani */
delay(DELAY);
}
}
Re: Pomoc
Osobně bych logiku blikání řešil bez delay. Vytvořil bych si proměnnou, kterou bych si blikal pomocí millis a tuto proměnnou bych potom posílal na tu požadovanou LEDku. Asi nějak takhle:
Kód: Vybrat vše
unsigned long lastTime, presentTime;
bool ledActive; //tato proměnná "bliká" v nastaveném intervalu
bool maBlikat; //aktivní režim blikání
bool maSvitit; //aktivní režim svícení
void loop() {
presentTime = millis();
if (presentTime - lastTime >= 250) {
//cyklovač
lastTime = presentTime;
ledActive = !ledActive;
}
if(maBlikat){
//blikani ledky
digitalWrite(13; ledActive);
}
if(maSvitit){
//sviceni ledky
digitalWrite(13; true);
}
if(!maBlikat && !maSvitit){
//zhasnuti ledky
digitalWrite(13; false);
}
}
-
- Příspěvky: 1030
- Registrován: 06 zář 2017, 20:04
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: Pomoc
Šlo by tlačítka kontrolovat přes interupt, časy řídit knihovnou Interval nebo přes mills(). Ale stejně základem je slušné ošetření tlačítek, které tvoří podstatnou část programu. Pojal jsem to primárně jako školní úlohu, nechtěl jsem aby to bylo dokonalé, sám bych použil tu knihovnu. Na druhé straně to zadání splňuje (pokud jsem ho správně pochopil) s tím, že se to rozsvítí a zhasne hned po stisku tlačítka, jak je běžně po blikačích požadováno.
Re: Ovládání blinkrů tlačítkem
Dobrý den, funkční prototyp je na stole, proto bych chtěl všem zůčastněným moc poděkovat.
Kdo je online
Uživatelé prohlížející si toto fórum: Bing [Bot] a 10 hostů