appels.ino

Arduino MKR GSM 1400 · Archivo : appels.ino · Lenguaje : Arduino · Uso : Recevoir un appel et déclencher une action

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();
  }
}

← Volver a la ficha