Arduino 101: Construye un Podómetro con Sensor DHT11 y Pantalla LCD
Componentes y materiales
| Arduino 101 (con IMU Curie integrada) | ×1 |
| Sensor temperatura/humedad DHT11 (4 pines) | ×1 |
| Pantalla LCD 16x2 (blanco sobre azul, estándar Adafruit) | ×1 |
| Potenciómetro rotatorio (contraste LCD) | ×1 |
| Cables de conexión | ×1 |
| Batería 9V | ×1 |
| Conector batería 9V | ×1 |
Herramientas necesarias
- Impresora 3D (para la carcasa)
Aplicaciones y servicios online
- Arduino IDE
Sobre el proyecto
Este proyecto cumplió los requisitos de la feria de ciencias de mi ciudad el año pasado: "Mi cuerpo, mi mundo".
La idea: un dispositivo que mida el rendimiento físico individual. El podómetro, en cada movimiento, calcula: distancia recorrida, número de pasos, calorías quemadas, temperatura y humedad ambiente.
La mayoría de datos vienen directamente de la placa (librería de conteo de pasos del CurieIMU); el resto se calcula con fórmulas matemáticas. La carcasa se imprimió en 3D. Alimentación: batería 9V.
¿Por qué?
Gran parte de la población vive sedentaria, alejada de actividad física y hábitos saludables. Es vital reconocer la actividad física como elemento clave para el metabolismo normal y reducción de riesgos de enfermedades futuras.
Con esta conclusión, creé un prototipo que ayuda en esto, recopilando datos analizables en detalle. Al verlos, la persona se motiva a practicar actividad física, monitoriza su rendimiento, entiende su cuerpo y mejora día a día.
¿Dudas? Deja un comentario o envíame un email.
Código
Pedometer.ino (C/C++)
// Frank, the living dead, made this code.
// Chapecó, Brazil - 2017 (ciencia fair) - 2018
// Thanks: Adafruit, Intel, Filipeflop, Keyes
#include <DHT.h>
#include <DHT_U.h>
#include <LiquidCrystal.h>
#include "CurieIMU.h"
#include <SoftwareSerial.h>
#include <Adafruit_Sensor.h>
#define DHTPIN 8
#define DHTTYPE DHT11
LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
int state = LOW, lastState = LOW;
const int ledPin = 13;
boolean stepEventsEnabled = true;
long lastStepCount = 0;
boolean blinkState = false;
float paso_longitud; // longitud de zancada (cm)
float calories = 0;
float peso = 57; // kg
float altura = 168; // cm
float cal_por_km;
float calories_burned;
float distance;
float pasos_por_milla;
float velocidad;
char option;
float t;
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
void setup() {
lcd.begin(16, 2);
dht.begin();
paso_longitud = 0.30 * altura; // estimación zancada
cal_por_km = (0.57 * peso * 1.6) / 0.453; // kcal/km
pasos_por_milla = 160000.0 / paso_longitud; // 16 km = 160,000 cm
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Podometro");
lcd.setCursor(0, 1); lcd.print("Hecho por Frank :P");
delay(3000);
CurieIMU.begin();
CurieIMU.setStepDetectionMode(CURIE_IMU_STEP_MODE_NORMAL);
CurieIMU.setStepCountEnabled(true);
if (stepEventsEnabled) {
CurieIMU.attachInterrupt(eventCallback);
CurieIMU.interrupts(CURIE_IMU_STEP);
}
}
static void updateStepCount() {
int stepCount = CurieIMU.getStepCount();
if (stepCount != lastStepCount) {
lastStepCount = stepCount;
}
}
static void eventCallback(void) {
if (CurieIMU.stepsDetected()) updateStepCount();
}
void loop() {
if (!stepEventsEnabled) updateStepCount();
// 1. Pasos
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Pasos: ");
lcd.setCursor(0, 1); lcd.print(lastStepCount);
delay(4000);
// 2. Calorías
calories_burned = lastStepCount * (lastStepCount / pasos_por_milla) * cal_por_km;
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Calorias Q.: ");
lcd.setCursor(0, 1); lcd.print(calories_burned); lcd.print(" Kcal");
delay(4000);
// 3. Distancia
distance = (paso_longitud * lastStepCount) / 100.0; // metros
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Distancia: ");
lcd.setCursor(0, 1); lcd.print(distance); lcd.print(" m");
delay(4000);
// 4. Temperatura
delay(delayMS);
sensors_event_t event;
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
Serial.println("Error - Temp");
} else {
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Temperatura: ");
lcd.setCursor(0, 1); lcd.print(event.temperature); lcd.print(" C");
delay(3000);
}
// 5. Humedad
dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
Serial.println("Error - Humi");
} else {
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Humedad: ");
lcd.setCursor(0, 1); lcd.print(event.relative_humidity); lcd.print("%");
delay(3000);
}
// Parpadeo LED vida
lastState = state;
digitalWrite(13, blinkState);
blinkState = !blinkState;
delay(300);
}
Esquemáticos
El LCD es fácil de configurar.

Proceso de manufactura
- Proyecto Dados Digitales Arduino: Construye tu Propio Generador de Números Aleatorios con LCD
- Construye un Iron Man animado con Arduino: componentes, sensores y guía paso a paso
- Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
- Construye un Brazo Robótico Impreso en 3D Controlado por Arduino – Guía Paso a Paso
- Controlador de Humidificador DIY con Arduino y Relé: Configuración Segura de Alto Voltaje
- Puerta de control de temperatura sin contacto para detección rápida y precisa
- PiBot: Robot Pianista con Arduino para Interpretación Musical de Precisión
- Pong Neón en Matriz NeoPixel con Arduino Nano
- Monitorización Meteorológica en Tiempo Real con Arduino y ThingSpeak IoT
- Construye un volante joystick personalizado con Arduino para gaming
- Construye un Receptor FM Potente con Arduino y Módulo TEA5767