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   405 / 853
(#) berkesandor válasza tbarath hozzászólására (») Dec 10, 2017 /
 
Először meg kell keresni min és max értéket a tömbben, azt nem tudom előre, mi lesz a min és max.
(#) mateatek válasza berkesandor hozzászólására (») Dec 10, 2017 /
 
Nem erre való az Arduinoban a min() és max() függvény?
(#) berkesandor válasza mateatek hozzászólására (») Dec 10, 2017 /
 
Az két értékre jó csak, most próbálom a array.getMin() -t de hibát dob rá.
(#) tbarath válasza berkesandor hozzászólására (») Dec 10, 2017 /
 
Pásszeg...

1. felveszel 2 változót, legyen a nevük min és max.
2. min és max értéke is a tömb első eleme legyen
3. ciklusban végigmész a tömb maradék elemein (2-5), ha az adott elem kisebb mint a min, akkor min értékét erre állítod. Ha az adott elem nagyobb, mint a max, akkor a max értékét erre állítod.

Ugyan ki nem próbáltam (de lefordul), elvileg ez azt csinálná, amit akarsz:
  1. float ehh[] = {1.1, -5.7456, 18.5, 214.56734, 3.14159};
  2.  
  3. float avgX(){
  4.   float min = ehh[0];
  5.   float max = ehh[0];
  6.   for (int i=1; i < 5; i++){
  7.     if (ehh[i] < min){
  8.       min = ehh[i];}
  9.     if (ehh[i] > max){
  10.       max = ehh[i];}
  11.   }
  12.   unsigned int db = 0;
  13.   float sum = 0;
  14.   for (int i=1; i < 5; i++){
  15.     if ( (ehh[i] > min) && (ehh[i] < max) ){
  16.       sum += ehh[i];
  17.       db++;
  18.     }
  19.   }
  20.   return sum / db;
  21. }
A hozzászólás módosítva: Dec 10, 2017
(#) tbarath válasza tbarath hozzászólására (») Dec 10, 2017 /
 
Összeraktam a kódot a szöveges leírásommal:
  1. // Szeretnék csinálni egy 5 elemű tömböt, azt feltölteni float változókkal. (ez eddig nem gond)
  2.   float ehh[] = {1.1, -5.7456, 18.5, 214.56734, 3.14159};
  3.  
  4.   // 1. felveszel 2 változót, legyen a nevük min és max.
  5.   // 2. min és max értéke is a tömb első eleme legyen
  6.   float min = ehh[0];
  7.   float max = ehh[0];
  8.   // 3. ciklusban végigmész a tömb maradék elemein (2-5)
  9.   for (int i=1; i < 5; i++){
  10.     // ha az adott elem kisebb mint a min
  11.     if (ehh[i] < min){
  12.       // , akkor min értékét erre állítod.
  13.       min = ehh[i];}
  14.     // Ha az adott elem nagyobb, mint a max
  15.     if (ehh[i] > max){
  16.       // akkor a max értékét erre állítod.
  17.       max = ehh[i];}
  18.   }
  19.   // 4. felveszel 2 változót, darab és osszeg, mindkettő értéke nulla
  20.   unsigned int db = 0;
  21.   float sum = 0;
  22.   // 5. ciklusban végigmész a tömb összes elemén (1-5)
  23.   for (int i=1; i < 5; i++){
  24.     // ha az adott elem nem a max és nem a min
  25.     if ( (ehh[i] > min) && (ehh[i] < max) ){
  26.       // akkor az elemet hozzáadod az osszeg-hez
  27.       sum += ehh[i];
  28.       // és a darab értékét eggyel növeled
  29.       db++;
  30.     }
  31.   }
  32.   // 6. elosztod az osszeg értékét a darab értékével, így kapsz átlagot - persze csak ha a darab > 0, mert ha nem, akkor egyetlen vagy 2 különböző értéket tartalmaz az összes tömbelemed.
  33.   if (db > 0){
  34.     float avg = sum / db;}
A hozzászólás módosítva: Dec 10, 2017
(#) berkesandor válasza tbarath hozzászólására (») Dec 10, 2017 /
 
A tiédet még nem próbáltam, de megoldottam favágó módszerrel:
Legkisebbet és legnagyobbat lenullázom, majd átlagolok ( de csak 3-al osztok).

  1. if ( tomb [0] < tomb [1] && tomb [0] < tomb [2]  && tomb [0] < tomb [3] && tomb [0] < tomb [4] )
  2.     { tomb [0] = 0;}
  3.    
  4.   if ( tomb [1] < tomb [0] && tomb [1] < tomb [2] && tomb [1] < tomb [3] && tomb [1] < tomb [4] )
  5.     { tomb [1] = 0;}
  6.  
  7.  if ( tomb [2] < tomb [0] && tomb [1] < tomb [2] && tomb [2] < tomb [3] && tomb [2] < tomb [4] )
  8.     { tomb [2] = 0;}
  9.  
  10.  if ( tomb [3] < tomb [0] && tomb [3] < tomb [1] && tomb [3] < tomb [1] && tomb [3] < tomb [4] )
  11.     { tomb [3] = 0;}
  12.  
  13.  if ( tomb [4] < tomb [0] && tomb [4] < tomb [1] && tomb [4] < tomb [2] && tomb [4] < tomb [3] )
  14.     { tomb [4] = 0;}
  15.  
  16.  
  17.  
  18.  if ( tomb [0] > tomb [1] && tomb [0] > tomb [2]  && tomb [0] > tomb [3] && tomb [0] > tomb [4] )
  19.     { tomb [0] = 0;}
  20.    
  21.   if ( tomb [1] > tomb [0] && tomb [1] > tomb [2] && tomb [1] > tomb [3] && tomb [1] > tomb [4] )
  22.     { tomb [1] = 0;}
  23.  
  24.  if ( tomb [2] > tomb [0] && tomb [1]  > tomb [2] && tomb [2] > tomb [3] && tomb [2] > tomb [4] )
  25.     { tomb [2] = 0;}
  26.  
  27.  if ( tomb [3] > tomb [0] && tomb [3] > tomb [1] && tomb [3] > tomb [1] && tomb [3] > tomb [4] )
  28.     { tomb [3] = 0;}
  29.  
  30.  if ( tomb [4] > tomb [0] && tomb [4] > tomb [1] && tomb [4] > tomb [2] && tomb [4] > tomb [3] )
  31.     { tomb [4] = 0;}
  32.    
  33.  
  34. for ( byte index = 0; index < 5 ; index ++)
  35.      {osszeg = osszeg + tomb [index]; }
  36.  
  37.    atlag =  osszeg /3;
(#) tbarath válasza berkesandor hozzászólására (») Dec 10, 2017 /
 
Ez is működik, csak nem túl elegáns. Illetve ha bele kell nyúlni, mert mondjuk 6 vagy 8 elemet kell átlagolni, hát az igen fájdalmas lesz...
(#) kapu48 válasza berkesandor hozzászólására (») Dec 10, 2017 /
 
if-ben az && feltétel vizsgálatnál az a bibi, hogy ha tegyük fel az első nem igaz?
Akkor a többit már nem vizsgálja tovább, tehát nem megy végig a soron.
(#) berkesandor válasza kapu48 hozzászólására (») Dec 10, 2017 /
 
Az nem gond, ha ez első nem teljesül a sorban, akkor az egész sor sem teljesülhet.
(#) rolandgw válasza berkesandor hozzászólására (») Dec 10, 2017 /
 
qsort() fügvény a stdlib-ben? Egyszerűbb lenne.
(#) berkesandor válasza tbarath hozzászólására (») Dec 10, 2017 /
 
Előfordul, hogy a tömbben két azonos elem van, akkor többet nullázok le. Így meg is bukik a dolog.
(#) nightlife válasza berkesandor hozzászólására (») Dec 10, 2017 /
 
A qsort() ha jól emlékszem nagyon stack igényes, mikrokontrolleren abból pedig kevés van. Én sima bubirendezéssel oldanám meg. A define-ok a későbbi bővíthetőség miatt vannak benne.
  1. #define _MERET 5 // tömb kívánt mérete
  2. #define _ELDOBANDO 1 // Mennyit dobjunk el a tömb tetejéről és aljáról
  3.  
  4. float tomb[_MERET] = {1.1, -5.7456, 18.5, 214.56734, 3.14159};
  5.  
  6. float rendezo;
  7. for (int i = 0; i < _MERET; ++i)
  8.   for (int j = i + 1; j < _MERET; ++j)
  9.     if (tomb[i] < tomb[j])
  10.     {
  11.       rendezo = tomb[i];
  12.       tomb[i] = tomb[j];
  13.       tomb[j] = rendezo;
  14.     }
  15.  
  16. float eredmeny;
  17. for (int i = _ELDOBANDO; i < _MERET - _ELDOBANDO; i++)
  18.   eredmeny += tomb[i];
  19.  
  20. eredmeny /= _MERET - 2 * _ELDOBANDO;
(#) berkesandor válasza tbarath hozzászólására (») Dec 10, 2017 /
 
Ez működik, köszönöm.
A "favágó módszer" nem jól kezeli az azonos tömbelemeket.
(#) vargham válasza rolandgw hozzászólására (») Dec 10, 2017 /
 
AVR-en nincs libstdc++
Helyette van mincenféle C könyvtár implementálva, speciálisan figyelembe véve az architektúra sajátosságait, például qsort() is.
(#) kleinie hozzászólása Dec 10, 2017 /
 
Szeretnék Arduino/AVR programozással megismerkedni. Mi a helyzet az kínai piacon fellelhető Arduino deszkákkal? Van valakinek tapasztalata? Egy ilyen deszka kezdő kit-el annyiba kerül, mint itthon maga a lap.
(#) goreny válasza kleinie hozzászólására (») Dec 10, 2017 /
 
Használhatóak, azonban belefuthatsz hibás lapokba és lehetnek problémák a driverrel. Kezdő kitet pedig itthoni forrásból is összerakhatsz, alkatészenként. (A kezdőkitek legtöbbször az adott alkatrészek árának többszöröse, és sok minden felesleges benne.)
(#) rolandgw válasza vargham hozzászólására (») Dec 10, 2017 /
 
Nem mondtam, hogy van libstdc++, stdlib.h-ról van szó. Ott van deklarálva a qsort.
(#) tbarath válasza berkesandor hozzászólására (») Dec 11, 2017 /
 
Hát ez se kezeli le, ha a legnagyobb vagy legkisebb elemedből több van. Bár bele lehet hegeszteni...
(#) tbarath válasza goreny hozzászólására (») Dec 11, 2017 /
 
Így van, a kezdő kiteket érdemes elfelejteni. 200 Ft-nyi alkatrészt megkasz 2000-ért egy szép kis dobozban. Már a kínai forrásoknák, mert itthon inkább több...
(#) tbarath válasza tbarath hozzászólására (») Dec 11, 2017 /
 
Pontosabban attól függ, hogy mit szeretnél.
Ha a tömböd ilyen: 1, 1, 3, 6, 10; akkor az én módszerem a 3-at és a 6-ot átlagolja, mert két legkisebb és egy legnagyobb van, és ezeket nem számolja. Ugyanígy működik 1, 3, 6, 10, 10 esetén, azaz amikor a legnagyobbból több van.
És vannak speciális esetek, amik nincsenek lekezelve, pl. a 3,3,3,3,3; vagy épp a 6,6,6,8,8 tömb is ilyen. Ilyenkor valamilyen hiba flag-et kellene bebillenteni, mert javasolt lekezelni az ilyet
(#) berkesandor válasza tbarath hozzászólására (») Dec 11, 2017 /
 
Akkor ezen még gondolkodnom kell, a tömb elemei mérési eredmények, nyilván lehetnek benne azonosak, elméletileg lehet az összes azonos is.
A hozzászólás módosítva: Dec 11, 2017
(#) kapu48 válasza berkesandor hozzászólására (») Dec 11, 2017 /
 
Én így csinálnám:
  1. // Buborékrendezés (algoritmus)
  2. // http://wiki.prog.hu/wiki/Buborékrendezés_(algoritmus)
  3.    void bubble( float arr[], int size ) {
  4.       int i;
  5.       int j;
  6.       float tmp;
  7.       for (i=size-1; 0<i; --i) {
  8.          for (j=0; j < i; ++j) {
  9.             if (arr[j]>arr[j+1]) {
  10.                // csere
  11.                tmp=arr[j];
  12.                arr[j]=arr[j+1];
  13.                arr[j+1]=tmp;
  14.             }
  15.          }
  16.       }
  17.    }
  18.  
  19. void setup() {
  20.   // put your setup code here, to run once:
  21.  
  22.  
  23. }
  24.  
  25. void loop() {
  26.   // put your main code here, to run repeatedly:
  27.   int _size = 5;
  28.   float tmp = 0;
  29.  
  30.   float ehh[_size] = {1.1, -5.7456, 18.5, 214.56734, 3.14159};
  31.  
  32.   bubble( ehh, _size );   // Tömbb Sorbarendezés
  33.  
  34.   for (int i_=1; i_<_size-1; i_++) {  // Összeadás a szélső értékek kihagyásával
  35.      tmp += ehh[i_];  
  36.  }
  37.  tmp /= _size-2;  // Átlagolás
  38.  
  39. }
A hozzászólás módosítva: Dec 11, 2017
(#) kapu48 válasza kapu48 hozzászólására (») Dec 11, 2017 /
 
Esetleg tovább fejlesztve:
  1. // Buborékrendezés (algoritmus)
  2. // http://wiki.prog.hu/wiki/Buborékrendezés_(algoritmus)
  3. void bubble( float arr[], int size ) {
  4.       int i;
  5.       int j;
  6.       float tmp;
  7.       for (i=size-1; 0<i; --i) {
  8.          for (j=0; j < i; ++j) {
  9.             if (arr[j]>arr[j+1]) {
  10.                // csere
  11.                tmp=arr[j];
  12.                arr[j]=arr[j+1];
  13.                arr[j+1]=tmp;
  14.             }
  15.          }
  16.       }
  17. }
  18.  
  19.  // Tömbb átlag számitás
  20. float atlag( float arr[], int size ) {
  21.   float tmp = 0;
  22.  
  23.   bubble( arr, size );   // Tömbb Sorbarendezés
  24.   for (int i_=1; i_<size-1; i_++) {  // Összeadás a szélső értékek kihagyásával
  25.      tmp += arr[i_];
  26.   }
  27.   tmp /= size-2;
  28.   return tmp;        
  29. }
  30.  
  31. void setup() {
  32.   // put your setup code here, to run once:
  33.  
  34.  
  35. }
  36.  
  37. void loop() {
  38.   // put your main code here, to run repeatedly:
  39.   int _size = 5;
  40.   float tmp = 0;
  41.  
  42.   float ehh[_size] = {1.1, -5.7456, 18.5, 214.56734, 3.14159};
  43.  
  44.   tmp = atlag( ehh, _size );   // Tömbb átlag számitás
  45.  
  46.  
  47. }
(#) berkesandor válasza kapu48 hozzászólására (») Dec 11, 2017 /
 
A céljaimnak ez felel meg a legjobban , kiküszöböli azokat a hibákat amire az elején nem is gondoltam. Köszönöm. Kipróbálom hamarosan.
(#) tbarath válasza berkesandor hozzászólására (») Dec 11, 2017 /
 
Nem nagy dolog átírni, és figyelni arra, hogy pontosan 1 minimumot és pontosan egy maximumot hagyjon ki.

  1. // Szeretnék csinálni egy 5 elemű tömböt, azt feltölteni float változókkal. (ez eddig nem gond)
  2.         float ehh[] = {1.1, -5.7456, 18.5, 214.56734, 3.14159};
  3.  
  4.         // 1. felveszel 2 változót, legyen a nevük min és max.
  5.         // 2. min és max értéke is a tömb első eleme legyen
  6.         float min = ehh[0];
  7.         float max = ehh[0];
  8.         // 3. ciklusban végigmész a tömb maradék elemein (2-5)
  9.         for (int i=1; i < 5; i++){
  10.                 // ha az adott elem kisebb mint a min
  11.                 if (ehh[i] < min){
  12.                         // , akkor min értékét erre állítod.
  13.                         min = ehh[i];}
  14.                 // Ha az adott elem nagyobb, mint a max
  15.                 if (ehh[i] > max){
  16.                         // akkor a max értékét erre állítod.
  17.                         max = ehh[i];}
  18.         }
  19.         // 4. felveszel 2 változót, darab és osszeg, mindkettő értéke nulla
  20.         unsigned int db = 0;
  21.         float sum = 0;
  22.         // 5. ciklusban végigmész a tömb összes elemén (1-5)
  23.         int voltmax = 0;
  24.         int voltmin = 0;
  25.         for (int i=1; i < 5; i++){
  26.                 // ha az adott elem nem a max és nem a min
  27.                 if ( (ehh[i] == min) && (0 == voltmin) ){
  28.                         voltmin = 1;}
  29.                 else{
  30.                         if ( (ehh[i] == max) && (0 == voltmax) ){
  31.                                 voltmax = 1;}
  32.                         else{
  33.                                 // akkor az elemet hozzáadod az osszeg-hez
  34.                                 sum += ehh[i];
  35.                                 // és a darab értékét eggyel növeled
  36.                                 db++;
  37.                         }
  38.                 }
  39.         }
  40.         // 6. elosztod az osszeg értékét a darab értékével, így kapsz átlagot - persze csak ha a darab > 0, mert ha nem, akkor egyetlen vagy 2 különböző értéket tartalmaz az összes tömbelemed.
  41.         if (db > 0){
  42.                 float avg = sum / db;}
  43.         else{
  44.                 // baj van
  45.         }
(#) kleinie válasza goreny hozzászólására (») Dec 11, 2017 /
 
Na majd kipróbálom délután összekattintgatok egyet a Hestore-ban. De a szememnek megtetszett a "kici szárga", és valóban jól néz ki. Az unalmas kék arduino helyett ez fekete/sárga.
(#) RoliNyh hozzászólása Dec 11, 2017 /
 
Szebb napot!

Szóval mivel előzőekben mutatott projektemmel nem férek bele egy attiny44 -be, az esetleg nem megoldható, hogy külső flash -el (AT24C16) bővítem a hardwert?
(#) csatti2 válasza RoliNyh hozzászólására (») Dec 11, 2017 /
 
Megoldható, de az Arduino-t sztem mellőznöd kell, mert nagyon sok sallang van benne, ami növeli a programméretet.

Két irányba mehetsz el. Az egyik az, hogy betöltöd a karaktert, amit meg akarsz jeleníteni és ebből generálod a képpontokat (lassabb). A másik (SPI-os flasht feltételezve), hogy előre legenerálod a képernyő típusának megfelelően bitmapként a betűket (háttérszín, betűszín), a végeredményt flashbe felírod. Kiíratáskor először felkonfigolod a kijelzőt, hova megy a betű, utána pedig a flash-t, honnan vegye az adatokat, majd utána csak órajelet küldesz ki az AVR-ből és a flash IC direktben a képernyőre tolja az adatot (közös SPI busz). Nagyon kell figyelni, hogy ne lehessen rövidzár (busz IC-k, vagy áramkorlátozó ellenállások kellenek). Ez utóbbi módszer nagyon gyors eredményt adhat.

Megj.: Az az IC egyébként EEPROM és nem flash. Flash IC-k olcsóbbak és jóval nagyobbak, viszont ritkábban írhatóak (ez itt nem gond), I2C helyett pedig inkább SPI, ami sokkal gyorsabb.
A hozzászólás módosítva: Dec 11, 2017
(#) RoliNyh válasza csatti2 hozzászólására (») Dec 11, 2017 /
 
Mmmm, akkor ez úgy érzem megint nem kezdő(k)nek való projekt...
Hogy kellene erre neten rákeresni, hogy lássak is valamit előbb?
(#) csatti2 válasza RoliNyh hozzászólására (») Dec 11, 2017 /
 
Hmm, egyszer valahol láttam egy projektet, ahol valaki SPI-os SRAM-ot használt framebuffer-nek SPI-os TFT-hez egy hasonló megoldással. Én magam biztos nem vesződnék ezzel, mert létezik egy csomó filléres mikrokontroller, ahol nem szükséges ilyen köröket futni a jó eredményhez (elég a flash is és az SRAM is), csak épp azok nem AVR-ek.

Készítettem egy gyors Móricka ábrát. Az IC-ket ne vedd készpénznek (ilyenek voltak az adatbázisomban), neked szintillesztés is kellhet a TFT-hez, illetve 5V-os flash IC.
A hozzászólás módosítva: Dec 11, 2017
Következő: »»   405 / 853
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