appels.ino
El módem GSM como mando a distancia: una llamada desde un número autorizado alterna el estado de alarma del MKR GSM 1400, que contesta y cuelga de inmediato. El LED 6 parpadea mientras la alarma está activa, sin gastar crédito de SMS.
Hardware
Una Arduino MKR GSM 1400 (microcontrolador SAMD21, módem celular 2G/GPRS, antena externa, alimentada por batería LiPo en el conector J6 o por USB). SIM con número activo, antena 2G, un LED con resistencia de 330 Ω en el pin 6.
Cableado
LED (+) con resistencia de 330 Ω al pin 6, cátodo a GND; nada más que cablear.
Funcionamiento
call.onRinging() registra una función callback que se dispara con la llamada. returnCaller() lee el número; si coincide con la lista, pickUp/hangUp cuelgan limpiamente y un booleano de estado alterna.
Ejecución
En el IDE de Arduino, instala el paquete Arduino SAMD Boards, selecciona la placa MKR GSM 1400 y carga. Los ejemplos de red suponen una SIM de datos activa insertada, la antena enroscada y cobertura 2G todavía disponible en tu zona.
Variantes
Gestiona varios números en un array, envía un SMS de confirmación tras alternar, o usa DTMF durante la llamada para elegir entre varias órdenes.
appels.ino
// Appel entrant = declencheur : la LED 6 clignote si numero connu.
#include <MKRGSM.h>
const char PIN_SIM[] = "0000";
const char NUMERO_AUTORISE[] = "+33612345678";
GSM gsm;
GSMCall call;
const int LED = 6;
bool alarme = false;
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT);
if (gsm.begin(PIN_SIM) != GSM_READY) while (true);
call.begin();
call.onRinging(appelEntrant);
Serial.println(F("En attente d'appel..."));
}
void loop() {
unsigned long t = millis();
if (alarme && (t / 500) % 2 == 0) digitalWrite(LED, HIGH);
else digitalWrite(LED, LOW);
}
void appelEntrant() {
String emetteur = call.returnCaller();
Serial.println("Appel de : " + emetteur);
if (emetteur == NUMERO_AUTORISE) {
alarme = !alarme; // bascule l'etat a chaque appel du numero autorise
Serial.println(alarme ? F("ALARME ACTIVEE") : F("ALARME COUPEE"));
call.pickUp();
delay(500);
call.hangUp();
} else {
Serial.println(F("Numero inconnu, ignore"));
call.hangUp();
}
}