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   526 / 839
(#) Laslie válasza D_Zsolt hozzászólására (») Ápr 26, 2019 /
 
a read/write nem foglalt szó, ezért nyugodtan használható. Viszont abban igaza van Kovidivi-nek, hogy ez így túl általános, ezért érdemes hozzá kapcsolni, hogy mit is olvas/ír. Úgy, mint amilyen példákat felsorolt.
A hozzászólás módosítva: Ápr 26, 2019
(#) Laslie válasza D_Zsolt hozzászólására (») Ápr 26, 2019 /
 
Igen, ez így már jobb.
(#) D_Zsolt válasza Laslie hozzászólására (») Ápr 26, 2019 /
 
Értettem és már meg is változtattam a kódban, nem csak itt! Logikus és igaza van, megjegyzem! Egyre többet játszom arduino-val, nem mindegy, hogy most mi „ragad” be. Két hete még elvoltam a blink.ino-val igaz, azzal már vagy 5-6 éve elvoltam
(#) D_Zsolt válasza Laslie hozzászólására (») Ápr 26, 2019 /
 
Pici módosítással az értékátadás/átvétel működik így már. A kiírásnál a char[] msg egyáltalán nem ment, átírtam char msg[]-re, de úgy nem kezeli a számokat. Visszaírtam a bank kiíratást, úgy működik, de a te megoldásoddal jobban tetszene a kiírás. Ne írd le a megoldást (még), magam akarom megkeresni! Eddig sosem használtam char-t, utána olvasok picit.

Viszont magyarázatot szeretnék kérni. A bank globális változóm. Az eredeti loopból ezzel
  1. if (funktion == 3) save()
hívom, ezt:
  1. void save()
  2. {
  3.      value = bank;
  4.      valuemax = maxbank;
  5.   lcd.clear();
  6.   lcd.setCursor(0,0);
  7.   lcd.print("Save in bank ");
  8.    do
  9.   {
  10.          value -= encoder->getValue();
  11.           if (value != last) {
  12.           encoderValue = value;
  13.            if (value > valuemax) { value = valuemax; }
  14.             if (value < 1) { value = 1; }
  15.           last = encoderValue;
  16.            lcd.setCursor(13,0);
  17.            clearChar(13,0);
  18.            lcd.setCursor(13,0);
  19.            lcd.print(encoderValue);        
  20.           }
  21.   funktion = 0;
  22.   button1.Update();
  23.   if (button1.clicks != 0) funktion = button1.clicks;
  24.   }
  25. //  while (funktion != 1 || funktion != 3);
  26.   while (funktion != 1);
  27. //  if (funktion == 1) return;
  28.   lcd.setCursor(0,1);
  29.   lcd.print("Saved in memory.");
  30.   bank = encoderValue;
  31.   bankwrite(bank);
  32.   funktion = 0;
  33.   delay(1000);
  34. }

Hol állítom el? Ebből a kódból a bank az alapértékem lesz és be tudom állítani, vissza is tér a loopba az érték. Ha újra meghívom, megint az alapértéken lesz és kezdhetem tekerni az elejéről. Szeretném érteni! Tudom, hogy esetleg hosszú lesz, mert nehéz a fejem néha, ha itt túl terhelő lenne, akkor valahol privátban

Viszont ez a két különböző click nem megy, marad a ciklusban. Most megyek a clickbutton oldalára művelődni.
A hozzászólás módosítva: Ápr 26, 2019
(#) Laslie válasza D_Zsolt hozzászólására (») Ápr 26, 2019 /
 
Rendben, akkor nem írom le. Bár nem foglalkoztam még eddig (nagyon) az Arduino programozásácval, de a referencia leírásban rákeresve hamar meg lett.
A kérdésedre a választ akkor tudnám megmondani, ha látnám az egész kódot. Mivel globális váűltozóról van szó, ezért bárhol el lehet a kódban bújva a módosítást végrehajtó sor.
(#) D_Zsolt hozzászólása Ápr 26, 2019 /
 
Feltöltöttem ide.
Elvileg használható, korlátozásokkal. Kiszedtem a nagyja szemetet belőle, de maradt még pár dolog.
Még nem jött meg az optocsatoló, anélkül a nullátmenetet nem tudom tesztelni, de a többiről:
Ami működik:
Friss installt felismeri, inicializál, újraindítás után már tudja a dolgát. (újra is indul, meleg starttal)
Állíthatóak az értékek, meg is jegyzi. Beolvas memóriából, kiír memóriába, a eeprom túlcsordulást még nem értem el, de elvben kiírja, hogy törölni fog és újraindul. Gyakorlatilag ha a nullátmenet megy, használható, anélkül kiírja, hogy welding és vár. Hőmérséklet ellenőrzés megy. Két érzékelőt terveztem, de mindenhol azt látom, hogy a trafó hőjét mérik, az SSR-t nem, így a kódban benne van még, de nem építem ki, törlésre kerül majd.
Ami nem megy:
A clickbuttonnal nem tudok (még) visszalépni mentés nélkül (folyamatban).
Nem ismeri fel, hogy ha 0 a weld, elvileg akkor manuálba kellene menjen, de nem (nem tudom az okát még, igazából nem foglalkoztam vele).
A beállításokba lépve nem az aktuális értékről állítható tovább, hanem melyik hogy Ezt nem is értem. Az első értékeket onnan lehet tovább ahol állt, a többit nem. Az utolsó stabilan a minimum beállíthatóval jön, a többi bekapcsoláskor teljesen érték nélkül, később az előző változó maximumával jön, illetve a weld az azt követő alkalomtól 1000-el kezd.
Szeretném a hálózati frekit állíthatóvá tenni és az ahhoz tartozó SinMax értéket. Még hozzá sem kezdtem, majd (vagy az is lehet, hogy nem is )!
Ami kicsit zavaró:
kissé vibrál a kijelző max kontraszton is, ha nagyobb késleltetést állítok be, bizonytalan a gomb kezelés (1,2 click ok, a 3click néha 1 lesz).

Kapcsolási rajzot készítek majd, de ez a fránya Fritzing nekem nem jött be. A huzalozás vele eléggé nyakatekert nekem (vagy csak nem szántam elég időt ismerkedésre).

A kódot népítéletre tettem fel. Arduino-t kb 1 hete próbálok értelmesen programozni, a kód jelentős része innen-onnan jött, kipróbálni, illetve itt is kaptam segítséget amit köszönök!!! Rengeteget jelent nekem, ha van kitől kérdezni és tanulni!
Az alap kódot kinőttem, átláthatatlanná vált és elkopott a görgőm az egéren, így kicsit szétdaraboltam, hogy kevesebbet kelljen tekerni. Azt terveztem, hogy a teljesen működő kódokat áthelyezem még egy külön fájlba, hogy ne együtt legyenek a hibással, de ez elmaradt szeretnék még összevonni azonos kódokat, de ott majd változókkal kell játszanom megint. Nem tudom, hogy nyernék-e vele, mert azért vannak olyan eltérések, amik megint ping-pongoznának változókkal és egyenlőre a mostaniakkal is van bajom, ezt még tanulnom kell előbb!!!
A vázlat 14482 bájtot (47%) használ tárhelyből. El férek vele, nem ezért akarok összevonni, hanem tanulni szeretném, hogy meddig érdemes eljárásokat építeni és mikortól nem lesz érezhető haszna.
A változók 672 bájtot (32%) használnak. Ez, hogy sok-e, azt nem tudom. Nem bántam takarékosan, amit gondoltam mindent deklaráltam szinte ész nélkül. Ahol biztosra vettem, hogy el kell férjek egy bájton, ott kicsit rövidítettem Fordításkor 2 warningom van, mind a kettő a ClickEnkoder-t okolja, az egyik a gyorsítást, a másik a duplaclicket. Asszem ennyi hirtelen.
Szívesen veszek némi okítást úgy az egészről, hol mekkora hibát követtem el és miként lehet rajta csiszolni. Szeretném minél fogyaszthatóbbnak tudni a kódot, amit más is szívesen olvas.
(#) Laslie válasza D_Zsolt hozzászólására (») Ápr 26, 2019 /
 
Első ránézésre én kicserélném azokat a változókat pl. max..., amik nem változnak, hiszen konstans értéket képviselnek, erre
  1. #define

Így a kevesebb változó kevesebb memóriát igényel.
(#) D_Zsolt válasza Laslie hozzászólására (») Ápr 26, 2019 /
 
Ok, csinálom!
Ezek a szebb kód érdekében az elejére kerüljenek vagy ahová tartoznak a csoportban ott is maradhat?
(#) Laslie válasza Laslie hozzászólására (») Ápr 26, 2019 / 1
 
Nem tudom sikerült-e megtalálnod a megoldást, egy kis segítség hozzá.
A referencia leírásban olvasható, hogy van String típus. A char msg[] helyett használhatod ezt.
  1. void lcdWrite(int x, int y, String msg) {
  2.     lcd.setCursor(x,y);
  3.     lcd.print(msg);    
  4. }

Ebből következik, hogy a számok kiíratásánal pedig előbb át kell konvertálni Sting-é.
  1. lcdWrite(13,0,String(encoderValue));

A kód is kisebb lesz, ha használod az lcdWrite függvényt. (Ha már beletetted a kódba. )
A hozzászólás módosítva: Ápr 26, 2019
(#) Laslie válasza D_Zsolt hozzászólására (») Ápr 26, 2019 /
 
Maradhatnak ott (sőt) a Definitions.h fájlban.
(#) D_Zsolt válasza Laslie hozzászólására (») Ápr 26, 2019 /
 
Megmondom őszintén, hogy keresgéltem kb 10 percet, de nem találtam meg és jobban zavart ez az érték átadás, így azzal foglalkoztam inkább meg a kódtisztítással. Nagy erőt nem fektettem bele, mert azzal a megoldással ment ami a kódban van és nem volt zavaró!
(#) D_Zsolt válasza Laslie hozzászólására (») Ápr 26, 2019 /
 
Így értettem:
  1. // Weld timing
  2. byte packet = 1;               // welding multiplier
  3. #define maxpackets 20          // maximum welding multiplier
  4. byte packetpause = 50;         //
  5. #define maxpacketpause 150     //
  6. byte preweld = 50;             // Pre-weld in milliseconds (the first pulse in a dual pulse weld)
  7. #define maxpreweld 300
  8. byte pause = 100;              // Pause in milliseconds before the second pulse in a dual pulse
  9. #define maxpause 500
  10. #define maxweldpulse 1000      // Maximum welding time pulse in milliseconds.
  11. byte timeincrement = 10;       // This is the time in milliseconds that the menu will increase the weld time by whenever you press the menu button
  12. byte debouncepause = 200;      // This is just to prevent accidental double activations due to physical imperfections in buttons
  13. int weldtime = 50;            // This init value becomes the base increment value. This is just a declaration and doesn't need to be changed.

Jó helyen vannak itt? Szebben mutatna a fájl tetején az összes ilyen, de ide tartoznak.
(#) D_Zsolt válasza Laslie hozzászólására (») Ápr 26, 2019 /
 
Használni is fogom, szerintem nem csak ebben a kódban
(#) Laslie válasza D_Zsolt hozzászólására (») Ápr 26, 2019 /
 
Maradhatnak ott ahol vannak. Ez egyéni izlés kérdése. Viszont a #define után a konstans nevét célszerű nagybetűsen megadni. Ezzel is jelezve, hogy nem egy változóról van szó.
(#) D_Zsolt válasza Laslie hozzászólására (») Ápr 26, 2019 /
 
Átírtam, a fordítás után ugyan annyi a változók mérete. Nem kellett volna ennek változnia?

PS:
Most nézem, hogy az int weldtime = 50; értékét veszi fel az utoljára állítandó változó, nem a saját minimum 50-ét. Tehát valamiért a változóim az előző változó maximum értékét veszik fel... ennek köze lesz a value-hoz a ciklusban. Gondolom...
A hozzászólás módosítva: Ápr 26, 2019
(#) Laslie válasza D_Zsolt hozzászólására (») Ápr 26, 2019 /
 
Ez függ a fordítótól és a beállítasaitól. Nem ismerem ilyen mélységeiben az Arduinohoz adott fordítót.
Ettől függetlenül valamennyit csökkennie kellett volna.
A hozzászólás módosítva: Ápr 26, 2019
(#) D_Zsolt hozzászólása Ápr 26, 2019 /
 
A Definitions.h-ban volt egy „int valuemax = 0”. Ezt töröltem és minden ciklus elején állítom „int valuemax = MAX....” értékre. Ezzel most már az első bekapcsoláskor 0-val indít nem üres értékkel, ráadásul a valuemax sosem 0, csak a fordító kiabált velem, hogy nincs, ezért csináltam. Most már nem kiabál, de egyel kevesebb változóm van (2 bájttal kisebb a változók mérete is). Igaz, a probléma maradt
A clickenkóder kéri: int16_t last, value = 0;
Valahol itt lesz a kutya elásva...
A hozzászólás módosítva: Ápr 26, 2019
(#) KoblogPerGyok válasza D_Zsolt hozzászólására (») Ápr 26, 2019 /
 
def.h-ban:


// KY-040 definitions

int16_t last, value = 0;
Ez két különböző elem? Vagy last_value akar lenni?
(#) KoblogPerGyok válasza D_Zsolt hozzászólására (») Ápr 26, 2019 /
 
Abban az esetben ha két különböző:

int16_t last, value;
last=0;
value=0;
(#) D_Zsolt válasza KoblogPerGyok hozzászólására (») Ápr 26, 2019 /
 
Két különböző!
Már működik, ezzel volt a baj, mindjárt frissítem a git-et is, benne hagyva a hibás helyen lévő részeket //-el!

Tehát a KY-040 példaprogramjából vettem ezt:
  1. // KY-040 definitions
  2. int16_t last, value = 0;
  3. int encoderValue;
  4. int valuemax = 0;

Ott nem is volt vele semmi gond, hiszen azon kívül, hogy tekergethettem a gombot meg klikkelhettem a gombjával, nem csinált mást, így betettem globális változónak, ami azt eredményezte, hogy ebben a programban az értékét megőrizve továbbadta a következő érték beállításomnak, hiszen globál. Ezeket most töröltem a Definitionsban és minden eljárás elején hozom létre újra, majd amint kilép, elfelejti és a következőben létrehozza újból az új adatokkal. Így most már minden megy a helyén, gyakorlatilag csak át kell nézzem a kódot még, hogy hol tudok spórolni egy kis tárhelyet (például a Laslie char kódjával és megpróbálom megint a ClickEnkóder clickjét, mert gyanítom, hogy emiatt nem boldogultam azzal sem. Akkor kidobhatom a kódból a ClickButtont egy kis helyet spórolva (bár ahol nem lesz tekerőm egy másik projektben, oda jó lesz ez a tudás amit vele szereztem). Szóval kis türelem, mindjárt kész az újabb kódtisztítás
A hozzászólás módosítva: Ápr 26, 2019
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Ápr 26, 2019 /
 
Ugayanitt:

int encodervalue;

utána nincs kezdőérték: encodervalue=0;
(#) D_Zsolt válasza KoblogPerGyok hozzászólására (») Ápr 26, 2019 /
 
Ezek mind a tudatlanságom eredményei, a kezdők szerencséje, hogy úgy ahogy működött eddig. A következő projektem már biztosan probléma mentesebben fog indulni, én ezen tanultam meg az alapokat is, bár pár éve megvettem a Taviros uno-t, elővettem néha és egész jól tudok LED-et villogtatni Ezeddig ennyi volt a tudásom
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Ápr 26, 2019 /
 
Nekem jobban tetszik, ha rögtön van valami értéke is.
(#) KoblogPerGyok válasza D_Zsolt hozzászólására (») Ápr 26, 2019 /
 
Gyorsan haladsz.
(#) D_Zsolt válasza KoblogPerGyok hozzászólására (») Ápr 26, 2019 /
 
Hidd el, nem így akartam, bárminemű hasonlóság az élettel teljesen a véletlen szüleménye Valamiért nem vettem észre, talán azért mert működött és nem kiabált a fordító.
(#) kapu48 válasza Laslie hozzászólására (») Ápr 27, 2019 /
 
Már használt nevet lehetőleg ne használjál másra:
  1. /***
  2.     EEPROMClass class.
  3.    
  4.     This object represents the entire EEPROM space.
  5.     It wraps the functionality of EEPtr and EERef into a basic interface.
  6.     This class is also 100% backwards compatible with earlier Arduino core releases.
  7. ***/
  8.  
  9. struct EEPROMClass{
  10.  
  11.     //Basic user access methods.
  12.     EERef operator[]( const int idx )    { return idx; }
  13.     uint8_t read( int idx )              { return EERef( idx ); }
  14.     void write( int idx, uint8_t val )   { (EERef( idx )) = val; }
  15.     void update( int idx, uint8_t val )  { EERef( idx ).update( val ); }
  16.    
  17.     //STL and C++11 iteration capability.
  18.     EEPtr begin()                        { return 0x00; }
  19.     EEPtr end()                          { return length(); } //Standards requires this to be the item after the last valid entry. The returned pointer is invalid.
  20.     uint16_t length()                    { return E2END + 1; }
  21.    
  22.     //Functionality to 'get' and 'put' objects to and from EEPROM.
  23.     template< typename T > T &get( int idx, T &t ){
  24.         EEPtr e = idx;
  25.         uint8_t *ptr = (uint8_t*) &t;
  26.         for( int count = sizeof(T) ; count ; --count, ++e )  *ptr++ = *e;
  27.         return t;
  28.     }
  29.    
  30.     template< typename T > const T &put( int idx, const T &t ){
  31.         EEPtr e = idx;
  32.         const uint8_t *ptr = (const uint8_t*) &t;
  33.         for( int count = sizeof(T) ; count ; --count, ++e )  (*e).update( *ptr++ );
  34.         return t;
  35.     }
  36. };

13/14. sorban a vitatott nevek!
A hozzászólás módosítva: Ápr 27, 2019
(#) kapu48 válasza Laslie hozzászólására (») Ápr 27, 2019 /
 
Ezek a függvények benne vannak az EEPROM lib-ben.
Ezáltal már védet szavaknak minősülnek, amint használod a: #include <EEPROM.h>
(#) D_Zsolt hozzászólása Ápr 27, 2019 /
 
Szép reggelt!
Nem egészen csak arduino-s kérdés, de elszúrtam valamit. Elkezdtem takarítani a kódot és olyan messze ment, hogy már kiszedtem belőle majdnem minden felesleget, pedig itt is meg akartam mutatni, de már nem tudom Úgy belemerültem, hogy elfeledkeztem arról, hogy nem kéne törölni mindent, most meg már annyi minden változott, hogy nem is emlékszem a pontosan hibás blokkokra, csak arra, hogy mit és miért kellett változtatni.
Valahogy tudom a git-et úgy frissíteni, hogy látszódjon a változtatás? A baj, hogy nem szinkronban csináltam, azaz oda csak feltöltöttem és nem töltöttem le megint, hogy a git dogai is benne legyenek. Diff-el tudok patch-et csinálni, de megint az a kérdés, hogy hogyan töltöm fel? Kellene valami okosabb arduino-s editor, ami ezt is tudja, de nem eszi le a gépem haját és automatikusan verziót kezel, majd gombnyomásra feltölti. Vannak a nagyok, mint az Eclipse, Atom, Code:Blocks stb, de nem annyira kevés erőforrással dolgoznak, mint az arduino keretrendszer. A kódom végre azt csinálja egyetlen kis kivétellel amit szeretnék és szerettem volna úgy megmutatni, hogy követni lehessen, mi és hol változott. Ide tettem az újat, később törlöm mind a kettőt és csinálok neki egy rendeset. Ezt is tanulnom kell még
A hozzászólás módosítva: Ápr 27, 2019
(#) kapu48 válasza D_Zsolt hozzászólására (») Ápr 27, 2019 /
 
Ha már ilyen nagyra nőt a kódod!
Akkor tanulj meg könyvtárat készíteni!

How to Write Libraries for Arduino
Bővebben: Link

Bővebben: Link
A hozzászólás módosítva: Ápr 27, 2019
(#) D_Zsolt válasza kapu48 hozzászólására (») Ápr 27, 2019 /
 
Csak félve kérdezem: mit kellene ebből könyvtárasítani és miért? Így pár nap (talán egy hét) aktív tanulás után fogalmam sincs miért kellene és melyik részéből! Új még ez nekem, ennyire sosem akartam eddig programot írni csak az a fránya akkus porszívó az oka! Akármilyen vékonyan forrasztottam, nem fért bele a házába a vezetékek miatt Ez ha nem egészen ide vágó téma, jöhet privátban is, szívesen veszek minden információt, azt hiszem igyekeztem eddig is megfogadni innen mindent. Remélem viszontlátni a kódon is.
Következő: »»   526 / 839
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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