[ Manić_M @ 14.07.2018. 10:34 ] @
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++; } |