Arduino Polska Forum

Pełna wersja: Ultrasonic - pomiary w w tablicy
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
Witam
Mam pytanie odnosnie zapisywania danych do tablicy. Jak wiecie zaprogramowany czujnik odbiera sygnaly ktorych wartosci mozemy wyswietlic w  Serial Moniotor. Chcialbym jednak  aby wyniki byly zapisywane do tablicy, z tego wzgledu ze chcialbym z nich korzystac w nastepnej funkcji. Czy ktos ma pomysl jak tego dokonac? podam kod ktory wyswietla wyniki bez tablicy

Kod:
#define Trig A0
#define Echo A1
//#define Led1 A7
//#define Led2 A6

unsigned long duration;
float distance;

void setup()
{
 Serial.begin(9600);
 pinMode(Trig,OUTPUT);
 pinMode(Echo,INPUT);
 //pinMode(Led1,OUTPUT);
 //pinMode(Led2, OUTPUT);
 //digitalWrite(Led2,HIGH);
 //digitalWrite(Led1,LOW);

}
/*
float measure()
{
 digitalWrite(Trig,HIGH);
 delayMicroseconds(10);
 digitalWrite(Trig,LOW);
 duration = pulseIn(Echo,HIGH);
 distance = duration/58.00;
 /*if (distance < 10.00)
 {
 digitalWrite(Led1,HIGH);
 digitalWrite(Led2,LOW);
 }


}*/

void loop()
{
 digitalWrite(Led2,HIGH);
 digitalWrite(Led1,LOW);
 digitalWrite(Trig,HIGH);
 delayMicroseconds(10);
 digitalWrite(Trig,LOW);
 duration = pulseIn(Echo,HIGH);
 float distance = duration/58.00;
/* if (distance < 10.00)
 {
 digitalWrite(Led1,HIGH);
 digitalWrite(Led2,LOW);
 }*/
 Serial.print("Distance: ");
 Serial.print(distance);
 Serial.println("cm");
 delay(500);
 
}
Kurcze nie zdążę do kina... jak wrócę to napiszę więcej. W każdym da się utworzyć w pamięci tablicę typu float o max 596 elementach (praktyka). Powyżej tej wielkości kompilator zastrajkuje - za mało pamięci.
To tyle. Wieczorkiem napisze dlaczego tak jest i jak to ugryźć.
Pozdrawiam
Super, będę czekał na  podpowiedzi. Z tego co sie dowiedziałem międzyczasie to trzeba by było z EEPROM, jest gotowy sketch zapisu do EEPROM ale z tymi tablicami to nie wychodzi.
Pozdrawiam
Da się i do EEPROM zapisać, tyle że tam zapisuje się kolejne bajty, zaczynając od komórki pamięci o adresie 0. Mała trudność polega na tym, że jak pisałem wcześniej liczba typu float zajmuje w pamięci 4 bajty, zatem jej poszczególne bity (po 8) trzeba dzielić i kolejno zapisywać w EEPROM. Mało wydajna metoda niestety. Może napisz do czego potrzebne Ci są te tablice, co chciałbyś z tymi danymi potem robić... i może wtedy należałoby wymyślić coś max. prostego....Najtrudniej jest zakumać co autor ma na myśli :-)
Pozdrawiam
Zgadza się, nie ma to jak zrozumieć autora mysli. Potrzebna  mi byla tablica by zbierac pomiary i z opoznieniem 200ms maksymalnie wysylac max wartosc,  a pozniej z kolei dzieki tym wartosciom max mogl sterowac innym urzadzeniem. Mysle ze poradzilem sobie z tym.  
Dzieki za odpwiedz
Pozdrawiam
Witam 
No nie bardzo rozumiem to zbieranie pomiarów z tym max opóźnieniem 200ms skoro w kodzie pozwalasz sobie na delay(500)... ale spoko.
Skoro chcesz z np 1000 prób pobrać max. wartość to jaki problem użyć tylko 2 zmiennych i w każdej próbie sprawdzać:
Kod:
float x, max=0;
for(int i=0;i<1000;i++)
{
// jakiś tam pomiar - tu musisz coś dać od siebie :-) np x=analogRead(0);
if(x>max) max=x;
}

 Pozdro
