[SOLUCIONADO] Registrar o modificar numero en eeprom (SIM800L)

Hola buenas tardes comunidad, hace rato que no ando por aca ya que por cuestiones personales no tengo mucho tiempo. En esta ocacion se me presento un problema, necesito realizar un sistema de telemetria, el cual algo esta echo, pero el problema esta en la integracion del codigo que agrega usuarios (numeros de telefono) como Administrador, supervisor y operador.

Voy a dar un ejemplo, se le envia un mensaje al sim800l (En este momento tengo este, calculo que despues le coloco otro) con el siguiente contenido: A1,0000,3333333333

Donde los elementos son:
A (Administrador) 1 (numero de administrador, donde calculo que maximos habra 3)
Puede variar segun que tipo de usuario se va a grabar
A = Admistrador
S = supervisor
O = Operador
0000 (el pass que habilita a dar de alta al usuario)
3333333333 (el numero de telefono a registrar)

Los elementos que varian son el primer que puede ser A1 (administrador 1) S3 (Supervisor 3) O2 (Operador 2)
La pass ya estaria grabada
Y por su puesto el numero de telefono.

Tengo un codigo que funciona, pero lo que realiza, es reconocer el elemento 1 que en este ejemplo es A1 y graba el numero, pero el numero que graba es el que le envio el mensaje.

El codigo es el siguiente:

#include <Sim800l.h>
#include <SoftwareSerial.h>
#include <EEPROM.h>

Sim800l Sim800l;

String textoSms, numeroSms;

bool error;
char* texto;
char* numero;
char administrador[] = ""; // numero del Administrador
const int Tamano_EEPROM = 14;
char buffer_EEPROM[Tamano_EEPROM];


void setup()
{
  Serial.begin(9600);


  Sim800l.begin();
  Serial.print("Iniciando....");
  texto = "Iniciando sistema...espere..";
  Serial.println(administrador);
  //error=Sim800l.sendSms(admin,text);
  error = Sim800l.delAllSms(); //Apaga SMS
  Serial.println(" Listo! Sistema iniciado.");

  delay (500);
  texto = "\nListo";
  numero = administrador;
  error = Sim800l.sendSms(numero, texto);
  error = Sim800l.delAllSms();
}

void loop()
{

  textoSms = Sim800l.readSms(1);     //Lee el SMS en la posicion 1
  void(* resetFunc) (void) = 0;     // esta es la funcion

  if (textoSms.indexOf("OK") != -1)      //Verifica que el SMS fue recebido y es valido
  {

    if (textoSms.length() > 18)      //Verifica que SMS esta vacio
    {

      numeroSms = Sim800l.getNumberSms(1);      //Devuelve el numero de celular que envio el SMS

      Serial.println(numeroSms);      //Muestra el numero de telefono en el Serial Monitor

      textoSms.toUpperCase();    //Convierte el texto a Mayusculas


      if (numeroSms != administrador and textoSms.indexOf("A1") != -1)
      {
        Serial.println("Actualizando numero de administrador");
        texto = "\nActualizando numero de administrador";
        error = Sim800l.sendSms(numeroSms.c_str(), texto);
        Escribir_EEPROM(numeroSms.c_str());
        Leer_EEPROM(buffer_EEPROM);
        Serial.println("Datos grabados en la EEPROM:");
        Serial.println(buffer_EEPROM);
        strcat( texto, "\nUd. es el nuevo Administrador, con este numero: ");
        strcat( texto,  numeroSms.c_str());
        error = Sim800l.sendSms(numeroSms.c_str(), texto); 
        error = Sim800l.delAllSms(); //Apaga SMS

      }


      else {
        Serial.println("Su numero no esta autorizado.");
        texto = "\nSu numero no esta autorizado para esta accion.";
        //Leer_EEPROM(buffer_EEPROM);
        //Serial.println(buffer_EEPROM);
        //Serial.println(admin);
        error = Sim800l.sendSms(numeroSms.c_str(), texto);
        error = Sim800l.delAllSms(); //Apaga SMS
      }
      //Apaga todos as mensajes da memoria, garantizando que el proximo
      //SMS este siempre en la posicion 1
      Sim800l.delAllSms();
    }
  }
}

