Editar ficheros con linux


Para muchas personas, una de las piezas de software más importantes es un procesador de textos, aunque obviamente si ese equipo es un Linux  para  escribir documentos se usen otros programas como LibreOffice Writer,Open Office ,ete c o incluso servicios en linea como google docs , un editor de texto, sigue siendo hoy en dia  una herramienta indispensable  pera  ver contenido de ficheros ASCIII ( por ejemplo tipo logs, txt ,etc )   y también  para editar o ver  scripts de shell, programas PostScript, páginas web y más.

Un editor de texto opera en archivos de texto sin formato almacenando solo los caracteres que escribe no agregando ningún código oculto de formateo. Es decir ,si escribimos unos caracteres   y presionamos Enter en un editor de texto y lo guardamos, el archivo contendrá exactamente esos caracteres y una nueva línea. Sin embargo si usamos  un  procesador de textos, dicho fichero  que contenga el mismo texto sería miles de veces más grande (con abiword por ejemplo un archivo de unos pocos caracteres  podiria ocupar 2.526 bytes, el archivo LibreOffice.org contendria sobre 7.579 bytes).

Puede escribir scripts en cualquier editor de texto, desde el e3 básico o nano hasta el emacs o nedit completos.

Los mejores editores de texto le permiten tener más de un archivo abierto a la vez. Hacen que el código de edición sea más fácil con, por ejemplo,con  resaltado de sintaxis, sangría automática, autocompletado, revisión ortográfica, macros, búsqueda y reemplazo, y la importante funcion de deshacer.

En última instancia, qué editor se  elige es una cuestión de preferencia personal pero en  GNU  uno muy bueno  es  emacs

emacs1.PNG

Emacs viene autodocumentado de serie con un manual al que puede acceder usando el comando info. Ya sea desde una terminal de los sistemas operativos GNU y Unix, o desde el propio Emacs, escribiendo M-x info RET (esto quiere decir Meta- x o ESC x, la palabra “info”, seguido de la tecla return), o escribiendo C-h i (eso es Control-h seguido de la i). Ademá Emacs trae consigo un tutorial interactivo que le guiará paso a paso a través de una sesión de edición en la cual aprenderá los elementos básicos del uso de Emacs como editor de texto.

Para realizarlo, proceda de la siguiente manera:

  • Utilice C-h t (presione Control y h, suelte ambas teclas, y luego pulse t).
  • Si eso no resulta, intente mediante F1 t.
  • Si eso no resulta tampoco, intente M-x help-with-tutorial (Pulse Esc, suéltela, pulse x, suéltela, escriba help-with-tutorial, pulse Enter).

Si desea leer el tutorial en un idioma distinto al Inglés, use el comando M-x help-with-tutorial-spec-language. (en el momento se encuentran disponibles: bg, cn, cs, de, es, fr, it, ja, ko, nl, pl, ro, ru, sk, sl, sv, th, zh  , es decir también esta en español)

Las opciones más habituales:

  • Obtener ayuda C-h (Mantenga presionada la tecla CTRL y presione h)
  • Deshacer cambios C-x u Salir Emacs C-x C-c
  • Obtener un tutorial C-h t Usar información para leer documentos C-h i
  • Manuales de pedido C-h RET
  • Activar la barra de menú F10 o ESC `o M-`
  • `C- ‘significa usar la tecla CTRL.
  • ` M-‘ significa usar la tecla Meta (o Alt).Si no tiene una clave Meta, en su lugar puede escribir ESC seguido del carácter).

El entorno puede modificar el modo en que secuencias como C-h o F1 son interpretadas.

 

Cuadro de Referencia Resumido

Apertura de archivos: C-x C-f – luego escriba el nombre del archivo, puede usar la tecla TAB para  autocomplementar de modo automático.

Creación de nuevos documentos: C-x C-f – luego escriba el nombre de un archivo que no exista aun; use TAB para  autocomplementar de modo automático.

Guardar archivo: C-x C-s

Destruir búfer (cerrar archivo): C-x k

Separar ventanas (para ver dos archivos al mismo tiempo):

  • Una sobre la otra: C-x 2
  • Una al lado de la otra: C-x 3

Unificar ventanas (maximizar una ventana)C-x 1

Cambiar de ventana (luego de haber hecho una separación): C-x o

Cambiar de búfer (si está editando múltiples archivos): C-x b

Menú de búferes (listado de búferes): C-x C-b

Ejecutar comandos de cuyo atajo por teclado se ha olvidado: M-x – luego escriba el nombre del comando, TAB puede ser usado para autocomplementar.

Obtener ayuda: C-h, luego cualquiera de las siguientes teclas:

  • k – ¿qué hace cierta secuencia de teclado?
  • f – ¿qué hace cierta función?
  • m – ¿qué secuencias de teclado están definidas en este modo?
  • w – ¿a qué teclas está asociada una función?
  • a – ¿qué nombres de comandos coinciden con cierta cadena?

 

 

Como ve, emacs  es un editor  ASCII  muy diferente a los editores basados en sistemas windows , pero como se ve tambien puede ser muy potente para trabajar desde una consola depurando o inlcuso escribiendo nuestros propios scripts en c-shell

Anuncios

Visualizando datos en Arduino y Netduino


 


GLCD

La biblioteca de e-salud incluye funciones para gestionar una pantalla gráfica LCD para la visualización de datos. La mochila de serie gráfica LCD está soldada a la 128×64 pixel LCD gráfico y proporciona al usuario una interfaz serial simple.
Caracteristicas:
Voltaje: 5V – 7V DC
Corriente: 220mA (luz de fondo al 100%)
De entrada: 0-5V, 115.200 bps (ajustable), 8 bits de datos, 1 bit de parada, sin paridad
Conexión del GLCD
Es necesario conectar el dispositivo con las señales en la posición correcta. El cable rojo que alimenta el módulo muestra cómo conectarlo.
e_health+pantalla
pantalla2

Las medidas de los sensores se distribuye en tres pantallas que cambian al presionar el botón.

e-Health_button-01

En la primera pantalla podemos ver algunos valores como la temperatura, el pulso o el oxígeno.

pantalla1b

En la segunda pantalla se utiliza para la presentación de la onda de flujo de aire.

pantalla4

Cuando no se detecta la respiración, la pantalla se aconsejan de un RISQ de apnea.

pantalla3

La última pantalla recibe la onda del ECG.

pantalla5
Después de la tercera pantalla, si se presiona el botón de nuevo, volverá a la primera pantalla.
GLCD biblioteca
La biblioteca de la sanidad electrónica incluye todas las funciones necesarias para la gestión de la pantalla LCD y mostrar en tiempo real las medidas de sensores de datos. Para utilizar esta función, ante todo, debe incluir la biblioteca correspondiente.
 #include
Library functions:
  •  init() // Configure and initializes the LCD.
  •  InitValuesScreen() // Configure some parameters of the values screen.
  •  PrintValuesScreen() // It prints (refresh) the values of the sensors in the screen.
  •  InitECGScreen() // Configure some parameters of the ECG screen.
  •  printECGScreen() // It prints (refresh) the ECG wave in the LCD screen.
  •  initAirFlowScreen() //Configure some parameters of the AirFlow screen.
  •  PrintAirFlowScreen() // It prints (refresh) the AirFlow wave in the LCD screen.
Inicializar el LCD
Utilice la función de inicio en la configuración antes de empezar a usar la pantalla LCD.
Example
   {
    eHealthDisplay.init ();
    }
Los valores de la pantalla:
En esta pantalla se pueden ver algunos parámetros numéricos como el pulso, el oxígeno, la temperatura, amd una representación de la posición del cuerpo actual.
Inicialización
Esta pantalla debe ser inicializado con la siguiente función:
Example:
   {
    eHealthDisplay.initValuesScreen ();
    }
Obtención de datos
Para actualizar los valores de la LCD ejecutar la siguiente función.
Example
   {
    eHealthDisplay.printValuesScreen ();
    }
AirFlow pantalla:
En esta pantalla podemos ver el flujo de aire (respiración) de onda y el número de respiraciones por minuto. Esta pantalla incluye un asesor apnea cuando no respira.
Inicialización
Esta pantalla debe ser inicializado con la siguiente función:
Example:
   {
    eHealthDisplay.initAirFlowScreen ();
    }
Obtención de datos
Para actualizar los valores de la LCD ejecutar la siguiente función.
Example
   {
    eHealthDisplay.printAirFlowScreen ();
    }
ECGScreen:
Esta pantalla recibe la onda de electrocardiograma y mide la frecuencia de latido del corazón.
Inicialización
Esta pantalla debe ser inicializado con la siguiente función:
Example:
   {
    eHealthDisplay.initECGScreen ();
    }
Obtención de datos
Para actualizar los valores de la LCD ejecutar la siguiente función.
Example
   {
    eHealthDisplay.printECGScreen ();
    }
El pulsador:
La junta eHealth icludes un botón pulsador integrado para cambiar entre la pantalla o se puede utilizar un botón de lika purpuose general para cualquier aplicación. El botón pulsador se enruta al pin digital 4.
Example
Arduino
Sube el siguiente código para ver los datos en el GLCD:

 # Include
# Include
# Include

#define pushButton 4

uint8_t screenNumber = 1;
uint8_t buttonState;
uint8_t cont = 0;

void setup () {
Serial.begin(115200);
retardo (100);

//Configure and initializes the LCD.
eHealthDisplay.init();
retardo (100);
}

void loop () {

//Screen number one with the numerical sensor values and body position
//=========================================================================

eHealthDisplay.initValuesScreen();
retardo (100);

//Attach the inttruptions for using the pulsioximeter

PCintPort::attachInterrupt(6, readPulsioximeter, RISING);

while(screenNumber == 1) {
//It prints data sensor measures in the LCD.
buttonState = digitalRead(pushButton);
delay(10);

if(buttonState == 1) {
screenNumber++;
}

eHealthDisplay.printValuesScreen();
}

PCintPort::detachInterrupt(6);

//Screen number two wich represent the air flow wave
//=========================================================================

eHealthDisplay.initAirFlowScreen();

while( screenNumber == 2) {
buttonState = digitalRead(pushButton);
delay(10);

if(buttonState==1){
screenNumber++;
}

eHealthDisplay.printAirFlowScreen();
}

//Screen number three wich represent the ECG wave
//=========================================================================

eHealthDisplay.initECGScreen();

while( screenNumber == 3) {
buttonState = digitalRead(pushButton);
delay(10);

if(buttonState==1){
screenNumber++;
}

eHealthDisplay.printECGScreen();
}

screenNumber = 1;
delay(10);
}

//Include always this function for using the pulsioximeter sensor
//=========================================================================
void readPulsioximeter() {

cont ++;

if (cont == 50) {
//Get only one 50 measures to reduce the latency
eHealth.readPulsioximeter();
cont = 0;
}
}

El GLCD muestra la información de los nodos se envía, que contiene los datos de sensor recogidos.

KST: Real-time data viewing and plotting

KST es el más rápido en tiempo real a gran conjunto de datos de visualización y trazado herramienta disponible (usted puede estar interesado en algunos puntos de referencia) y tiene una funcionalidad integrada de análisis de datos. Es muy fácil de usar y contiene muchas potente incorporado en funciones y se puede ampliar con plugins y extensiones.
3-pics
KST está licenciado bajo la GPL, y es como tal libremente disponible para cualquier persona. Lo que es más, a partir de 2.0.x está disponible en todas las plataformas: Microsoft Windows, Linux, Mac OSX.
Antes de todo, usted tiene que instalar el programa KST en su PC. Puede descargar el programa desde la página web KST:
http://kst-plot.kde.org/
Vamos a utilizar KST para representar la onda ECG, flujo de aire y la respuesta galvánica de la piel.
Ejemplo de código
Este ejemplo es para el sistema operativo Linux. Se representan las diferentes olas y los datos medidos por el sensor plataforma e-Salud.
Puede encontrar más información acerca de cómo utilizar KST en este video tutorial.
Para comenzar a trabajar con los datos en tiempo real primero debe cargar el código apropiado en el Arduino.
Como vamos a trabajar con Linux vamos a utilizar la consola para guardar los datos en un archivo (. Txt).
Enchufe en el dispositivo, y ejecutar

 stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon 
  -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts
