zvonacfirst Postat August 28, 2023 Partajează Postat August 28, 2023 Multumesc @nico_2010, dar si varianta ta are migi "galme", ca sa zic asa. Uneori cursorul are mici salturi pe o alta pozitie apoi revine pe pozitia buna. Nu este o trecere cursiva si curata de la o pozitie la alta. Cam acelasi lucru se intampla si in versiunea din postarea mea de mai sus. As putea trai cu asta dar parca este loc de mai bine. Cu delay(100); se comporta mai bine. // Sterge cursorul din poziția curenta lcd.setCursor(0, currentOption + 1); lcd.print(" "); delay(100); // Afiseaza cursorul la noua pozitie lcd.setCursor(0, newPosition + 1); lcd.print(">"); delay(100); Link spre comentariu
nico_2010 Postat August 28, 2023 Partajează Postat August 28, 2023 Acum 34 minute, zvonacfirst a spus: Uneori cursorul are mici salturi pe o alta pozitie apoi revine pe pozitia buna. Nu este o trecere cursiva si curata de la o pozitie la alta. Cam acelasi lucru se intampla si in versiunea din postarea mea de mai sus. Asta se intampla in mediul virtual sau in montajul real? Link spre comentariu
zvonacfirst Postat August 28, 2023 Partajează Postat August 28, 2023 In mediul virtual, montajul pe breadboard este acasa, acum sunt la munca. Dar comportamentul in simulator a fost intotdeauna identic cu cel de pe montaj. Am sa vad diseara ce si cum. Revin cu feedback.. Link spre comentariu
zvonacfirst Postat August 28, 2023 Partajează Postat August 28, 2023 Acum 6 ore, antemir a spus: Libraria aleasă nu prea este făcută pentru "meniul" tău. Am biblioteca Encoder.h care este disponibila pe GitHub. Ce alta biblioteca as putea folosi? Mai am si ClickEncoder.h dar nu am studiat-o. Intre timp am parasit rationamentul sketch-ului anterior si am reluat proiectul stabilind din start ca trebuie sa identific sensul de rotatie al encoderului si sa ajustez sensibilitatea in asa fel incat sa am o miscare curata a cursorului. Iar acel cursor trebuie sa nu se mai miste in bucla. Scap in acest fel de problema valorii negative returnate de encoder. Am identificat si valoarea absoluta a valorii encoderului din acelasi motiv. Poate vi se par chestii redundante dar... Posibil sa vi se para complicat acest sketch pentru ceea ce face. Scuzati comentariile excesive, am un amic care este mai nepriceput ca mine si vrea sa inteleaga ce face fiecare linie sau sectiune de cod. https://wokwi.com/projects/374334366384857089 Link spre comentariu
daniels Postat August 28, 2023 Partajează Postat August 28, 2023 Acum 10 minute, zvonacfirst a spus: Ce alta biblioteca as putea folosi? https://github.com/mathertel/RotaryEncoder Link spre comentariu
zvonacfirst Postat August 28, 2023 Partajează Postat August 28, 2023 Multumesc @daniels. Eu folosesc aceasta biblioteca. Link spre comentariu
daniels Postat August 28, 2023 Partajează Postat August 28, 2023 Era un ceas unde prin meniu te miscai cu un encoder. Link spre comentariu
Kreator Postat August 29, 2023 Partajează Postat August 29, 2023 (editat) Cred ca functia "encoder" foloseste delay(). Tot într-un proiect asemănător am renuntat la ea din acest motiv dar am folosit intreruperi "on change" pe pinii corespunzatori. Astfel programul reactioneaza la oricat de repede invarti de encoder fara a pierde pasi. LE Am pus si doi conzi de 10n in paralel cu contactele. Editat August 29, 2023 de Kreator Link spre comentariu
zvonacfirst Postat August 31, 2023 Partajează Postat August 31, 2023 La 29.08.2023 la 19:36, antemir a spus: Daca vrei să folosești în continuare asta, poți incerca asa: Multumesc @antemir, scuze pentru raspunsul intarziat, sunt in concediu. Da, codul furnizat de tine functioneaza si cred ca stiai deja asta. Mi-am permis sa fac o modificare care mi-a venit in minte pe moment: am eliminat bucla de miscare a cursorului, similar cu un buton de volum. Mi se pare mult mai intuitiv asa. #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <Encoder.h> #define LCD_ADDRESS 0x27 #define NUM_OPTIONS 3 const char* options[NUM_OPTIONS] = { "Optiunea 1", "Optiunea 2", "Optiunea 3" }; #define ENCODER_PIN_A 3 #define ENCODER_PIN_B 2 #define ENCODER_BUTTON_PIN 4 LiquidCrystal_I2C lcd(LCD_ADDRESS, 20, 4); Encoder encoder(ENCODER_PIN_A, ENCODER_PIN_B); int currentOption = 0; int old_val = 0; bool dir_CW = false; int newPosition = 0; void setup() { lcd.init(); lcd.backlight(); lcd.setCursor(7, 0); lcd.print("MENIU"); for (int i = 0; i < NUM_OPTIONS; ++i) { lcd.setCursor(1, i + 1); lcd.print(options[i]); } lcd.setCursor(0, 1); lcd.print(">"); pinMode(ENCODER_BUTTON_PIN, INPUT_PULLUP); } bool rotary_move() { static bool am_new_val = false; static uint32_t timeD; int new_val = encoder.read(); if (new_val != old_val) { dir_CW = new_val > old_val; old_val = new_val; timeD = millis(); am_new_val = true; return false; } else if (am_new_val && millis() - timeD > 50) { am_new_val = false; return true; } return false; } void loop() { if (rotary_move()) { newPosition += dir_CW ? +1 : -1; if (newPosition > NUM_OPTIONS - 1) { newPosition = NUM_OPTIONS - 1; } else if (newPosition < 0) { newPosition = 0; } // Limit the newPosition to be within 0 and NUM_OPTIONS - 1 newPosition = constrain(newPosition, 0, NUM_OPTIONS - 1); lcd.setCursor(0, currentOption + 1); lcd.print(" "); lcd.setCursor(0, newPosition + 1); lcd.print(">"); currentOption = newPosition; } } Codul lui @antemir modificat de mine poate fi testat in simulator: https://wokwi.com/projects/374555947819729921 Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum