trame-crc.ino
En radio, cualquier trama puede corromperse o perderse: este protocolo mínimo añade un id de estación, un número de serie y un CRC-8 a cada paquete LoRa de la MKR WAN 1300. Así el receptor descarta tramas inválidas y detecta huecos de secuencia.
Hardware
Una Arduino MKR WAN 1300 (microcontrolador SAMD21, módem LoRa Semtech SX1272 para enlaces punto a punto, sin pila LoRaWAN integrada, antena de 868/915 MHz). MKR WAN 1300 emisora, cualquier sensor analógico en A1 (o potenciómetro de prueba), receptor LoRa compatible.
Cableado
Sensor a A1/GND/3,3 V; revisa el pinado según el sensor, si no, un potenciómetro clásico.
Funcionamiento
La trama binaria de 6 bytes separa cabecera (id, seq), datos de 16 bits y un CRC-8 calculado sobre los bytes previos. El número de serie cuenta pérdidas incluso cuando el CRC pasa.
Ejecución
Instala Arduino SAMD Boards y la librería MKRWAN, selecciona la placa y carga. Hacen falta DOS placas LoRa (dos MKR WAN 1300, o una 1300 y una 1310) para ver los intercambios; fija el mismo plan de frecuencias en el código.
Variantes
Amplía a CRC-16-CCITT para tramas largas o añade un campo flags para multiplexar varios sensores en la misma trama.
trame-crc.ino
// Trame LoRa robuste : [id][seq][donnees...][crc8] sur MKR WAN 1300.
#include <MKRWAN.h>
LoRaModem modem;
uint8_t seq = 0;
uint8_t crc8(const uint8_t *d, size_t n) {
uint8_t crc = 0x31; // CRC-8/MAXIM-like simple polynomial 0x07
for (size_t i = 0; i < n; i++) {
crc ^= d[i];
for (int b = 0; b < 8; b++)
crc = (crc & 0x80) ? (crc << 1) ^ 0x07 : (crc << 1);
}
return crc;
}
void setup() {
Serial.begin(115200);
if (!modem.begin(EU868)) while (true);
modem.setFrequency(868.7);
}
void loop() {
uint8_t trame[8];
trame[0] = 0x2A; // id station
trame[1] = seq++; // numero de serie
int brut = analogRead(A1);
trame[2] = brut >> 8; // grandeur 16 bits
trame[3] = brut & 0xFF;
trame[4] = (uint8_t)(millis() >> 24); // minute approximative
trame[5] = crc8(trame, 5);
modem.beginPacket();
modem.write(trame, 6);
modem.endPacket(false);
Serial.println(F("trame CRC emise"));
delay(600000);
}