14_
en la consola “A”.
Con esta orden se debe configurar el puerto ttyACM0.
A continuación, utilice el comando en la consola del mismo para crear el archivo de texto en el que se almacenarán los datos.
  tail-f / dev/ttyACM0> Desktop / test.txt
456_
Los programas de Arduino KST muestras están listas para enviar datos de forma continua cuando recibe una “C” y dejar de enviar cuando se recibe una “F”. Estos datos se enviarán por consola “B” con los comandos:
 echo 'C' > /dev/ttyACM0
  echo 'F' > /dev/ttyACM0
546_
7887_
Cconfiguración básica
Ahora con el archivo creado y actualizado con los datos recibidos, tenemos que abrir el programa KST.
Para configurar KST para cada ejemplo, tendremos que establecer parámetros comunes.
1) En la ventana emergente, seleccione el directorio en el txt. Creado anteriormente y pulse el botón Configurar.
Pantallazo_
2) El siguiente paso, es configurar la fuente de datos.
Pantallazo-1_
3) Seleccione los datos de medición. Los datos de campo / columna 2.

Pantallazo_

Pantallazo-1_

El paso final es diferente dependiendo de cada ejemplo.
ECG ejemplo en KST
En este ejemplo se configura el KST para mostrar un determinado período de tiempo x (x = 300). Estamos interesados sólo en los valores más actuales del ECG.

Pantallazo-4_Pantallazo-6_

ecg_measure
The Arduino code used in this program is presented next:
#Include

extern volatile unsigned long timer0_overflow_count;
float fanalog0;
int analog0;
unsigned long time;

byte serialByte;
void setup () {
Serial.begin (9600);
Serial.println(“Starting…”);
}

void loop () {
while (Serial.available()>0){
serialByte=Serial.read();
if (serialByte==’C’){
while (1) {
fanalog0=eHealth.getECG();
// Use the timer0 => 1 tick every 4 us
time=(timer0_overflow_count << 8) + TCNT0;
// Microseconds conversion.
time=(time*4);
//Print in a file for simulation
Serial.print(time);
Serial.print(“;”);
Serial.println(fanalog0,5);

if (Serial.available()>0){
serialByte=Serial.read();
if (serialByte==’F’) break;
}
}
}
}
}

Respuesta Galvánica de la Piel ejemplo en KST
En el ejemplo de respuesta galvánica de la piel que está interesado en todos los datos desde el inicio de la medición. Vamos a configurar el KST para mostrar una onda con todos los datos.

Pantallazo-5_Pantallazo-6_

Pantallazo-2
Pantallazo2
The Arduino code used in this program is presented next:
Show Code

  / *
 * eHealth sensor platform for Arduino and Raspberry from Cooking-hacks. 
  *
 * Description: "The e-Health Sensor Shield allows Arduino and Raspberry Pi 
 * users to perform biometric and medical applications by using 9 different 
 * sensors: Pulse and Oxygen in Blood Sensor (SPO2), Airflow Sensor (Breathing),
 * Body Temperature, Electrocardiogram Sensor (ECG), Glucometer, Galvanic Skin
 * Response Sensor (GSR - Sweating), Blood Pressure (Sphygmomanometer) and 
 * Patient Position (Accelerometer)."  
  *
 * In this example we read the value of the GSR sensor 
 * and print the GSR wave form in the KST .
  *
 * Copyright (C) 2012 Libelium Comunicaciones Distribuidas SL
  * Http://www.libelium.com
  *
  * Este programa es software libre: usted puede redistribuirlo y / o modificarlo
  * Bajo los términos de la Licencia Pública General de GNU según es publicada por
 * the Free Software Foundation, either version 3 of the License, or
  * (A su elección) cualquier versión posterior.
  *
  * Este programa se distribuye con la esperanza de que sea útil,
  * Pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de
  * COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR.  Consulte la
  * GNU General Public License para más detalles.
  *
  * Usted debe haber recibido una copia de la Licencia Pública General de GNU
  * Junto con esta librería. If not, see .
  *
 * Version 0.1
 * Author: Luis Martin & Ahmad Saad 
  * /

# Include

extern volatile unsigned long timer0_overflow_count;
float fanalog0;
int analog0;
unsigned long time;
byte serialByte;

void setup () {
Serial.begin (9600);
Serial.println(“Starting…”);
}

void loop () {
while (Serial.available()>0){
serialByte=Serial.read();

if (serialByte==’C’){
while (1) {
fanalog0=eHealth.getSkinConductance();
// Use the timer0 => 1 tick every 4 us
time=(timer0_overflow_count << 8) + TCNT0;
// Microseconds conversion.
time=time*4;
//Print in a file for simulation
Serial.print(time);
Serial.print(char(‘ ; ‘));
Serial.println(fanalog0,5);
if (Serial.available()>0){
serialByte=Serial.read();
if (serialByte==’F’) break;
}
}
}
}
}

Flujo de aire en el ejemplo KST
Podemos configurar el programa KST en este ejemplo de acuerdo con los datos que queremos Muestra (métodos anteriores).
breathing_measure
The Arduino code used in this program is presented next:
Show Code

  / *
 * eHealth sensor platform for Arduino and Raspberry from Cooking-hacks.
  *
 * Description: "The e-Health Sensor Shield allows Arduino and Raspberry Pi 
 * users to perform biometric and medical applications by using 9 different 
 * sensors: Pulse and Oxygen in Blood Sensor (SPO2), Airflow Sensor (Breathing),
 * Body Temperature, Electrocardiogram Sensor (ECG), Glucometer, Galvanic Skin
 * Response Sensor (GSR - Sweating), Blood Pressure (Sphygmomanometer) and 
 * Patient Position (Accelerometer)."  
  *
 * In this example we read the value of the air flow sensor 
 * and print the air Flow wave form using KST.
  *
 * Copyright (C) 2012 Libelium Comunicaciones Distribuidas SL
  * Http://www.libelium.com
  *
  * Este programa es software libre: usted puede redistribuirlo y / o modificarlo
  * Bajo los términos de la Licencia Pública General de GNU según es publicada por
 * the Free Software Foundation, either version 3 of the License, or
  * (A su elección) cualquier versión posterior.
  *
  * Este programa se distribuye con la esperanza de que sea útil,
  * Pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de
  * COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR.  Consulte la
  * GNU General Public License para más detalles.
  *
  * Usted debe haber recibido una copia de la Licencia Pública General de GNU
  * Junto con esta librería. If not, see .
  *
 * Version 0.1
 * Author: Luis Martin & Ahmad Saad 
  * /

