Rotary encoder with push button - Arduino for beginners

Discutii despre placile de dezvoltare compatibile Arduino
User avatar
Levy
Gold User
Posts: 1581
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Rotary encoder with push button - Arduino for beginners

Unread postby Levy » 02 Oct 2021 16:33

Dupa cum scrie in titlu, astazi ne ocupam de un rotary encoder.
Pentru a intelege cum functioneaza, vom folosi probabil cel mai simplu cod posibil si cea mai simpla schema electrica.

Encoderul rotativ, in acest caz va numara pasii (contactele inchise si deschise) in crestere daca-l rotim in sensul acelor de ceasornic, de la 0 la 100, iar in cazul in care rotim invers acelor de ceasornic, va numara in scadere.
Daca trecem de limita (aleasa) de 100, va sari de la 100 la 0 si va incepe numaratoarea in sus daca continuam in acelas sens sa-l rotim.
Daca rotim in sensul scaderii numaratorului, si va asjunge sub 0 va sari automat la 100 de unde va scadea din nou valoarea numaratorului daca continuam sa rotim in continuare in acelasi sens.

Aceasta simpla aplicatie poate fi deosebit de utila, de exemplu in cazul unui radio FM care in loc de condensator variabil, sau potentiometru, va folosi encoderul rotativ pentru schimbarea frecventei pe care vrem sa o receptionam. Acesta va fi urmatorul proiect, care este realizat deja, insa inca nu i-am facut schemele, documentatia si videoclipul pe youtube. Probabil zilele urmatoare va aparea si acel proiect, tot aici.
O alta aplicatie ar putea fi reglarea unei tensiuni in pasi mici prestabiliti, la un alimentator care sa poata avea tensiunea variabila. Acesta este si motivul pentru care in codul pentru rotary encoder nu am folosit

Code: Select all

count = ++;
ci am folosit +1, pentru ca acesta se poate inlocui de exemplu cu 0.1 sau chiar si 0.01 si in acest caz numaratorul va putea sa faca valori si cu zecimale, foarte util in cazul reglarii frecventei la radio, si chiar si in cazul in care vrem sa folosim si la un alimentator cu tensiune reglabila.

In teorie aplicatiile pot fi nelimitate, doar fantezia fiecaruia poate fi limita in cazul unui encoder rotativ.
Se poate folosi pentru masurarea distantei, daca pe encoder punem un cerc (roata) la care sa numere clickurile si sa stim distanta pe care roata o face intre doua clickuri. In acest caz poate afisa pe un ecran LCD de exemplu distanta parcursa de acea roata.

Un alt exemplu de utilizare ar fi reglarea unui modul RTC (real time clock) in cazul in care se deregleaza in timp. De exemplu la apasarea butonului de pe encoder sa regleze ora, la urmatoarea apasare sa regleze minutul si tot asa, ultima apasare de buton sa incarce ora exacta in RTC si astfel cu un singur encoder putem realiza reglarea unui ceas digital.

Nu mai continui cu asemenea exemple, le-am descris putin, pentru a se vedea cat de diferite pot fi domeniile in care acest encoder rotativ se poate folosi.

In acest caz am folosit un arduino nano, insa se poate folosi orice alta versiune compatibila, sau chiar si variante ale ESP care sint compatibile arduino.

Schema electrica pe care am folosit-o este extrem de simpla si o puteti vedea aici:

Image

iar codul i-l puteti avea de aici:

Code: Select all

#define CLK 2
#define DT 3
#define SW 4

int currentStateCLK;
int lastStateCLK;
int counter = 0;

String currentDir ="";
unsigned long lastButtonPress = 0;

void setup()
     {
         pinMode(CLK,INPUT);
         pinMode(DT,INPUT);
         pinMode(SW, INPUT_PULLUP);
         Serial.begin(9600);
         lastStateCLK = digitalRead(CLK);
        Serial.print("Direction: ");
         Serial.print(currentDir);
         Serial.println(counter);
     }

void loop()
     {
          currentStateCLK = digitalRead(CLK);
         if (currentStateCLK != lastStateCLK  && currentStateCLK == 1)
           {
              if (digitalRead(DT) != currentStateCLK)
                 {
                       counter = counter + 1;
                    if (counter > 100)
                       {
                         counter = 0;
                       }
                       currentDir ="UP";
                   } else
                      {
                             counter = counter - 1;
                          if (counter < 0)
                             {
                                counter = 100;
                             }
                       currentDir ="DOWN";
                        }
                Serial.print("Direction: ");
                Serial.print(currentDir);
                Serial.print(" - Counter: ");
                Serial.println(counter);
           }
   
  lastStateCLK = currentStateCLK;
  int btnState = digitalRead(SW);
   if (btnState == LOW)
        {
             if (millis() - lastButtonPress > 50)
              {
                    Serial.println("Button pressed!");
                }
             lastButtonPress = millis();
         }
     delay(1);
    }


sau descarca din pastebin.

Videoclipul cu mica realizare i-l puteti vedea aici

phpBB [video]


Acest proiect se poate realiza de incepatori fara a va da prea multa bataie de cap. Functioneaza din prima, si dupa cum a-ti vazut din cod, nu are nevoie de librarii externe pentru a putea functiona !

Spor la bricolat ! :drink2:
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image

Return to “Arduino”

Who is online

Users browsing this forum: No registered users and 50 guests