Witam,
Stworzyłem na mikroprocesorze AVR pomiar odległości (czujnik ultradźwiękowy) i chciałbym wyświetlać wykres odległości w funkcji kolejnych próbek na wyświetlaczu 128x64. Zakres pomiarowy to 2-250 cm. Z racji, że szerokość wyświetlacza to 128 pixeli (od 0 do 128), więc pomyślałem, że stworzę tablicę 128 elementową, gdzie będę zapisywał pomiary i wyświetlał je na wyświetlaczu, a następnie gdy 128 element tablicy przyjmie wartość niezerową to, elementom tablicy tab[i] nadam wartość tab [i+1] (przesunięcie próbek o jedną w lewo, zapominanie tej najstarszej i nadanie wartości tab[127] aktualnej wartości itp. I teraz pytanie, czy można to zrobić lepiej? Bo przepisywanie co każdy pomiar 127 elementów tablicy jest chyba mało optymalnym rozwiązaniem.
Dodam, że w celu wyświetleniu danego piksela na wyświetlaczu wystarczy podać, jego współrzędne: x = (0,127) y= (0,63) => przedziały
Z racji, że wysokość zawiera 64 piksele a mój wynik maksymalnie osiąga wartość 250, to należy przeskalować pomiar, dzieląc go przez 4, wtedy 1pikel będzie odpowiadał za 4 cm.
mój pomysł:
int main(){
int tab [ 128];
// Wyświetlacz pusty, tablica pusta, rozpoczynanie rysowania wykresu
if (tab[127]==0) //jeśli ekran czysty, rysuj wykres, aż ostatni element tablicy (pixel) przyjmie jakąś wartość
{
for (int i =0; i<128; i++)
{
pomiar(); //wywolanie funkcji która wykona pomiar i do zmiennej odleglosc przypisze wartość z zakresu 2 - 250
tab[i]=odleglosc/4;
rysuj (i, tab[i]); //funcja rysuje piksel na wsp (x,y), gdzie (0,0) to lewy dolny róg wyświetlacza
_delay_ms(100); // opóźnienie 10 pomiarów na sekundę
}
else //cały wyświetlacz zapełniony, teraz trzeba zapomnieć próbkę tab[0] i wpisać nową do tab[127] i znowu wyświetlić wszystkie
{
for (int i=0; i<127; i++) //przepisywanie tablicy, element tab[126] = tab[127], a więc wszystko przesunięte o 1 w lewo
{
tab[i]=tab[i+1];
}
pomiar();
tab[127]=odleglosc; //mamy już cala tablice przesuniętą o 1 w lewo + nowy pomiar
for (int i =0; i<128; i++)
{
rysuj (i, tab[i]/4);
}
_delay_ms(100);
}
}
Moje pytanie, jak można zrobić to lepiej? Słyszałem, że jest coś takiego jak bufor kołowy, ale nie mam pojęcia jak go wykorzystać, bo jestem początkujący w programowaniu w C.
Może ewentualnie jakieś inne pomysły?