# Include

extern volatile unsigned long timer0_overflow_count;
float fanalog0;
int analog0;
unsigned long time;
byte serialByte;

void setup () {
Serial.begin (9600);
Serial.println(“Starting…”);
}

void loop () {
while (Serial.available()>0) {
serialByte=Serial.read();

if (serialByte==’C’){
while (1) {
fanalog0=eHealth.getAirFlow();
// Use the timer0 => 1 tick every 4 us
time=(timer0_overflow_count << 8) + TCNT0;
// Microseconds conversion.
time=time*4;
//Print in a file for simulation
Serial.print(time);
Serial.print(“;”);
Serial.println(fanalog0,5);
if (Serial.available()>0){
serialByte=Serial.read();
if (serialByte==’F’) break;
}
}
}
}
}

La consola serie

Todos los datos se pueden visualizar en el monitor serie de Arduino / RasberryPi utilizando el siguiente programa de consola serie.
Cargar el programa eHealth_SerialMenu ejemplo y abrir el monitor serie de Arduino IDE.
En el menú principal podemos encontrar todos los sensores de salud electrónica. Mediante el envío de un comando para el puerto serie que se puede seleccionar uno de ellos.
NOTA: La medición de la glucosa no se ha aplicado en este ejemplo porque ambos procesos utilizan UART comunicación y puede causar un mal funcionamiento
MainMenu
Para ver las medidas del sensor, envía el comando correspondiente y pulse la tecla Intro.
Puede volver al menú principal mediante el envío de la orden de “B”.
ExitCommand
Ejemplo
Arduino
The Arduino code used in this program is presented next:
Show Code

  / *
 * eHealth sensor platform for Arduino and Raspberry from Cooking-hacks.
  *
 * Description: "The e-Health Sensor Shield allows Arduino and Raspberry Pi 
 * users to perform biometric and medical applications by using 9 different 
 * sensors: Pulse and Oxygen in Blood Sensor (SPO2), Airflow Sensor (Breathing),
 * Body Temperature, Electrocardiogram Sensor (ECG), Glucometer, Galvanic Skin
 * Response Sensor (GSR - Sweating), Blood Pressure (Sphygmomanometer) and 
 * Patient Position (Accelerometer)." 
  *
 * In this example we have used the serial monitor like a programed
 * console where we can choose the sensor we want to view.  *   
  * 
  * Este programa es software libre: usted puede redistribuirlo y / o modificarlo
  * Bajo los términos de la Licencia Pública General de GNU según es publicada por
 * the Free Software Foundation, either version 3 of the License, or
  * (A su elección) cualquier versión posterior.
  *
  * Este programa se distribuye con la esperanza de que sea útil,
  * Pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de
  * COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR.  Consulte la
  * GNU General Public License para más detalles.
  *
  * Usted debe haber recibido una copia de la Licencia Pública General de GNU
  * Junto con esta librería. If not, see .
  *
 * Version 0.1
 * Author: Luis Martín & Ahmad Saad
  * /

# Include
# Include

char serialByte;
uint8_t state = 0;
uint8_t cont = 0;

float parameter = 0.098;

void setup ()
{
Serial.begin(115200);
initScreen();
retardo (100);
}

void loop ()
{
state = 0;

while (Serial.available()>0){
serialByte=Serial.read();

if ((serialByte==’A’) || (serialByte == ‘a’)){ //Airflow sensor
airFlowMenu();
airFlowBucle();

} else if ((serialByte==’S’) || (serialByte == ‘s’)){
skinSensorMenu();
skinSensorBucle();

} else if ((serialByte==’E’) || (serialByte == ‘e’)){
ECGMenu();
ECGBucle();

} else if ((serialByte==’P’) || (serialByte == ‘p’)){
pulsioximeterMenu();
pulsioximeterBucle();

} else if ((serialByte==’B’) || (serialByte == ‘b’)){
bodyPositionMenu();
bodyPositionBucle();

} else if ((serialByte==’T’) || (serialByte == ‘t’)){
temperatureMenu();
temperatureBucle();

} else if ((serialByte==’N’) || (serialByte == ‘n’)){
BloodPressureMenu();
BloodPressureBucle();
}
}
}

void initScreen(void)
{
printLogoEhealth();
retardo (100);
mainMenu();
}

void mainMenu(void)
{
lineFeed(); Serial.print(F(” ——–> EHEALTH MENU OPTIONS <——–“)); lineFeed(); lineFeed();

initialSpace(); Serial.print(F(“A : AirFlow sensor options”)); lineFeed();
initialSpace(); Serial.print(F(“S : Skin sensor options”)); lineFeed();
initialSpace(); Serial.print(F(“E : ECG sensor options”)); lineFeed();
initialSpace(); Serial.print(F(“P : Pulsioximeter sensor options”)); lineFeed();
initialSpace(); Serial.print(F(“B : Body position sensor options”)); lineFeed();
initialSpace(); Serial.print(F(“T : Temperature sensor options”)); lineFeed();
initialSpace(); Serial.print(F(“N : Blood Pressure sensor options”));lineFeed();
}

void airFlowMenu(void)
{
lineFeed(); Serial.print(F(“——–> AIRFLOW MENU OPTIONS <——–“)); lineFeed(); lineFeed();
initialSpace(); Serial.print(F(“W : Wave form”)); lineFeed();
initialSpace(); Serial.print(F(“V : Analogic value”)); lineFeed();
initialSpace(); Serial.print(F(“B : BACK MAIN MENU”)); lineFeed();
}