//-------------------------------------------------------------------------------
//Función para escribir en la EEPROM
void Escribir_EEPROM(char *UnString) {
  for (int i = 0; i < strlen(UnString); i++) {
    EEPROM.write(i, UnString[i]);
  }
}
//Función para leer de la EEPROM
void Leer_EEPROM(char *bufferIn) {
  for (int i = 0; i < Tamano_EEPROM; i++) {
    bufferIn[i] = EEPROM.read(i);
  }
}
void Borrar_EEPROM() {
  //Limpiamos la EEMPROM byte a byte
  for (int i = 0 ; i < EEPROM.length() ; i++) {
    EEPROM.write(i, 0);
  }
  Serial.println("Memoria EEPROM borrada!");
}

Luego tengo un codigo que realiza la separacion del mensaje por medio de la “,”

El mismo esta basado en la libreria de ioticos

En el ejemplo es A1,0000,3333333333
Entonces me lo separa en

elemento 1 = A1
elemento 2 = 0000
elemento 3 = 3333333333

Y es el siguiente:

#include <Separador.h>

separador S;

void separador() {
  
 String datosRecibidos =  Sim800l.readSms(1);

 String elemento1 = S.separa(datosRecibidos, ',',0);
 String elemento2 = S.separa(datosRecibidos, ',',1);
 String elemento3 = S.separa(datosRecibidos, ',',2);
}

El problema seria integrar los dos y que si en la agenda de administradores posicion 1 ya esta grabado el mismo numero que se envia solamente devuelva un mensaje iiformandolo y el numero es distinto lo grabe y lo informe, la verdad que le intentado de diferentes manera y nada.

Desde ya muchas gracias

No sería mas fácil usar una estructura con los datos a guardar, tal como los has descripto.
EEPROM.put y EEPROM.get serán las funciones que guarden o leen los datos hacia/desde la EEPROM.
si lees como se trabaja con ambos veerás que sugiere una structure entonces imagina esto

#include <EEPROM.h>

