Matriz de 11×2 LEDs controlada con Arduino para un R2D2

Autor: Julio César Sandria Reynoso
Fecha: 9 de noviembre de 2024

Robot tipo R2D2

En este artículo se presenta un proyecto de creación de una matriz de 11×2 LEDs que se controlan con Arduino para colocarlos en una ranura de un robot similar al R2D2 de las películas Star Wars.

Semanas atrás, uno de los alumnos del Instituto de Robótica de Xalapa (iRoX) llevó su robot R2D2 para hacerle algunas mejoras. Una de esas mejoras consiste en ponerle LEDs en algunas de las ranuras de la cabeza.

Una de esas ranuras es rectangular de 9 cm X 1.2 cm, donde se puede colocar una matriz de 11×2 LEDs por dentro de la cabeza para que se pueda ver su encendido desde el exterior.

Cabeza de R2D2

La idea de poner varios LEDs fue para emular un tanto la forma en que trabaja el robot de las películas, encendiendo de diversas formas los LEDs de esa ranura.

Algunos de los alumnos participaron en el diseño de la sección rectangular para la colocación de los LEDs, inicialmente se consideró una tabla de MDF de 3mm cortada en láser para colocar allí los LEDs, pero se descartó porque con una placa fenólica perforada fue suficiente.

La disposición de los 22 LEDs, con resistencias, transistores y conexiones a Arduino se diseñó en Tinkercad. De hecho, en esta plataforma se hizo también la programación inicial y simulación de su funcionamiento, lo cual se muestra en el artículo Arreglo de 22 LEDS (11×2) con encendido aleatorio con Arduino en Tinkercad.

Arreglo de LEDs en 11 columnas y 2 filas conectados con transistores a Arduino UNO

Después del diseño del circuito en Tinkercad, se procedió a soldar los componentes en la placa fenólica. El material usado es el siguiente:

  • Placa fenólica perforada
  • 22 LEDs de diferentes colores
  • 11 resistencias de 220 Ohms
  • 2 transistores 2N2222
  • 2 resistencias de 1 KOhm
  • Cable UTP
  • Tira de pines macho 90° (14 conectores)
Componentes soldados a la placa fenólica

Una vez soldados todos los componentes como se ve en la imagen «Componentes soldados a la placa fenólica», se conectaron cables Dupont hembra-macho del circuito al Arduino UNO de la siguiente forma:

  • Los primeros 11 cables de izquierda a derecha se conectan a los pines digitales 10 a 0 de Arduino respectivamente.
  • El antepenúltimo cable (amarillo) se conecta al pin analógico A0.
  • El penúltimo cable (naranja) se conecta al pin analógico A1.
  • El último cable (rojo) se conecta a GND.

Una vez conectado todo, se cargó el siguiente programa C++ desde Arduino IDE al Arduino UNO.