void airFlowBucle(void) {
while (state == 0) {
while (Serial.available()>0){
serialByte=Serial.read();
if ((serialByte==’W’) || (serialByte == ‘w’)){ //Airflow sensor
while (1) {
serialByte=Serial.read();
eHealth.airFlowWave(eHealth.getAirFlow());

if ((serialByte== ‘B’) || (serialByte == ‘b’)) {
airFlowMenu();
break;
}
}
} else if ((serialByte==’V’) || (serialByte == ‘v’)){
while (1) {
serialByte=Serial.read();
Serial.print(F(” Airflow analogic value : “));
Serial.println(eHealth.getAirFlow());
delay(20);
if ((serialByte== ‘B’) || (serialByte == ‘b’)) {
airFlowMenu();
break;
}
}
} else if ((serialByte==’B’) || (serialByte == ‘b’)){
state = 1;
}
}
}
mainMenu();
}

void skinSensorMenu(void)
{
lineFeed(); Serial.print(F(“——–> SKIN SENSOR MENU OPTIONS <——–“)); lineFeed(); lineFeed();
outputMenu();
}

void skinSensorBucle(void) {
while (state == 0) {
while (Serial.available()>0){
serialByte=Serial.read();
if ((serialByte==’S’) || (serialByte == ‘s’)){
while (1) {

lineFeed();

serialByte=Serial.read();
float conductance = eHealth.getSkinConductance();
long resistance = eHealth.getSkinResistance();
float conductanceVoltage = eHealth.getSkinConductanceVoltage();

if (conductance == -1) {
Serial.println(” No patient connection”);
} Else {

Serial.print(F(” Skin conductance value : “));
Serial.println(conductance);

Serial.print(F(” Skin resistance value : “));
Serial.println(resistance);

Serial.print(F(” Skin conductance value in volts: “));
Serial.println(conductanceVoltage);

retardo (500);
}

if ((serialByte== ‘B’) || (serialByte == ‘b’)) {
skinSensorMenu();
break;
}
}

} else if ((serialByte==’B’) || (serialByte == ‘b’)){
state = 1;
}
}
}
mainMenu();
}

void ECGMenu(void) {
lineFeed(); Serial.print(F(“——–> ECG MENU OPTIONS <——–“)); lineFeed(); lineFeed();
outputMenu();
}

void ECGBucle(void) {
while (state == 0) {
while (Serial.available()>0){
serialByte=Serial.read();
if ((serialByte==’S’) || (serialByte == ‘s’)){
while (1) {

lineFeed();
serialByte=Serial.read();

retardo (500);

if ((serialByte== ‘B’) || (serialByte == ‘b’)) {
ECGMenu();
break;
}
}
} else if ((serialByte==’B’) || (serialByte == ‘b’)){
state = 1;
}
}
}
mainMenu();
}

void pulsioximeterMenu(void)
{
lineFeed(); Serial.print(F(“——–> PULSIOXIMETER MENU OPTIONS <——–“)); lineFeed(); lineFeed();
outputMenu();
}

void pulsioximeterBucle(void)
{
//Attach the interruptions for using the pulsioximeter.
PCintPort::attachInterrupt(6, readPulsioximeter, RISING);
eHealth.initPulsioximeter();

while (state == 0) {
while (Serial.available()>0){
serialByte=Serial.read();
if ((serialByte==’S’) || (serialByte == ‘s’)){
while (1) {

//eHealth.readPulsioximeter();

lineFeed();
serialByte=Serial.read();
Serial.print(“PRbpm : “);
Serial.print(eHealth.getOxygenSaturation());

Serial.print(” % SPo2 : “);
Serial.print(eHealth.getBPM());

Serial.print(“\n”);
retardo (500);

if ((serialByte== ‘B’) || (serialByte == ‘b’)) {
pulsioximeterMenu();
break;
}
}
} else if ((serialByte==’B’) || (serialByte == ‘b’)){
state = 1;
}
}
}
mainMenu();

PCintPort::detachInterrupt(6);
}

void bodyPositionMenu(void)
{
lineFeed(); Serial.print(F(“——–> BODY POSTITIONMENU OPTIONS <——–“)); lineFeed(); lineFeed();
outputMenu();
}

void bodyPositionBucle(void)
{
while (state == 0) {
while (Serial.available()>0){
serialByte=Serial.read();
if ((serialByte==’S’) || (serialByte == ‘s’)){
while (1) {

lineFeed();
serialByte=Serial.read();

Serial.print(“Current position : “);
uint8_t position = eHealth.getBodyPosition();
eHealth.printPosition(position);
retardo (100);

if ((serialByte== ‘B’) || (serialByte == ‘b’)) {
bodyPositionMenu();
break;
}
}
} else if ((serialByte==’B’) || (serialByte == ‘b’)){
state = 1;
}
}
}
mainMenu();
}

void temperatureMenu(void)
{
lineFeed(); Serial.print(F(“——–> TEMPERATURE MENU OPTIONS <——–“)); lineFeed(); lineFeed();
outputMenu();
}

void temperatureBucle(void)
{
while (state == 0) {
while (Serial.available()>0){
serialByte=Serial.read();
if ((serialByte==’S’) || (serialByte == ‘s’)){
while (1) {

lineFeed();
serialByte=Serial.read();

float temperature = eHealth.getTemperature();
Serial.print(“Temperature (ºC): “);
Serial.println(temperature, 2);

delay (1000);

if ((serialByte== ‘B’) || (serialByte == ‘b’)) {
temperatureMenu();
break;
}
}
} else if ((serialByte==’B’) || (serialByte == ‘b’)){
state = 1;
}
}
}
mainMenu();
}

void BloodPressureMenu(void)
{
lineFeed(); Serial.print(F(“——–> BLOOD PRESSURE MENU OPTIONS <——–“)); lineFeed(); lineFeed();
outputMenu();
}

void BloodPressureBucle()
{
while (state == 0) {
while (Serial.available()>0){
serialByte=Serial.read();
if ((serialByte==’S’) || (serialByte == ‘s’)){
while (1) {

lineFeed();
serialByte=Serial.read();
Serial.println(“Press On/Off button please…”);

eHealth.initBloodPressureSensor(parameter);

Serial.println(“****************************”);
Serial.print(“Systolic blood pressure value : “);
Serial.println(eHealth.getSystolicPressure());

Serial.println(“****************************”);
Serial.print(“Diastolic blood pressure value : “);
Serial.println(eHealth.getDiastolicPressure());
retardo (3000);

if ((serialByte== ‘B’) || (serialByte == ‘b’)) {
BloodPressureMenu();
break;
}
}
} else if ((serialByte==’B’) || (serialByte == ‘b’)){
state = 1;
}
}
}
mainMenu();
}