dolaczony kod to kod pokazowy z opoznieniem widzialnym dla oka, a  chodzilo o to by robic pomiar1....gdy wartosci zaczna byc wieksze od wartosci z pomiaru1 zaczac nowy pomiar2. Gdy wartosci  zmaleja zakonczyc pomiar2 i wrocic do poczatku wykonywania pomiaru2 i dokonac na nich pewnych obliczen.
Witam
Kurcze co drugi tu robi co najmniej bombę atomową, wszystko takie utajnione :-) Opiszcie dokładnie na czym pracujecie i co chcielibyście osiągnąć a macie z tym problemy. Zawsze trzeba od was wszystko wyciągać, krok po kroku?
Twój przypadek - chcesz robić jakiś pomiar, ale jego wynik poddawać dalszej obróbce dopiero wtedy gdy trend przestanie rosnąć lub maleć, TAK?
Jeśli o to dokładnie chodzi to rzeczywiście potrzebujesz tablicy z wynikami. Tylko pytanie: Ile ostatnich pomiarów wystarczy aby określić trend - rosnący czy malejący? Bo może nie trzeba aż tak wielu obliczeń.
Może wystarczy do Twoich obliczeń np. wiedza. z np. 5-ciu kolejnych pomiarów?
jeśli np:
1) każdy następnik z 5-ciu ost. pomiarów jest większy od poprzednika ->  trend rosnący
2) każdy następnik z 5-ciu ost. pomiarów jest mniejszy od poprzednika -> trend malejący
3) Jeśli przypadek 1 lub 2 nie zachodzi - to wybierz z tych 5-ciu MIN lub MAX i rób obliczenia

Te 3 punkty to może być algorytm którego potrzebujesz.
Pozdrawiam
No nie koniecznie bombe ale czasem ktos ma pomysl na cos i nie moze zdradzic calosci projektu tylko ewentualnie kawalek kodu tak by ktos nie wykorzystal tego..wiem ze maloprawdopodobne bo teraz juz jest wszystko hehe..
A wracajac do tematu...
Mam funkcje ktora w tablicy x elementowej  wyswietla mi na okraglo pomiary i zwraca wartosc stanu wysokiego i niekiego jak w warunku:
if(tab[i]<10.00)
    {  
       canL=tab[i];
       Serial.println(" CAN LOW ");
          }
    else 
    { 
       canH=tab[i];
       Serial.println(" CAN HIGH ");  
    }   
  }

Pytanie, jak zwrocic ilosc wystapien stanow wysokich i niskich w tej x elementowej tablicy.  zazwyczaj uzywa sie funkcji tab.length no ale arduino nie korzysta z niej. zrobilem funkcje szukajaca po tablicy:
int canL=0;
for( i=0;i<x;i++)
{
   if(tab[i]<10.00)
   { 
      canL=tab[i]
      canL++;
 }
Serial.print(canL);
 Ale cos nie dokonca to dobrze wyszukuje..
(24-01-2016, 00:39)f1rew4ll napisał(a): [ -> ]No nie koniecznie bombe ale czasem ktos ma pomysl na cos i nie moze zdradzic calosci projektu tylko ewentualnie kawalek kodu tak by ktos nie wykorzystal tego..wiem ze maloprawdopodobne bo teraz juz jest wszystko hehe..
A wracajac do tematu...
Mam funkcje ktora w tablicy x elementowej  wyswietla mi na okraglo pomiary i zwraca wartosc stanu wysokiego i niekiego jak w warunku:
if(tab[i]<10.00)
    {  
       canL=tab[i];
       Serial.println(" CAN LOW ");
          }
    else 
    { 
       canH=tab[i];
       Serial.println(" CAN HIGH ");  
    }   
  }

Pytanie, jak zwrocic ilosc wystapien stanow wysokich i niskich w tej x elementowej tablicy.  zazwyczaj uzywa sie funkcji tab.length no ale arduino nie korzysta z niej. zrobilem funkcje szukajaca po tablicy:
int canL=0;
for( i=0;i<x;i++)
{
   if(tab[i]<10.00)
   { 
      canL=tab[i]
      canL++;
 }
Serial.print(canL);
 Ale cos nie dokonca to dobrze wyszukuje..

Cześć
Kurcze w zmiennej licznik na przykład:
Kod:
int licznik=0;
for( i=0;i<x;i++)
{
   if(tab[i]<10.00)
   { 
       licznik ++;
  }
Serial.print(licznik);
Musisz jeszcze trochę ćwiczyć. Polecam Arduino Reference na arduino.cc
Pozdrawiam
Stron: 1 2