Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Arduino - encoder menu

[es] :: Elektronika :: Mikrokontroleri :: Arduino - encoder menu

[ Pregleda: 1231 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Manić_M
Marko Manić
Elektronski fakultet Niš

Član broj: 335013
Poruke: 17
*.dynamic.isp.telekom.rs.



Profil

icon Arduino - encoder menu14.07.2018. u 10:34 - pre 69 meseci
Pozdrav svima!

Imam problem sa enkoderom, koji u ovom kodu sluzi da idem kroz menu i da menjam vrednosti.
Napisao sam kod i poceo da ga testiram, pri testiranju sam naisao na jedan problem koji nisam mogao da resim.
U pitanju je sledeće:
- Kad menjam poziciju menija (menuPos), menja se i vrednost parametra koji se štampa na ekranu lcd.
- Kad izaberem mod za menjanje parametra i kad menjam parametar menja se i pozicija menija(menuPos).
- Pri prelasku iz jednog u drugi mod inkrementuju se vrednosti za 1 (menuPos) i parametra(mTepm).

Encoder je vezan na Analogne pinove, ne znam koliko je to pouzdano pa ako neko zna neka mi i to napise.

Da li postoji neki bolji način za pisanje koda za meni?

Interesuje me da li je Arduino platforma pouzdana za neke ozbiljne stvari jer ovaj kod sto kucam je za "Kotao na pelet"?

I kakva je ralika izmendju AVR i PIC mikrokontrolera?


Kritičan deo koda je smešten izmedju dva reda kosih crta.

Nadam se da sam leo objasnio sta je problem

//////////////
//////////////

Kritični deo koda

//////////////
//////////////
Code:


#include <LCD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RotaryEncoder.h>

RotaryEncoder encoder(A0,A1);
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6 ,7, 3, POSITIVE);
#define sw 2

int lastPos = 0;
int newPos;
bool sws;
int winPos = 0;
int winLast = 0;
int currentMenu = 0;
int lastMenu;

int menu = "menu";    // U ovom slucaju samo je prikaz parametara i vrednosti,a kada se klikne na "switch encoder-a" onda se menja u change
                      // Kada je menu = "change" onda se enkoderom podesava vrednost parametra koji je prikazan na meniju tj, na LCD.
int pause = 200;      // 200ms je cekanje da bi se promenilo stanje sa -sw- kako pritiskom na taster -sw- nebi doslo do ponovnog prelaska u prethodno stanje
int br = 0;           // vreme posle pritiska tastera,da nebi doslo do ponovnog prebacivanja
int pTemp = 25;       // Temperatura vode
int iTemp = 100;      // Temperatura na izduvnih gasova
int menuPos = 0;      // Menu pozicija, bira se parametar cija vrednost treba da se promeni
int lastMenuPos;


void setup() {
  pinMode(sw, INPUT_PULLUP);
  Serial.begin(9600);
  lcd.begin(16,2);
  lcd.home();
  encoder.setPosition(0 / 1);

}
 int times = 1;
void loop() {  
  if(times == 1000){    // Sluzi da svake sekunde obrise lcd, mada to traje skoro 10 sekundi a ne 1 sekundu
                        // Pokusao sam sa "milis();" ali ne radi kako treba
     lcd.clear();
     lcd.home();
     times = 0;
  }
  /////////////////////////
  /////////////////////////
  encoder.tick();
  sws = digitalRead(sw);
  if(sws == LOW && menu == "menu" && br > pause)   // Ako je klikbuto na -sw- onda se menja parametar koji je bio na ekranu
  {
    menu = "change";
    br = 0; 
    
  }
  else if(sws == LOW && menu == "change" && br > pause) 
  {
    menu = "menu";
    br = 0;

  }
  if(menu == "change")
  {
    newPos = encoder.getPosition(); 
    Serial.print("Change  ");
    
    if(lastPos != newPos)
    {
      if(newPos > lastPos)
        pTemp++;
      if(newPos < lastPos)
        pTemp--;  
    }
    lastPos = newPos;
  }
    Serial.print("  temperatura =  ");
    Serial.println(pTemp);
    
   if(menu == "menu")
     {
      currentMenu = encoder.getPosition();
      if(lastMenu != currentMenu)
        {
      if(currentMenu > lastMenu)
          menuPos++;
      if(currentMenu < lastMenu)
          menuPos--;  
        }
         lastMenu = currentMenu;
         Serial.print("  menuPos: ");
         Serial.print(menuPos); 

         ///////////////////////////////
         ///////////////////////////////
      if(times % 200 == 0){
             lcd.clear();
             lcd.home();
        
       if(menuPos == 0){   
         lcd.print("  Temperatura: ");
         lcd.print(pTemp);
         lcd.print(" C");
       }
       if(menuPos == 1){
         lcd.print("iTemp: ");
         lcd.print(iTemp);
         lcd.print("C");
       }
      }
   }
  br++;
  times++;
}
  

 
Odgovor na temu

goran_68

Član broj: 89012
Poruke: 932
*.dynamic.isp.telekom.rs.



+81 Profil

icon Re: Arduino - encoder menu14.07.2018. u 15:55 - pre 69 meseci
Pogledaj LCDMenuLIb2. Mislim da ti je bolje da ugradiš to več gotovo rešenje nego da se zezaš sa svojim. Koristiće ti sigurno i za dalje pa i ako ti uzme više vremena nije važno. Arduino je pouzdan koliko i sve drugo. Zavisi samo od tebe. Nema neke razlike između AVR i PIC. Sad još manje jer je gazda Microchip.
gorankg
 
Odgovor na temu

peromalosutra
Ivan Rajkovic
Software engineer
Luxoft
Berlin

Član broj: 54774
Poruke: 871
*.ip.prioritytelecom.net.



+148 Profil

icon Re: Arduino - encoder menu14.07.2018. u 18:26 - pre 69 meseci
Ovaj kod ima dosta problema, odmah na prvu loptu imas ovo:

Code:
int menu = "menu";


Ne mozes da snimis string u int, nisam siguran kako ti ovo uopste prolazi kroz kompajler. Dakle sav kod vezan za "menu" promjenjivu ti je pogresan. Ako imas samo dva (ili neki relativno mali, diskretni broj) stanja kao ovdje, onda napravi enumeraciju:

Code:

enum MenuOption {
    MENU,
    CHANGE
}


Onda mozes da kazes stvari kao "menu = CHANGE" i "if (menu == MENU)".


 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Arduino - encoder menu

[ Pregleda: 1231 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.