// Programa C++ para Arduino
// Autor: Julio César Sandria Reynoso
// Fecha: Noviembre 2024
// Arreglo de LEDs de 11 columnas X 2 filas,
// enciende LEDs de forma aleatoria o con ciertos patrones
#define columnas 11
#define filas 2
int Columnas[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int Filas[] = {A0, A1};
int ledColumna[columnas];
int ledFila[columnas];

void setup() {
  for (int col = 0; col < columnas; col++)
    pinMode(Columnas[col], OUTPUT); 
  for (int fila = 0; fila < filas; fila++)
    pinMode(Filas[fila], OUTPUT);
}

void loop() {
  // Enciende un led iniciando en la primera fila de 
  // izquierda a derecha y terminando en la segunda 
  // fila a la izquierda
  for(int t=100; t>=40; t=t-20)
    ledPorFila(t,0);

  // Enciende de 1 a 5 leds de forma aleatoria durante un tiempo
  // de 100 + i*50 ms y apagándolos 0 ms
  for(int i=1; i<6; i++)
    ledsAleatorios(i,100+i*50,0);

  // Enciende 6 leds de forma aleatoria durante 50 iteraciones
  for(int i=0; i<50; i++)
    ledsAleatorios(6,350,0);
}

void ledPorFila(int tEncendido, int tApagado) {
  for(int i=columnas-1; i>=0; i--) {
    digitalWrite(Filas[0], HIGH);
    digitalWrite(Columnas[i], HIGH);
    delay(tEncendido);

    digitalWrite(Filas[0], LOW);
    digitalWrite(Columnas[i], LOW);
    delay(tApagado);
  }
  for(int i=0; i<columnas; i++) {
    digitalWrite(Filas[1], HIGH);
    digitalWrite(Columnas[i], HIGH);
    delay(tEncendido);

    digitalWrite(Filas[1], LOW);
    digitalWrite(Columnas[i], LOW);
    delay(tApagado);
  }
}

void ledsAleatorios(int nLeds, int tEncendido, int tApagado) {
  // Los arreglos ledFila[] y ledColumna[] tienen <columnas> elementos,
  // de los cuales solo se usan <nLeds> elementos en esta función.
  // Es posible que de forma aleatoria se repita un led a encender,
  // pero es imperceptible o poco notorio durante la ejecución.
  // Encendemos los nLeds indicados, durante <tEcendido> milisegundos
  for(int i=0; i<nLeds; i++) {
    ledFila[i] = random(0, filas);
    ledColumna[i] = random(0, columnas);
    digitalWrite(Columnas[ledColumna[i]], HIGH);
    digitalWrite(Filas[ledFila[i]], HIGH);
  }
  delay(tEncendido);
  // Apagamos todos los leds encendidos
  for(int i=0; i<nLeds; i++) {
    digitalWrite(Columnas[ledColumna[i]], LOW);
    digitalWrite(Filas[ledFila[i]], LOW);    
  }
  delay(tApagado);
}

Las siguientes fotografías son del circuito funcionando.

Al probar el programa se detectó que algunos LEDs no encendían, por lo que se hizo una revisión exhaustiva, encontrando algunos errores de soldadura, que se fueron resolviendo.

Con este tipo de proyectos, donde los alumnos practican los temas que se van viendo en el iRoX, los alumnos se sienten motivados a aprender aún mucho más.

Si te interesa aprender más sobre programación en C++, Arduino, robótica u otros lenguajes de programación, visita el sitio web del Instituto de Robótica de Xalapa (www.irox.mx) y contáctanos. Si estás en una región cercana a Xalapa, como Veracruz, Boca del Río, Córdoba, Martínez de la Torre, etc., puedes visitar las instalaciones del iRoX entre semana o un sábado y hablar con nuestros profesores sobre proyectos de robótica o tecnología.

Agradecemos a los alumnos que están participando en este proyecto: David, Germán, Fernando, Carlo y Max.

Arreglo de 22 LEDS (11×2) con encendido aleatorio con Arduino en Tinkercad

Instituto de Robótica de Xalapa - iRoX

Autor: Julio César Sandria Reynoso
Fecha: 19 de octubre de 2024

En este artículo se presenta un proyecto en Tinkercad (www.tinkercad.com) haciendo un circuito para conectar 22 LEDs en un arreglo de 11 columnas y 2 filas, con encendido aleatorio de los LEDs.

Lo interesante de este proyecto es mostrar cómo, teniendo únicamente 20 pines de entrada/salida en Arduino UNO (14 digitales y 6 analógicos), podemos conectar 22, 30 ó 45 LEDs y controlarlos fácilmente mediante programación C++ en Arduino.

Arreglo de LEDs en 11 columnas y 2 filas conectados con transistores a Arduino UNO

En la imagen se puede ver que en forma de columna, se conectan dos LEDs a cada uno de los pines digitales 0 a 10 de Arduino. Por ejemplo, viendo los LEDs de derecha a izquierda, en los primeros dos LEDs los ánodos (+) se conectan entre si, después a una resistencia de 220 Ohms y la resistencia se conecta al pin 0 de Arduino. Y así sucesivamente se conectan los demás LEDs.

En la primera fila de 11 LEDs (los de arriba), se conectan entre si sus cátodos (-), y todos ellos se conectan a la patilla C (colector) del transistor NPN de la derecha. La patilla E (emisor) se conecta a tierra (GND de Arduino) y la patilla B (base) se conecta a una resistencia de 1 KOhm y ésta al pin analógico A0 de Arduino.

De forma similar, la segunda fila de 11 LEDs se conectan sus cátodos (-) al transistor NPN de la izquierda y la patilla B (base) se conecta con una resistencia de 1 Ohm de por medio, al pin A1 de Arduino.

Para encender los primeros dos LEDs de la derecha, se activa el pin 0 de Arduino con digitalWrite(0,HIGH), pero esto por si solo no enciende ninguno de los dos LEDs. Para encender el primer LED de la derecha-arriba, se debe activar el pin A0 de Arduino con digitalWrite(A0,HIGH). Con esto, se envía el voltaje necesario a la base del transistor de la derecha, lo que cierra el circuito entre el colector y emisor de dicho transistor, permitiendo el flujo de corriente desde el pin 0 de Arduino, pasando por el LED (derecha-arriba), el transistor derecho, hasta el GND de Arduino.

El programa siguiente implementa el encendido de forma aleatoria de un LED durante 15 veces y después el encendido de dos LEDs de forma aleatoria durante 20 veces. Esto se repite mientras se ejecute la simulación en Tinkercad.

// Programa C++ para Arduino
// Arreglo de LEDs de 11 columnas X 2 filas,
// enciende un LED de forma aleatoria y
// después enciende dos LEDs de forma aleatoria
int Columnas[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int Filas[] = {A0, A1};
int columnas = 11;
int filas = 2;

void setup() {
  for (int col = 0; col < columnas; col++)
    pinMode(Columnas[col], OUTPUT); 
  for (int fila = 0; fila < filas; fila++)
    pinMode(Filas[fila], OUTPUT);
}

void loop() {
  // 15 veces encendemos un led de forma aleatoria
  ledAleatorio(15);
  // 20 veces encendemos dos leds de forma aleatoria
  ledAleatorio2(20);
}

void ledAleatorio(int n) {
  int aFila;
  int aColumna;

  for(int i=0; i<n; i++) {
    aFila = random(0, filas);
    aColumna = random(0, columnas);

    digitalWrite(Filas[aFila], HIGH);
    digitalWrite(Columnas[aColumna], HIGH);
    delay(300);

    digitalWrite(Filas[aFila], LOW);
    digitalWrite(Columnas[aColumna], LOW);
    delay(200);
  }
}

void ledAleatorio2(int n) {
  int aFila;
  int aColumna;
  int a2Fila;
  int a2Columna;
  
  for(int i=0; i<n; i++) {
    aFila = random(0, filas);
    aColumna = random(0, columnas);
    a2Fila = random(0, filas);
    a2Columna = random(0, columnas);

    digitalWrite(Filas[aFila], HIGH);
    digitalWrite(Columnas[aColumna], HIGH);
    digitalWrite(Filas[a2Fila], HIGH);
    digitalWrite(Columnas[a2Columna], HIGH);
    delay(300);

    digitalWrite(Filas[aFila], LOW);
    digitalWrite(Columnas[aColumna], LOW);
    digitalWrite(Filas[a2Fila], LOW);
    digitalWrite(Columnas[a2Columna], LOW);
    delay(200);
  }
}

Si te interesa aprender más sobre programación en C++, Arduino, robótica u otros lenguajes de programación, visita el sitio web del Instituto de Robótica de Xalapa (www.irox.mx) y contáctanos. Si estás en una región cercana a Xalapa, como Veracruz, Boca del Río, Córdoba, Martínez de la Torre, etc., puedes visitar las instalaciones del iRoX entre semana o un sábado y hablar con nuestros profesores sobre proyectos de robótica o tecnología.

Encender Led en Arduino por Bluetooth desde Android

Programa Arduino que recibe comandos desde un móvil Android para encender o apagar un LED.

//Se crea una variable que servirá como buffer
String bufferString = "";

void setup() {
  //Iniciamos comunicación con el puerto serie
  Serial.begin(9600);
  pinMode(3, OUTPUT);
}

void loop() {
  /*
  * Evaluamos el momento en el cual recibimos un caracter
  * a través del puerto serie 
  */
  if (Serial.available() &gt; 0) {
    //Delay para favorecer la lectura de caracteres
    delay(20);
    /*
    * Se le indica a Arduino que mientras haya datos
    * disponibles para ser leídos en el puerto serie
    * se mantenga concatenando los caracteres en la
    * variable bufferString
    */
    while (Serial.available() &gt; 0) {
      bufferString = "";
      bufferString += (char)Serial.read();
    }
  //Se transforma el buffer a un número entero
  int num = bufferString.toInt();
  //Se imprime el número que se recibe
  Serial.print("Numero recibido: ");
  Serial.print(num);
  //Serial.write(num);
  if (num == 1){
    digitalWrite(3, HIGH);
    Serial.println(",Encendido");
  }
    if (num == 2){
      digitalWrite(3, LOW);
      Serial.println(",Apagado");
    }
  }
}

 

Tipos de motores rotativos para proyectos de Arduino

arduino-tipos-de-motores

Luis LLamas publicó en su blog un interesante artículo sobre tipos de motores rotativos para proyectos de Arduino, donde describe los siguientes:

  • Motores de corriente continua
  • Motores geared down motor
  • Motores brushless
  • Servo motores
  • Servo motores de rotación continua
  • Motores paso a paso
  • Motores paso a paso 28BYJ-48

En su artículo proporciona una tabla resumen donde hace una comparación de características y forma de control de tales motores.

No dejes de leer su artículo en:

https://www.luisllamas.es/tipos-motores-rotativos-proyectos-arduino/

 

Comunicación inalámbrica de dos Arduino con módulos Zigbee XBee S2C

En este artículo vemos cómo establecer una comunicación inalámbrica entre dos tarjetas Arduino usando módulos Zigbee XBee S2C que se conectan mediante módulos XBee Explorer Regulated de SparkFun a Arduino.

Configuración de módulos XBee S2C

En la página Conexión punto a punto de módulos Zigbee XBee S2C se puede ver cómo hacer la configuración inicial de los módulos XBee S2C a usar en este artículo.

Material y equipo usado

  • 1 Arduino UNO
  • 1 Arduino Mega
  • 2 módulo XBee S2C de Digi-Key
  • 2 módulo XBee Explorer Regulated de SparkFun
  • computadora con con software Arduino IDE 1.6 o superior

Referencias

Artículo en desarrollo…

Robot Sanduino controlado via Bluetooth con Android

Robot Sanduino A01 con Bluetooth

En esta entrada mostramos como conectar un robot Sanduino A01 (basado en Arduino UNO) con módulo bluetooth a un teléfono Android, utilizando una aplicación creada por nosotros mismos.

Para esto necesitaremos el programa MIT App Inventor 2

DescargaAplicación en Linea

Y la libreria SoftwareSerial para Arduino

SoftwareSerialLibrary

Conexión del módulo Bluetooth a la placa Arduino


#include <SoftwareSerial.h>

int estado=0;
int multi=0;
#define RxD 10
#define TxD 11
SoftwareSerial BTSerial(RxD, TxD);
  

void setup(){
  Serial.begin(9600);
  BTSerial.flush();
  delay(500);
  BTSerial.begin(9600);
  //Insertar aquí
}

void loop(){
  if(BTSerial.available()>0){
    estado = BTSerial.read();
    Serial.write(estado);
    Serial.print("\r\n");
    //Insertar aquí
  }
}

Para controlar el robot Sanduino


#include <SoftwareSerial.h>

int tRetrocede = 500;
int tAvanza = 50;
int tAlto = 40;
int tGiro = 70;

int estado=0;
int multi=0;
#define RxD 10
#define TxD 11
SoftwareSerial BTSerial(RxD, TxD);
  
void setup(){
  Serial.begin(9600);
     BTSerial.flush();
  delay(500);
  BTSerial.begin(9600);

  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  
}

void loop(){
  if(BTSerial.available()>0){
    estado = BTSerial.read();
    Serial.write(estado);
    Serial.print("\r\n");
    digitalWrite(9,HIGH);
  }
  if (estado == '1') {
    avanza(100);
    Serial.print("Avanza");
  }
  if (estado == '2') {
    derecha(100);
    Serial.print("Derecha");
  }
  if(estado == '3') {
    retrocede(100);
    Serial.print("Retrocede");
  }
  if(estado == '4') {
    izquierda(100);
    Serial.print("Izquierda");
  }
  if(estado == '5') {
    alto(0);
    Serial.print("Alto");
  }
}

void alto(int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  delay(ms);
}

void derecha (int ms) {
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(ms);
}
void izquierda (int ms) {
  digitalWrite (6, LOW);
  digitalWrite (7, HIGH);
  digitalWrite (8, HIGH);
  digitalWrite (9, LOW);
  delay (ms);
}
void avanza (int ms) {
  digitalWrite (6, HIGH);
  digitalWrite (7, LOW);
  digitalWrite (8, HIGH);
  digitalWrite (9, LOW);
  delay (ms);
}

void retrocede (int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(ms);
}

Las funciones para mover el robot son las mismas funciones básicas describas en la entrada Robot Sanduino Control con funciones.

iRoX – Escuela de Verano Robótica 2017 – Segunda llamada

El Instituto de Robótica de Xalapa invita al público en general a su Escuela de Verano Robótica 2017 para niños, jóvenes y adultos, que se llevará a cabo del 14 al 22 de julio en Xalapa, Veracruz, México. Donde impartiremos cursos de robótica (y Raspberry Pi) independientes de dos o cuatro días:
  • Curso Raspberry Pi, 14 y 15 de julio, intensivo, 12 horas, dirigido a jóvenes y adultos.
  • Curso Robótica Lego NXT, 17 al 20 de julio, matutino, 16 horas, dirigido a niños y jóvenes.
  • Curso Robótica Arduino, 17 al 20 de julio, vespertino, 16 horas, dirigido a niños y jóvenes.
  • Curso Robótica Lego EV3, 21 y 22 de julio, intensivo, 12 horas, dirigido a jóvenes y adultos.

¿Conoces a algún niño o joven fuera de Xalapa a quien le gustaría aprender de robótica? Llévalo a Xalapa un fin de semana a tomar nuestro Curso Robótica Lego Ev3, o mejor aún, una semana completa para tomar dos o tres cursos de robótica.

NOTA: Tenemos descuentos en inscripción temprana, hasta el 30 de junio.

Puedes ver más información en nuestra página Escuela de Verano Robótica 2017, o escribirnos en nuestra página de contacto o al correo electrónico irox@robotsa.com.

El iRoX es sede de los equipos de robótica Galácticos, formados por niños que han obtenido los siguientes logros:

¿Cómo construir un dispositivo para monitoreo ambiental con Arduino y el Internet de la cosas?

Por Ana Luisa Balderas García
4to semestre de Bachillerato
Colegio de Bachilleres Simón Bolívar del Sureste

Participante en el Programa de Fomento al Interés por la Carrera Científica en Niños y Jóvenes con el Mtro. Julio Sandria en el Instituto de Ecología, A.C.

Dí­a 1

Aprendí los principios básicos del Arduino. Sus caracterí­sticas, conexiones, su enlace a la computadora y el lenguaje de programación a utilizar.

Realice ejercicios con un programa base (uno predeterminado). Este programa ordenaba a la tarjeta (Arduino) que encendiera un led y lo apagara con un tiempo de espera determinado entre cada orden. Ejercicio: El led enciende para dar una señal de SOS en código morse.

Dí­a 2

¿Qué es el cambio climático?, y ¿Qué es el monitoreo ambiental?

  1. El cambio climático es la alteracion de proporcion y composición de gases de efecto invernadero que atrapan el calor de la atmósfera.
  2. El monitoreo ambiental discute desarrollos técnicos y el surgimiento de datos de monitoreo ambiental, principalmente en el diseño de sistemas de monitoreo y en el uso de la información recabada, analizando consecuencias del manejo de recursos naturales y riegos de la contaminación.

Trabajamos con 3 sensores; el DHT22, que mide la humedad y temperatura, el BMP180, que mide la presión barométrica, la temperatura y la altura en metros sobre el nivel del mar; y el sensor de luz, con valores de luz del 0 al 1023, teniendo como referencia que el 0 es total iluminación y el 1023 para obscuridad.

Se tení­a programas base para cada uno de los sensores, y se descargaron librerías para poder trabajarlos.

Ejercicio: Enlazar dos programas en uno, haciendo trabajar dos sensores al mismo tiempo. Los programas se entrelazaron., tomando las instrucciones del algoritmo base que el otro no tenía y eran fundamentales para su funcionamiento.

Ejercicio: Acoplar el tercer sensor. Se utilizó un Protoboard para anexar las conexiones del tercer sensor y modificar el programa. Se conectó a internet para el registro de datos con una tarjeta de red, con entrada para cable Ethernet.

Dí­a 3

El Internet de las Cosas (Internet of Things, IoT), es una iniciativa global para la interconexión digital de objetos cotidianos mediante internet, la cual permite subir datos a un servidor para que se almacenen. El maestro Julio César Sandria Reynoso generó un programa en donde los datos obtenidos pasan a un servidor del INECOL y en otro servidor de forma gratuita en el IoT.

En conclusión, este prototipo nos sirve para monitorizar variables que pueden reflejar el cambio climático y estar disponibles en servidores gratuitos.

Sensor de luz con Arduino UNO

En esta página se muestra el uso del sensor de luz (Light Sensor Brick) con Arduino UNO. Este sensor puede funcionar como sensor analógico o sensor digital. Aquí se ejemplifica el uso analógico, con valores entre 0 y 1023.

Material usadoLightSensorBrick

1 Arduino UNO
1 Sensor de luz (Ligth Sensor Brick)
3 Cables hembra-macho

El sensor tiene una fotorresistencia, la cual se usa para detectar la cantidad de luz en el ambiente. También tiene un interruptor, con el cual se configura el sensor para enviar valores digitales o analógicos. Para el programa siguiente debe estar en la posición A (analógico).

Programa LightSensorBrick.ino

/* LightSensorBrick.ino
* Julio C. Sandria Reynoso - 24-Mayo-2017
* Este programa monitorea un sensor de luz del tipo
* Light Sensor Brick
*/

int lightValue = 0; // Muy iluminado 0..1023 Muy obscuro
 
void setup() {
  pinMode(A0, INPUT);
  Serial.begin(9600);
  Serial.println("Iniciando programa...");
  Serial.println("Valor\tSituacion");
}

void loop() {
  lightValue = analogRead(A0);
  Serial.print(lightValue);
  Serial.print("\t");
  if( lightValue < 205 )
    Serial.println("Muy iluminado");
  else if( lightValue < 410 )
    Serial.println("Iluminado");
  else if( lightValue < 615 )
    Serial.println("Sombreado");
  else if( lightValue < 820 )
    Serial.println("Obscuro");
  else
    Serial.println("Muy obscuro");
  delay(1000);
}

 

Sensor de presión BMP180 con Arduino UNO

BMP180En esta página se muestra el uso del sensor de presión barométrica BMP180 con Arduino UNO. Con este sensor también se puede obtener la temperatura y altura sobre el nivel del mar.

Material usado

1 Arduino UNO
1 Sensor BMP180
4 Cables hembra-macho

Libería

SFE_BMP180.zip que se puede descargar de esta misma página. La página oficial de la librería está en la dirección https://github.com/sparkfun/BMP180_Breakout.

El programa que se muestra aquí está basado en el Tutorial sensor de presión barométrica, en el cual se hace una muy buena explicación de la librería.

Diagrama de conexión del sensor BMP180 con Arduino UNO:

UNO-and-BMP180

Programa SensorBMP180.ino

/* 
* SensorBMP180.ino
* Julio C. Sandria Reynoso - 23-Mayo-2017
* Este programa toma la Temperatura y Presión de un sensor
* BMP180 conectado a Arduino UNO
* Esta basado en el Tutorial sensor de presion barometrica
* http://www.naylampmechatronics.com/blog/43_Tutorial-sensor-de-presi%C3%B3n-barom%C3%A9trica-BMP180.html
*/

#include <SFE_BMP180.h>
#include <Wire.h>

SFE_BMP180 bmp180;
char statusBmp180;
double P,T,A,PNivelMar=1013.25; //presion sobre el nivel del mar en mbar

void setup() {
  Serial.begin(9600);
  Serial.println("Iniciando programa...");
  delay(1000);

  if (bmp180.begin()) {
    Serial.println("Sensor BMP180 iniciado correctamente");
    Serial.println();
    Serial.println("  P mbar = Presion barometrica en milibares");
    Serial.println("  T *C = Temperatura en grados Celcius");
    Serial.println("  A msnm = Altura en metros sobre el nivel del mar");
    Serial.println();
  } else {
    Serial.println("Error al iniciar sensor BMP180");
  }
  Serial.println("P mbar\tT *C\tA msnm");
}

void loop() {
  delay(1000);
  if( leerBmp180() ) {
    Serial.print(P,2);
    Serial.print("\t");
    Serial.print(T,2);
    Serial.print("\t");
    Serial.println(A,2);
  } else
    Serial.println("pp.pp\ttt.tt\taa.aa?");
}

boolean leerBmp180() {
  //Inicio de lectura de temperatura
  statusBmp180 = bmp180.startTemperature(); 
  if (statusBmp180 != 0) {
    //Pausa para que finalice la lectura
    delay(statusBmp180); 
    //Obtener la temperatura
    statusBmp180 = bmp180.getTemperature(T); 
    if (statusBmp180 != 0) {
      // Inicio lectura de presión
      statusBmp180 = bmp180.startPressure(3); 
      if (statusBmp180 != 0) {
        //Pausa para que finalice la lectura
        delay(statusBmp180); 
        //Obtenemos la presión
        statusBmp180 = bmp180.getPressure(P,T); 
        if (statusBmp180 != 0) {
          A = bmp180.altitude(P,PNivelMar);
          return true; // Se tomo lectura de Temperatura, Presion y Altitud
        }      
      }      
    }   
  }
  return false; // No se tomo lectura de Temperatura, Presion y Altitud
} // leerBmp180

Ejemplo de corrida

Iniciando programa...
Sensor BMP180 iniciado correctamente
  T *C = Temperatura en grados Celcius
  P mbar = Presion barometrica en milibares
  A msnm = Altura en metros sobre el nivel del mar
T *C	P mbar	A msnm
26.11	866.66	1298.90
26.10	866.64	1299.06
26.10	866.61	1299.38
26.10	866.60	1299.45
26.08	866.61	1299.37
26.09	866.63	1299.15
26.09	866.64	1299.08
26.09	866.65	1298.94
26.10	866.65	1298.97
26.10	866.63	1299.17