便携式 GSM 投票箱:基于 Hologram + IFTTT 实现云端数据采集
项目背景
作者想探索群体匿名投票在无同辈压力环境下的真实表现,于是设计了这款 "Mobile Vote Box"(移动投票箱)。设备投放于芝加哥和拉斯维加斯的随机公共场所,收集路人对 "Chicago 风味披萨 vs New York 风味披萨" 的偏好。整机由电池供电,通过蜂窝网络上传数据,部署极其简单——放下即走。
成本与连接方案
- 元件成本约 $50 (若从 AliExpress 采购可压缩至 $6)。
- 蜂窝连接免费:使用 Hologram.io Developer Plan,赠送全球 SIM 卡 + 每月 1MB 免费流量 (约 2000 条投票数据包)。
- 推荐使用推广码 BUDS-WITH-BENSTR 获得免费邮费及额外赠款。
系统架构与数据流向
每次投票 → 设备发送字符串到 Hologram Data Router → Router 解析为 JSON → 转发至 IFTTT Webhook → IFTTT 追加行到 Google Sheets。各环节职责:
- Hologram Data Store:屏蔽 SIMCom 模组上云的复杂性。
- Hologram Data Router:将极简字符串转为 IFTTT 要求的 JSON,且可随时增加新集成而无需改动设备固件。
- IFTTT:抽象 Google Sheets 等云服务集成。
- Google Sheets:直观存储与可视化。
分步搭建指南
1. 创建 IFTTT Applet
- 登录 IFTTT,新建 Applet。
- 触发器:Webhooks → Receive a web request,事件名设为
vote。 - 动作:Google Drive → Add row to spreadsheet,配置字段 (可参考原文图示)。
- 完成后,在
https://ifttt.com/services/maker_webhooks/settings复制 Webhook Key (URL 最后一段)。
2. 配置 Hologram Data Route
- Hologram 控制台激活 SIM 或选中现有设备,命名如 "Vote Btn #1"。
- 左侧 Routes → New Route:
- IN (Topic):
vote - OUT:IFTTT Maker Webhook
- Webhook Key:粘贴上一步复制的 Key
- Event:
vote - Data (JSON 模板):
{"value1": "Pizza: Chicago or New York Style?", "value2": "<>"} - 创建路由。
3. 测试路由与 Webhook
- 控制台 Devices → 选中设备 → Messaging → Simulate from Device。
- Topic 填
vote,Data 填chicago发送。 - 控制台应显示路由成功,打开 Google Sheets 应见新行数据。
- 若失败,核对 Key、Topic、JSON 格式;或至 Hologram 社区求助。
4. 硬件接线与烧录
- 从 Hologram 设备详情页 Configure → Show CSR Credentials 获取 Device Key,替换代码中
HOLO_KEY。 - 参考原理图接线:FONA 模组 TX/RX/RST 接 Arduino D3/D2/D4,两个按键分别接 D6/D9 (上拉/下拉按原理图),指示灯接 D7/D10,网络状态灯接 D12。
- 烧录代码前需在 Arduino IDE 安装 HologramSIMCOM 库。
设备端代码 (关键部分)
#include <HologramSIMCOM.h>
#define RX_PIN 2 // FONA TX → MCU RX
#define TX_PIN 3 // FONA RX → MCU TX
#define RESET_PIN 4 // FONA RST
#define HOLO_KEY "########" // 替换为你的 Device Key
#define CONNECT_LED 12
#define VOTE1_BTN_PIN 6
#define VOTE1_LED_PIN 7
#define VOTE2_BTN_PIN 9
#define VOTE2_LED_PIN 10
HologramSIMCOM Hologram(TX_PIN, RX_PIN, RESET_PIN, HOLO_KEY);
String VOTE1_VALUE = "chicago";
String VOTE2_VALUE = "newYork";
String HOLOGRAM_TOPIC = "vote";
void setup() {
Serial.begin(19200);
while(!Serial);
pinMode(CONNECT_LED, OUTPUT);
pinMode(VOTE1_BTN_PIN, INPUT);
pinMode(VOTE1_LED_PIN, OUTPUT);
pinMode(VOTE2_BTN_PIN, INPUT);
pinMode(VOTE2_LED_PIN, OUTPUT);
bool cellConnected = Hologram.begin(19200, 8888);
if (cellConnected) digitalWrite(CONNECT_LED, HIGH);
}
void loop() {
Hologram.debug(); // 处理模组后台任务
if (digitalRead(VOTE1_BTN_PIN) == HIGH) sendVote(VOTE1_VALUE, VOTE1_LED_PIN);
if (digitalRead(VOTE2_BTN_PIN) == HIGH) sendVote(VOTE2_VALUE, VOTE2_LED_PIN);
}
void sendVote(String value, int ledPin) {
digitalWrite(ledPin, HIGH);
if (Hologram.send(value, HOLOGRAM_TOPIC)) {
// 成功闪烁 3 次
for (int i=0; i<3; i++) {
digitalWrite(ledPin, LOW); delay(100);
digitalWrite(ledPin, HIGH); delay(100);
}
digitalWrite(ledPin, LOW);
} else {
digitalWrite(ledPin, LOW); // 发送失败熄灭
}
}
原理图与外壳
原文提供原理图 PNG 及激光切割外壳 CAD 文件 (drawing_lasser_cutting_lvvsN9X9Xg.dwg),可直接用于制作。
未来展望
作者设想在全球部署数百个投票箱,每天发布一个新问题,数据公开共享,构建大规模匿名民意采集网络。项目完全开源,欢迎二次开发。
关键提示
- FONA 模组波特率默认 19200,代码中
Hologram.begin(19200, 8888)需匹配。 - 按键采用轮询方式,长按可能重复发送;实际部署建议加去抖动或边沿触发逻辑。
- Hologram 免费额度足够低频投票;高并发场景需升级套餐。
- 设备户外部署需防水、防晒、固定牢靠,电池续航按投票频率预估 (如 2000mAh 18650 可待机数周)。
- IFTTT Google Sheets 动作字段建议包含:时间戳、投票值、设备 ID,便于后续分析。
制造工艺
- 果汁盒革命:历史、设计与环境影响
- 黑匣子飞行记录仪:从早期原型到未来一体化设计
- DIY仿Wall-E树莓派CD盒机器人
- DIY 低成本 UVC 紫外线消毒盒:医疗与个人物品快速杀菌方案
- UnifiedWater v1 — 基于 Arduino MKR GSM 1400 的完整水质监测套件
- Really Smart Box:基于 Sigfox 的物联网智能储物箱平台
- 紧凑型气象站:Arduino Nano + ESP8266 双核方案 (BMP280 + OLED/Nokia 双屏)
- DIY 打地鼠街机游戏(按键版)——Arduino Mega 2560 实现
- 现代复古点唱机:Raspberry Pi + Arduino NeoPixel 声控灯光音乐播放器
- 箱式开采法:定义、流程与应用场景
- C# 类完全指南:定义、封装、构造函数、析构函数与静态成员
- C# 运算符重载完全指南:自定义类型的运算符行为定义