storing data from sensors

Hi, I am making a robot that uses 3 ultrasonic sensors to navigate through a path. I want to get the values that the sensors provide for a given path and store them somewhere. How can I do that. To read all three sensors I use an array already is there a way that I can get all the arrays and store on a matrix or something? Here is the code of how I read the sensors.

int ping(int j) {
  int duration, distance;
  pinMode (trigPin[j], OUTPUT);
  pinMode (echoPin[j], INPUT);
  digitalWrite(trigPin[j], LOW);
  digitalWrite(trigPin[j], HIGH);
  duration = pulseIn(echoPin[j], HIGH);
  distance = (duration/2) / 29.1;
  return distance;
}
void loop(){
  int minimum, Position, distance[3], j;
  for (i=0; i<3; i++){
  distance[i]=ping(i);
  delay (35);
  
  }

To read all three sensors I use an array already is there a way that I can get all the arrays and store on a matrix or something? Here is the code of how I read the sensors.

If you mean all one of the arrays, yes. If the something in "store on a matrix or something" includes an SD card, yes. Storing the data on a LED matrix seems kind of silly.

victorfb:
Hi, I am making a robot that uses 3 ultrasonic sensors to navigate through a path. I want to get the values that the sensors provide for a given path and store them somewhere. How can I do that. To read all three sensors I use an array already is there a way that I can get all the arrays and store on a matrix or something? Here is the code of how I read the sensors.

int ping(int j) {

int duration, distance;
  pinMode (trigPin[j], OUTPUT);
  pinMode (echoPin[j], INPUT);
  digitalWrite(trigPin[j], LOW);
  digitalWrite(trigPin[j], HIGH);
  duration = pulseIn(echoPin[j], HIGH);
  distance = (duration/2) / 29.1;
  return distance;
}
void loop(){
  int minimum, Position, distance[3], j;
  for (i=0; i<3; i++){
  distance[i]=ping(i);
  delay (35);
 
  }

at first glance i doubt the code would read values from the sensors

If you mean all one of the arrays, yes. If the something in "store on a matrix or something" includes an SD card, yes. Storing the data on a LED matrix seems kind of silly.

I never said that I were using a any type of matrix. I am just wondering how can I get all the arrays and store their values somewhere and how can I do that.

at first glance i doubt the code would read values from the sensors

this function read all the sensors. I am using 3 HC-SR04 sensors that use 2 pins to make the readings

at first glance i doubt the code would read values from the sensors

this function read all the sensors. I am using 3 HC-SR04 sensors that use 2 pins to make the readings

Ok if you tried it, then sry....
Because my HC-SR04 gave me a headache, and i ended up doing something more complex than you wrote... :grin:

Ok if you tried it, then sry....
Because my HC-SR04 gave me a headache, and i ended up doing something more complex than you wrote...

Yeah, they gave me some headaches too, but I was able to figure it out now they read fine.

victorfb:
I am just wondering how can I get all the arrays and store their values somewhere and how can I do that.
this function read all the sensors.

If you can make the numbers, you can store them. It really is as simple as that.
I may be biased because my Arduino came with a slot, but I think using an SD card is the obvious choice, if only because you are unlikely to have any problems with capacity.

Retrieving the numbers is another matter, but I imagine it is just a matter of how you read a single CSV file.

victorfb:
is there a way that I can get all the arrays and store on a matrix or something?

Two important questions are:

  • How many values do you want to store?
  • What are you going to do with the stored values?

The answers to these questions will determine what options are sensible for storing them.

Two important questions are:
How many values do you want to store?
What are you going to do with the stored values?

The answers to these questions will determine what options are sensible for storing them.

I want to get this information and transmit wirelessly using Xbee's

I want to get this information and transmit wirelessly using Xbee's

You already have an array that contains the data. Why do you need to copy it somewhere else?

Transmitting data wirelessly or wired is exactly the same from the Arduino's point of view. It doesn't know that the pins it is wiggling are connected to a USB to serial chip or to an XBee via a shield. The pins are wiggled exactly the same way. Sometimes it matters which pins are wiggled, and whether the HardwareSerial class or the SoftwareSerial class is doing the wiggling.

You already have an array that contains the data. Why do you need to copy it somewhere else?

I don't want to send just one array, I am getting a lot of information from the sensors and I want to send all of it

I don't want to send just one array, I am getting a lot of information from the sensors and I want to send all of it

You get some data. You store the data in an array as you get it. When you have all of it, you start over getting more.

Once you have an array full of data, send that array, and then start over.

You get some data. You store the data in an array as you get it. When you have all of it, you start over getting more.

Once you have an array full of data, send that array, and then start over.

I don't know if this would work in my case because I want the car to go all the way in the path and then send the data. And then I want another car to read this data and go through the same path, and I don't think the arduino would have memory enough to store all this data.
I bought a sd shield to store all these arrays in a sd card, but I am having difficulties in doing so. This is the code that the arduino IDE has as example to read and write something in a card

/*
  SD card read/write
 
 This example shows how to read and write data to and from an SD card file 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 
 This example code is in the public domain.
 	 
 */
 
#include <SD.h>

File myFile;

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
   pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);
  
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
	// close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
  
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
    	Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
  	// if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
	// nothing happens after setup
}