void outputMenu(void) {
initialSpace(); Serial.print(F(“S : Serial output value”)); lineFeed();
initialSpace(); Serial.print(F(“B : BACK MAIN MENU”)); lineFeed();
}

void printLogoEhealth(void)
{
starLine();
starPrint(); blank(); HLeterOne(); blank(); blank(); blank(); tLeterOne(); hLeterOne(); starPrint(); lineFeed();
starPrint(); eLeterTwo(); HLeterTwo(); eLeterTwo(); aLeterTwo(); lLeterTwo(); tLeterTwo(); hLeterTwo(); starPrint(); lineFeed();
starPrint(); eLeterThree(); HLeterThree(); eLeterThree(); aLeterThree(); lLeterThree(); tLeterThree(); hLeterThree(); starPrint(); lineFeed();
starPrint(); eLeterFour(); HLeterFour(); eLeterFour(); aLeterFour(); lLeterFour(); tLeterFour(); hLeterFour(); starPrint(); lineFeed();
starPrint(); eLeterFive(); HLeterFive(); eLeterFive(); aLeterFive(); lLeterFive(); tLeterFive(); hLeterFive(); starPrint(); lineFeed();
starPrint(); eLeterSix(); HLeterSix(); eLeterSix(); aLeterSix(); lLeterSix(); tLeterSix(); hLeterSix(); starPrint(); lineFeed();
starLine();
}

void eLeterTwo(void) { Serial.print(F(” _____ “)); }
void eLeterThree(void) { Serial.print(F(“| __ | “)); }
void eLeterFour(void) { Serial.print(F(“| ___| “)); }
void eLeterFive(void) { Serial.print(F(“| |___ “)); }
void eLeterSix(void) { Serial.print(F(“|_____| “)); }

void HLeterOne(void) { Serial.print(F(” _ _ “)); }
void HLeterTwo(void) { Serial.print(F(“| | | | “)); }
void HLeterThree(void) { Serial.print(F(“| |__| | “)); }
void HLeterFour(void) { Serial.print(F(“| __ | “)); }
void HLeterFive(void) { Serial.print(F(“| | | | “)); }
void HLeterSix(void) { Serial.print(F(“|_| |_| “)); }

void aLeterTwo(void) { Serial.print(F(” ______ “)); }
void aLeterThree(void) { Serial.print(F(“| | “)); }
void aLeterFour(void) { Serial.print(F(“| {} | “)); }
void aLeterFive(void) { Serial.print(F(“| __ | “)); }
void aLeterSix(void) { Serial.print(F(“|_| |_| “)); }

void lLeterTwo(void) { Serial.print(F(” _ “)); }
void lLeterThree(void) { Serial.print(F(“| | “)); }
void lLeterFour(void) { Serial.print(F(“| | “)); }
void lLeterFive(void) { Serial.print(F(“| |____ “)); }
void lLeterSix(void) { Serial.print(F(“|______|”)); }

void tLeterOne(void) { Serial.print(F(” _ “));}
void tLeterTwo(void) { Serial.print(F(” _| |__ “)); }
void tLeterThree(void) { Serial.print(F(“(_ __) “)); }
void tLeterFour(void) { Serial.print(F(” | | “)); }
void tLeterFive(void) { Serial.print(F(” | |__ “)); }
void tLeterSix(void) { Serial.print(F(” |____) “)); }

void hLeterOne(void) { Serial.print(F(” _ “));}
void hLeterTwo(void) { Serial.print(F(“| | “)); }
void hLeterThree(void) { Serial.print(F(“| |___ “)); }
void hLeterFour(void) { Serial.print(F(“| _ | “)); }
void hLeterFive(void) { Serial.print(F(“| | | | “)); }
void hLeterSix(void) { Serial.print(F(“|_| |_| “)); }

void blank(void) { Serial.print(F(” “));}

void initialSpace(void)
{
Serial.print(F(” “));
}

void starPrint(void)
{
Serial.print(F(“* “));
}

void lineFeed(void)
{
Serial.print(F(“\n”));
}

void starLine(void)
{
for (int i = 0; i< 63; i++)
{
Serial.print(F(“*”));
}
lineFeed();
}

int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v – (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

//Include always this code for using the pulsioximeter sensor
//=========================================================================
void readPulsioximeter(){

cont ++;

if (cont == 30) { //Get only one of 25 measures to reduce the latency
eHealth.readPulsioximeter();
cont = 0;
}
}

Upload the code and watch the Serial monitor.

SmartPhone Application

ehealth_icon_op3
The wifi module may perform direct communications with iPhone and Android devices without the need of an intermediate router by creating an Adhoc network between them.
We have developed the application e-Health Sensor Plattform, for both iPhone and Android platforms. The application may be also downloaded from the official App markets or from the Libelium website for free: http://www.cooking-hacks.com/apps
Official app markets URL’s:
ehealth_icon_op3 ehealth_icon_op3
Instalación:
a) Download the application from App Store:
  • From the iPhone, go to App Store. Go to Search screen and search “e-Health Sensor Plattform”.
  • Select e-Health app. Press FREE button, and then INSTALL button.
  • Accept the rights and then the app will appear in your iPhone screen.

You can do the same from the Computer with iTunes. Open iTunes and search “e-Health Sensor Plattform”: https://itunes.apple.com/us/app/e-health-sensor-platform/id581953525

  • Save the app in iTunes and synchronize it with your iPhone or iPod.

 

b) Download the application (e-Health.ipa) from the Libelium website: http://www.libelium.com/apps
  • Then double click on the icon, or right click and open with iTunes.
  • Inside iTunes, on the left panel, click on DEVICES->Your Device.
  • Select on the top “Apps”, and select Sync Apps. Drag into the desired screen e-Health app.
