Sari la conținut
ELFORUM - Forumul electronistilor

Nu imi merge programul


Postări Recomandate

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
  • Răspunsuri 23
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

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
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

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 de Kreator
Link spre comentariu
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. :reytre

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări