AnalogDemo: plot data and upload to Pachube in C#

by luca
2 comments

Let’s analyze the source code:

In Form1 constructor the main objects are created and configured; especially the chartArea of the object chart1, with changes on axis properties (intervals, minimum and maximum values, colors).
X axis is configured to show 300 seconds of data (CHART_SECONDS constant):

void setup() {
 
  Serial.begin(9600);
  randomSeed(analogRead(0));
}
 
void loop() {
 
  int randomValue = random(0, 1023);
  Serial.println(randomValue, DEC);
  delay(5000);  
}

Also in constructor is created the data series to contain received data and  some of its parameters are changed (name, chart type, line width and color, value type for X axis):

mySerie = new Series("AnalogInput");
mySerie.ChartType = SeriesChartType.FastLine;
mySerie.BorderWidth = 1;
mySerie.Color = Color.Red;
mySerie.XValueType = ChartValueType.DateTime;
chart1.Series.Add(mySerie);

In the methods called by form load and click on Connect button, we manage the serial port, as we learned in different tutorials on this site:

  • list the available ports and add them to a combobox
  • create a SerialPort object and open the connection (9600 baud 8N1)
  • add an handler to the event DataReceived

serialPort_DataReceived method, handler of DataReceived, calls – using a delegate method – AddData() which updates chart and datastream.

That method read incoming value from serial port and add it to the chart, setting actual timestamp as the value on X axis:

DateTime timeStamp = DateTime.Now;
string stringValue = serialPort.ReadLine();
chart1.Series[0].Points.AddXY(timeStamp, Double.Parse(stringValue));

Next, it calculates the first value to be shown, substracting 300 seconds from the actual timestamp and removing values older than the calculated timestamp. Finally it moves X axis to be centered on the remaning values (setting the first of them origin of the axis) and it invalidates the chart for redraw it:

double removeBefore = timeStamp.AddSeconds(-CHART_SECONDS).ToOADate();
while (mySerie.Points[0].XValue < removeBefore)
{
    mySerie.Points.RemoveAt(0);
}
chart1.ChartAreas[0].AxisX.Minimum = mySerie.Points[0].XValue;
chart1.ChartAreas[0].AxisX.Maximum = DateTime.FromOADate(mySerie.Points[0].XValue).AddSeconds(CHART_SECONDS).ToOADate();
chart1.Invalidate();

If Pachube update is flagged, it checks if all the parameters are present and uses WebClient object to call with PUT method the URL to update your datastream:

string updatePath = "http://api.pachube.com/v2/feeds/" + tbFeedId.Text + "/datastreams/" + tbDatastreamId.Text + ".csv";

adding in the HTTP headers the specified API Key and  catching any connection errors:

webClient.Headers.Set("X-PachubeApiKey", tbAPIKey.Text);
try
{
    webClient.UploadString(updatePath, "PUT", stringValue);
}

To simplify, I choosed to update data in csv format, as shown in the  API documentation.

In summary, I remember you that all the material (pre-compiled program and source code) is available in my GitHub repository and that I’m here for questions in this site’s forum.

Related Posts

2 comments

lucadentella.it – Sensore di corrente con Arduino Tuesday November 29th, 2011 - 11:50 PM

[…] formula indicata sopra e lo invia al PC sulla porta seriale. Sul PC è in esecuzione il programma AnalogDemo che disegna il grafico dei valori letti e aggiorna un feed su […]

Reply
mario Wednesday January 25th, 2012 - 09:13 AM

Ciao Luca, progettino interessante, ho trovato in giro questa utility per Excel, solo fino al 2003, per rappresentazione grafica di dati da seriale.
http://www.parallax.com/ProductInfo/Microcontrollers/PLXDAQDataAcquisitiontool/tabid/393/Default.aspx
molto interessante se non l’hai già vista.
Ci si vede
Ciao

Reply

Leave a Comment

thirteen + 8 =