I ran it and works fine. but how where do I put my code so it stores the array that I am generating?
Again this is how I am getting the values from the sensors

int ping(int j) {
  int duration, distance;
  pinMode (trigPin[j], OUTPUT);
  pinMode (echoPin[j], INPUT);
  digitalWrite(trigPin[j], LOW);
  digitalWrite(trigPin[j], HIGH);
  duration = pulseIn(echoPin[j], HIGH);
  distance = (duration/2) / 29.1;
  return distance;
}
void loop(){
  int minimum, Position, distance[3], j;
  for (i=0; i<3; i++){
  distance[i]=ping(i);
  delay (35);
  
  }

victorfb:

Two important questions are:
How many values do you want to store?
What are you going to do with the stored values?

The answers to these questions will determine what options are sensible for storing them.

I want to get this information and transmit wirelessly using Xbee's

You didn't answer the first question.

You didn't answer the first question.

I don't know how many values will be stored, it will depend on how long is the path that the car that has the sensors will pass. I imagine will be a lot of values since I have a sensor reading every 35ms

victorfb:

You didn't answer the first question.

I don't know how many values will be stored, it will depend on how long is the path that the car that has the sensors will pass. I imagine will be a lot of values since I have a sensor reading every 35ms

You need to know the answer to this question. If you can't produce an exact answer, then work out what would be the upper limit you need to support. Just saying 'a lot' could mean anything from 100 to 100,000,000.

victorfb:

You didn't answer the first question.

I don't know how many values will be stored, it will depend on how long is the path that the car that has the sensors will pass. I imagine will be a lot of values since I have a sensor reading every 35ms

I submit you should just cut to what the real problem is, and forget about answering unanswerable questions, for which you probably already have a solution.

You have already done the bleeding obvious and gotten a SD card module, which probably cost $1.50. In the (highly) unlikely event that the data you need to store doesn't really justify an SD card, then it's still only $1.50, which would be struggling to be 5% of your Arduino investment, and it will do the job anyway. If you have too much data, either get a bigger card or come to terms with the fact that Arduino might be the wrong choice to start with, and it cost you $1.50 to find that out.

I believe the real problem is just a matter of code, not storage. The first bit you attach in reply #12 is simply a one-shot to ensure everything is kosher, but contains the seeds for proper employment. I know nothing about the second bit, I can't even see how you can say it works, but it does, so all you need now is to splice them together.

I know this sounds a bit glib but the Arduino sends information to its various receptors in the same way. The one-shot shows the way

open file
myFile.print(data)
close file

you just need to put it in the loop which, in your code, currently does nothing. So:-

void loop() {

aquire data// tralala
Serial.print(data);

myFile = SD.open("name.txt", FILE_WRITE); //+++++++++++++OPEN

myFile.print(data); // just like serial
myFile.print(" , "); // comma separation

myFile.close();//++++++++++++++++++++++++ CLOSE
}
// and go round again

The file is typically a CSV, i.e. comma separated, suitable for a spreadsheet, which is an array of data, and I guess it is the sort of thing you need.

Is that what you need?

that was what I needed thank you. but now how can I use the values that I stored on the file, I was able to read the files back from the file and now I need to use these values. can I go backwards and read these values 3 by 3 as I was reading from the sensors?

victorfb:
that was what I needed thank you. but now how can I use the values that I stored on the file, I was able to read the files back from the file and now I need to use these values. can I go backwards and read these values 3 by 3 as I was reading from the sensors?

I'm sure the answer is yes, even though I have not progressed far enough myself to be sure I understand the question - particularly the last sentence.

Essentially: no matter what you want to do, if you can see it sensibly, you can use it sensibly. Even if you can't see it sensibly, i.e. just a continuous stream of numbers, it is still possible to use it sensibly but it involves a lot of work you would probably rather not know about.

Sticking with the first, by seeing sensibly, I mean easily understood on the monitor. A properly formed CSV file is formed the same way as a properly formed display on the screen. It can even be exactly the same, whereby the file is derived from the monitor.

So the code in the loop looks like

Serial.print(var1);
myFile.print(var1);
Serial.print(" , ");
myFile.print(" , ");
Serial.print(var2);
myFile.print(var2);
Serial.print(" , ");
myFile.print(" , ");
Serial.print(var3);
myFile.print(var3;
Serial.println(" , ");
myFile.println(" , ");

which gives three columns, one row for each loop. The println at the end is the vital punctuation. You don't actually need the commas in the serial stuff, just the spacing. The commas don't get printed on a spread sheet. They are just signals.

I'm not sure this helps, principally because I'm not sure what you want to do. I'm a newbie too and, at the moment, II don't use the SD to disseminate data, it is just a backup.

NickPyner:
I submit you should just cut to what the real problem is, and forget about answering unanswerable questions, for which you probably already have a solution.

I submit that you need to sort out what data you're dealing with (i.e. the type and quantity) and what you want to do with it, before you design mechanisms to store it. These questions ought to be easy to answer, and if you can't answer them then what hope do you have of choosing the most appropriate design?