Arduino 101 计步器:集成 DHT11 温湿度 + LCD 显示步数/距离/卡路里
项目背景
为参加科技展“My body, my world”主题制作。利用 Arduino 101 (Intel Curie) 内置六轴 IMU 硬件计步功能,结合 DHT11 温湿度传感器与 1602 LCD,打造一款佩戴式计步器,显示步数、距离、消耗卡路里、环境温湿度,3D 打印外壳,9V 电池供电。
硬件清单
- Arduino 101 (含 Curie IMU) ×1
- DHT11 温湿度模块 (4 针) ×1
- 1602 LCD (I²C 或并口,示例用并口 6 线) ×1
- 10kΩ 电位器 (LCD 对比度) ×1
- 9V 电池 + 电池扣 ×1
- 跳线、3D 打印外壳
核心算法
- 步长估算:
stepLen = 0.30 * height(cm)(经验公式) - 每英里步数:
stepsPerMile = 160000 / stepLen(160000 cm = 1 英里) - 卡路里/公里:
kcalPerKm = (0.57 * weight_kg * 1.6) / 0.453 - 距离:
distance_m = stepLen * steps / 100 - 消耗卡路里:
kcal = steps * (steps / stepsPerMile)(简化模型)
接线对照
| 模块 | Arduino 101 引脚 |
|---|---|
| LCD RS | D12 |
| LCD EN | D10 |
| LCD D4-D7 | D5, D4, D3, D2 |
| DHT11 DATA | D8 |
| 电位器中间脚 | LCD V0 (对比度) |
| 板载 LED | D13 (心跳指示) |
完整固件代码
#include <DHT.h> #include <DHT_U.h> #include <LiquidCrystal.h> #include <CurieIMU.h>
#define DHTPIN 8
#define DHTTYPE DHT11
LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
DHT_Unified dht(DHTPIN, DHTTYPE);
float stepLen, kcalPerMile, stepsPerMile;
float weight = 57, height = 168;
long lastStepCount = 0;
uint32_t delayMS;
void setup() {
lcd.begin(16, 2);
dht.begin();
stepLen = 0.30 * height;
kcalPerMile = (0.57 * weight * 1.6) / 0.453;
stepsPerMile = 160000.0 / stepLen;
lcd.print("Pedometer"); lcd.setCursor(0,1); lcd.print("Made by Frank"); delay(3000);
CurieIMU.begin();
CurieIMU.setStepDetectionMode(CURIE_IMU_STEP_MODE_NORMAL);
CurieIMU.setStepCountEnabled(true);
CurieIMU.attachInterrupt(eventCallback);
CurieIMU.interrupts(CURIE_IMU_STEP);
sensors_event_t event;
dht.temperature().getEvent(&event);
delayMS = event.min_delay / 1000;
}
static void eventCallback() {
if (CurieIMU.stepsDetected()) updateStepCount();
}
void updateStepCount() {
int steps = CurieIMU.getStepCount();
if (steps != lastStepCount) lastStepCount = steps;
}
void loop() {
// 1. 步数
lcd.clear(); lcd.print("Steps:"); lcd.setCursor(0,1); lcd.print(lastStepCount); delay(4000);
// 2. 卡路里
float kcal = lastStepCount * (lastStepCount / stepsPerMile);
lcd.clear(); lcd.print("Calories:"); lcd.setCursor(0,1); lcd.print(kcal); lcd.print(" Kcal"); delay(4000);
// 3. 距离
float dist = stepLen * lastStepCount / 100.0;
lcd.clear(); lcd.print("Distance:"); lcd.setCursor(0,1); lcd.print(dist); lcd.print(" m"); delay(4000);
// 4. 温度
sensors_event_t ev;
dht.temperature().getEvent(&ev);
if (!isnan(ev.temperature)) {
lcd.clear(); lcd.print("Temp:"); lcd.setCursor(0,1); lcd.print(ev.temperature); lcd.print(" C"); delay(3000);
}
// 5. 湿度
dht.humidity().getEvent(&ev);
if (!isnan(ev.relative_humidity)) {
lcd.clear(); lcd.print("Humi:"); lcd.setCursor(0,1); lcd.print(ev.relative_humidity); lcd.print("%"); delay(3000);
}
digitalWrite(13, !digitalRead(13)); // 心跳灯
delay(300);
}
3D 打印外壳
设计含 LCD 窗口、DHT11 通风孔、电池仓、背部夹扣,STL 文件可自行建模或下载作者源文件。打印材料建议 PLA,填充 20%,0.2 mm 层高。
改进方向
- 加入 BLE 同步数据到手机 App 记录长期趋势。
- 改用圆形 OLED (SSD1306) 显示更多图表。
- 集成 GPS 模块校准步长、记录轨迹。
- 优化功耗:Curie 睡眠模式 + 间歇唤醒,延长电池寿命。
制造工艺
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- 打造功能完整的 Arduino 驱动 3D 打印机械臂:分步指南
- DIY Arduino 加湿器控制器:继电器安全控制高压电路
- 非接触体温筛查闸机:Arduino MKR1000 + 红外测温 + 舵机控制
- PiBot:Arduino驱动的88键钢琴机器人,精准演奏MIDI乐曲
- Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
- Arduino + ThingSpeak 实时气象监测站
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
- Arduino + TEA5767 打造 FM 收音机:Nokia 5110 显频谱/信号强度/立体声
- Arduino RGB 颜色混合器 – 分步制作教程