Once installed, the app appears in your iPhone/iPod screen.
The use of the app is very simple, first you have to connect to one of the Arduino nodes selecting it in Settings->Wi-Fi, and then launch the application.
To connect to the network created by the wifi module of Arduino: Go to Settings->Wi-Fi and select iPHONE_ADHOC .
iphone_app
Once connected, you can launch the App.
iphone_appiphone_app
The App shows the information the nodes are sending which contains the sensor data gathered.
The first tab “Charts” shows:
  • Respiratory rate chart
  • Electrocardiogram: is necessary to correctly set the delay between frames for the correct measurement of electrocardiogram
The “Current data” tab, shows data that is in continuous change:
  • Temperatura
  • Pulso
  • Oxígeno
  • Conductividad
  • Resistencia
  • Flujo de aire
iphone_appiphone_app
The “Tests” tab shows the information about:
  • Systolic Pressure
  • Diastolic Pressure
  • Glucometer
Finally, in the “Movement” tab shows the position of the body.
iphone_app
NOTE: The measurement of glucose has not been implemented in this example because both processes use UART communication and can cause malfunction
Ejemplo
Arduino
The Arduino code used in this program is presented next:
Show Code

  / *
 * eHealth sensor platform for Arduino and Raspberry from Cooking-hacks.
  *
 * Description: "The e-Health Sensor Shield allows Arduino and Raspberry Pi 
 * users to perform biometric and medical applications by using 9 different 
 * sensors: Pulse and Oxygen in Blood Sensor (SPO2), Airflow Sensor (Breathing),
 * Body Temperature, Electrocardiogram Sensor (ECG), Glucometer, Galvanic Skin
 * Response Sensor (GSR - Sweating), Blood Pressure (Sphygmomanometer) and 
 * Patient Position (Accelerometer)."  
  *
 * Explanation: This example shows the way to communicate with  
 * the Arduino Wifi Demo iPhone app. 
  *
 * Copyright (C) 2012 Libelium Comunicaciones Distribuidas SL
  * Http://www.libelium.com
  *
  * Este programa es software libre: usted puede redistribuirlo y / o modificarlo
  * Bajo los términos de la Licencia Pública General de GNU según es publicada por
 * the Free Software Foundation, either version 3 of the License, or
  * (A su elección) cualquier versión posterior.
  *
  * Este programa se distribuye con la esperanza de que sea útil,
  * Pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de
  * COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR.  Consulte la
  * GNU General Public License para más detalles.
  *
  * Usted debe haber recibido una copia de la Licencia Pública General de GNU
  * Junto con esta librería. If not, see .
  *
 * Version 0.1
 * Author: Luis Martin & Ahmad Saad 
  * /

# Include
# Include

char recv[256];
float parameter = 0.098;
uint8_t cont = 0;

void setup () {

//eHealth.readGlucometer();
Serial.begin (9600);
eHealth.initPulsioximeter();
eHealth.initPositionSensor();
}

