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.
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