Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   525 / 854
(#) Laslie válasza JoeA hozzászólására (») Ápr 25, 2019 /
 
Na igen, de a
  1. funtion = 0;
csak akkor fut le, ha meghívásra kerül a
  1. settings();
. De akkor nem nullázódik ki a változó, ha a
  1. load();
vagy a
  1. save();
kerül meghívásra. Így viszont, ha a button2 nem volt lenyomva, és a button1 sem állandóan meghívja az adott funktion értékhez tartozó függvényt. Lásd load/save.
(#) JoeA válasza Laslie hozzászólására (») Ápr 25, 2019 /
 
Jelenleg azokban a függvényekben kerül nullázásra, mint írtam próbából. Ez helypocséklás, csak kipróbáltam. (néha alig tudom követni, hogy mikor mit és hol )
Az előző megoldásod tetszene, ki is fogom próbálni hamarosan! Nem bánnám ha egy kicsit kevesebb változóm lenne forgásban (mármint a kódomon belüli forgásra gondolok)
(#) JoeA válasza Laslie hozzászólására (») Ápr 25, 2019 /
 
Így most akár mit nyomok a button2-vel nem indul a weld, de ha bármit állítok, betöltök, mentek, kilépés után rögtön hegeszt vég nélkül No majd ismerkedem vele, most kicsit le kell lépnem!
(#) Laslie válasza JoeA hozzászólására (») Ápr 25, 2019 /
 
Sikerült valamit jól eltolnod.
Tedd fel a kódot, úgy könnyebb segíteni. Nem baj, ha még nincs kész, és még teli van hibával.
(#) JoeA válasza sargarigo hozzászólására (») Ápr 25, 2019 /
 
Nos megálmodtam ezt az eeprom írást, bizonyára lehetne szebben is.
  1. void freebank()
  2. {
  3.   int factory_addr = EEPROM.length();
  4.     int i = 256;
  5.     while (EEPROM.read(i) != 255 ){ i++; }
  6.           lcd.setCursor(0,1);
  7.           lcd.print(i);      
  8.           delay(50);          
  9.       if ( i >= factory_addr-6 ) FFwrite();
  10.           lcd.setCursor(1,1);
  11.           lcd.print(" Bank:");
  12.           lcd.print(i/5);
  13.           bankread(i/5); //ez olvas be egy bankot, a program futása alatt nem tud bank(50)-nél nagyobbat elérni
  14. }


  1. void FFwrite()
  2. {
  3.     int factory_addr = EEPROM.length();
  4.      for (int i = 256 ; i < factory_addr-1 ; i++) {
  5.      EEPROM.write(i, 255);
  6.      softReset(); //ez újraindítja az arduino-t
  7.   }
  8. }


az első 256 bájt a tárhely, ott nem is engedem keresni, az utolsó bájt az eepromban az én jelzésem, hogy meg van formázva az eeprom, de azért hagytam az utolsó 6 bájtot békén, véletlenül se írjon oda.
A beállítások végén meg megkerestetem vele újra az első szabad helyet és írhatja, így Nano-n lesz 150 bank még amit forgóban használhat (szerintem addig nem élek, amíg tönkre megy). Ez még nincs kész, de ez menni fog.
A fenti kód egy részlet, benn a helyén eeprom írás helyett lcd-re írok, látszólag működik.
Kell valamit módosítanom? Van benne nagy hiba? Nem azt várom, hogy javítsd (vagy bárki más), hanem hogy mit kell(!) másképp és miért! Tehát nem kódot szeretnék, hanem útba igazítást

Jah, most látom
Az lcd-re írás csak a kedvemért van benne, mert vizuális tipus vagyok
A hozzászólás módosítva: Ápr 25, 2019
(#) Kera_Will válasza JoeA hozzászólására (») Ápr 25, 2019 / 1
 
Egy - 2 apróság soros terminálos kijelzéshez a Arduinoban avagy bármilyen uC környezetben .
Ha debuggolni akarod soros porton a futását valaminek .

Zavaró lehet a az Serial.println(változónév vagy "szövegkonstans"); // CR/LF

végű újsor (CR/LF) generátoros kiírás.

Ekkor kapsz egy folyamatosan lefele futó scrollozó sorokat.

De ha beiktatsz egy FORM FEED ESC vezérlő szekvenciát akkor nem lesz ez a végtelen scrollózó adatsor futás.
Lessél utána a terminál vezérlő ESC szekvenciáknak.
Van párféle szabványos VT100 , VTxyz ... stb. számú terminál emuláció.
Ezekhez lettek fejlesztve az ESC szekvenciák.
Ezek a ESCape vezérlő kódok segítségével rugalmasabban formázhatod a soros terminálon megjelenő tartalmat.(akár színezheted inverzé teheted ...stb.. )
(persze mindez soros terminál program/vas függő , persze vas mert annó az IT hőskorban lehet éppen egy nyomtató volt a soros terminálod kimenete és nem a monitor . Később lettek persze CRT-s konzolok is amik mint terminálok működtek valóban valami soros protokollal modemmel összekötve ...stb. )
Bocs ha ismerős volt a VT100 és egyéb "állatfajtáik" !

Igaz ha ESC szekvenciát használsz akkor azt megfelelően kell fogadni is.
Volt egy sejtésem , hogy az ArduinoIDE serial monitora nem lesz jó.
(Valóban nem veszi észre az ESC szekvenciákat , esetleg ha valami másabb formában etetem meg vele. ... de ezen nem akadtam fel ... nem is érdekelt)

Egyből valódi VT100 és kompatibilis soros porti programban gondolkodtam.
Pl.:A Putty általános konzolos termnál program ....
putty elérhetősége

pl.: FORM FEED ami konzolon " képernyő törlést" (avagy lapot dobna a printeren) csinál az aktuális kurzor pozíciótól.

A minta .... "elrontottam" az egyik default gyári minta kódot ...
(analogread to serial pirintinget) ezt :
analogvoltread

  1. // the setup routine runs once when you press reset:
  2. void setup() {
  3. // initialize serial communication at 9600 bits per second:
  4. Serial.begin(9600);
  5. }
  6.  
  7. // the loop routine runs over and over again forever:
  8.  
  9. void loop() {
  10.  
  11. // read the input on analog pin 0:
  12.  
  13. int sensorValue = analogRead(A0);
  14.  
  15. // print out the value you read:
  16.  
  17.  
  18. // Serial.write(12); // FORM FEED vagy itt vagy a végén de valahol kell egy (clrscr)
  19. // FORM FEED vagy itt vagy a végén de valahol kell egy (clrscr) Putty worked !!! BUT //ArdionoIDE serial monitor NOT WORKDED
  20.  
  21. Serial.print("sensor1: ");Serial.print(sensorValue); Serial.print(" -- sensor2: ");Serial.print(sensorValue); // (elso adatsor)
  22.  
  23. Serial.println(); // CR LF
  24.  
  25. Serial.print("sensor3: ");Serial.print(sensorValue); Serial.print(" ** sensor4: ");Serial.print(sensorValue); // (masodik adatsor)
  26. Serial.println(); // CR LF
  27. Serial.print("sensor5: ");Serial.print(sensorValue); Serial.print(" ## sensor6: ");Serial.print(sensorValue);
  28.  
  29.  
  30.  
  31. delay(500); // delay in between reads for stability
  32.  
  33.  
  34. Serial.write(12);// FORM FEED vagy itt vagy a végén de valahol kell egy (clrscr) Putty worked //!!! BUT ArdionoIDE serial monitor NOT WORKDED


Persze 9600 bps esetén kicsit villog és remeg a kiíratás meg a delay(ideje) -től is függ .
Valszín feljebb menve 19k2 36k4 56k bps esetén kevésbé lehet remegős már ...

Ezzel sokkal szebb megjelenítésű konzolt is lehet "varázsolni" a lefele srollozó sortömege helyett .
FORM FEED pedig éppen 12 értéken található a standard ASCII táblázatban is , avagy azt is szokás mondani , hogy az ascii tábla első 32 karaktere a vezérlő karakterek (CR - 13 , LF - 10 , BELL - 7 ...stb.)

Ezért használom a Serial.write(12); // FORM FEED
sorban a 12 számot mint értéket ekkor végrehajtja a lapdobást / képernyő törlést.
A hozzászólás módosítva: Ápr 25, 2019
(#) kormika hozzászólása Ápr 25, 2019 /
 
Sziasztok!
Ha túl láma a kérdésem, akkor előre is bocsánat, de még nem programoztam érintős, színes LCD-t. A kérdésem az, hogy mennyiren bonyolult leprogramozni egy ikonokkal megvalósított 4-5 pontból álló menürendszert? Egy gépen lenne, amihez van 3-4 különböző adapter, ezeket kellene tudnom ikonokkal kiválasztani, és pár egyszerű beállítást elvégezni szintén az érintős felületen keresztül. Eddig karakteres lcd-t, bluetooth modult, analóg jelkezelést, pwm szabályzást csináltam, karakteres lcd-re csináltam már menüt is, az megy, magától a kijelzőtől "félek". Ha nagyon nagy szintugrás lenne ez, amit nem biztos, hogy meg tudom könnyen lépni, akkor nem ruháznék be közel 10000Ft-ot egy érintős lcd-re, hanem akkor megoldom kevésbé korszerűen gombokkal, vagy rotary encoderrel. A megrendelő szeretné az érintős vezérlést, és záros határidőm van az elkészítésére, szóval nem sok időm van kisérletezni, tanulni. Előre is köszönöm a válaszokat.
(#) JoeA válasza Kera_Will hozzászólására (») Ápr 25, 2019 /
 
Köszönöm! Ha csak egy-két érték kell, akkor az Arduino keret soros monitorát használom, de ma kiírattam a teljes eeprom tartalmat párszor, mert nem értettem, hogy mit hová és miért írt, ehhez a screen (screen /dev/ttyUSB0) volt jobb. Linuxozom olyan 94-95 óta, a terminálokkal nincs bajom, bár mindent nem tudok róluk. Teszek majd egy „monitor"t az usb-re, hogy ne kelljen kapcsolgatni (ezzel mintegy megcsapolom az USB0-t és nem kiabál foglaltság miatt), de eddig még nem kellett sokszor, mert van lcd. A következő projektemen nem lesz, addigra meglesz. Az infókat meg elraktározom amiket tőled/tőletek kapok
A hozzászólás módosítva: Ápr 25, 2019
(#) JoeA válasza JoeA hozzászólására (») Ápr 25, 2019 /
 
Az íráshoz jó az (i/5), olvasáshoz ((i-5)/5) kell, mert az első szabad 255 értékű címen nincs még tárolt adat. Most azt keresgélem, hogy lehetne-e egy függvényt így hívni:
  1. freebank(write);

vagy
  1. freebank(read);

Tehát nem változót akarok átadni, hanem a műveletet határoznám meg vele és a „freebank”-ban vizsgálnám meg, hogy melyikkel érkezett. Létezik ilyen megoldás? A googlevel nem találok, de igazán nem is tudom, hogy hogyan keressem
(#) kapu48 válasza JoeA hozzászólására (») Ápr 25, 2019 /
 
Itt van:
  1. // Nevet mindig olyat választunk ami nem foglalt szó
  2. // pl.. ezek foglaltak: write, read
  3. #define Write  0  
  4. #define Read  1
  5. #define KO  0    // error
  6. #define OK  1
  7.  
  8. int freebank(byte utasitas);
  9.  
  10.  
  11. void setup() {
  12.   // put your setup code here, to run once:
  13.  
  14. }
  15.  
  16. void loop() {
  17.  
  18.   // put your main code here, to run repeatedly:
  19.  if(freebank(Write)== KO){
  20.   // nem sikerült
  21.  
  22.  }else {
  23.   // sikerült
  24.  
  25.  }
  26.  
  27.  
  28.  if(freebank(Read)== KO){
  29.   // nem sikerült
  30.  
  31.  }else {
  32.   // sikerült
  33.    
  34.  }
  35.  
  36. }
  37.  
  38.  
  39. int freebank(byte utasitas){
  40.   byte sikerult = KO;
  41.   if(utasitas == Write){
  42.     // ide kerülnek az írási program részek
  43.  
  44.     if(sikerult){
  45.       return OK; // ha sikeres volt
  46.     }
  47.     else{
  48.       return KO; // ha nem sikerült    
  49.     }
  50.   }else if(utasitas == Read){
  51.     // ide kerülnek az olvasás program részek
  52.  
  53.  
  54.     if(sikerult){
  55.       return OK; // ha sikeres volt
  56.     }
  57.     else{
  58.       return KO; // ha nem sikerült    
  59.     }
  60.   }
  61. }
(#) sargarigo válasza JoeA hozzászólására (») Ápr 25, 2019 /
 
Kezdjük a végén, az gyorsan megvan:
  1. void kezeloFuggvenyem(int vezerloSzo)
  2. {
  3.   if (vezerloSzo == 0)
  4.   {
  5.      // Ezt csinalja ha a parameter 0 volt
  6.   }
  7.   else
  8.   {
  9.     // Ezt csinalja ha nem nulla
  10.   }


Ezt lehet szebben is:
  1. #define WRITE  0
  2. #define READ 1
  3.  
  4. void kezeloFuggvenyem(int vezerloSzo)
  5. {
  6.   if (vezerloSzo == WRITE)
  7.   {
  8.      // Ezt csinalja ha a parameter 0 volt
  9.   }
  10.   else
  11.   {
  12.     // Ezt csinalja ha nem nulla
  13.   }


Vedd észre, hogy a kettő ugyanaz, csak mágikus számok helyett a program elején definiáltam cimkéket, és inkább azt használtam.

Ezt is lehet még szebben?
  1. #define WRITE  0
  2. #define READ 1
  3. #define CLEARALL 2
  4.  
  5.  
  6. void kezeloFuggvenyem(int vezerloSzo)
  7. {
  8.   switch (vezerloSzo)
  9.  {
  10.   case WRITE:
  11.       {
  12.           // Ezt csinalja ha a parameter 0 volt
  13.           break; // ez fontos hogy nem maradjon le, kulonben vegigszalad mindenen!!
  14.       }
  15.   case READ:
  16.       {
  17.           // Ezt csinalja ha 1
  18.          break;
  19.       }
  20.   case CLEAR_ALL:
  21.      {
  22.          // Ha 2 az érték
  23.          break;
  24.      }
  25.   default:
  26.      {
  27.          // a default sor opcionális. Ha egyik feltétel sem teljesül, akkor fut rá.
  28.      }

Láthatóan itt már tetszőlegesen sok feltételt is egyszerű megvizsgálni.
(#) kapu48 válasza JoeA hozzászólására (») Ápr 25, 2019 /
 
Most válogathatsz!
(#) JoeA válasza kapu48 hozzászólására (») Ápr 25, 2019 /
 
Szuper! Köszönöm!
Egy istennek se találtam egy olyan kódot se, ahol ilyesmi lett volna benne! Ez jelentheti azt, hogy nem kívánatos az ilyen hívás vagy csak nem volt szerencsém a keresésben? Ez amúgy ellenjavallt módszer vagy van helyette egyszerűbb/logikusabb? Innen most egyszerűbbnek tűnik egy bármilyen számot átadni és azt vizsgálni. Ha eltalálta akkor write ha nem akkor read csak nem olyan könnyen olvasható a kód, mintha szerepelne benne ez a két szó.
(#) kapu48 válasza JoeA hozzászólására (») Ápr 25, 2019 /
 
Emberek vagyunk, és a neveket könnyebben megjegyezzük, mint a számokat.

Viszont a gép csak a számokat érti.
Ezért van a kettős definiállás: adunk a névnek szám értéket.
(#) JoeA válasza sargarigo hozzászólására (») Ápr 25, 2019 /
 
Upsz, közben amíg írtam megleptél egy kóddal

Ez a harmadik tetszetős és egy függvénnyel hívással kevesebb lehet! No ezt ki is próbálom Köszönöm!!!
(#) JoeA válasza kapu48 hozzászólására (») Ápr 25, 2019 /
 
Ez jelent valami a lefordított kódméretben vagy van valami hátránya a nevesítésnek ebben az esetben? A kód szebb lehet ha nevekkel illetem és ahogy öregszem egyre nehezebben értelmezek dolgokat (bár van aki szerint nem a korom miatt van ) Igyekszem szépre írni, hogy bárki érthesse, bár ebben most még kételkedem...
(#) kapu48 válasza JoeA hozzászólására (») Ápr 25, 2019 /
 
Ezek csak a fordítónak szóló utasítások,
  1. // Tudja a fordító, hogy a neveket ezekkel a számokkal kel helyettesítenie:
  2. #define WRITE  0
  3. #define READ 1
  4. #define CLEARALL 2

Nem kerülnek bele a kódba
(#) JoeA hozzászólása Ápr 25, 2019 /
 
Nagyon köszönöm mindkettőtöknek!!! (@kapu48, @sargarigo) Ezzel most el leszek egy darabig, át kell nézzem, hogy mi az amit nevesíthetek a teljes kódban
A hozzászólás módosítva: Ápr 25, 2019
(#) kapu48 válasza JoeA hozzászólására (») Ápr 25, 2019 /
 
Ha már így belemerültünk!

Elmondom, hogy azért írjuk ezeket a neveket csupa NAGYBETÜVEL.
Így később tudjuk, hogy állandó értékek, ezeknek nem lehet más értéket adni
A hozzászólás módosítva: Ápr 25, 2019
(#) kapu48 válasza kormika hozzászólására (») Ápr 25, 2019 /
 
Határidős első projecthez nem kezdenék TFT + Touch alkalmazást tanulni.

Mivel az ilyen kijelzőknek rengeteg gyártója van, számtalan változatban.
És alapos körültekintéssel kell megválasztani őket!
Nem is az áruk a döntő szempont.
Hanem, hogy milyen mértékű támogatást találsz hozzá a neten?
(#) tbarath válasza kormika hozzászólására (») Ápr 26, 2019 /
 
A kérdésed nem láma, hanem alulspecifikált. Igazából se a tudásod, se a feladat nem derül ki belőle, és az sem, hogy mit is szeretnél használni. Ja, és a határidő se, a költségkeret se, semmi se. És no offense, de a 10e Ft bármilyen komolyabb üzleti témában aprópénz, kerekítési hiba.

Ha Nextion-ra gondolsz, akkor arról van itt topic, van a cikkek között is nextion-os cikk nem túl régről, és ha rákeresel a "nextion arduino" kifejezésre, akkor rengeteg találatod lesz. Youtube videó, tutorial, bármi. Ez alapján szerintem leginkább Te tudod megválaszolni a kérdésedet.
(#) sargarigo válasza JoeA hozzászólására (») Ápr 26, 2019 /
 
Ezt az usb-s monitoros dolgot le tudnád írni hogy csinálod? Nekem is jól jönne néha..
(#) JoeA válasza sargarigo hozzászólására (») Ápr 26, 2019 /
 
Persze! Olyasmi, mint a gpsd, figyel a porton és továbbadja ha kell 1000 felé. Még nem állítottam be soha, de elmentettem könyvjelzőbe
(#) sargarigo válasza JoeA hozzászólására (») Ápr 26, 2019 /
 
A kódodban kb bármit nevesíthetsz! Érdemes minden számértéket elnevezni, hogy tudd miért annyi amennyi, és ha utólag változtatni kell, akkor elég egy helyen az elején megtenni, nem kell az egész kódot áttúrni.
(#) JoeA hozzászólása Ápr 26, 2019 /
 
A teljes eeprom kezelést sikerült megoldanom így:
  1. // EEprom routine
  2. void bankmanager(int manage)
  3. {
  4.     int factory_addr = EEPROM.length();
  5.       switch(manage)
  6.       {
  7.         case INIT:
  8.         {
  9.             lcd.clear();
  10.             lcd.setCursor(0,0);
  11.             lcd.print ("First boot");
  12.             for (int i = 1 ; i < 255 ; i++) {
  13.               EEPROM.write(i, 0);
  14.             }
  15.             bankmanager(CLEAR);
  16.             for (int i = 0; i < 5; i++) {
  17.             lcd.setCursor(0,1);
  18.             lcd.print("eeprom clearing");
  19.             delay(200);
  20.             clearLine(1);
  21.             delay(200);
  22.             }
  23.             delay(500);
  24.             packet=2;preweld=60;pause=40;weldtime=50;packetpause=50;
  25.             bankwrite(1);
  26.             bankwrite(51);
  27.             EEPROM.write(factory_addr, initValue);
  28.             lcd.clear();
  29.             lcd.setCursor(0,0);
  30.             lcd.print("Factory defaults");
  31.             lcd.setCursor(0,1);
  32.             lcd.print("stored");
  33.             delay(2000);
  34.             lcd.clear();
  35.             lcd.setCursor(0,0);
  36.             lcd.print("    Reset");
  37.             delay(1000);
  38.             softReset();
  39.            break;
  40.         }
  41.         case CLEAR:
  42.         {
  43.               for (int i = 256 ; i < factory_addr-1 ; i++) {
  44.               EEPROM.write(i, 255);
  45.             }
  46.            break;
  47.         }
  48.         case READ:
  49.         {
  50.           int i = 256;
  51.            while (EEPROM.read(i) != 255 ){ i++; }
  52.             if ( i >= factory_addr-6 ) bankmanager(CLEAR);
  53.             bankread((i-5)/5);
  54.            break;
  55.         }
  56.         case WRITE:
  57.         {
  58.           int i = 256;
  59.            while (EEPROM.read(i) != 255 ){ i++; }
  60.             if ( i >= factory_addr-6 ) bankmanager(CLEAR);
  61.             bankwrite(i/5);
  62.            break;
  63.         }
  64.       }
  65. }

Az epromba mentett beállítás miatt feleslegessé vált a bank(51), ahonnan eddig az alapot töltötte be, ezt még törlöm majd.
Viszont a beállításom még mindig nem megy. Kiemeltem a kódból azt ami nem megy:
  1. #include<EEPROM.h>
  2.    
  3. // LCD 16*2
  4. #include <LiquidCrystal.h>
  5. LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
  6. #include <ClickButton.h>
  7. int setupbuttonpin = 9;       // D9 - Setup button
  8.  
  9. ClickButton button1(setupbuttonpin, LOW, CLICKBTN_PULLUP);
  10. #include <ClickEncoder.h>
  11. #include <TimerOne.h>
  12.  
  13. ClickEncoder *encoder;
  14.  
  15. unsigned initValue = 8;        // EEPROM first
  16.  
  17.  
  18. // Button definition
  19. //int setupbuttonpin = 9;       // D9 - Setup button
  20. long oldPosition  = 0;
  21. byte funktion = 0;
  22.  
  23. // KY-040 definitions
  24. int16_t last, value = 0;
  25. int encoderValue;
  26. int valuemax = 0;             //
  27.  
  28. int bank = 1;
  29. int maxbank = 1000;
  30.  
  31. void setup() {
  32. pinMode(setupbuttonpin, INPUT_PULLUP);
  33.   lcd.begin(16,2);
  34.   setrotaryswitch();
  35.  
  36.   lcd.clear();
  37.   lcd.setCursor(0,0);
  38.   lcd.print(" Test ");
  39.   delay(1000);
  40.   lcd.setCursor(0,1);
  41.   lcd.print(" Current: ");
  42.   lcd.print(bank);    
  43. }
  44.  
  45.  
  46.  
  47. void loop() {
  48.   button1.Update();
  49.   if (button1.clicks != 0) funktion = button1.clicks;
  50.       if (funktion == 1) save(bank);
  51.   lcd.clear();
  52.   lcd.setCursor(0,0);
  53.   lcd.print(" in bank ");
  54.   lcd.setCursor(0,1);
  55.   lcd.print(bank);  
  56.  
  57. }
  58.  
  59. void timerIsr() {
  60.   encoder->service();
  61. }
  62.  
  63. void setrotaryswitch()
  64. {
  65.   encoder = new ClickEncoder(7, 8, 9, 4);
  66.   encoder->setAccelerationEnabled(true);
  67.   Timer1.initialize(1000);
  68.   Timer1.attachInterrupt(timerIsr);
  69.   last = -1;
  70. }
  71.  
  72. void save(int bank)
  73. {
  74.      int value = bank;
  75.      valuemax = maxbank;
  76.   lcd.clear();
  77.   lcd.setCursor(0,0);
  78.   lcd.print("Save in bank ");
  79.    do
  80.   {
  81.          value -= encoder->getValue();
  82.           if (value != last) {
  83.           encoderValue = value;
  84.            if (value > valuemax) { value = valuemax; }
  85.             if (value < 1) { value = 1; }
  86.           last = encoderValue;
  87.            lcd.setCursor(13,0);
  88.            clearChar(13,0);
  89.            lcd.setCursor(13,0);
  90.            lcd.print(encoderValue);        
  91.           }
  92.   funktion = 0;
  93.   button1.Update();
  94.   if (button1.clicks != 0) funktion = button1.clicks;
  95.   }
  96.   while (funktion != 1 || funktion != 3);
  97. //  while (funktion != 1); //ezzel 1click után visszatér
  98.   if (funktion == 1) return;
  99.   else {
  100.   lcd.setCursor(0,1);
  101.   lcd.print("Saved in memory.");
  102.   bank = encoderValue;
  103.   funktion = 0;
  104.   delay(1000);
  105.   lcd.setCursor(0,1);
  106.   lcd.print(bank);
  107.   delay(1000);
  108.   return bank; }
  109. }
  110.  
  111. // Diplay routine
  112.  
  113. // clear routine
  114. void clearChar(int charPosition, int line){
  115.   lcd.setCursor (charPosition,line);
  116.   lcd.print("  ");
  117. }
  118.  
  119. void clearLine(int line){
  120.   lcd.setCursor (0,line);
  121.   lcd.print("                ");
  122. }


Itt látszik, hogy a loopból a (bank)-al hívom meg a rutint, ott tekergethetem a rotary-t, változik is az érték és a return előtt kiíratva még megvan, majd a visszatéréskor az alap értéket kapom megint. A value=bank azért van benne, mert ezt az eljárást most 5 különböző változóval hívom meg, amiből egyet szeretnék csinálni ha majd működik és a do-ból szeretnék majd az encoderValue értékkel visszatérni és azt átadni a bank-nak (meg a többinek). Most ezzel az egyel sem megy, de próbáltam már úgy is, hogy csak egyszer van és akkor más problémáim is adódtak. Előbb ez menjen, aztán az is fog
Ha (bank) nélkül dolgozik, akkor visszaadja a beállított értéket, de akkor a loop-ból nem kapja meg az aktuálist és mindig azzal kezd amit az elején beállítottam. próbáltam az „int save(int bank)”-ot is, ugyan ez a helyzetem. Bizonyára triviális amit benézek, de 2 napja nem jövök rá.
Másik problémám: a while (funktion != 1 || funktion != 3); elvileg vagy 1 vagy 3 értékig kellene várjon, de egyikre sem csinál semmit, tehát fut a ciklusom a végtelenségig. A while-on belül nem lehet logikai értékeket kezelni?
(#) JoeA válasza sargarigo hozzászólására (») Ápr 26, 2019 /
 
Serial monitor itt egy ami win/linux elvileg. Nem próbáltam, de elvben ez arra lenne.
Itt meg még pár. Ha csinálom, leírom lépésről lépésre, hogy mit csináltam.
A hozzászólás módosítva: Ápr 26, 2019
(#) Kovidivi válasza JoeA hozzászólására (») Ápr 26, 2019 /
 
Én nem használnám se a write, se a Write, se a WRITE szavakat! Inkább vagy magyarul írnám, IRNI, OLVASNI, vagy valami megkülönböztethetőt használnék: MYREAD, vagy LCDWRITE, MOTORWRITE, amit akarsz. A read, write túlságosan sűrűn használt ahhoz, hogy valamit rádefiniálj! És kizárólag nagybetűvel, nem keverve. Ez valahogy szabályként kialakult, nem kötelező, de sokkal átláthatóbb a kódod, hogy azok előre definiált értékek lesznek!
Én akár egész mondatot is egybeírva, nagy betűvel felhasználok a programomban, hogy egyértelmű legyen. Pl. LCDREFRESHPERIOD, LOADENABLEDELAY, stb, utána meg kommentben kifejetem, melyik függvényben használom, vagy ami fontos. Amikor tényleg hosszú, nagy, bonyolult programot írsz, csak így lesz átlátható.
(#) JoeA válasza Kovidivi hozzászólására (») Ápr 26, 2019 /
 
Köszönöm! Ezt a kommentelést még gyakorolnom kell, mindig elfelejtem Olyan, mint doksit írni valamihez! „Mé nem ölég, hogy működik?”
Magyarul nem fogok beleírni, ki tudja, hátha megteszene valakinek, aki nem ért magyarul. Igaz, inkább vagyok németes, mint angolos, de azért megpróbálom ahol lehet angolul. A nevesítésnél igazad lehet, bár a READ/WRITE eléggé láthatóan kiemelt. Majd keresek helyette mást, ami kellően tükrözi, hogy írás/olvasás más szavakkal
(#) JoeA válasza Kovidivi hozzászólására (») Ápr 26, 2019 /
 
  1. // EEprom routine
  2. void bankmanager(int manage)
  3. {
  4.     int factory_addr = EEPROM.length();
  5.       switch(manage)
  6.       {
  7.         case EEINIT:
  8.         {
  9.             lcd.clear();
  10.             lcd.setCursor(0,0);
  11.             lcd.print ("First boot");
  12.             for (int i = 1 ; i < 255 ; i++) {
  13.               EEPROM.write(i, 0);
  14.             }
  15.             bankmanager(EECLEAR);
  16.             for (int i = 0; i < 5; i++) {
  17.             lcd.setCursor(0,1);
  18.             lcd.print("eeprom clearing");
  19.             delay(200);
  20.             clearLine(1);
  21.             delay(200);
  22.             }
  23.             delay(500);
  24.             packet=2;preweld=60;pause=40;weldtime=50;packetpause=50;
  25.             bankwrite(1);
  26.             bankwrite(51);
  27.             EEPROM.write(factory_addr, initValue);
  28.             lcd.clear();
  29.             lcd.setCursor(0,0);
  30.             lcd.print("Factory defaults");
  31.             lcd.setCursor(0,1);
  32.             lcd.print("stored");
  33.             delay(2000);
  34.             lcd.clear();
  35.             lcd.setCursor(0,0);
  36.             lcd.print("    Reset");
  37.             delay(1000);
  38.             softReset();
  39.            break;
  40.         }
  41.         case EECLEAR:
  42.         {
  43.               for (int i = 256 ; i < factory_addr-1 ; i++) {
  44.               EEPROM.write(i, 255);
  45.             }
  46.            break;
  47.         }
  48.         case EEREAD:
  49.         {
  50.           int i = 256;
  51.            while (EEPROM.read(i) != 255 ){ i++; }
  52.             if ( i >= factory_addr-6 ) bankmanager(EECLEAR);
  53.             bankread((i-5)/5);
  54.            break;
  55.         }
  56.         case EEWRITE:
  57.         {
  58.           int i = 256;
  59.            while (EEPROM.read(i) != 255 ){ i++; }
  60.             if ( i >= factory_addr-6 ) bankmanager(EECLEAR);
  61.             bankwrite(i/5);
  62.            break;
  63.         }
  64.       }
  65. }

Szerintem így kellően tükrözi, hogy mit ír/olvas. Valahogy a névnek utalnia kell számomra a műveletre, de ezzel arra is utal, hogy mit. Nekem tetszik
A hozzászólás módosítva: Ápr 26, 2019
(#) Laslie válasza JoeA hozzászólására (») Ápr 26, 2019 /
 
Ez így nem is fog bekerülni a bank globális változóba.
Mutatom, hogy szerintem hogyan kellene
  1. #include<EEPROM.h>
  2.    
  3. // LCD 16*2
  4. #include <LiquidCrystal.h>
  5. LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
  6. #include <ClickButton.h>
  7. int setupbuttonpin = 9;       // D9 - Setup button
  8.  
  9. ClickButton button1(setupbuttonpin, LOW, CLICKBTN_PULLUP);
  10. #include <ClickEncoder.h>
  11. #include <TimerOne.h>
  12.  
  13. ClickEncoder *encoder;
  14.  
  15. unsigned initValue = 8;        // EEPROM first
  16.  
  17. // Button definition
  18. //int setupbuttonpin = 9;       // D9 - Setup button
  19. long oldPosition  = 0;
  20.  
  21. // KY-040 definitions
  22. int16_t last, value = 0;
  23. int encoderValue;
  24. int valuemax = 0;             //
  25.  
  26. int bank = 1;
  27. int maxbank = 1000;
  28.  
  29. void setup() {
  30.         pinMode(setupbuttonpin, INPUT_PULLUP);
  31.         lcd.begin(16,2);
  32.         setrotaryswitch();
  33.  
  34.         lcd.clear();
  35.         lcdWrite(0,0," Test ");
  36.         delay(1000);
  37.         lcdWrite(0,1," Current: ");
  38.         lcd.print(bank);  
  39. }
  40.  
  41. void loop() {
  42.         button1.Update();
  43.         switch(button1.clicks) {
  44.         case 1:
  45.                 save();
  46.                 break;
  47.         default:
  48.                 break;
  49.         }
  50.         lcd.clear();
  51.         lcdWrite(0,0," in bank ");
  52.         lcd.setCursor(0,1);
  53.         lcd.print(bank);  
  54. }
  55.  
  56. void timerIsr() {
  57.         encoder->service();
  58. }
  59.  
  60. void setrotaryswitch() {
  61.         encoder = new ClickEncoder(7, 8, 9, 4);
  62.         encoder->setAccelerationEnabled(true);
  63.         Timer1.initialize(1000);
  64.         Timer1.attachInterrupt(timerIsr);
  65.         last = -1;
  66. }
  67.  
  68. void save() {
  69.         byte funktion = 0;
  70.     int value = bank;
  71.     valuemax = maxbank;
  72.         lcd.clear();
  73.         lcdWrite(0,0,"Save in bank ");
  74.         do {
  75.         value -= encoder->getValue();
  76.         if (value != last) {
  77.                         encoderValue = value;
  78.                         if (value > valuemax) { value = valuemax; }
  79.             if (value < 1) { value = 1; }
  80.                         last = encoderValue;
  81.                         lcd.setCursor(13,0);
  82.                         clearChar(13,0);
  83.                         lcdWrite(13,0,encoderValue);        
  84.         }
  85.                 button1.Update();
  86.                 funktion = button1.clicks;
  87.         } while (funktion != 1 || funktion != 3);
  88.         if (funktion == 1) return;
  89.  
  90.         lcdWrite(0,1,"Saved in memory.");
  91.         bank = encoderValue;
  92.         delay(1000);
  93.         lcdWrite(0,1,bank);
  94.         delay(1000);
  95. }
  96.  
  97. // Diplay routine
  98. void lcdWrite(int x, int y, char[] msg) {
  99.     lcd.setCursor(x,y);
  100.     lcd.print(msg);    
  101. }
  102.  
  103. // clear routine
  104. void clearChar(int charPosition, int line){
  105.   lcdWrite(charPosition,line,"  ");
  106. }
  107.  
  108. void clearLine(int line){
  109.   lcdWrite(0,line,"                ");
  110. }

Mivel a save függvénynek átadod a bank globális változót, így az elrejtésre kerül, és létrejön egy lokális változó, ami addig él míg a függvény.
Kicsit egyszerűsítettem a kódon is.
Következő: »»   525 / 854
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem