Fórum témák
- • Arduino
- • 3D nyomtatás
- • Mosógép vezérlők és általános problémáik
- • Nagyfeszültségű tápegység
- • Klíma szervizelés, javítás
- • Számítógép hiba, de mi a probléma?
- • Hangszórójavítás (otthon)
- • Laptop javítás, tuning
- • Dobozolási technikák, műszerdobozok
- • Kondenzátor
- • Elektromos távirányítós kapunyitó
- • Autós erősítős kérdések, problémák
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Elfogadnám, ha ingyen elvihető
- • Boombox javítás
- • Villanymotor
- • Erősítő mindig és mindig
- • Akkumulátor töltő
- • Sütő javítás
- • Vegyes barkácsfogások
- • Digitális óra
- • Hűtőgép probléma
- • TV hiba, mi a megoldás?
- • Szünetmentes táp javítása, élesztése
- • Felajánlás, azaz ingyen elvihető
- • Erősítő építése elejétől a végéig
- • Műhelyünk felszerelése, szerszámai
- • Kombikazán működési hiba
- • Függvénygenerátor építése
- • SMD, mi a típusa?
- • Hibrid erősítő
- • Suzuki Swift elektronika
- • Videomagnó problémák
- • Általános antennás kérdések, válaszok
- • Érdekességek
- • STK erősítők javítások
- • DC-DC konverter max. kapacitív terhelése
- • Háromfázisú aggregátor
- • Audiofil, High End Audio
- • Alternativ HE találkozó(k)
- • Központi fűtés (vezérlés)
- • IMI villanymotor
- • Borhűtő vezérlő panel
- • Androidos okos telefonok
- • Klíma beszerelése, fűtés-hűtés házilag
- • Súlymérés
- • Varrógép elektronika
- • Analóg oszcilloszkóp javítása
- • Videoton EA-7386-s erösítő
- • Digitális mérleg
- • Kapcsolási rajzot keresek
- • Triak és tirisztor helyettesítése
- • Rádióamatőrök topikja
- • LED-es világítás
- • Whirlpool mosógép
» Több friss téma
|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
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.
Nem erre való az Arduinoban a min() és max() függvény?
Az két értékre jó csak, most próbálom a array.getMin() -t de hibát dob rá.
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:
float ehh[] = {1.1, -5.7456, 18.5, 214.56734, 3.14159};
float avgX(){
float min = ehh[0];
float max = ehh[0];
for (int i=1; i < 5; i++){
if (ehh[i] < min){
min = ehh[i];}
if (ehh[i] > max){
max = ehh[i];}
}
unsigned int db = 0;
float sum = 0;
for (int i=1; i < 5; i++){
if ( (ehh[i] > min) && (ehh[i] < max) ){
sum += ehh[i];
db++;
}
}
return sum / db;
}
A hozzászólás módosítva: Dec 10, 2017
Összeraktam a kódot a szöveges leírásommal:
// Szeretnék csinálni egy 5 elemű tömböt, azt feltölteni float változókkal. (ez eddig nem gond)
float ehh[] = {1.1, -5.7456, 18.5, 214.56734, 3.14159};
// 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
float min = ehh[0];
float max = ehh[0];
// 3. ciklusban végigmész a tömb maradék elemein (2-5)
for (int i=1; i < 5; i++){
// ha az adott elem kisebb mint a min
if (ehh[i] < min){
// , akkor min értékét erre állítod.
min = ehh[i];}
// Ha az adott elem nagyobb, mint a max
if (ehh[i] > max){
// akkor a max értékét erre állítod.
max = ehh[i];}
}
// 4. felveszel 2 változót, darab és osszeg, mindkettő értéke nulla
unsigned int db = 0;
float sum = 0;
// 5. ciklusban végigmész a tömb összes elemén (1-5)
for (int i=1; i < 5; i++){
// ha az adott elem nem a max és nem a min
if ( (ehh[i] > min) && (ehh[i] < max) ){
// akkor az elemet hozzáadod az osszeg-hez
sum += ehh[i];
// és a darab értékét eggyel növeled
db++;
}
}
// 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.
if (db > 0){
float avg = sum / db;}
A hozzászólás módosítva: 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).
if ( tomb [0] < tomb [1] && tomb [0] < tomb [2] && tomb [0] < tomb [3] && tomb [0] < tomb [4] )
{ tomb [0] = 0;}
if ( tomb [1] < tomb [0] && tomb [1] < tomb [2] && tomb [1] < tomb [3] && tomb [1] < tomb [4] )
{ tomb [1] = 0;}
if ( tomb [2] < tomb [0] && tomb [1] < tomb [2] && tomb [2] < tomb [3] && tomb [2] < tomb [4] )
{ tomb [2] = 0;}
if ( tomb [3] < tomb [0] && tomb [3] < tomb [1] && tomb [3] < tomb [1] && tomb [3] < tomb [4] )
{ tomb [3] = 0;}
if ( tomb [4] < tomb [0] && tomb [4] < tomb [1] && tomb [4] < tomb [2] && tomb [4] < tomb [3] )
{ tomb [4] = 0;}
if ( tomb [0] > tomb [1] && tomb [0] > tomb [2] && tomb [0] > tomb [3] && tomb [0] > tomb [4] )
{ tomb [0] = 0;}
if ( tomb [1] > tomb [0] && tomb [1] > tomb [2] && tomb [1] > tomb [3] && tomb [1] > tomb [4] )
{ tomb [1] = 0;}
if ( tomb [2] > tomb [0] && tomb [1] > tomb [2] && tomb [2] > tomb [3] && tomb [2] > tomb [4] )
{ tomb [2] = 0;}
if ( tomb [3] > tomb [0] && tomb [3] > tomb [1] && tomb [3] > tomb [1] && tomb [3] > tomb [4] )
{ tomb [3] = 0;}
if ( tomb [4] > tomb [0] && tomb [4] > tomb [1] && tomb [4] > tomb [2] && tomb [4] > tomb [3] )
{ tomb [4] = 0;}
for ( byte index = 0; index < 5 ; index ++)
{osszeg = osszeg + tomb [index]; }
atlag = osszeg /3;
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...
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.
Az nem gond, ha ez első nem teljesül a sorban, akkor az egész sor sem teljesülhet.
qsort() fügvény a stdlib-ben? Egyszerűbb lenne.
Előfordul, hogy a tömbben két azonos elem van, akkor többet nullázok le. Így meg is bukik a dolog.
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.
#define _MERET 5 // tömb kívánt mérete
#define _ELDOBANDO 1 // Mennyit dobjunk el a tömb tetejéről és aljáról
float tomb[_MERET] = {1.1, -5.7456, 18.5, 214.56734, 3.14159};
float rendezo;
for (int i = 0; i < _MERET; ++i)
for (int j = i + 1; j < _MERET; ++j)
if (tomb[i] < tomb[j])
{
rendezo = tomb[i];
tomb[i] = tomb[j];
tomb[j] = rendezo;
}
float eredmeny;
for (int i = _ELDOBANDO; i < _MERET - _ELDOBANDO; i++)
eredmeny += tomb[i];
eredmeny /= _MERET - 2 * _ELDOBANDO;
Ez működik, köszönöm.
A "favágó módszer" nem jól kezeli az azonos tömbelemeket.
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.
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.
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.)
Nem mondtam, hogy van libstdc++, stdlib.h-ról van szó. Ott van deklarálva a qsort.
Hát ez se kezeli le, ha a legnagyobb vagy legkisebb elemedből több van. Bár bele lehet hegeszteni...
Í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...
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
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
Én így csinálnám:
// Buborékrendezés (algoritmus)
void bubble( float arr[], int size ) {
int i;
int j;
float tmp;
for (i=size-1; 0<i; --i) {
for (j=0; j < i; ++j) {
if (arr[j]>arr[j+1]) {
// csere
tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
}
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
int _size = 5;
float tmp = 0;
float ehh[_size] = {1.1, -5.7456, 18.5, 214.56734, 3.14159};
bubble( ehh, _size ); // Tömbb Sorbarendezés
for (int i_=1; i_<_size-1; i_++) { // Összeadás a szélső értékek kihagyásával
tmp += ehh[i_];
}
tmp /= _size-2; // Átlagolás
}
A hozzászólás módosítva: Dec 11, 2017
Esetleg tovább fejlesztve:
// Buborékrendezés (algoritmus)
void bubble( float arr[], int size ) {
int i;
int j;
float tmp;
for (i=size-1; 0<i; --i) {
for (j=0; j < i; ++j) {
if (arr[j]>arr[j+1]) {
// csere
tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
}
// Tömbb átlag számitás
float atlag( float arr[], int size ) {
float tmp = 0;
bubble( arr, size ); // Tömbb Sorbarendezés
for (int i_=1; i_<size-1; i_++) { // Összeadás a szélső értékek kihagyásával
tmp += arr[i_];
}
tmp /= size-2;
return tmp;
}
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
int _size = 5;
float tmp = 0;
float ehh[_size] = {1.1, -5.7456, 18.5, 214.56734, 3.14159};
tmp = atlag( ehh, _size ); // Tömbb átlag számitás
}
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.
Nem nagy dolog átírni, és figyelni arra, hogy pontosan 1 minimumot és pontosan egy maximumot hagyjon ki.
// Szeretnék csinálni egy 5 elemű tömböt, azt feltölteni float változókkal. (ez eddig nem gond)
float ehh[] = {1.1, -5.7456, 18.5, 214.56734, 3.14159};
// 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
float min = ehh[0];
float max = ehh[0];
// 3. ciklusban végigmész a tömb maradék elemein (2-5)
for (int i=1; i < 5; i++){
// ha az adott elem kisebb mint a min
if (ehh[i] < min){
// , akkor min értékét erre állítod.
min = ehh[i];}
// Ha az adott elem nagyobb, mint a max
if (ehh[i] > max){
// akkor a max értékét erre állítod.
max = ehh[i];}
}
// 4. felveszel 2 változót, darab és osszeg, mindkettő értéke nulla
unsigned int db = 0;
float sum = 0;
// 5. ciklusban végigmész a tömb összes elemén (1-5)
int voltmax = 0;
int voltmin = 0;
for (int i=1; i < 5; i++){
// ha az adott elem nem a max és nem a min
if ( (ehh[i] == min) && (0 == voltmin) ){
voltmin = 1;}
else{
if ( (ehh[i] == max) && (0 == voltmax) ){
voltmax = 1;}
else{
// akkor az elemet hozzáadod az osszeg-hez
sum += ehh[i];
// és a darab értékét eggyel növeled
db++;
}
}
}
// 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.
if (db > 0){
float avg = sum / db;}
else{
// baj van
}
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.
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?
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
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?
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
|
|