Jak w temacie jest jakaś elegancka metoda z tablicy Float zrobić int..
Mam w programie liczby float do wykresu, aby mieć "stabilna podstawę"
robie tak
// -- definicje tablic na zmienne 24 szt
int Blue_probki1[24] ={};
float Blue_probki2 [24] ={};
//---wycinek kodu -float-->int
Blue_probki1[i]= Blue_probki2[i];
wszystko działa ale nie podoba mi sie ze marnuje dynamic memory deklarując jeszcze jedna tablice
fajnie by było zrobić cos takiego aby sie skróciło do pełnej int z floatu
Blue_probki2[i ,0]= Blue_probki2[i];
Jakieś porady po prostu nie wiem
Jak flota wrzucisz do zmiennej INT to będzie INT. Albo to jest tak proste albo nie rozumiem z czym walczysz, opisz szerzej problem. Używanie flat w Arduino AVR nie jest dobrym pomysłem.
Używanie flat w Arduino AVR nie jest dobrym pomysłem.
Właśnie właśnie ... ta operacja kładzie mi program
Chciałem przepisać
int Red_pomiarINT[24] ={};
float Red_pomiarFL[24] ={};
Red_pomiarINT[j]= Red_pomiarFL[j];
program się kompiluje wgrywa
ale w urządzeniu się zawiesza na przepisaniu tablic można to zrobić jakoś inaczej ...
A czemuodrazu nie odczytujesz do inita?? Program się kładzie bo jest przerwa i pewnie kropka. Byś musiał z tablicy wyciągnąć same liczby te co cię interesują.
na pierwszym etapie czytam liczbę pozyskaną z czujnika float i na ekran dokładniejsza 2 liczby po kropce
na kolejnym obrabiam liczbę do użytku -->użytkuje dla elementów wykonawczych
na koniec fantazja mnie poniosła na ekran rysuje sobie wykres słupkowy ,podstawa mi skacze o piksel na floacie bo niezaokrąglony int załatwił by sprawę ...
int z floata
Jezu chryste leżało przedemną
for( int i = 0; i < probki; i++ )
{
Blue_pomiarINT[i]= Blue_pomiarFL[i];
}
Nie jest najlepszy pomysł z floatami bo generują pewne niedogodności:
- zwiększają kod wynikowy
- obliczenia są wolne
- liczby niedokładne
- porównania == nie zadziałają
- nie można użyć w niektórych przypadkach.
W Arduino są używane bardzo często i uC jakoś sobie z nimi radzi, po prostu jak jest do wyboru int i float to lepiej int. Jak ktoś w kodzie używa delay(1000) to i float w prędkości mu nie zaszkodzi, po prostu trzeba o tym pamiętać.
No i nie jest to ZAOKRĄGLENIE float do int, tylko obcięcie.
Np. liczby 11.12,13.14,15.99 zostaną zamienione na 11, 13 i 15. Jak chcesz zaokrąglić to jest do tego specjalna funkcja w Arduino.
Nie widzę całego kodu, ale jak chcesz użyć floata jako int to wystarczy tak:
Kod:
float tab[3]={11.12,13.14,15.99};
for (int i=0;i<3;i++)
{
Serial.println((int)tab[i]);
}
Mam nadzieję @Jarewa0606, że nie masz na myśli kropek zapisanych w komórce pamięci zajmowanej przez float
? To tylko 32 0 i 1, tak samo jak przy int32_t czy long, tylko inaczej interpretowane.
Niestety pomimo zachwytu nie rozwiązałem problemu.
wszystkie próby "przerobienia" tablicy float do tablicy int powodują zawieszanie programu.
1) przypisanie jednej do drugiej =
2) przepisanie komórki po komórce
3) Najciekawsze
Wczytanie równoległe do tablicy INT i do tablicy Float w tej samej pętli
4) Wczytanie INT w pierwszej pętli i Wczytanie float w następnej
Magia Arduino ... jestem zawiedziony, ale się nie poddaje.
Dodatkowe zawiechy w wyrzucie na ekran .. np
to działa Display.setCursor(12,13);Display.print("T1_OFF");Display.setCursor(62,13);Display.print(t1_OFF);
ale jak powtużę ...
Display.setCursor(12,13);Display.print("T1_OFF");Display.setCursor(62,13);Display.print(t1_OFF);
Display.setCursor(22,26);Display.print("T1_ON"); Display.setCursor(62,26);Display.print(t1_ON);
Gleba
To nie dlatego, że Arduino jest magiczne czy złe, tylko dlatego że jest tak proste, że nawet nie mając pojęcia o programowaniu wybrałeś właśnie je na początek. Wrzuć cały kod, który nie działa razem z bibliotekami, może ktoś odtworzy warunki i zauważy o co chodzi.
Ile pamięci zostaje po kompilacji?
A więc na poczekaniu zmajstrowałem kod obrazujący problem sercem są cztery pętle pracujące niezależnie od siebie na "milisach " . Mozna by je porównać do blink bez delay dla dwóch ledów równolegle taka struktura czasowa, aby czytać co określony czas czujniki temperatury i zapisywać do przesuwanych tablic dla wykresów ...
Dwie tablice float dwie int po 23 próbki dla zobrazowania wszystko jest osobno bez funkcji
jeśli mam 3 tablice nic sie nie gryzie dołączenie czwartej powoduje "glebę"... wystarczy odkomentowac czwartą ...czwarta pętla "gleba będzie widoczna po zablokowaniu leda na ledPin6 ...
CODE w 137 lini usuncie } jeden za dużo jak powiedziałem jest to wyolbrzymiony problem
który testowałem na wiele sposobów rozwiązać ...
Najlepiej zacząć przeglądać kod od loop() zmienych 60% nie potrzebnych w tym przykładzie
Dla uproszczenia sprawdziłem
for(int i = (probki-1); i > 0 ; i--)
{
Blue_pomiarFL[i] = Blue_pomiarFL[i-1];
Red_pomiarFL[i] = Red_pomiarFL[i-1];
Blue_pomiarINT[i] = Blue_pomiarINT[i-1];
Red_pomiarINT[i] = Red_pomiarINT[i-1];
}
Blue_pomiarFL [0] = temperatura1;
Red_pomiarFL [0] = temperatura1;
Blue_pomiarINT [0] = temperatura2;
Red_pomiarINT [0] = temperatura2;
Po prostu nie ma takiej możliwości ... na czterech tablicach na 3 jest
//----------------------------------------------
Działa takie cos ...
for(int i = (probki-1); i > 0 ; i--)
{
Blue_pomiarFL[i] = Blue_pomiarFL[i-1];
Red_pomiarFL[i] = Red_pomiarFL[i-1];
}
Blue_pomiarFL [0] = temperatura1;
Red_pomiarFL [0] = temperatura1;
for(int i=0;i<probki;++i)
{
Blue_pomiarINT[i] = Blue_pomiarFL[i];
Red_pomiarINT[i] = Red_pomiarFL[i];
}
Do momentu dalszej obróbki