void loop () {

Serial.print(“$$$”);
marcar ();

/ / 1. Configure the transport protocol (UDP, TCP, FTP, HTTP…)
Serial.print(“set ip 3\r”); check();
/ / 2. Configure the way the modules will resolve the IP address.
Serial.print(“set id 2\r”); check();
/ / 3. Configure how to connect the AP.
Serial.print(“set wa 6\r”); check();
// 3.1 Sets the name of the ADhoc network.
Serial.print(“set ws iPHONE_ADHOC\r”); check();
// 3.2 Sets the channel of the ADhoc network
Serial.print(“set wc 6\r”); check();

Serial.print(“set wj 4\r”); check();
Serial.print(“save\r”); check();
Serial.print(“exit\r”); check();
Serial.print(“$$$”); check();
// Configures UDP host and ports.
Serial.print(“set ih 255.255.255.255\r”); check();
Serial.print(“set ir 12345\r”); check();
Serial.print(“set il 2000\r”); check();
// Checks if everything is Ok, even if It’s correctly connected.

// Exits from command mode, and then the UDP messages
// can be sent and received.
Serial.print(“exit\r”);
marcar ();

//Attach the inttruptions for using the pulsioximeter.
PCintPort::attachInterrupt(6, readPulsioximeter, RISING);
delay (1000);

while (1) {

eHealth.initBloodPressureSensor(0.1);

//1. Read from eHealth.
int airFlow = eHealth.getAirFlow();
float temperature = eHealth.getTemperature();
float conductance = eHealth.getSkinConductance();
float resistance = eHealth.getSkinResistance();
float conductanceVol = eHealth.getSkinConductanceVoltage();
int BPM = eHealth.getBPM();
int SPO2 = eHealth.getOxygenSaturation();
uint8_t pos = eHealth.getBodyPosition();
int syst = eHealth.getSystolicPressure();
int diast = eHealth.getDiastolicPressure();
float ECG = eHealth.getECG();
//uint8_t glucose = eHealth.glucoseDataVector[0].glucose;

/ / 2. Send data to the Android smartphone
Serial.print(int(airFlow)); Serial.print(“#”);
Serial.print(ECG); Serial.print(“#”);
Serial.print(temperature); Serial.print(“#”);
Serial.print(int(BPM)); Serial.print(“#”);
Serial.print(int(SPO2)); Serial.print(“#”);
Serial.print(conductance); Serial.print(“#”);
Serial.print(int(resistance)); Serial.print(“#”);
Serial.print(int(airFlow)); Serial.print(“#”);
Serial.print(syst); Serial.print(“#”);
Serial.print(diast); Serial.print(“#”);
Serial.print(int(0)); Serial.print(“#”);
Serial.print(int(pos)); Serial.print(“#”);
Serial.print(“\n”);

// Reduce this delay for more data rate
retardo (100);
}

}

//=========================================================================

void check(){
cont=0;
retardo (500);
while (Serial.available()>0)
{
recv[cont]=Serial.read();
delay(10);
cont + +;
}
recv[cont]=’\0′;
Serial.println(recv);
Serial.flush ();
retardo (100);
}

//Include always this code when using the pulsioximeter sensor
//=========================================================================
void readPulsioximeter(){

cont ++;

if (cont == 50) { //Get only one 50 measures to reduce the latency
eHealth.readPulsioximeter();
cont = 0;
}
}

Instalación:
a) Download the application from Android Market:
  • From the Android device, go to Android Market.
  • Search “” or “” and press enter
b) Download the application () from Libelium website: http://www.libelium.com/apps
  • Insert it to the SD card of your Android device.
  • Then explore the SD card in your Android device and install the application. You can explore the SD card with “Astro”, “ES Explora”, or “File Explorer” applications.
Once installed, the app appears in your device screen.
The use of the app is very simple, first you have to create an AP from your Android device and then set Waspmote to connect to it.
To create the AP from the Android device:
Go to Settings->Tethering & Portable Hotspot or Settings->Wifi-> My Wifi Zone (depending of the version of mobile).
android_app

Then configure the WLAN hotspot (name= ANDROID, Security= Open).

android_app
Finally, enable Portable WLAN hotspot (or My Wifi Zone), and Arduino will connect to the Android device. Once connected, you can launch the e-Health App.
android_appandroid_app
The App shows the information the nodes are sending which contains the sensor data gathered.
The first tab “Charts” shows:
  • Respiratory rate chart
  • Electrocardiogram: is necessary to correctly set the delay between frames for the correct measurement of electrocardiogram
The “Current data” tab, shows data that is in continuous change:
  • Temperatura
  • Pulso
  • Oxígeno
  • Conductividad
  • Resistencia
  • Flujo de aire
android_appandroid_app

The “Tests” tab shows the information about:
  • Systolic Pressure
  • Diastolic Pressure
  • Glucometer
Finally, in the “Movement” tab shows the position of the body.
android_app
NOTE: The measurement of glucose has not been implemented in this example because both processes use UART communication and can cause malfunction
Ejemplo
Arduino
The Arduino code used in this program is presented next:
Show Code

  / *
 * eHealth sensor platform for Arduino and Raspberry from Cooking-hacks.
  *
 * Description: "The e-Health Sensor Shield allows Arduino and Raspberry Pi 
 * users to perform biometric and medical applications by using 9 different 
 * sensors: Pulse and Oxygen in Blood Sensor (SPO2), Airflow Sensor (Breathing),
 * Body Temperature, Electrocardiogram Sensor (ECG), Glucometer, Galvanic Skin
 * Response Sensor (GSR - Sweating), Blood Pressure (Sphygmomanometer) and 
 * Patient Position (Accelerometer)."  
  *
 * Explanation: This example shows the way to communicate with  
 * the Arduino Wifi Demo Android app. 
  *
 * Copyright (C) 2012 Libelium Comunicaciones Distribuidas SL
  * Http://www.libelium.com
  *
  * Este programa es software libre: usted puede redistribuirlo y / o modificarlo
  * Bajo los términos de la Licencia Pública General de GNU según es publicada por
 * the Free Software Foundation, either version 3 of the License, or
  * (A su elección) cualquier versión posterior.
  *
  * Este programa se distribuye con la esperanza de que sea útil,
  * Pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de
  * COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR.  Consulte la
  * GNU General Public License para más detalles.
  *
  * Usted debe haber recibido una copia de la Licencia Pública General de GNU
  * Junto con esta librería. If not, see .
  *
 * Version 0.1
 * Author: Luis Martin & Ahmad Saad 
  * /

# Include
# Include

char recv[128];
float parameter = 0.098;
uint8_t cont = 0;

void setup ()
{
Serial.begin (9600);

eHealth.initPulsioximeter();
eHealth.initPositionSensor();

//Attach the inttruptions for using the pulsioximeter.
PCintPort::attachInterrupt(6, readPulsioximeter, RISING);
delay (1000);

}

void loop ()
{
while (Serial.available()>0) {}
// Enters in command mode
Serial.print(“$$$”); check();
// Sets DHCP and TCP protocol
Serial.print(“set ip dhcp 1\r”); check();
Serial.print(“set ip protocol 1\r”); check();
// Configures the way to join the network AP
Serial.print(“set wlan join 0\r”); check();
Serial.print(“join ANDROID\r”); check();

Serial.print(“set ih 255.255.255.255\r”); delay(1000);

Serial.print(“set ir 12345\r”); check();
Serial.print(“set il 2000\r”); check();
Serial.print(“exit\r”); check();

while (1) {

eHealth.initBloodPressureSensor(0.098);

//1. Read from eHealth.
int airFlow = eHealth.getAirFlow();
float temperature = eHealth.getTemperature();
float conductance = eHealth.getSkinConductance();
float resistance = eHealth.getSkinResistance();
float conductanceVol = eHealth.getSkinConductanceVoltage();
int BPM = eHealth.getBPM();
int SPO2 = eHealth.getOxygenSaturation();
uint8_t pos = eHealth.getBodyPosition();
int syst = eHealth.getSystolicPressure();
int diast = eHealth.getDiastolicPressure();
float ECG = eHealth.getECG();
//uint8_t glucose = eHealth.glucoseDataVector[0].glucose;

//Data sensor must be sent in this order to mobile android application
Serial.print(int(airFlow)); Serial.print(“#”);
Serial.print(ECG); Serial.print(“#”);
Serial.print(syst); Serial.print(“#”);
Serial.print(diast); Serial.print(“#”);
Serial.print(int(0)); Serial.print(“#”); //Glucose is not implemented yet
Serial.print(temperature); Serial.print(“#”);
Serial.print(int(BPM)); Serial.print(“#”);
Serial.print(int(SPO2)); Serial.print(“#”);
Serial.print(conductance); Serial.print(“#”);
Serial.print(int(resistance)); Serial.print(“#”);
Serial.print(int(airFlow)); Serial.print(“#”);
Serial.print(int(pos)); Serial.print(“#”);
Serial.print(“\n”);

// Reduce this delay for more data rate
delay(250);
}
}

void check(){
cont=0; delay(500);
while (Serial.available()>0)
{
recv[cont]=Serial.read(); delay(10);
cont + +;
}
recv[cont]=’\0′;
Serial.println(recv);
Serial.flush(); delay(100);
}

//Include always this code when using the pulsioximeter sensor
//=========================================================================
void readPulsioximeter(){

cont ++;

if (cont == 50) { //Get only one 50 measures to reduce the latency
eHealth.readPulsioximeter();
cont = 0;
}
}

Para más informacion,pulse aquí