Objetivo y caso de uso
Qué construirás: Un sistema de pesaje para colmenas utilizando Arduino Uno R3, XBee S2C y HX711 para medir el peso y monitorear el ambiente.
Para qué sirve
- Monitoreo del peso de colmenas en tiempo real para optimizar la producción de miel.
- Registro de datos ambientales (temperatura y humedad) usando el sensor SHT31.
- Transmisión de datos a través de Zigbee para una comunicación eficiente y de bajo consumo.
- Integración con sistemas de alerta para notificar cambios significativos en el peso.
Resultado esperado
- Precisión en la medición del peso de ±0.1 kg utilizando HX711.
- Latencia de transmisión de datos menor a 200 ms a través de Zigbee.
- Capacidad de enviar datos de temperatura y humedad cada 5 minutos.
- Recepción de datos en un PC con Python y pyserial, validando al menos 95% de los paquetes.
Público objetivo: Ingenieros y entusiastas de la electrónica; Nivel: Avanzado
Arquitectura/flujo: Sensor de peso (HX711) y ambiental (SHT31) conectados a Arduino Uno R3, datos enviados a través de XBee Zigbee S2C a un coordinador en PC.
Nivel: Avanzado
Prerrequisitos
Sistema operativo y herramientas (probado)
- Linux:
- Ubuntu 22.04.4 LTS (64-bit)
- Python 3.11.6 (para validación PC)
- Digi XCTU 6.5.10 (configuración XBee)
- Windows:
- Windows 11 Pro 23H2
- Python 3.11.6
- Digi XCTU 6.5.10
Toolchain exacta para Arduino Uno (AVR)
- Arduino CLI 0.35.3
- Core AVR:
- FQBN: arduino:avr:uno
- Paquete: arduino:avr@1.8.6
- Librerías Arduino (Library Manager vía arduino-cli lib install):
- HX711@0.7.5 (bogde/HX711)
- Adafruit SHT31 Library@2.2.1
- Adafruit BusIO@1.14.5
- Monitor serie de Arduino CLI:
- arduino-cli monitor (integrado desde 0.34+)
Herramientas adicionales para Zigbee
- Digi XCTU 6.5.10 para configurar los módulos XBee Zigbee S2C (EM357).
- Un adaptador USB para XBee (por ejemplo, “XBee USB Explorer”) para el coordinador en el PC.
- Python en el PC con pyserial para validar la recepción:
- pyserial 3.5
Materiales
- Nodo sensor (en colmena):
- 1x Arduino Uno R3
- 1x XBee Zigbee S2C (EM357)
- 1x Shield XBee para Arduino con regulador 3.3V y nivelación de voltaje (cualquier modelo estándar compatible con UNO R3)
- 1x HX711 (amplificador para célula de carga)
- 1x Célula de carga (ej. 50 kg o 100 kg, tipo viga)
- 1x SHT31 (breakout con interfaz I2C, por ejemplo Adafruit SHT31-D)
- Cableado Dupont, tornillería, base rígida para célula de carga, conectores
-
Fuente de alimentación para el nodo (inicialmente USB, en despliegue real: batería con step-up/step-down y/o panel solar)
-
Coordinador (en PC):
- 1x XBee Zigbee S2C (EM357) adicional (coordinador)
- 1x Adaptador USB para XBee (XBee Explorer USB o similar)
-
PC con Ubuntu 22.04.4 LTS o Windows 11 23H2, con XCTU 6.5.10
-
Nota de coherencia:
- El modelo principal a emplear en el nodo es exactamente: Arduino Uno R3 + XBee Zigbee S2C (EM357) + HX711 + SHT31.
- El coordinador XBee Zigbee S2C (EM357) adicional se usa para la validación y recepción de datos Zigbee en el PC, no altera el modelo del nodo sensor.
Preparación y conexión
Consideraciones de alimentación y niveles lógicos
- El XBee Zigbee S2C funciona a 3.3V y puede demandar picos de corriente >200 mA durante transmisión. Por eso, use un Shield XBee con regulador 3.3V y level shifting. Evite alimentar el XBee directamente desde el pin 3.3V del UNO (capacidad limitada).
- El HX711 funciona a 5V típicamente (verifique su módulo).
- El SHT31 (breakout) suele ser 3–5V tolerant (si es Adafruit, integra level shifting); confirme el modelo y su rango de alimentación. Aquí alimentaremos a 5V para simplificar.
Mapeo de pines y conexiones
La siguiente tabla detalla las conexiones para el nodo:
| Componente | Señal/Pin | Arduino Uno R3 | Notas |
|---|---|---|---|
| XBee S2C | DIN (entrada XBee) | D3 (TX SoftwareSerial) | A través del Shield XBee (nivelado) |
| XBee S2C | DOUT (salida XBee) | D2 (RX SoftwareSerial) | A través del Shield XBee (nivelado) |
| XBee S2C | VCC | 3.3V (del Shield) | Regulador del Shield |
| XBee S2C | GND | GND | Masa común |
| HX711 | VCC | 5V | Verifique su módulo |
| HX711 | GND | GND | Masa común |
| HX711 | DT (DOUT) | D4 | Entrada de datos |
| HX711 | SCK | D5 | Reloj |
| Célula carga | E+ / E- | HX711 E+ / E- | Excitación |
| Célula carga | A+ / A- | HX711 A+ / A- | Señal |
| SHT31 | VIN | 5V | Si su breakout lo permite |
| SHT31 | GND | GND | Masa común |
| SHT31 | SDA | A4 | I2C |
| SHT31 | SCL | A5 | I2C |
- Consola de depuración: USB del Arduino (Serial a 115200 baudios).
- Canal Zigbee: XBee en modo transparente (AT) a 9600 baudios, conectado al UNO vía SoftwareSerial en D2 (RX) y D3 (TX).
Preparación de XBee (coordinador y nodo)
- Use XCTU 6.5.10 para configurar ambos XBee S2C (EM357):
- Coordinador (en el PC):
- Función: Zigbee Coordinator AT (XB24C, “Zigbee TH Reg”, AT)
- BD (Baud Rate): 9600
- PAN ID (ID): por ejemplo 0x7A7A
- Canal (CH): opcional o automático
- AP (API Mode): 0 (modo transparente)
- CE (Coordinator Enable): 1
- NI (Node Identifier): COORD
- Escribir cambios (Write).
- Anote SH y SL (dirección 64-bit).
- Nodo (en el UNO):
- Función: Zigbee Router AT (XB24C, “Zigbee TH Reg”, AT)
- BD (Baud Rate): 9600
- PAN ID (ID): 0x7A7A (igual al coordinador)
- AP: 0 (transparente)
- CE: 0
- DH/DL: ponga la dirección 64-bit del coordinador (DH=SH del coordinador, DL=SL del coordinador)
- JV: 1 (permitir rejoin si el coordinador reinicia)
- NI: BEE_NODE
- AI: compruebe 0x00 tras asociar (Association Indication OK)
-
Escribir cambios (Write).
-
Tras configurar el nodo, monte el XBee S2C en el Shield, y el Shield sobre el UNO R3.
Código completo (Arduino C++) con explicación
El siguiente sketch lee peso (HX711) y ambiente (SHT31), filtra, formatea una línea CSV y la envía vía Zigbee (XBee en modo transparente) y en paralelo por el puerto USB para depuración. Incluye comandos por serial para tare, factor de calibración y periodo, y persistencia en EEPROM.
// zigbee_beehive_weight_sensing.ino
// Hardware: Arduino Uno R3 + XBee Zigbee S2C (EM357) + HX711 + SHT31
// Toolchain: Arduino CLI 0.35.3, arduino:avr@1.8.6
// Librerías: HX711@0.7.5, Adafruit SHT31 Library@2.2.1, Adafruit BusIO@1.14.5
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_SHT31.h>
#include <HX711.h>
#include <SoftwareSerial.h>
#include <EEPROM.h>
// Pines
static const uint8_t PIN_HX711_DOUT = 4;
static const uint8_t PIN_HX711_SCK = 5;
static const uint8_t PIN_XBEE_RX = 2; // RX del UNO (desde DOUT del XBee)
static const uint8_t PIN_XBEE_TX = 3; // TX del UNO (hacia DIN del XBee)
// Objetos
HX711 scale;
Adafruit_SHT31 sht31 = Adafruit_SHT31();
SoftwareSerial xbee(PIN_XBEE_RX, PIN_XBEE_TX);
// Configuración de medidas
volatile unsigned long samplePeriodMs = 5000; // periodo de muestreo
volatile long calibrationFactor = 2280; // factor de ejemplo; calibrar para su célula/puente
volatile int hx711Averages = 10; // promediado interno HX711
// EEPROM layout
// addr 0..3: signature 'BZWS' (Beehive Zigbee Weight Sensing)
// addr 4..7: calibrationFactor (int32)
// addr 8..11: samplePeriodMs (uint32)
const int EEPROM_ADDR_SIGNATURE = 0;
const int EEPROM_ADDR_CAL = 4;
const int EEPROM_ADDR_PERIOD = 8;
void eepromWriteLong(int addr, long value) {
EEPROM.put(addr, value);
}
long eepromReadLong(int addr) {
long v = 0;
EEPROM.get(addr, v);
return v;
}
void eepromWriteULong(int addr, unsigned long value) {
EEPROM.put(addr, value);
}
unsigned long eepromReadULong(int addr) {
unsigned long v = 0;
EEPROM.get(addr, v);
return v;
}
bool eepromHasSignature() {
char sig[4];
for (int i = 0; i < 4; ++i) sig[i] = EEPROM.read(EEPROM_ADDR_SIGNATURE + i);
return (sig[0]=='B' && sig[1]=='Z' && sig[2]=='W' && sig[3]=='S');
}
void eepromWriteSignature() {
EEPROM.write(EEPROM_ADDR_SIGNATURE + 0, 'B');
EEPROM.write(EEPROM_ADDR_SIGNATURE + 1, 'Z');
EEPROM.write(EEPROM_ADDR_SIGNATURE + 2, 'W');
EEPROM.write(EEPROM_ADDR_SIGNATURE + 3, 'S');
}
void saveConfigToEEPROM() {
eepromWriteSignature();
eepromWriteLong(EEPROM_ADDR_CAL, calibrationFactor);
eepromWriteULong(EEPROM_ADDR_PERIOD, samplePeriodMs);
}
void loadConfigFromEEPROM() {
if (eepromHasSignature()) {
calibrationFactor = eepromReadLong(EEPROM_ADDR_CAL);
samplePeriodMs = eepromReadULong(EEPROM_ADDR_PERIOD);
}
}
void printHelp() {
Serial.println(F("Comandos (USB@115200):"));
Serial.println(F(" h : ayuda"));
Serial.println(F(" t : tare (poner a cero)"));
Serial.println(F(" c <factor> : set calibracion (p.ej. c 2280)"));
Serial.println(F(" p <ms> : set periodo muestreo en ms (p.ej. p 5000)"));
Serial.println(F(" a <n> : set promediado HX711 (1..20)"));
Serial.println(F(" s : muestreo inmediato"));
Serial.println(F(" w : guardar en EEPROM"));
Serial.println(F(" r : recargar de EEPROM"));
Serial.println(F("Formato TX: CSV: ts_ms,weight_kg,tempC,humRH,status"));
}
bool setupSHT31() {
if (!sht31.begin(0x44)) { // 0x44 por defecto; 0x45 si A0 soldado
Serial.println(F("ERROR: SHT31 no encontrado en 0x44"));
return false;
}
// Opcional: sht31.heater(true/false)
return true;
}
void setupHX711() {
scale.begin(PIN_HX711_DOUT, PIN_HX711_SCK);
scale.set_scale(); // Inicialmente sin factor
delay(100);
scale.tare(20); // Establecer tara inicial con N lecturas
scale.set_scale((float)calibrationFactor);
}
void sendLine(const char* line) {
xbee.println(line); // Hacia Zigbee (modo transparente)
Serial.println(line); // Depuracion en USB
}
void performSampleAndSend() {
// Lectura HX711
float weight = scale.get_units(hx711Averages); // unidades en función del factor
// Lecturas SHT31
float t = sht31.readTemperature();
float h = sht31.readHumidity();
// Estado
const char* status = "OK";
if (isnan(t) || isnan(h)) status = "SHT31_ERR";
// Línea CSV
char line[128];
unsigned long ts = millis();
// CSV: ts_ms,weight_kg,tempC,humRH,status
snprintf(line, sizeof(line), "%lu,%.3f,%.2f,%.2f,%s", ts, weight, t, h, status);
sendLine(line);
}
void handleSerialCommands() {
if (!Serial.available()) return;
String cmd = Serial.readStringUntil('\n');
cmd.trim();
if (cmd.length() == 0) return;
if (cmd == "h") {
printHelp();
} else if (cmd == "t") {
Serial.println(F("Tare..."));
scale.tare(20);
Serial.println(F("OK"));
} else if (cmd.startsWith("c ")) {
long f = cmd.substring(2).toInt();
calibrationFactor = f;
scale.set_scale((float)calibrationFactor);
Serial.print(F("Calibracion=")); Serial.println(calibrationFactor);
} else if (cmd.startsWith("p ")) {
unsigned long p = (unsigned long)cmd.substring(2).toInt();
if (p >= 500 && p <= 60000UL) {
samplePeriodMs = p;
Serial.print(F("Periodo(ms)=")); Serial.println(samplePeriodMs);
} else {
Serial.println(F("ERROR: periodo fuera de rango (500..60000)"));
}
} else if (cmd.startsWith("a ")) {
int n = cmd.substring(2).toInt();
if (n >= 1 && n <= 20) {
hx711Averages = n;
Serial.print(F("Promediado HX711=")); Serial.println(hx711Averages);
} else {
Serial.println(F("ERROR: promediado (1..20)"));
}
} else if (cmd == "s") {
performSampleAndSend();
} else if (cmd == "w") {
saveConfigToEEPROM();
Serial.println(F("EEPROM guardada"));
} else if (cmd == "r") {
loadConfigFromEEPROM();
scale.set_scale((float)calibrationFactor);
Serial.print(F("EEPROM: cal=")); Serial.print(calibrationFactor);
Serial.print(F(" period=")); Serial.println(samplePeriodMs);
} else {
Serial.println(F("Comando desconocido. 'h' para ayuda."));
}
}
void setup() {
Serial.begin(115200);
xbee.begin(9600);
Serial.println(F("zigbee-beehive-weight-sensing (UNO R3 + XBee S2C + HX711 + SHT31)"));
loadConfigFromEEPROM();
if (!setupSHT31()) {
Serial.println(F("Continuando sin SHT31 (status=SHT31_ERR)"));
}
setupHX711();
Serial.print(F("Cal=")); Serial.print(calibrationFactor);
Serial.print(F(" Period(ms)=")); Serial.print(samplePeriodMs);
Serial.print(F(" Avg=")); Serial.println(hx711Averages);
printHelp();
}
void loop() {
static unsigned long last = 0;
unsigned long now = millis();
if ((now - last) >= samplePeriodMs) {
last = now;
performSampleAndSend();
}
handleSerialCommands();
}
Explicación breve de partes clave
- SoftwareSerial en D2/D3: evita ocupar Serial hardware (USB) del UNO para debug, y nos permite tener el XBee S2C independiente a 9600 baudios en modo transparente.
- HX711:
- scale.set_scale(calibrationFactor): transforma la lectura del ADC en “unidades” (kg si calibramos adecuadamente).
- hx711Averages controla cuántas muestras internas se promedian en la función get_units().
- SHT31:
- Se inicializa en la dirección I2C 0x44 (común). Si su breakout usa 0x45, cambie en el código.
- Persistencia en EEPROM:
- Guarda factor de calibración y periodo (firma “BZWS”) para conservarlos entre reinicios.
- Interfaz de comandos:
- Comandos simples por USB para tare, calibración, periodo, etc., muy útil en campo.
Compilación, “flash” y ejecución
Asegúrese de conectar el Arduino Uno R3 por USB. Identifique el puerto serie (ejemplos: /dev/ttyACM0 en Linux, COM5 en Windows).
Preparación de proyecto
- Estructura de carpetas (Linux/macOS; en Windows use rutas equivalentes):
mkdir -p ~/projects/zigbee_beehive_weight_sensing
nano ~/projects/zigbee_beehive_weight_sensing/zigbee_beehive_weight_sensing.ino
# Pegue el sketch completo anterior y guarde
Instalación de toolchain y librerías (Arduino CLI)
# 1) Instalar Arduino CLI (si no lo tiene) y asegúrese de usar la 0.35.3
arduino-cli version
# Debería mostrar: arduino-cli Version: 0.35.3
# 2) Actualizar índices de cores y librerías
arduino-cli core update-index
# 3) Instalar el core AVR exacto
arduino-cli core install arduino:avr@1.8.6
# 4) Instalar librerías exactas
arduino-cli lib install "HX711@0.7.5" "Adafruit SHT31 Library@2.2.1" "Adafruit BusIO@1.14.5"
Compilar y subir al UNO R3
- Linux:
# Lista de placas para encontrar el puerto (opc.)
arduino-cli board list
# Compilar
arduino-cli compile --fqbn arduino:avr:uno ~/projects/zigbee_beehive_weight_sensing
# Subir (ajuste el puerto si es distinto)
arduino-cli upload -p /dev/ttyACM0 --fqbn arduino:avr:uno ~/projects/zigbee_beehive_weight_sensing
- Windows (PowerShell, ejemplo puerto COM5):
arduino-cli board list
arduino-cli compile --fqbn arduino:avr:uno $env:USERPROFILE\projects\zigbee_beehive_weight_sensing
arduino-cli upload -p COM5 --fqbn arduino:avr:uno $env:USERPROFILE\projects\zigbee_beehive_weight_sensing
Visualizar depuración por USB
# Linux
arduino-cli monitor -p /dev/ttyACM0 -c baudrate=115200
Finalice con Ctrl+C.
Validación paso a paso
Objetivo: confirmar que el nodo “zigbee-beehive-weight-sensing” transmite peso y ambiente por Zigbee y que el coordinador en PC recibe líneas CSV.
1) Verifique alimentación y enlaces:
– El Shield XBee está firmemente insertado.
– GND común entre todos.
– HX711 cableado correcto: E+/E- al excitador, A+/A- a señal de la célula (polaridad correcta).
– SHT31 conectado a A4/A5.
2) Verifique XBee en XCTU:
– Conecte el XBee coordinador al PC con el adaptador USB.
– En XCTU 6.5.10, agregue el puerto del XBee coordinador, lea parámetros.
– Confirme:
– Función: Zigbee Coordinator AT
– PAN ID = 0x7A7A (o el que definió)
– BD=9600, AP=0
– AI=0x00 (si ya hay nodos; si no, aparecerá 0x21 hasta que el nodo se asocie)
– Inserte/encienda el nodo UNO con su XBee.
– En XCTU, busque dispositivos en red (Network Working Mode) y verifique que aparezca “BEE_NODE”.
3) Monitor USB del UNO:
– Ejecute arduino-cli monitor a 115200.
– Debe ver un banner y ayuda de comandos. Ejemplo:
– “zigbee-beehive-weight-sensing (UNO R3 + XBee S2C + HX711 + SHT31)”
– “Cal=2280 Period(ms)=5000 Avg=10”
– “Comandos (USB@115200): …”
– En ausencia de SHT31, verá “SHT31_ERR” en el campo status.
4) Calibración (imprescindible para peso real):
– Con la colmena/viga descargada, ejecute: “t” y Enter (tare).
– Coloque un peso patrón conocido (p.ej., 5.000 kg) sobre la plataforma.
– Observe la salida CSV en USB: “ts_ms,weight_kg,tempC,humRH,status”. Ajuste “c
– Comando ejemplo: “c 2100” o “c 2450” y Enter, reintente hasta converger.
– Cuando esté satisfecho, ejecute “w” para guardar en EEPROM.
5) Verificación de transmisión Zigbee en el PC:
– Reciba desde el XBee coordinador. Dos opciones:
a) Uso de consola serial de XCTU:
– Abra una consola serial a 9600 baudios sobre el puerto del coordinador.
– Deben llegar líneas CSV periódicas: “12345,12.345,27.15,62.10,OK”
b) Uso de Python (pyserial) para registrar datos:
# Linux/Windows, instale pyserial 3.5
python -m pip install --user pyserial==3.5
Y el script:
# logger_zigbee_beehive.py
# Python 3.11.6 + pyserial 3.5
import sys, time, serial
if len(sys.argv) < 3:
print("Uso: python logger_zigbee_beehive.py <PORT> <BAUD>")
print("Ej: python logger_zigbee_beehive.py COM7 9600 (Windows)")
print(" python logger_zigbee_beehive.py /dev/ttyUSB0 9600 (Linux)")
sys.exit(1)
port = sys.argv[1]
baud = int(sys.argv[2])
with serial.Serial(port, baud, timeout=1) as ser:
print(f"Escuchando {port}@{baud} ... Ctrl+C para salir")
while True:
try:
line = ser.readline().decode('utf-8', errors='ignore').strip()
if line:
ts = int(time.time())
print(f"{ts},{line}")
except KeyboardInterrupt:
break
- Ejecútelo:
- Windows: python logger_zigbee_beehive.py COM7 9600
- Linux: python3 logger_zigbee_beehive.py /dev/ttyUSB0 9600
- Debe ver líneas con timestamp del PC + CSV del nodo.
6) Validación funcional:
– Cambie la carga sobre la célula (añada/retire masa). Verifique que weight_kg cambia coherentemente.
– Soplar ligeramente o tocar el sensor SHT31 debe alterar humedad/temperatura (leve).
– status debe ser “OK”; si SHT31 falla, verá “SHT31_ERR”.
7) Estabilidad:
– Observación de varios minutos: el peso debe fluctuar poco (ruido bajo). Si hay ruido visible:
– Aumente hx711Averages: “a 15”.
– Aumente samplePeriodMs: “p 10000”.
Troubleshooting (errores típicos y solución)
1) XBee no se asocia (AI != 0x00 en XCTU):
– Causa: PAN ID distinto, canal distinto, potencia insuficiente, antena mal, distancia excesiva.
– Solución: Asegure ID idéntico, AP=0 en ambos, BD=9600, CE=1 en el coordinador, JV=1 en el router, reinicie el nodo. Acerque los módulos. Compruebe alimentación estable en el Shield.
2) No llega nada al coordinador, pero el UNO imprime por USB:
– Causa: Baud rate en XBee distinto (p.ej., 115200 vs 9600), o SoftwareSerial en pines diferentes a los del Shield.
– Solución: Fije BD=9600 en XCTU para ambos módulos. Verifique que el Shield enruta DIN/DOUT a D2/D3 (jumpers). Si no, ajuste el sketch a los pines reales del Shield.
3) Reseteos aleatorios del UNO al transmitir:
– Causa: Caídas de tensión por picos de consumo del XBee.
– Solución: Use Shield XBee con regulador de calidad, fuente USB/5V estable. Añada condensador de 100 µF–470 µF cerca del XBee. Evite alimentar XBee desde el pin 3.3V del UNO sin Shield.
4) Lecturas de peso negativas o saturadas:
– Causa: Cables A+/A- invertidos o mala conexión en HX711; factor de calibración no ajustado.
– Solución: Revise polaridad A+/A-, apriete terminales. Tare (“t”) con la plataforma descargada. Ajuste factor con “c
5) SHT31 no responde (status=SHT31_ERR):
– Causa: Dirección I2C distinta (0x45), cableado invertido SDA/SCL, ausencia de alimentación.
– Solución: Compruebe A4=SDA, A5=SCL, GND común, VIN=5V (o 3.3V según breakout). Si su placa usa 0x45, modifique sht31.begin(0x45).
6) La consola USB muestra caracteres, pero el coordinador (XBee) recibe basura:
– Causa: Confusión entre USB (115200) y XBee (9600).
– Solución: Recuerde que USB va a 115200; Zigbee (XBee) va a 9600. Ajuste baud del receptor al del XBee.
7) arduino-cli upload falla con “permission denied” o no encuentra el puerto:
– Causa: En Linux faltan permisos de dialout; puerto incorrecto.
– Solución: Agregue su usuario a “dialout”: sudo usermod -a -G dialout $USER; reabra sesión. Use arduino-cli board list para confirmar /dev/ttyACM0.
8) Ruido excesivo en medida de peso:
– Causa: Montaje mecánico con vibraciones o célula sin pre-carga; interferencias.
– Solución: Aisle vibraciones, fije bien la célula, use promediado HX711 (a 10–15), incremente periodo, añada filtro de media móvil en firmware.
Mejoras y variantes
- Sincronización temporal real:
- Añada un RTC (DS3231) por I2C para timestamp con fecha/hora real.
- Baja potencia:
- Migrar a alimentación por batería + panel solar. Use modos de sleep del ATmega328P y despierte por watchdog para muestrear cada 1–5 min. El XBee puede configurarse con ciclos de sueño (SP/ST) y rutas “pin sleep” si el diseño lo permite.
- Fiabilidad de enlace:
- Cambie a API Mode (AP=1/2) con tramas ZB Transmit; añade ACK, reintentos y direccionamiento explícito. En ese caso, valore usar una librería XBee específica para Arduino o construir frames manualmente.
- Gestión de eventos:
- Transmitir solo si variación de peso supera un umbral (delta) o cada N minutos, para ahorrar energía/ancho de banda.
- Integridad de datos:
- Añada CRC al final de la línea CSV (p.ej., CRC-8/16) y validación en el receptor.
- Multisensor:
- Añada sensor de peso adicional (doble viga) para detectar desplazamientos. Integre sensores de entrada/salida (IR) para conteo de abejas correlacionando con variaciones de peso.
- Envoltorio y condiciones ambientales:
- Diseñar caja estanca con desecante y respiradero para el SHT31 (membrana PTFE), y pasacables adecuados para la célula de carga.
- Backend:
- En el PC, reenviar datos a un broker MQTT o base de datos (InfluxDB/TimescaleDB), y dashboard (Grafana).
Checklist de verificación (marque cada ítem)
- [ ] He instalado Arduino CLI 0.35.3 y el core arduino:avr@1.8.6.
- [ ] He instalado las librerías exactas: HX711@0.7.5, Adafruit SHT31 Library@2.2.1, Adafruit BusIO@1.14.5.
- [ ] He creado el sketch en ~/projects/zigbee_beehive_weight_sensing/ con el código proporcionado.
- [ ] He cableado HX711 (DOUT→D4, SCK→D5), SHT31 (SDA→A4, SCL→A5), XBee (DOUT→D2, DIN→D3) mediante Shield.
- [ ] He configurado los XBee en XCTU 6.5.10: Coordinador AT (CE=1), Router AT (DH/DL=addr del Coordinador), ambos BD=9600, PAN ID igual.
- [ ] He compilado y subido el sketch al UNO con FQBN arduino:avr:uno.
- [ ] En el monitor USB (115200) veo ayuda y líneas CSV periódicas.
- [ ] He realizado tare (“t”) y calibración (“c
”) con un peso patrón, y guardado en EEPROM (“w”). - [ ] En el PC, con XCTU o Python (pyserial 3.5), recibo las líneas CSV desde el XBee coordinador.
- [ ] Las lecturas de peso y SHT31 varían como se espera cuando cambio la carga o altero el entorno.
Apéndice: Notas de diseño para zigbee-beehive-weight-sensing
- Diseño mecánico:
- La célula de carga debe trabajar en su eje designado, con pre-carga mínima y rigidez lateral. Cualquier deformación lateral introduce offset y ruido.
- Escala y calibración:
- Use al menos dos puntos de calibración (0 kg y peso patrón cercano al rango operativo típico) para estimar linealidad.
- Inmunidad:
- Mantenga cables de señal de la célula retorcidos y cortos; separe del módulo XBee para minimizar acoplo RF.
- Seguridad energética:
- Si usa batería, añada protección contra sobredescarga y medición de voltaje (divisor resistivo a una entrada analógica, con muestreo ocasional).
Con este caso práctico, ha construido un nodo de sensado de peso para colmena con ENV por Zigbee, empleando exactamente Arduino Uno R3 + XBee Zigbee S2C (EM357) + HX711 + SHT31, compilado con Arduino CLI y verificado extremo a extremo con un coordinador XBee en el PC.
Encuentra este producto y/o libros sobre este tema en Amazon
Como afiliado de Amazon, gano con las compras que cumplan los requisitos. Si compras a través de este enlace, ayudas a mantener este proyecto.




