Hola,
Estoy trabajando en un proyecto para mandar mensajes de aviso utilizando el MKR1400, hasta ahora lo he hecho funcionar “bien” (el arduino MEGA manda cada 5seg un texto por I2C el MKR lo lee y manda un SMS) solamente que tengo un problema que después de muchas vueltas no se si es problema de código, de conexión o algo que debe ser de esa manera.
El problema es que primero necesito conectar el MKR y luego el MEGA, no puedo alimentar ambos al mismo tiempo, porque si los alimento al mismo tiempo el MKR nunca consigue conectarse a la red celular.
Resumiendo, para que todo funcione bien tengo que hacer los siguiente pasos
1)Conectar la alimentación pero solamente puede estar conectado el MKR (el cable que alimenta el mega desconectado)
2)espero unos 5 segundos (no importa que el MKR aun no se haya conectado a la red, para sabe ello le tengo puesto al código que encienda el led del MKR una vez que se conecto)
3) alimento el MEGA
4) empiezo a recibir mensaje de texto cada 5 segundos
Si alimento ambos al mismo tiempo el MKR se queda algo asi como trabado, ya que no conecta a la Red
anexo diagrama de conexión.
para los códigos.
Para el MKR que es el receptor estoy usando el ejemplo que viene por default para enviar SMS modificado para que lea desde la conexion I2C. Originalmente este código lo que hacia era que desde el monitor serial uno iba metiendo el numero de teléfono y el mensaje que deseabas enviar.
// Include the GSM library
#include <MKRGSM.h>
#include "arduino_secrets.h"
// Please enter your sensitive data in the Secret tab or arduino_secrets.h
// PIN Number
const char PINNUMBER[] = SECRET_PINNUMBER;
#include <Wire.h>
#define Direccion 4
byte nDato = 0;
char Cadena[32];
char Encender[] = "ABC1"; //palabra para encender
char Apagar[] = "ABC2"; //palabra para apagar
bool flag = false;
int estado;
// initialize the library instance
GSM gsmAccess;
GSM_SMS sms;
void setup() {
// initialize serial communications and wait for port to open:
Wire.begin(Direccion ); // Une el bus I2C con la dirección #4
Wire.onReceive(evento); // Registra el evento
Serial.begin(9600);
estado =0;
pinMode(6,OUTPUT);
//while (!Serial) {
// ; // wait for serial port to connect. Needed for native USB port only
//}
Serial.println("SMS Messages Sender");
// connection state
boolean connected = false;
// Start GSM shield
// If your SIM has PIN, pass it as a parameter of begin() in quotes
while (!connected) {
if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
connected = true;
Serial.println("GSM initialized");
digitalWrite(6,HIGH);
} else {
Serial.println("Not connected");
delay(1000);
digitalWrite(6,LOW);
}
}
Serial.println("GSM initialized");
}
void loop() {
if (estado==1){
Serial.print("Enter a mobile number: ");
char remoteNum[20]="xxxxxxxxxx"; // telephone number to send sms
//readSerial(remoteNum);
Serial.println(remoteNum);
// sms text
Serial.print("Now, enter SMS content: ");
//char txtMsg[200];
//readSerial(txtMsg);
Serial.println("SENDING");
Serial.println();
Serial.println("Message:");
Serial.println(Cadena);
// send the message
sms.beginSMS(remoteNum);
sms.print(Cadena);
sms.endSMS();
Serial.println("\nCOMPLETE!\n");
estado =0;
}
}
/*
Read input serial
int readSerial(char result[]) {
int i = 0;
while (1) {
while (Serial.available() > 0) {
char inChar = Serial.read();
if (inChar == '\n') {
result[i] = '\0';
Serial.flush();
return 0;
}
if (inChar != '\r') {
result[i] = inChar;
i++;
}
}
}
}
*/
void evento(int cantidad) { // Esta función se ejecuta cuando se recibe información del maestro}
nDato = 0;
strcpy(Cadena,"");
while(Wire.available()) {
char dato = Wire.read(); // Recibe la palabra del i2c tx
if (dato != '\0') {
Cadena[nDato] = dato;
//Serial.print(dato);
//Serial.print(" ");
nDato++;
//Serial.print(nDato);
//Serial.print(" ");
}
else
break;
}
Cadena[nDato] = '\0' ;
//Serial.println(Cadena);
flag = true;
estado = 1;
}
Para el emisor estoy usando el código que surbyte coloco en el siguiente post (de antemano muchas gracias a surbyte por ese código, batalle mucho para conseguir enviar text por I2C) https://forum.arduino.cc/index.php?topic=468421.0.
#include <Wire.h>
#define Direccion 4
void setup() {
Wire.begin(); // Se une con el bus I2C
delay(200);
Serial.begin(9600);
Serial.println("Emisor arrancado.");
}
void loop() {
Serial.println("Proceder a enviar mensaje");
Wire.beginTransmission(Direccion ); //Dirección del Dispositivo esclavo
Wire.write("Sensor 1 Activado"); // Envía 4 bytes
Wire.endTransmission(); // Detiene la transmisión
delay(5000);
}
Entonces no se si esto es un comportamiento normal, o si tengo algo mal en el código, o si me falta alguna linea de código o algo errado en la conexión. Les agradecería mucho alguna orientation con el tema, ya que quiero implementarlo al sistema que tengo para monitoreo y control que tengo en casa pero el hecho de tener que estar conectando primero el MKR le da al traste.
Muchas gracias