No cabe duda, que poder disponer de los datos adquiridos de nuestra placa de arduino en Excel resulta de lo más interesante. Una vez alli, graficar, crear canales matemáticos,... es facilísimo!!!
(link foro arduino donde fue escrito originalmente => http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230677761 )
Para ello, podemos usar el objeto NETCommOCX (similar el MSComm).
http://home.comcast.net/~hardandsoftware/NETCommOCX.htm
Veamos un ejemplo:
Por la parte Arduino, necesitamos algo así:
int serialByte;
if (Serial.available()>0) serialByte=Serial.read();
// Si recibe una C,envia datos de forma continua
if (serialByte==67){ //Letra C mayuscula
while (1)
{
analog5=analogRead(5);
// Convierto a milivoltios
fanalog5=(analog5)*(5000.0/1023);
Serial.print(millis());
Serial.print(",");
Serial.println (fanalog5,DEC);
if (PIND & B00100000) break;
}
}
// Si recibe un D,envia un dato
if (serialByte==68){ //Letra D mayuscula
analog5=analogRead(5);
// Convierto a milivoltios
fanalog5=(analog5)*(5000.0/1023);
Serial.print(millis());
Serial.print(",");
Serial.println (fanalog5,DEC);
}
Simplemente, si recibe una "C" por el puerto serie, empieza a mandar el dato de la entrada analógica de forma continua hasta que pulse el boton de mi hardware (leo todo el puerto D y aplico mascara para saber si he pulsado el botón).
Si recibe una "D" manda un dato individual (esto es lo que uso para Excel).
Los datos que envio son de la forma:
tiempo,valor_en_mv con CR+CF
En la parte EXCEL, lo que hago es añadir el objeto NETComm (en el codigo es NETComm2) a mi hoja. Para esto puedes ver culquier ejemplo con MSComm, que es similar.
El único truco, es realizar una especie de Timer en excel. Es decir, que cada cierto tiempo,realice una acción. Para esto uso una llamada a una API de windows que te devuelve el tiempo en ms desde que inicio Windows.
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
tiempo_inicial = timeGetTime()
Hoja2.Range("L3").FormulaR1C1 = 1
While (Hoja2.Range("L3").FormulaR1C1 <> "0")
tiempo_actual = timeGetTime()
If (tiempo_actual - tiempo_inicial) >= 200 Then
tiempo_inicial = timeGetTime()
NETComm2.Output = "D"
End If
kk = DoEvents()
Wend
Como ves, cada 200 ms aproximadamente, envio una D por el puerto serie. Uso la casilla L3 de control, mientras no haya un 0, estoy enviando una D cada 200 ms.
Luego, el objeto NETComm tiene un evento cada vez que recibe un dato por el puerto serie. Lo que hago es configurarlo para que entre cada vez que recibo un byte, y separo tiempo y dato. Lo pongo en dos casillas diferente. Luego no tengo más que añadir gráficos en Excel que esten vinculados a estas casillas.....
Puedes ver otro ejemplo basado en este trabajo realizado por Nicolas:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230677761
( http://ingenegros.com.ar/Microcontroladores/graficar-con-el-excel-mediciones-tomadas-por-arduino.html )
Saludos!!
.
.Igor R.
.
.
.