Mini CNC osa Z
Re: Mini CNC osa Z
dobrý den, přesunul jsem class Button a to tak , že jsem ze sketche zkopíroval vybraný kod do poznámkového bloku a přejmenoval koncovku souboru *.txt na *.h
Aby mi W10 ukázaly příponu, tak podle tohoto : https://wintip.cz/515-jak-zobrazit-pripony-souboru
a takhle to vypadá : https://ctrlv.cz/JFFc - přejmenovaný soubor na .h
https://ctrlv.cz/QIIW - soubor.h + sketch
Aby mi W10 ukázaly příponu, tak podle tohoto : https://wintip.cz/515-jak-zobrazit-pripony-souboru
a takhle to vypadá : https://ctrlv.cz/JFFc - přejmenovaný soubor na .h
https://ctrlv.cz/QIIW - soubor.h + sketch
Re: Mini CNC osa Z
dobrý den, v předešlé odpovědi, kde jsme narazili na objektově orientované programování je otázka, které moc nerozumím ?
tam je ale vypsáno, že Alik steka Haf! děkuju za vysvětlení
když jsem si to vyzkoušel , tak seriový monitor vypsal tohle : https://ctrlv.cz/RfcOmno a teď je otázka ... chápeš, proč nám to tlačítko neštěká, že se jmenuje Alík ? ... zkonstruováno je to skoro jako třída Pes ...
tam je ale vypsáno, že Alik steka Haf! děkuju za vysvětlení
Re: Mini CNC osa Z
No občas jsem rýpavej a sarkastickej, nenech se tím rozhodit
Re: Mini CNC osa Z
dobrý den, upravil jsem kod, který po stisknutí a držení tlačítka Start zastavil blikání led v mode. Na doporučení podle kiRRow ze dne 10.1.2020 16:16 hod.je teď upraveno, že při stisknutí tlačítka Start ve všech mode , vyjma mode2, se provede STOP nebo START blikání . Přidána proměnná mamBezet. Stavy mode a stav tlačítka Start jsou vypsány na lcd.
tady video : https://www.youtube.com/watch?v=rF146CnL_pI
tady upravený kod :
s těmi výpisy si musím ještě trošku pohrát , aby nebyly vypisovány prázdné pole
prosím o kontrolu a připomínky. Ještě snad se pokusím v mode2 taky doplnit start/stop a snad taky třetí tlačítko kdy se bude měnit směr mode, tedy od mode==4; do mode==0; nebo když bude stisknuto. děkuju
na OOProgramování nezapomínám
tady video : https://www.youtube.com/watch?v=rF146CnL_pI
tady upravený kod :
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;
boolean lastTrueButtonStart = false;
boolean mamBezet = 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 lastDebounceTime2 = 0;
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
long buttonTime2;
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í
Serial.begin(9600); // konfigurace rychlosti seriového portu
Serial.println("Seriovy port aktivni"); // První výpis na seriový port
lcd.setCursor ( 0, 1 ); // nastavení kursoru na druhý znak, druhý řádek
lcd.print(" LED1,LED2 "); // vypsání textu na lcd
lcd.setCursor( 1, 3);
lcd.print("All ready");
delay(2000);
}
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
//-------------- debounce pro tlačítko START ----------
buttonStateStart = digitalRead(buttonStart); // přečtení stavu tlačítka
if (buttonStateStart != lastButtonStart) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
lastDebounceTime2 = millis();
}
if ((millis() - lastDebounceTime2) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
if (buttonStateStart != lastTrueButtonStart) { // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem
if (buttonStateStart == true) {
mamBezet = !mamBezet;
buttonTime2 = millis();
Serial.println("START"); // výpis na seriový monitor
}
// TADY CHYBÍ CO SE MÁ PROVÉST PŘI STISKU TLAČÍTKA START ... U MODE SE PŘIČÍTÁ MODE ...
// ...U STARTU BY SE MĚLA PŘEKLÁPĚT PROMĚNNÁ mamBezet - hoď si tu nějaký výpis do seriové linky a uvidíš že to funguje
}
lastTrueButtonStart = buttonStateStart; // uložím si nový pravý ošetřený stav tlačítka
}
lastButtonStart = buttonStateStart; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
//-------------- konec ořetření tlačítka Start ----------
if(mode == 0) { // ******* LED1,LED2 vypnuto ********
if(mamBezet == true){
led1svetlo = false; // zhasni LED1
led2svetlo = false; // zhasni LED2
lcd.setCursor( 12, 2 );
lcd.print("STOP ");
} else {
lcd.setCursor( 12, 2 );
lcd.print("START");
}
lcd.setCursor( 1, 3 );
lcd.print("MODE 0 ");
}
if(mode == 1) { // ******* LED1,LED2 zapnuto ********
if(mamBezet == true){
led1svetlo = true;
led2svetlo = true;
lcd.setCursor( 12, 2 );
lcd.print("START");
}
else {
led1svetlo = false;
led2svetlo = false;
lcd.setCursor( 12, 2 );
lcd.print("STOP ");
}
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(" START ");
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( 6, 2 );
lcd.print(" za ");
lcd.setCursor( 10, 2 );
lcd.print(10000 - (millis() - buttonTime)); // zobrazí se odpočet do blikání led v ms
lcd.setCursor( 14, 2 );
lcd.print(" ms ");
lcd.setCursor( 1, 3 );
lcd.print("Mode 2");
}
}
if(mode == 3) { // ******* LED1,LED2 blikání pomalé *******
if(mamBezet == true){
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(" START ");
} else {
led1svetlo = false;
led2svetlo = false;
lcd.setCursor( 5, 2);
lcd.print(" STOP ");
}
lcd.setCursor( 1, 3 );
lcd.print("MODE 3 ");
}
if(mode == 4) { // ******* LED1,LED2 blikání střídavé *******
if(mamBezet == true){
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( 12, 2 );
lcd.print("START");
} else {
led1svetlo = false;
led2svetlo = false;
lcd.setCursor( 12, 2 );
lcd.print("STOP ");
}
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
}
prosím o kontrolu a připomínky. Ještě snad se pokusím v mode2 taky doplnit start/stop a snad taky třetí tlačítko kdy se bude měnit směr mode, tedy od mode==4; do mode==0; nebo když bude stisknuto. děkuju
na OOProgramování nezapomínám
Re: Mini CNC osa Z
tím, že je spouštěcí tlačítko Start ... tak z tlačítka Select je nutno řádek "buttonTime = millis();" přemístit do tlačítka Start příjde to místo "buttonTime2 = millis();" ... buttonTime2 vůbec nepotřebuješ.
Jak přidat Start/Stop do mode 2 ?
1) výjmu všechno co mám v mode 2 aby mi zbylo jen :
2) dopíšu si tam vnitřní podmínku mamBezet a dostanu :
3) vrátím to co jsem výjmul :
Jak přidat Start/Stop do mode 2 ?
1) výjmu všechno co mám v mode 2 aby mi zbylo jen :
Kód: Vybrat vše
if(mode == 2){ // ******* LED1,LED2 blikání rychlé *******
}
Kód: Vybrat vše
if(mode == 2){ // ******* LED1,LED2 blikání rychlé *******
if(mamBezet == true){
} else {
}
}
Kód: Vybrat vše
if(mode == 2){ // ******* LED1,LED2 blikání rychlé *******
if(mamBezet == true){
// tady vrátím to co jsem výjmul
} else {
// tady napíšu že led1 a led2 jsou zhaslé
}
}
Re: Mini CNC osa Z
dobrý den, jak bylo avizováno, upravil a zjednodušil jsem výpisy na lcd displej. Doplněno i start/stop do mode2.
Nyní je tedy plně funkční kod : Start / Stop blikání led v mode s výpisem na 20x4 lcd
třetím tlačítkem jsem se zatím nezabýval, dokončoval jsem tento kod
a taky pro srovnání přidával ke kodu ze dne 13.ledna 2020, 16:26 výpisy na lcd, zajímalo mě jak to bude chodit ?
- zjištění chodí to Super a u výpisu jsem zadával pouze umístění prvního znaku ve větě ?!, žádné další pozice a přepisování prázdnýma polema ? nevím, snad je to tím, že se slova ve výpisu řadí za sebe tak, jak jdou v kodu - větě
netušil jsem, že to půjde tak hladce a bude stačit jen vyměnit serial za lcd v kodu ?!
Bomba tady je kod s třídou Button :
snad je všechno v pořádku ? a netvrdím bludy ? později přidám i video. Snad, všiml jsem si, že u mode2 tady není v kodu to 10 sekundové časování do startu blikání ? děkuju
Nyní je tedy plně funkční kod : Start / Stop blikání led v mode s výpisem na 20x4 lcd
Kód: Vybrat vše
#define buttonSelect 2 // číslo pinu tlačítka SELECT pro výběr MODE červené
#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;
boolean lastTrueButtonStart = false;
boolean mamBezet = false;
unsigned long lastDebounceTime = 0; // čas posledního změny výstupního pinu
unsigned long lastDebounceTime2 = 0;
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í
Serial.begin(9600); // konfigurace rychlosti seriového portu
Serial.println("Seriovy port aktivni"); // První výpis na seriový port
lcd.setCursor( 2, 1);
lcd.print("ready");
delay(1000);
}
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
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
//-------------- debounce pro tlačítko START ----------
buttonStateStart = digitalRead(buttonStart); // přečtení stavu tlačítka
if (buttonStateStart != lastButtonStart) { // kmita to, od minule se to zmenilo, zacnu debounce cas pocitat znovu (tedy od posledni zmeny, ktera je ted)
lastDebounceTime2 = millis();
}
if ((millis() - lastDebounceTime2) > debounceDelay) { // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
if (buttonStateStart != lastTrueButtonStart) { // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem
if (buttonStateStart == true) {
mamBezet = !mamBezet;
buttonTime = millis();
Serial.println("START"); // výpis na seriový monitor
}
// TADY CHYBÍ CO SE MÁ PROVÉST PŘI STISKU TLAČÍTKA START ... U MODE SE PŘIČÍTÁ MODE ...
// ...U STARTU BY SE MĚLA PŘEKLÁPĚT PROMĚNNÁ mamBezet - hoď si tu nějaký výpis do seriové linky a uvidíš že to funguje
}
lastTrueButtonStart = buttonStateStart; // uložím si nový pravý ošetřený stav tlačítka
}
lastButtonStart = buttonStateStart; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
//-------------- konec ořetření tlačítka Start ----------
if(mode == 0) { // ******* LED1,LED2 vypnuto ********
if(mamBezet == true){
led1svetlo = false; // zhasni LED1
led2svetlo = false; // zhasni LED2
lcd.setCursor( 12, 2 );
lcd.print("STOP ");
} else {
lcd.setCursor( 12, 2 );
lcd.print("START");
}
lcd.setCursor( 2, 1 );
lcd.print("Mode 0");
}
if(mode == 1) { // ******* LED1,LED2 zapnuto ********
if(mamBezet == true){
led1svetlo = true;
led2svetlo = true;
lcd.setCursor( 12, 2 );
lcd.print("START");
}
else {
led1svetlo = false;
led2svetlo = false;
lcd.setCursor( 12, 2 );
lcd.print("STOP ");
}
lcd.setCursor( 2, 1 );
lcd.print("Mode 1");
}
if(mode == 2){ // ******* LED1,LED2 blikání rychlé *******
if(mamBezet == true) {
if(millis() - buttonTime > 10000){ // zjistím si jestli je čas něco provést, uběhlo už 10s od poslední akce?
lcd.setCursor ( 10, 2 );
lcd.print(" START ");
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( 11, 2 );
lcd.print(10000 - (millis() - buttonTime)); // zobrazí se odpočet do blikání led v ms
lcd.setCursor( 15, 2 );
lcd.print(" ms");
}
} else {
lcd.setCursor( 11, 2 );
lcd.print(" STOP ");
led1svetlo = true;
led2svetlo = true;
}
lcd.setCursor( 2, 1 );
lcd.print("Mode 2");
}
if(mode == 3) { // ******* LED1,LED2 blikání pomalé *******
if(mamBezet == true){
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( 5, 2 );
lcd.print(" START ");
} else {
led1svetlo = false;
led2svetlo = false;
lcd.setCursor( 12, 2);
lcd.print("STOP ");
}
lcd.setCursor( 2, 1 );
lcd.print("Mode 3");
}
if(mode == 4) { // ******* LED1,LED2 blikání střídavé *******
if(mamBezet == true){
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( 12, 2 );
lcd.print("START");
} else {
led1svetlo = false;
led2svetlo = false;
lcd.setCursor( 12, 2 );
lcd.print("STOP ");
}
lcd.setCursor( 2, 1 );
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
}
a taky pro srovnání přidával ke kodu ze dne 13.ledna 2020, 16:26 výpisy na lcd, zajímalo mě jak to bude chodit ?
- zjištění chodí to Super a u výpisu jsem zadával pouze umístění prvního znaku ve větě ?!, žádné další pozice a přepisování prázdnýma polema ? nevím, snad je to tím, že se slova ve výpisu řadí za sebe tak, jak jdou v kodu - větě
netušil jsem, že to půjde tak hladce a bude stačit jen vyměnit serial za lcd v kodu ?!
Bomba tady je kod s třídou Button :
Kód: Vybrat vše
class Button
{
private:
byte buttonPin; // pin na kterém je tlačítko připojeno
boolean buttonState; // nejnovější hodnota načtená ze vstupního pinu
boolean lastButtonState; // minulá hodnota načtená ze vstupního pinu
boolean lastTrueButtonState = false; // předchozí hodnota ošetřeného tlačítka
unsigned long lastDebounceTime; // čas posledního změny výstupního pinu
unsigned int debounceDelay; // čas debounce prodlevy - tady jsem to změnil na int, zabere to méně místa a myslím že 65535ms na max debounce stačí
boolean change; // zde si uložíme jestli při kontrole a debounce tlačítka došlo k jeho změně
boolean rise; // změna z LOW na HIGH
boolean fall; // změna z HIGH na LOWoo
public:
Button(byte pin, unsigned int delay){ // Konstruktor - při vytvoření objektu nastaví jeho vlastnosti a přepne jeho pin na vstup
buttonState = false;
lastButtonState = false;
lastTrueButtonState = false;
lastDebounceTime = 0;
change = false;
rise = false;
fall = false;
buttonPin = pin;
debounceDelay = delay;
pinMode(pin, INPUT);
}
void Update(){
buttonState = digitalRead(buttonPin); // 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();
lastButtonState = buttonState; // tady si to ulozim, v dalsim pruchodu loop() to zase porovnam s novym stavem, zda se to mezi tim nezmenilo
}
if((millis() - lastDebounceTime) > debounceDelay){ // jo, uz se to dlouho nezmenilo, tak je to stabilni a spravna hodnota
rise = (buttonState != lastTrueButtonState) && (buttonState == HIGH); // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem + zároveň je HIGH tak rise bude true
fall = (buttonState != lastTrueButtonState) && (buttonState == LOW); // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem + zároveň je LOW tak fall bude true
change = buttonState != lastTrueButtonState; // Pokud se stav tlačítka změnil tj. porovná se buttonState (stav tlačítka) s předchozím stavem bude change true
lastTrueButtonState = buttonState;
}
}
boolean getState(){
return lastTrueButtonState; // vrátí 0 nebo 1 podle stavu tlačítka
}
boolean isRising(){
return rise; // vrátí 1 pouze tehdy pokud v poslední změně doško ke změne z LOW na HIGH
}
boolean isFalling(){
return fall; // vrátí 1 pouze tehdy pokud v poslední změně došlo k změně z HIGH na LOW
}
boolean isChange(){
return change; // 1 vrací jedna při jakékoliv změně na tlačítku
}
};
/*--------------------------------------------------------------------------------------------------*/
#define LED1 10
#define LED2 11
#define TLACITKO_SELECT 2
#define TLACITKO_START 3
#define TLACITKO_DEBOUNCE_TIME 50
#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
int mode = 0;
boolean mamBezet = false; // proměnná na uchování stavu programu jestli je start nebo stop
boolean led1svetlo; // pomocná proměnná led1svetlo
boolean led2svetlo; // pomocná proměnná led2svetlo
unsigned long predchoziMillis;
boolean vypisLinku = true; // proměnná kde si uchovávám jestli je potřeba provést update na seriové lince
boolean vypisLCD = true;
// KONSTRUKCE OBJEKTŮ
Button tlacitkoSelect(TLACITKO_SELECT, TLACITKO_DEBOUNCE_TIME); // tady se volá konstruktor třídy Button - předávám mu PIN a DebounceTime pro dané tlačítko
Button tlacitkoStart(TLACITKO_START, TLACITKO_DEBOUNCE_TIME); // tady se volá konstruktor třídy Button - předávám mu PIN a DebounceTime pro dané tlačítko, každé tlačítko může mít i jiný debounce time
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
lcd.begin(); // inicializace LCD
lcd.backlight(); // zapnutí podsvícení
pinMode(LED1, OUTPUT); // pin pro LED1 nastaven jako výstup
pinMode(LED2, OUTPUT); // pin pro LED2 nastaven jako výstup
delay(10);
Serial.println("Program spuštěn.");
lcd.setCursor( 2, 1);
lcd.print("Program spusten.");
delay(1500);
// lcd.clear();
}
void loop() {
/*TOHLE JE TEĎ NOVĚ OŠETŘENÍ TLAČÍTEK*/
tlacitkoStart.Update(); // tady se volá metoda, která provede debounce tlačítka a zaktualizuje jeho stavy
tlacitkoSelect.Update(); // tady se volá metoda, která provede debounce tlačítka a zaktualizuje jeho stavy
if(tlacitkoStart.isRising()){
mamBezet = !mamBezet;
vypisLinku = true; // došlo ke změně, je potřeba provést nový výpis na RS232
vypisLCD = true;
}
if(tlacitkoSelect.isRising()){
mode = (mode + 1) % 5;
vypisLinku = true; // došlo ke změně, je potřeba provést nový výpis na RS232
vypisLCD = true;
}
/*KONEC OŠETŘENÍ TLAČÍTEK*/
/*PROVEDENÍ MODE*/
if(mode == 0){
if(mamBezet){
led1svetlo = false;
led2svetlo = false;
}
}
if(mode == 1){
if(mamBezet){
led1svetlo = true;
led2svetlo = true;
} else {
led1svetlo = false;
led2svetlo = false;
}
}
if(mode == 2){
if(mamBezet){
if(millis() - predchoziMillis > 1000) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 1000ms ?
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 led1svetlo - chci aby blikali stejně
predchoziMillis = millis(); // v tento čas jsem provedl poslední akci
}
} else {
led1svetlo = false;
led2svetlo = false;
}
}
if(mode == 3){
if(mamBezet){
if(millis() - predchoziMillis > 500) { // nejprve si zjistím jestli je čas něco provést, uběhlo už 500ms ?
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 led1svetlo - chci aby blikali stejně
predchoziMillis = millis(); // v tento čas jsem provedl poslední akci
}
} else {
led1svetlo = false;
led2svetlo = false;
}
}
if(mode == 4){
if(mamBezet){
if(millis() - predchoziMillis > 250) { // 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
predchoziMillis = millis(); // v tento čas jsem provedl poslední akci
}
} else {
led1svetlo = false;
led2svetlo = false;
}
}
/*KONEC PROVEDENI MODE*/
/*OBSLUHA LED*/
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
/*KONEC OBSLUHA LED*/
/*OBSLUHA RS232 - TY BUDEŠ ASI VYPISOVAT NA LCD DISPLAY*/
if(vypisLinku){
Serial.print("MODE : ");
Serial.print(mode);
Serial.print(" - ");
if(mamBezet){
Serial.println("START");
} else {
Serial.println("STOP");
}
vypisLinku = false;
}
/*KONEC OBSLUHY RS232*/
/*OBSLUHA 20x4 LCD DISPLAY*/
if(vypisLCD){
lcd.setCursor( 2, 1); // tady se zadává pozice výpisu 3 znak, 2 řádek
lcd.print("MODE : ");
lcd.print(mode);
lcd.print(" - ");
if(mamBezet){
lcd.print("START");
} else {
lcd.print("STOP ");
}
vypisLCD = false;
}
/*KONEC OBSLUHY 20x4 LCD DISPLAY*/
}
Re: Mini CNC osa Z
dobrý den, slíbené video : Start / Stop blikání led v mode s výpisem na 20x4 lcd i2c
odkaz : https://www.youtube.com/watch?v=ur_biclS8EA&t=13s
odkaz : https://www.youtube.com/watch?v=ur_biclS8EA&t=13s
Re: Mini CNC osa Z
Vypadá to dobře, akorát jsem musel vypnout zvuk ... ta hudba je děs. Už mi to nedělej, prosím .
Zvládneš zakázat měnit mode, když program bliká ? Všimnul jsem si toho když jsi přešel z 1 na 2, že to nezačlo od 10000ms. A divím se, že se nedivíš tomuhle : "mode = (mode + 1) % 5;" . Jo... a proč máš otočený start a stop u mode0 - prostě je chudák takový ... když ho zapneš, tak vypne LEDky ... a když ho vypneš, tak je vypne taky
Ano, časování spuštění mode2 chybí ... v tom co jsem psal já jsem se nezabýval samotným během programu, ale ukazoval jsem jak funkční třídu a jak ji tak nějak přibližně využít v tvém programu. Použil jsem hromadu tvojeho kódu, poznáváš ho snad
Zvládneš zakázat měnit mode, když program bliká ? Všimnul jsem si toho když jsi přešel z 1 na 2, že to nezačlo od 10000ms. A divím se, že se nedivíš tomuhle : "mode = (mode + 1) % 5;" . Jo... a proč máš otočený start a stop u mode0 - prostě je chudák takový ... když ho zapneš, tak vypne LEDky ... a když ho vypneš, tak je vypne taky
Ano, časování spuštění mode2 chybí ... v tom co jsem psal já jsem se nezabýval samotným během programu, ale ukazoval jsem jak funkční třídu a jak ji tak nějak přibližně využít v tvém programu. Použil jsem hromadu tvojeho kódu, poznáváš ho snad
Re: Mini CNC osa Z
dobrý den, za music se omlouvám, budu se snažit ji upravit , kod jsem poznal, ale už jsem neřešil tohle :
"mode = (mode + 1) % 5;" ? Mode0 jsem otočil tady, začíná nyní "Mode 0 STOP" - neuvědomil jsem si
ale pokud přepínám jen jednotlivá mode, tak v jakém stavu skončím tj. Start nebo Stop,
tak mi pokračuje následující mode ?! Takže pokud mode0 Stop , tak stiskáním tlačítka Select bude pořád Stop v dalším a dalším a dalším mode, pokud v jakémkoliv mode nepřepnu tlačítkem Start na Start , tak bude pokračovat mode Start atd.
edit : zkoušel jsem i kod s třídou Button a zdá se mi stejný, tedy to přepínání mode a start stop v mode
"mode = (mode + 1) % 5;" ? Mode0 jsem otočil tady, začíná nyní "Mode 0 STOP" - neuvědomil jsem si
Kód: Vybrat vše
if(mode == 0) { // ******* LED1,LED2 vypnuto ********
if(mamBezet == false){
led1svetlo = false; // zhasni LED1
led2svetlo = false; // zhasni LED2
tak mi pokračuje následující mode ?! Takže pokud mode0 Stop , tak stiskáním tlačítka Select bude pořád Stop v dalším a dalším a dalším mode, pokud v jakémkoliv mode nepřepnu tlačítkem Start na Start , tak bude pokračovat mode Start atd.
tehle otázečce moc dobře nerozumím , ale pokud je myšleno na Objektově Orientované programování, kdy nemusím mít přístup do programu, abych já nebo někdo jiný měnil "knihovnu" , tak to nevím asi jsem to ještě nezkoušel ? A časování v kodu začíná odpočet od 10000. děkujuZvládneš zakázat měnit mode, když program bliká ?
edit : zkoušel jsem i kod s třídou Button a zdá se mi stejný, tedy to přepínání mode a start stop v mode
Re: Mini CNC osa Z
dobrý den, tak už jsem vysledoval - máte pravdu, že na videu první odpočet 10s v mode2 nezačíná jak má. Vyzkoušel jsem a je to tím, že jsem předtím probíhal mode dokola a u mode2 nepočkal až dojde odpočet 10 sekund no při dalším najetí na mode2 se pokračovalo v odpočtu tam, kde se minule přestalo ?! tak by to asi být nemělo, že ? protože nastavený odpočet času je 10s. Dá se to ošetřit ? určitě někde nějak v podmínce ...? děkuju za postřehy a rady
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 4 hosti