struct Datos {
     char categoria[2];
     char password[4[:
     char telefono[10];
}

void setup() {

  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

 //Data to store.
  Datos datosVar = {
    "A1","0000", "3333333333" 
  };

  int eeAddress = 0;   //Location we want the data to be put.

  EEPROM.put(eeAddress, datosVar);
  Serial.print("Se han guardo los datos!");
   // si se guardaran nuevos datos sería a partir de esa posición reservando los lugares usados.
  eeAddress += sizeof(datosVar); //Move address to the next byte after float '

  int eeAddress = 0;   //Location we want the data to be put.
  Datos leoDatos;   // creo una nueva variable con la estructura correspondiente.
  EEPROM.put(eeAddress, leoDatos);
  Serial.print("Categoria :");  Serial.println(leoDatos.categoria);
  Serial.print("Password :");  Serial.println(leoDatos.password);
  Serial.print("Numero    :");  Serial.println(leoDatos.numero);
}

void loop() { /* Empty loop */ }

Hola surbyte, muchas gracias por la respuesta.
Te hago una consulta porque la verdad es que hace tanto tiempo que no programo que ya estoy oxidado.
Intente grabar y leer el codigo que me brindaste y me devuelve las variables vacias.

Si lo realizo como los ejmplos de PUT, anda bien, pero no puedo descubrir donde esta el problema del codigo que me pasaste para que me devuelva los variables de las estructura.

Te dejo como tengo el codigo que me brindaste.

#include <EEPROM.h>

struct Datos {
     char categoria[2];
     char password[4];
     char telefono[10];
};

void setup() {

  Serial.begin(9600);
  while (!Serial) {
    ; 
  }

 //Data to store.
  Datos datosVar = {
    "A1",
    "0000", 
    "3333333333"
  };

  int eeAddress = 0;   

  EEPROM.put(eeAddress, datosVar);
  Serial.println("Se han guardo los datos!");
   
  eeAddress += sizeof(datosVar); 

  Datos leoDatos;  
  EEPROM.put(eeAddress, leoDatos);
  Serial.print("Categoria:");  Serial.println(leoDatos.categoria);
  Serial.print("Password:");  Serial.println(leoDatos.password);
  Serial.print("Numero:");  Serial.println(leoDatos.telefono);
}

void loop(){
  
}

Otra consulta seria que si como habia plantiado el problema que queria diferentes agendas, deberia hacer una estructrura por agenda o una estructura por numero que se va a registrar.

Saludos

Bueno vi que sin querer cometí un error con el segudo comando, debe ser get no put
put es para guardar
get es para leer

Aca te dejo la version corregida y funcionando.

#include <EEPROM.h>

struct Datos {
     char categoria[3];
     char password[5];
     char telefono[11];
};

void setup() {

  Serial.begin(115200);
  while (!Serial) {
    ;
  }

 //Data to store.
//  Datos datosVar = {
//    "A1\0",
//    "0000\0",
//    "3333333333\0"
//  };
  Datos datosVar;
  strcpy(datosVar.categoria, "A1");                  // <== otra forma de cambiar los datos 
  strcpy(datosVar.password, "0000");             // Tal vez sea mas cómoda para tu proyecto
  strcpy(datosVar.telefono,"3333333333");
  int eeAddress = 20;   
  Serial.print("Categoria:");  Serial.println(datosVar.categoria);
  Serial.print("Password:");  Serial.println(datosVar.password);
  Serial.print("Numero:");  Serial.println(datosVar.telefono);
  EEPROM.put(eeAddress, datosVar);
  Serial.println("Se han guardo los datos!\n");
   
  Serial.println("Ahora los leo!");  
  eeAddress = 20;   
  Datos leoDatos; 
  EEPROM.get(eeAddress, leoDatos);                                            // <=== ACA ESTABA EL ERROR
  Serial.print("Categoria:");  Serial.println(leoDatos.categoria);
  Serial.print("Password:");  Serial.println(leoDatos.password);
  Serial.print("Numero:");  Serial.println(leoDatos.telefono);
}

void loop(){
 
}

La salida del programa

Categoria:A1
Password:0000
Numero:3333333333
Se han guardo los datos!

Ahora los leo!
Categoria:A1
Password:0000
Numero:3333333333

Muy importante es como vas a apuntar a la siguiente dirección.
Observa que yo puse 20 como dirección inicial porque se me ocurrió (en realidad pruebo tantos programas que voy variando la dirección inicial). En tu caso usa la dirección inicial que gustes, digamos 0 y luego debes usar esto para la siguiente posición luego de haber guardado los primeros datos.

eeAddress += sizeof(nombreVariable);

Tu variable es del tipo struct, asi que tiene varios bytes involucrados, contemos 3+5+11= 19 bytes. La siguiente posición sera 20+19 = 39.

Hola surbyte, ahora si anda perfecto el codigo que me brindaste…
Pero sigo sin poder integralos, ya realize el codigo que recibe el msj y solo lee el contenido del mismo. Ahora cuando quiero separar la categoria/password/telefono con la biblioteca separador.h lo hace perfecto, no puedo grabarlo con el codigo que me brindaste ya que son string, intente tambien convertir el string a char pero sin exito.

Nose si separar de la manera que lo hago es lo mejor o habria que hacerlo de otra manera asi poder grabarlo en la eeprom.
Te dejo el codigo hasta que devuelve el mensaje haber como integrarlo.

#include <Separador.h>

#include <Sim800l.h>
#include <SoftwareSerial.h> 
Sim800l Sim800l;  
Separador S;

String textSms, numberSms;
uint8_t index1;
uint8_t LED2 = 13; 
bool error;



void setup() {

  pinMode(LED2, OUTPUT);
  digitalWrite(LED2, HIGH);

  Serial.begin(9600); 
  Sim800l.begin();
  Sim800l.reset();
  
  error = Sim800l.delAllSms(); 



}

void loop() {
  textSms = Sim800l.readSms(1); //read the first sms


  if (textSms.length() > 7)  
  {

    numberSms = Sim800l.getNumberSms(1);
    //for debugin
    Serial.println("El comando ha sido envio desde el numero: " + numberSms);
    textSms.toUpperCase();  // set all char to mayus ;)
    int pos1 = textSms.indexOf("#");
    Serial.println(textSms.substring(pos1, pos1 + 20));
    separador();



    Sim800l.delAllSms();



  }
}



void separador() {
  int pos1 = textSms.indexOf("#");
  String datosRecibidos =  textSms.substring(pos1 + 1, pos1 + 20); //Elimino el #

  String elemento1 = S.separa(datosRecibidos, ',', 0);
  String elemento2 = S.separa(datosRecibidos, ',', 1);
  String elemento3 = S.separa(datosRecibidos, ',', 2);

  Serial.println("La categoria es: " + elemento1);
  Serial.println("El password es: " + elemento2);
  Serial.println("El numero de telefono es: " + elemento3);

}

Bueno creo que lo pude hacer andar, te dejo el codigo para ver si lo que hago es lo correcto o es de otra manera.

Desde ya muchas gracias.

#include <Separador.h>

#include <Sim800l.h>
#include <SoftwareSerial.h>
Sim800l Sim800l; 
Separador S;

String textSms, numberSms;
uint8_t index1;
uint8_t LED2 = 13;
bool error;

struct Administrador
   {   String categoria ; 
       String password ;       
       String telefono ;       
           
   } ;

void setup() {

  pinMode(LED2, OUTPUT);
  digitalWrite(LED2, HIGH);

  Serial.begin(9600);
  Sim800l.begin();
  Sim800l.reset();
 
  error = Sim800l.delAllSms();



}

void loop() {
  textSms = Sim800l.readSms(1); //read the first sms


  if (textSms.length() > 7) 
  {

    numberSms = Sim800l.getNumberSms(1);
    //for debugin
    Serial.println("El comando ha sido envio desde el numero: " + numberSms);
    textSms.toUpperCase();  // set all char to mayus ;)
    int pos1 = textSms.indexOf("#");
    Serial.println(textSms.substring(pos1, pos1 + 20));
    separador();



    Sim800l.delAllSms();



  }
}



void separador() {
  int pos1 = textSms.indexOf("#");
  String datosRecibidos =  textSms.substring(pos1 + 1, pos1 + 20); //Elimino el #

  String elemento1 = S.separa(datosRecibidos, ',', 0);
  String elemento2 = S.separa(datosRecibidos, ',', 1);
  String elemento3 = S.separa(datosRecibidos, ',', 2);

  Serial.println("La categoria es: " + elemento1);
  Serial.println("El password es: " + elemento2);
  Serial.println("El numero de telefono es: " + elemento3);

{
     Administrador Datos ;
     Datos.categoria = elemento1 ;
     Datos.password = elemento2 ;
     Datos.telefono = elemento3 ;

     
     Serial.print("Esto se grabara en categoria: "); Serial.print(Datos.categoria) ;
     Serial.println("");
     Serial.print("Esto se grabara en password: ");Serial.print(Datos.password ) ;
     Serial.println("");
     Serial.print("Esto se grabara en telefono: "); Serial.print(Datos.telefono ) ;

   
  }

}

Ahh y tu quieres Strings y no cadenas de string.
A ver como lo resolvemos.

Bueno solo modifiqué la estructura para que en lugar de cadenas ahora maneja Strings

#include <EEPROM.h>

struct Datos {
     String categoria;
     String password;
     String telefono;
};

void setup() {

  Serial.begin(115200);
  while (!Serial) {
    ;
  }

  Datos datosVar;
  datosVar.categoria  = "A1";
  datosVar.password   = "0000";
  datosVar.telefono   = "3333333333";
  
  int eeAddress = 20;   
  Serial.print("Categoria:");  Serial.println(datosVar.categoria);
  Serial.print("Password:");  Serial.println(datosVar.password);
  Serial.print("Numero:");  Serial.println(datosVar.telefono);
  EEPROM.put(eeAddress, datosVar);
  Serial.println("Se han guardo los datos!\n");
   
  Serial.println("Ahora los leo!"); 
  eeAddress = 20;   
  Datos leoDatos;
  EEPROM.get(eeAddress, leoDatos);                                            // <=== ACA ESTABA EL ERROR
  Serial.print("Categoria:");  Serial.println(leoDatos.categoria);
  Serial.print("Password:");  Serial.println(leoDatos.password);
  Serial.print("Numero:");  Serial.println(leoDatos.telefono);
}

void loop(){
 
}

Bueno surbyte, ya esta andando, te lo paso para ver si esta bien redactado, si es asi lo doy como solucionado…

#include <EEPROM.h>


#include <Separador.h>

#include <Sim800l.h>
#include <SoftwareSerial.h>
Sim800l Sim800l;
Separador S;

String textSms, numberSms;
uint8_t index1;
uint8_t LED2 = 13;
bool error;

struct Administrador
{ String categoria ; 
  String alias ;  
  String telefono ;    

} ;

void setup() {

  pinMode(LED2, OUTPUT);
  digitalWrite(LED2, HIGH);

  Serial.begin(9600);
  Sim800l.begin();
  Sim800l.reset();

  error = Sim800l.delAllSms();



}

void loop() {
  textSms = Sim800l.readSms(1); //read the first sms


  if (textSms.length() > 7)
  {

    numberSms = Sim800l.getNumberSms(1);
    //for debugin
    Serial.println("El comando ha sido envio desde el numero: " + numberSms);
    textSms.toUpperCase();  // set all char to mayus ;)
    int pos1 = textSms.indexOf("#");
    Serial.println(textSms.substring(pos1, pos1 + 20));
    separador();



    Sim800l.delAllSms();



  }
}



void separador() {
  int pos1 = textSms.indexOf("#");
  String datosRecibidos =  textSms.substring(pos1 + 1, pos1 + 20); //Elimino el #

  String elemento1 = S.separa(datosRecibidos, ',', 0);
  String elemento2 = S.separa(datosRecibidos, ',', 1);
  String elemento3 = S.separa(datosRecibidos, ',', 2);

  Serial.println("La categoria es: " + elemento1);
  Serial.println("El alias es: " + elemento2);
  Serial.println("El numero de telefono es: " + elemento3);

  Administrador datosVar;
  {
    Administrador Datos ;
    datosVar.categoria = elemento1 ;
    datosVar.alias = elemento2 ;
    datosVar.telefono = elemento3 ;


    Serial.print("Esto se grabara en categoria: "); Serial.print(datosVar.categoria) ;
    Serial.println("");
    Serial.print("Esto se grabara en alias: "); Serial.print(datosVar.alias ) ;
    Serial.println("");
    Serial.print("Esto se grabara en telefono: "); Serial.print(datosVar.telefono ) ;
    Serial.println("");
    int eeAddress = 0;

    EEPROM.put(eeAddress, datosVar);
    Serial.println("Se han guardado los datos!\n");

    delay(5000);
    Serial.println("Ahora los leo!");
    eeAddress = 0;

    Administrador leoDatos;
    EEPROM.get(eeAddress, leoDatos);

    Serial.print("Categoria:");  Serial.println(leoDatos.categoria);
    Serial.print("Alias:");  Serial.println(leoDatos.alias);
    Serial.print("Numero:");  Serial.println(leoDatos.telefono);

  }

}

y por serial me devuelve:

102
El comando ha sido envio desde el numero: +5492236965167
#A1,DAVID,2246965132
La categoria es: A1
El alias es: DAVID
El numero de telefono es: 2246965132
Esto se grabara en categoria: A1
Esto se grabara en alias: DAVID
Esto se grabara en telefono: 2246965132
Se han guardado los datos!
Ahora los leo!
Categoria:A1
Alias:DAVID
Numero:2246965132

La modificacion que realice fue cambiar el password por el alias, ya que el password va a ser un char que se ingresara con otro comando y se va a usar para comparar y habilitar la escritura de la eeprom…

Y atento de tu parte y muchisimas gracias…

Por nada.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.