dobrý den, pokud byl myslený tento problém, tak si ho můžete prohlédnout na tomto odkazu :
https://www.youtube.com/watch?v=-NOj_37gHMg
je na něm vidět problém, kdy po stisknutí tlačítka svítí LEDky a když pustím tlačítko, tak LEDky zhasnou. Není tak splněná podmínka jedním tlačítkem Zap/Vyp v mode. Kod přidávám zde :
Kód: Vybrat vše
#define buttonSelect 2 // číslo pinu tlačítka SELECT pro výběr MODE
#define buttonStart 3 // číslo pinu tlačítka START
#define LED1 10 // číslo pinu LED1 zelená
#define LED2 11 // číslo pinu LED2 červená
#include <Wire.h> // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // nastavení adresy I2C (0x27), počtu znaků, řádků LCD 20x4
boolean buttonState = false; // nejnovější hodnota načtená ze vstupního pinu
boolean lastButtonState = false; // předchozí hodnota načtení ze vstupního pinu
boolean lastTrueButtonState = false; // předchozí hodnota ošetřeného tlačítka
// Následné proměnné jsou typu long, jelikož čas měřený v milisekundách se
//rychle změní na větší číslo, jež nemůže být uloženo v int
unsigned long lastDebounceTime = 0; // čas posledního změny výstupního pinu
unsigned long debounceDelay = 50; // čas debounce prodlevy
byte mode = 0; // 0 - Vypnuto, 1 - Zapnuto, 2 - Blikání rychlé, 3 - Blikání pomalé, 4 - Blikání střídavé
unsigned long aktualniMillis; //aktualní čas
unsigned long predchoziMillis1; // předchozí čas pro rychle blikání
unsigned long predchoziMillis2; // předchozí čas pro pomalé blikání
unsigned long predchoziMillis3; // předchozí čas pro střídavé blikání
unsigned long cas = 0;
long buttonTime; // čas začátku stisknutí tlačítka
boolean led1svetlo; // pomocná proměnná led1svetlo
boolean led2svetlo; // pomocná proměnná led2svetlo
void setup() {
pinMode(LED1, OUTPUT); // pin pro LED1 nastaven jako výstup
pinMode(LED2, OUTPUT); // pin pro LED2 nastaven jako výstup
pinMode(buttonSelect, INPUT); // pin pro tlačítko buttonSelect nastaveno jako vstup
pinMode(buttonStart, INPUT); // pin pro tlačítko buttonStart nastaveno jako vstup
lcd.begin(); // inicializace LCD
lcd.backlight(); // zapnutí podsvícení
lcd.setCursor ( 0, 1 ); // nastavení kursoru na druhý znak, druhý řádek
lcd.print(" LED1,LED2 "); // vypsání textu na lcd
}
void loop(){
/*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
buttonState = digitalRead(buttonSelect); // přečtení stavu tlačítka
if (buttonState != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
if (buttonState != lastTrueButtonState) { // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem
if(buttonState == true) {
mode++; // přičte k MODE hodnotu 1
buttonTime = millis();
if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
}
lastTrueButtonState = buttonState; // uložím si nový pravý ošetřený stav tlačítka
}
}
lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
if(mode == 0) {
// ******* LED1,LED2 vypnuto ********
led1svetlo = false; // zhasni LED1
led2svetlo = false; // zhasni LED2
lcd.setCursor( 3, 2 ); // nastavení kursoru na šestý znak, třetí řádek
lcd.print(" jsme zhasnute "); // vypsání textu na lcd
lcd.setCursor( 1, 3 );
lcd.print("Mode 0");
}
if(mode == 1) {
// ******* LED1,LED2 zapnuto ********
if (digitalRead(buttonStart) == 1) { // když je stisknuto tlačítko, tak rožni ledky
led1svetlo = true; // rožni LED1
led2svetlo = true; // rožni LED2
lcd.setCursor( 5, 2 );
lcd.print(" uz svitime !");
}
if (digitalRead(buttonStart) == 0) { // když není stisknuto tlačítlo, tak zhasni ledky
led1svetlo = false;
led2svetlo = false;
lcd.setCursor( 3, 2 ); // nastavení kursoru na šestý znak, třetí řádek
lcd.print(" jsme zhasnute "); // vypsání textu na lcd
}
lcd.setCursor( 1, 3 );
lcd.print("Mode 1");
}
if(mode == 2){
// ******* LED1,LED2 blikání rychlé *******
if(millis() - buttonTime > 10000){ // zjistím si jestli je čas něco provést, uběhlo už 10s od poslední akce?
lcd.setCursor( 0, 1 );
lcd.print(" LED1,LED2 ");
lcd.setCursor ( 5, 2 );
lcd.print("blikame rychle");
aktualniMillis = millis(); // podívám se na hodinky - aktuální čas
if(aktualniMillis - predchoziMillis1 > 200) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 200ms od poslední akce?
if (led1svetlo) {
led1svetlo = false; // zhasnu LED1
led2svetlo = false; // zhasnu LED2
} else {
led1svetlo = true; // rožnu LED1
led2svetlo = true; // rožnu LED2
}
predchoziMillis1 = aktualniMillis; // v tento čas jsem provedl poslední akci
}
} else {
// vypis : "blikat začneme" - jestli chci vědět jak dlouho budu ještě čekat, tak vypíšu 10000 - (millis() - buttonTime)
lcd.setCursor ( 1, 1 );
lcd.print("blikat zacneme");
lcd.setCursor( 5, 2 );
lcd.print(" za ");
lcd.setCursor( 9, 2 );
lcd.print(10000 - (millis() - buttonTime)); // zobrazí se odpočet do blikání led v ms
lcd.setCursor( 13, 2 );
lcd.print(" ms ");
lcd.setCursor( 1, 3 );
lcd.print("Mode 2");
}
}
if(mode == 3) {
// ******* LED1,LED2 blikání pomalé *******
aktualniMillis = millis(); //podívám se na hodinky - aktuální čas
if(aktualniMillis - predchoziMillis2 > 500) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms od poslední akce?
if (led2svetlo) {
led1svetlo = false; // zhasnu LED1
led2svetlo = false; // zhasnu LED2
} else {
led1svetlo = true; // rožnu LED1
led2svetlo = true; // rožnu LED2
}
predchoziMillis2 = aktualniMillis; // v tento čas jsem provedl poslední akci
}
lcd.setCursor( 0, 1 );
lcd.print(" LED1,LED2 ");
lcd.setCursor( 5, 2 );
lcd.print("blikame pomalu");
lcd.setCursor( 1, 3 );
lcd.print("Mode 3");
}
if(mode == 4) {
// ******* LED1,LED2 blikání střídavé *******
aktualniMillis = millis(); //podívám se na hodinky - aktuální čas
if(aktualniMillis - predchoziMillis3 > 300) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 300ms ?
led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
led2svetlo = !led1svetlo; // do proměnné led2svetlo zapíšu negovanou hodnotu led1svetlo, tj. pokud LED1 svítí chci LED2 zhaslou a naopak
predchoziMillis3 = aktualniMillis; // v tento čas jsem provedl poslední akci
lcd.setCursor( 1, 1 );
lcd.print("LED1,LED2");
lcd.setCursor( 3, 2 );
lcd.print("blikame stridave");
lcd.setCursor( 1, 3 );
lcd.print("Mode 4");
}
}
digitalWrite(LED1,led1svetlo); // aktualizace stavu LED1, zápis proměnné led1svetlo na výstupní pin 10
digitalWrite(LED2,led2svetlo); // aktualizace stavu LED2, zápis proměnné led2svetlo na výstupní pin 11
}
tušil jsem, že budu potřebovat proměnnou na zapamatování si stavu tlačítka, no nevím jestli je to co bylo myšleno
popis :
v mode==1 při stisknutí tlačítka buttonStart se zapnou LEDky a při znovu stisknutí tlačítka buttonStart se LEDky vypnou. Můžu tak v mode1 xkrát rožínat a zhasínat led, pokud nezměním mode tlačítkem buttonSelect /červené na videu/.Taky je přiřazen patřičný popis co dělají LEDky na lcd. Musím to vyzkoušet ještě na jiném mode, uvidím jestli to bude funkční ?
odkaz na video :
https://www.youtube.com/watch?v=VHgxUWoOgY4
kod zde:
Kód: Vybrat vše
#define buttonSelect 2 // číslo pinu tlačítka SELECT pro výběr MODE
#define buttonStart 3 // číslo pinu tlačítka START
#define LED1 10 // číslo pinu LED1 zelená
#define LED2 11 // číslo pinu LED2 červená
#include <Wire.h> // knihovny pro LCD přes I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // nastavení adresy I2C (0x27), počtu znaků, řádků LCD 20x4
boolean buttonState = false; // nejnovější hodnota načtená ze vstupního pinu
boolean lastButtonState = false; // předchozí hodnota načtení ze vstupního pinu
boolean lastTrueButtonState = false; // předchozí hodnota ošetřeného tlačítka
boolean buttonStateStart = false;
boolean lastButtonStart = false;
// Následné proměnné jsou typu long, jelikož čas měřený v milisekundách se
//rychle změní na větší číslo, jež nemůže být uloženo v int
unsigned long lastDebounceTime = 0; // čas posledního změny výstupního pinu
unsigned long debounceDelay = 50; // čas debounce prodlevy
byte mode = 0; // 0 - Vypnuto, 1 - Zapnuto, 2 - Blikání rychlé, 3 - Blikání pomalé, 4 - Blikání střídavé
unsigned long aktualniMillis; //aktualní čas
unsigned long predchoziMillis1; // předchozí čas pro rychle blikání
unsigned long predchoziMillis2; // předchozí čas pro pomalé blikání
unsigned long predchoziMillis3; // předchozí čas pro střídavé blikání
unsigned long cas = 0;
long buttonTime; // čas začátku stisknutí tlačítka
boolean led1svetlo; // pomocná proměnná led1svetlo
boolean led2svetlo; // pomocná proměnná led2svetlo
void setup() {
pinMode(LED1, OUTPUT); // pin pro LED1 nastaven jako výstup
pinMode(LED2, OUTPUT); // pin pro LED2 nastaven jako výstup
pinMode(buttonSelect, INPUT); // pin pro tlačítko buttonSelect nastaveno jako vstup
pinMode(buttonStart, INPUT); // pin pro tlačítko buttonStart nastaveno jako vstup
lcd.begin(); // inicializace LCD
lcd.backlight(); // zapnutí podsvícení
lcd.setCursor ( 0, 1 ); // nastavení kursoru na druhý znak, druhý řádek
lcd.print(" LED1,LED2 "); // vypsání textu na lcd
}
void loop(){
/*TOHLE JE ZAČÁTEK BLOKU KDE OŠETŘUJI TLAČÍTKO*/
buttonState = digitalRead(buttonSelect); // přečtení stavu tlačítka
if (buttonState != lastButtonState) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
if (buttonState != lastTrueButtonState) { // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem
if(buttonState == true) {
mode++; // přičte k MODE hodnotu 1
buttonTime = millis();
if (mode > 4) mode = 0; // když je mode větší jak 4 tak ho vynuluje
}
lastTrueButtonState = buttonState; // uložím si nový pravý ošetřený stav tlačítka
}
}
lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
if(mode == 0) {
// ******* LED1,LED2 vypnuto ********
led1svetlo = false; // zhasni LED1
led2svetlo = false; // zhasni LED2
lcd.setCursor( 3, 2 ); // nastavení kursoru na šestý znak, třetí řádek
lcd.print(" jsme zhasnute "); // vypsání textu na lcd
lcd.setCursor( 1, 3 );
lcd.print("Mode 0");
}
if(mode == 1) {
// ******* LED1,LED2 zapnuto ********
buttonStateStart = digitalRead(buttonStart); // nacteni aktualniho stavu tlacitka
if(buttonStateStart == 0 && lastButtonStart == 1) { // je-li ted stisknuto tlacitko a zaroven predtim nebylo
led1svetlo = !led1svetlo; // zhasni nebo rožni LED1
led2svetlo = !led2svetlo; // zhasni nebo rožni LED2
if(!led1svetlo && !led2svetlo) { // když je stav led "takový" vypiš na lcd
lcd.setCursor( 3, 2 ); // nastavení kursoru na šestý znak, třetí řádek
lcd.print(" jsme zhasnute"); // vypsání textu na lcd
}
else { // jinak vypiš "takový" stav led na lcd
lcd.setCursor( 3, 2 ); // nastavení kursoru na šestý znak, třetí řádek
lcd.print(" uz svitime !"); // vypsání textu na lcd
}
}
lastButtonStart = buttonStateStart; // uloz aktualni stav tlacitka jako minuly stav
lcd.setCursor( 1, 3 );
lcd.print("Mode 1");
}
if(mode == 2){
// ******* LED1,LED2 blikání rychlé *******
if(millis() - buttonTime > 10000){ // zjistím si jestli je čas něco provést, uběhlo už 10s od poslední akce?
lcd.setCursor( 0, 1 );
lcd.print(" LED1,LED2 ");
lcd.setCursor ( 5, 2 );
lcd.print("blikame rychle");
aktualniMillis = millis(); // podívám se na hodinky - aktuální čas
if(aktualniMillis - predchoziMillis1 > 200) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 200ms od poslední akce?
if (led1svetlo) {
led1svetlo = false; // zhasnu LED1
led2svetlo = false; // zhasnu LED2
} else {
led1svetlo = true; // rožnu LED1
led2svetlo = true; // rožnu LED2
}
predchoziMillis1 = aktualniMillis; // v tento čas jsem provedl poslední akci
}
} else {
// vypis : "blikat začneme" - jestli chci vědět jak dlouho budu ještě čekat, tak vypíšu 10000 - (millis() - buttonTime)
lcd.setCursor ( 1, 1 );
lcd.print("blikat zacneme");
lcd.setCursor( 5, 2 );
lcd.print(" za ");
lcd.setCursor( 9, 2 );
lcd.print(10000 - (millis() - buttonTime)); // zobrazí se odpočet do blikání led v ms
lcd.setCursor( 13, 2 );
lcd.print(" ms ");
lcd.setCursor( 1, 3 );
lcd.print("Mode 2");
}
}
if(mode == 3) {
// ******* LED1,LED2 blikání pomalé *******
aktualniMillis = millis(); //podívám se na hodinky - aktuální čas
if(aktualniMillis - predchoziMillis2 > 500) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms od poslední akce?
if (led2svetlo) {
led1svetlo = false; // zhasnu LED1
led2svetlo = false; // zhasnu LED2
} else {
led1svetlo = true; // rožnu LED1
led2svetlo = true; // rožnu LED2
}
predchoziMillis2 = aktualniMillis; // v tento čas jsem provedl poslední akci
}
lcd.setCursor( 0, 1 );
lcd.print(" LED1,LED2 ");
lcd.setCursor( 5, 2 );
lcd.print("blikame pomalu");
lcd.setCursor( 1, 3 );
lcd.print("Mode 3");
}
if(mode == 4) {
// ******* LED1,LED2 blikání střídavé *******
aktualniMillis = millis(); //podívám se na hodinky - aktuální čas
if(aktualniMillis - predchoziMillis3 > 300) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 300ms ?
led1svetlo = !led1svetlo; // do proměnné led1svetlo zapíšu její negovanou hodnotu, tj. svítila-li LED1 tak zhasne, byla-li zhaslá rožne se
led2svetlo = !led1svetlo; // do proměnné led2svetlo zapíšu negovanou hodnotu led1svetlo, tj. pokud LED1 svítí chci LED2 zhaslou a naopak
predchoziMillis3 = aktualniMillis; // v tento čas jsem provedl poslední akci
lcd.setCursor( 1, 1 );
lcd.print("LED1,LED2");
lcd.setCursor( 3, 2 );
lcd.print("blikame stridave");
lcd.setCursor( 1, 3 );
lcd.print("Mode 4");
}
}
digitalWrite(LED1,led1svetlo); // aktualizace stavu LED1, zápis proměnné led1svetlo na výstupní pin 10
digitalWrite(LED2,led2svetlo); // aktualizace stavu LED2, zápis proměnné led2svetlo na výstupní pin 11
}
děkuju a mrkněte na videa