Mini CNC osa Z
Re: Mini CNC osa Z
Mno já mám zapojeno. Program jsem začal psát od začátku a postupně do něj nakopíroval většinu tvého kódu. Zatím neřeštím zpožděné spuštění jednoho mode a LCD displej. Ale já už blikám
Re: Mini CNC osa Z
dobrý den, moje gratulace pro kiRRow , no já se učím, ale zatím ... , ale když se nedaří, tak něco přeci .
V kodu jsem se pokusil dodělat debounce, radši jsem ho zakomentoval, jelikož mám někde chybu a nechodí to ? Co se naopak povedlo, v mode==1, jak jsem chtěl a bylo navrženo start/stop nebo zap/vyp ledek v mode + výpis na lcd display. mode==2 jsem nechal raději tak, jak je. Úspěch jen poloviční Mode==3 a mode==4, tak tam je, že po stisknutí tlačítka buttonStart se zastaví blikání v mode. A úspěšně jsem na lcd nechal výpisovat co se děje.
Tady je odkaz na video : https://www.youtube.com/watch?v=ghI27mlX3zc
a tady kod :
děkuju
V kodu jsem se pokusil dodělat debounce, radši jsem ho zakomentoval, jelikož mám někde chybu a nechodí to ? Co se naopak povedlo, v mode==1, jak jsem chtěl a bylo navrženo start/stop nebo zap/vyp ledek v mode + výpis na lcd display. mode==2 jsem nechal raději tak, jak je. Úspěch jen poloviční Mode==3 a mode==4, tak tam je, že po stisknutí tlačítka buttonStart se zastaví blikání v mode. A úspěšně jsem na lcd nechal výpisovat co se děje.
Tady je odkaz na video : https://www.youtube.com/watch?v=ghI27mlX3zc
a tady 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;
// 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í
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
/* //-------------- 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) {
buttonTime2 = millis();
}
lastTrueButtonState = 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 ********
led1svetlo = false; // zhasni LED1
led2svetlo = false; // zhasni LED2
lcd.setCursor( 3, 2 ); // nastavení kursoru na čtvrtý 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) { // vypiš stav led na lcd
lcd.setCursor( 3, 2 ); // nastavení kursoru na šestý znak, třetí řádek
lcd.print(" jsme zhasnute"); // vypsání textu na lcd
}
else { // vypiš 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é *******
if(digitalRead(buttonStart) == false) {
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(digitalRead(buttonStart) == true) {
lcd.setCursor( 3, 2 );
lcd.print(" blikani STOP ! ");
}
}
if(mode == 4) { // ******* LED1,LED2 blikání střídavé *******
if(digitalRead(buttonStart) == false) {
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");
}
if(digitalRead(buttonStart) == true) {
lcd.setCursor( 3, 2 );
lcd.print(" blikani 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
}
Re: Mini CNC osa Z
počti tady tohle https://arduino.cz/objektove-orientovan ... amovani-i/
naprogramujeme potom třídu "Button" (tlačítko), bude umět sedět na nějakém pinu, ošetřovat si sama sobě debounce a na dotaz nám řekne co se s tlačítkem děje. Kdykoliv potom budeš chtít přidat tlačítko, jednoduše přes třídu vytvoříš nový objekt. Až třídu odladíme, tak z ní můžeme udělat knihovnu. Potom ji můžeš použít v jakémkoliv budoucím projektu. Už nikdy více debounce
naprogramujeme potom třídu "Button" (tlačítko), bude umět sedět na nějakém pinu, ošetřovat si sama sobě debounce a na dotaz nám řekne co se s tlačítkem děje. Kdykoliv potom budeš chtít přidat tlačítko, jednoduše přes třídu vytvoříš nový objekt. Až třídu odladíme, tak z ní můžeme udělat knihovnu. Potom ji můžeš použít v jakémkoliv budoucím projektu. Už nikdy více debounce
Re: Mini CNC osa Z
dobrý den, třída "Button" ? a knihovna ? a ještě tlačítko na dotaz řekne co se s ním děje ? To zní velmi, velmi lákavě a rád se tohle naučím, už se těším ! No stejně by mě zajímalo, kde je problém s tím debounce pro tlačítko Start ? Zakomentoval jsem ho spíše proto, že nevím jak a kde na něho navázat s kódem , případně v kódech budoucích ? Myslím si že navázat mám tam, kde je koment // Pokud se stav tlačítka změnil tj. porovná se buttonState ... a pak jsou tam ještě hodnoty, které se ukládají pro další průchod loopem ? Někdy můžou být na konci kódu, jindy už výš v kódu ? Změnit proměnné jsem snad zvládnul, některé změnil možná i zbytečně ? Děkuju
Re: Mini CNC osa Z
V článku " objektově orientované programování " od Zbyška Vody viz. výše je taky mj. uvedena v příkladu kódu složená závorka a za ní středník !
Vzpomněl jsem si, kde jsem to viděl !
Bylo to v článku od gilhad http://robodoupe.cz/2018/drobnicky-006- ... e-klikacu/.
Jo a v Klikaču jsou tři tlačítka Up, Down,push , o nich se zmiňuje i kiRRow v souvislosti s vylepšením kódu u mode do budoucna / snad jsem to pochopil správně /
a taky ošetření Debounce - tlačítka tam klikají jak o život
Vzpomněl jsem si, kde jsem to viděl !
Bylo to v článku od gilhad http://robodoupe.cz/2018/drobnicky-006- ... e-klikacu/.
Jo a v Klikaču jsou tři tlačítka Up, Down,push , o nich se zmiňuje i kiRRow v souvislosti s vylepšením kódu u mode do budoucna / snad jsem to pochopil správně /
a taky ošetření Debounce - tlačítka tam klikají jak o život
Re: Mini CNC osa Z
Jelikož je kód z větší části tvůj, já ho jen více méně uklidil a přidal něco málo pro budoucí použití. Zatím je vše v jednom souboru. Ale už teď můžeš celou tu class Button{ ... }; přesunout do souboru s koncovlou *.h, tento soubor musí být v samé složce jako sketch, pak jej můžeš vložit do sketche skoro jako knihovnu pomocí #include "jmenoSouboru.h" - pozor opravdu jsou tam uvozovky a ne <>
... výpis chodí do seriové linky ...
další metody které nejsou v kódu ukázány
tlacitkoStart.getState() - Vrátí ti právě aktuální hodnotu tlačítka - tu debouncnutou samozřejmě - Pokud je tlačítko HIGH vrací TRUE
tlacitkoStart.isFalling() - V podstatě opak metody isRising - vrátí ti TRUE v momentě kdy dojde k přechodu na tlačítku z HIGH na LOW
tlacitkoStart.isChange() - Tady se objeví TRUE pokaždé když dojde ke změně na tlačítku ... při stisku i při puštění
a jak se přidá další tlačítko ? ... tam kde volám konstruktory, prostě přidám jeden řádek navíc ... tam kde probíhaj updaty tlačítek, tam přidám taky další řádek navíc ... a kdekoliv pak v loopu už můžu s tlačítkem pomocí metod pracovat.
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
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
// 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);
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.");
}
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
}
if(tlacitkoSelect.isRising()){
mode = (mode + 1) % 5;
vypisLinku = true; // došlo ke změně, je potřeba provést nový výpis na RS232
}
/*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*/
}
další metody které nejsou v kódu ukázány
tlacitkoStart.getState() - Vrátí ti právě aktuální hodnotu tlačítka - tu debouncnutou samozřejmě - Pokud je tlačítko HIGH vrací TRUE
tlacitkoStart.isFalling() - V podstatě opak metody isRising - vrátí ti TRUE v momentě kdy dojde k přechodu na tlačítku z HIGH na LOW
tlacitkoStart.isChange() - Tady se objeví TRUE pokaždé když dojde ke změně na tlačítku ... při stisku i při puštění
a jak se přidá další tlačítko ? ... tam kde volám konstruktory, prostě přidám jeden řádek navíc ... tam kde probíhaj updaty tlačítek, tam přidám taky další řádek navíc ... a kdekoliv pak v loopu už můžu s tlačítkem pomocí metod pracovat.
Re: Mini CNC osa Z
dobrý den, je to úžasné , vyzkoušel jsem kod - to nemá chybu ! stručné,krátké,přesné, nachystáno do budoucna, jak již bylo několikrát zmíněno kiRRow ...atd.
Tady je pro zajímavost
print screen seriového monitoru, kdy jsem pro ukázku otočil všechny čtyři mode : https://ctrlv.cz/UKTp
a kolik projekt zabírá místa od kiRRow : https://ctrlv.cz/LeQN
a kolik projekt zabírá místa ode mě : https://ctrlv.cz/whSn
při procházení kodu jsem narazil na tohle :, předpokládám , že je to překlep v komentu kodu ? děkuju Hanz
a stále mě zajímá ta chyba v kodu výše, kde je zakomentované debounce ?
Tady je pro zajímavost
print screen seriového monitoru, kdy jsem pro ukázku otočil všechny čtyři mode : https://ctrlv.cz/UKTp
a kolik projekt zabírá místa od kiRRow : https://ctrlv.cz/LeQN
a kolik projekt zabírá místa ode mě : https://ctrlv.cz/whSn
při procházení kodu jsem narazil na tohle :
Kód: Vybrat vše
boolean fall; // změna z HIGH na LOWoo
a stále mě zajímá ta chyba v kodu výše, kde je zakomentované debounce ?
Re: Mini CNC osa Z
Kód: Vybrat vše
/* //-------------- 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) {
buttonTime2 = millis();
//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
}
lastTrueButtonState = 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 ----------*/
Když zkompiluješ třídu, tak při kompilaci se vytvoří jen jeden kus kódu, který ale místo proměnných bude používat ukazatele do paměti. Když tu část kódu bude používat jedno tlačítko, tak ukazatele budou ukazovat na jiné místo, než když ho bude používat tlačítko druhé. Hodně místa mi taky ušetřilo použití jen jedné proměnné na uložení poslední akce. Vím, že se můžu dostat vždy jen do jednoho mode, proto můžu pro všechny použít jednu společnou proměnnou.
---
jo a to LOWoo je samozřejmě překlep
Re: Mini CNC osa Z
Jen tak mimochodem. Ta třída se dá použít i na jiné věci než na tlačítko. Půjde třeba i na různé senzory, které dávají na výstupu LOW nebo HIGH a kmitají ... nebo potřebuješ aby ti program zareagoval jen na senzor, který je sepnutý určitou dobu ... (nevýhoda je, že aby zareagoval znovu, musí být i rozepnutý stejnou dobu - to dělá ten debounce ... ale absolutně nic nebrání tomu, aby se vytvořila nová metoda reset() ...)
mno 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 ... má to svoje vlastnosti/atributy (většinu z nich jsi zapsal ty, já tam jen něco dodal), má to konstruktor, ten jsem vlastně taky zkopíroval a něco dodal ... kód, který to pohání (nejhlavnější metoda uptade()) je tvůj až na tohle :
a zbývající metody jen vrací hodnoty, protože jsou ty hodnoty privátní a jinak se knim nejde dostat
je důležité, abys chápal ty tři řádky
mno 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 ... má to svoje vlastnosti/atributy (většinu z nich jsi zapsal ty, já tam jen něco dodal), má to konstruktor, ten jsem vlastně taky zkopíroval a něco dodal ... kód, který to pohání (nejhlavnější metoda uptade()) je tvůj až na tohle :
Kód: Vybrat vše
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
je důležité, abys chápal ty tři řádky
Re: Mini CNC osa Z
všiml jsem si toho až teď ... u toho tvého kódu ... lastTrueButtonState = buttonStateStart; // uložím si nový pravý ošetřený stav tlačítka ...... máš tam špatnou proměnnou ... lastTrueButtonStart tam má být ... projeď si to celé jestli tam nemáš ještě něco takovýho podobnýho
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 7 hostů