Go Down

Topic: USAR EEPROM ARDUINO (Read 238 times) previous topic - next topic

gatoman

Hola vengo realizando un proyecto es sobre, encender un led usando la memoria eeprom 
Tengo un pequeño código en encender y apagar el led enviándolo por puerto Serial La letra A, para encender el led y la B para apagar, este dato se guarda y el led se queda en la posición que guardo el dato

Ahora lo que quiero hacer es esto : Quiero enviar este dato A -B - A- B  escribirlo en 4 direcciones de eeprom , luego leer esas direcciones 1 por 1 , para que el led Parpadee de acuerdo alas direcciones que vaya leyendo osea enciende apaga enciende apaga
tengo este pequeño código, no conozco mucho de programación me pueden ayudar ?
Code: [Select]

#include <EEPROM.h>

//Variables para leds
const int led10 =  10;

//Variables para la memoria eeprom
byte ee_valor0;


void setup() {
  Serial.begin(9600);
  ee_valor0 = EEPROM.read(0);//Lee el valor de la memoria eeprom en la dirección 0 y es asignado este valor a la variable ee_valor0
 
  //Pines que se va a usar como salidas(led)
  pinMode(led10, OUTPUT); //Inicializa el pin 13 como salida     
 
//Compara el valor contenido en la posición 0 de la memoria eeprom si es 1 el pin 10 tendrá un valor alto
if(ee_valor0==1){
 digitalWrite(led10, HIGH);
  }

//Compara el valor contenido en la posición 0 de la memoria eprom si es 0 el pin 10 tendrá un valor bajo
if(ee_valor0==0){
 digitalWrite(led10, LOW);
  }
}
void loop(){
if(Serial.available()){
int dato=Serial.read();

// Si el DATO es guardado  el pin 10 pasa a tener un valor alto
  if(dato=='A') {     
  digitalWrite(led10, HIGH);
   delay(100);
  EEPROM.write(0, 1); 
  }
// Si el DATO es guardado  el pin 10 pasa a tener un valor bajo   
   if(dato=='B'){   
    digitalWrite(led10, LOW);
    delay(100);
    EEPROM.write(0, 0); 
  }
}}

 
 

RIG

Prueba esto:
Code: [Select]

#include <EEPROM.h>

//Variables para leds
const byte led10 =  10;

//Variables para la memoria eeprom
byte ee_valor[4];
byte direccion=0;

void setup() {
  Serial.begin(9600);
 
  pinMode(led10, OUTPUT); //Inicializa el pin 10 como salida     
 
 for(byte i=0; i<4; i++){
     digitalWrite(led10, EEPROM.read(i));
     delay(500);   
  }


}
void loop(){
if(Serial.available()){
   byte dato=Serial.read();

// Si el DATO es guardado  el pin 10 pasa a tener un valor alto
  if(dato=='A') {     
     digitalWrite(led10, HIGH);
     delay(100);
     EEPROM.write(direccion, 1); 
     }
// Si el DATO es guardado  el pin 10 pasa a tener un valor bajo   
   if(dato=='B'){   
      digitalWrite(led10, LOW);
      delay(100);
      EEPROM.write(direccion, 0);
      }

     direccion++;    //para subir la direccion de la eeprom

  }

}


Ejecuta lo que grabas en la EEPROM solo una vez ya que lo puse en el setup, es un ejemplo para que lo adaptes a tu  necesidades.
Aunque estoy en contra del uso de delay, te puse uno de 500ms para que notes los cambios de estado del led,  en ciertos casos (como éste) cuando se usa un delay en el void setup no afecta mucho, 

gatoman

Hola, gracias por tu respuesta, tu funciona bien , pero estoy tratando de que el led vuelva a leer la eeprom , como un bucle infinitio, estoy tratando usando un goto , pero no lo consigo  :(

gatoman

Ya logre hacerlo , !!! gracias

RIG

Que bien que ya te funcionó
Por eso te dije
Quote
Ejecuta lo que grabas en la EEPROM una sola vez ya que lo puse en el void setup   
Cuando quieres que algo se ejecute infinitamente lo pones en el void loop()


Saludos

gatoman

hola, ahora quiero controlar 2 salidas , pero tengo un problema es que , primero realiza la secuencia en 1 led luego termina y pasa al siguiente

EJEMPLO si  la letra es A la orden es LED 10 (ON) LED 11 (OFF) y si es  B, LED 10 (OFF) LED 11 (ON)
Envio la instrucción : ABAB,  pero lo que hace el código es: LED10  ON OFF ON OFF  LED 11 OFF OFF OFF OFF  luego de terminar enciende el LED11  ON OFF ON OFF LED 10  OFF OFF OFF OFF ,  termina 1 led luego pasa al otro , y lo que trato es que realice esto al mismo tiempo 

Code: [Select]


#include <EEPROM.h>

//Variables para leds
const byte led10 =  10;
const byte led11 =  11;

//Variables para la memoria eeprom
byte ee_valor[4];
byte direccion=0;

void setup() {
  Serial.begin(9600);
 
  pinMode(led10, OUTPUT); //Inicializa el pin 10 como salida     
  pinMode(led11, OUTPUT); //Inicializa el pin 10 como salida     
 
}
void loop(){
   for(byte i=0; i<4; i++){
     
     digitalWrite(led10, EEPROM.read(i));
     delay(10);     
  }
  for(byte i=0; i<4; i++){
     digitalWrite(led11, EEPROM.read(i));
     delay(10);     
  }
 
if(Serial.available()){
   byte dato=Serial.read();

// Si el DATO es guardado  el pin 10 pasa a tener un valor alto
  if(dato=='A') {     
     digitalWrite(led10, HIGH);
     digitalWrite(led11, LOW);
   
     EEPROM.write(direccion, 1); 
     }
// Si el DATO es guardado  el pin 10 pasa a tener un valor bajo   
   if(dato=='B'){   
      digitalWrite(led10, LOW);
      digitalWrite(led11, HIGH);
      delay(50);
      EEPROM.write(direccion, 0);
      }
     direccion++;    //para subir la direccion de la eeprom
  }

}


RIG

No hagas doble post, como se trata del mismo tema debes seguir en este post y no abrir otro

En cuanto al código el problema es que solo copiaste y repetiste la lineas del código que te puse y las cosas no funcionan así. Te puse un  ejemplo de como podías hacer uso de la eeprom pero debes analizarlo y comprenderlo antes de dar otro paso.
Ahora mira el siguiente código,  hace lo que pides, pero ten en cuenta que el uso de un for() combinado con delay detiene todo el flujo del código, por lo que si quieres ampliar tu código, dependiendo de las necesidades se tendrá que cambiar la forma de hacerlo

Code: [Select]



#include <EEPROM.h>

//Variables para leds
const byte led10 =  10;
const byte led11 =  11;

//Variables para la memoria eeprom
byte ee_valor[4];
byte direccion=0;

void setup() {
  Serial.begin(9600);
 
  pinMode(led10, OUTPUT); //Inicializa el pin 10 como salida     
  pinMode(led11, OUTPUT); //Inicializa el pin 10 como salida     
 
}
void loop(){
   for(byte i=0; i<4; i++){
     
     digitalWrite(led10, EEPROM.read(i));
     digitalWrite(led11, !EEPROM.read(i));
     delay(10);     
  }

 
if(Serial.available()){
   byte dato=Serial.read();

// Si el DATO es guardado  el pin 10 pasa a tener un valor alto
  if(dato=='A') {     
     digitalWrite(led10, HIGH);
     digitalWrite(led11, LOW);
   
     EEPROM.write(direccion, 1); 
     }
// Si el DATO es guardado  el pin 10 pasa a tener un valor bajo   
   if(dato=='B'){   
      digitalWrite(led10, LOW);
      digitalWrite(led11, HIGH);
      delay(50);
      EEPROM.write(direccion, 0);
      }
     direccion++;    //para subir la direccion de la eeprom
  }

}



RIG

#7
Aug 12, 2019, 07:08 pm Last Edit: Aug 13, 2019, 12:13 am by RIG
Pues la razón del porque los puso @gatoman, no la sé, pero igual puede funcionar sin el uso de ese delay y yo al modificar el código original  olvidé comentarlos o borrarlos

Edito:
Éste post fue en respuesta a una pregunta sobre el delay,  realizada en este mismo hilo por una persona la cual no recuerdo su nick
Desconozco el porqué borro el post

gatoman

#8
Aug 13, 2019, 12:26 am Last Edit: Aug 13, 2019, 09:19 pm by gatoman
Hola, pongo los delay por que es un secuenciador led programable y ese delay va aser reemplazado por un potencio-metro,
pero esa es la parte facil (supongo), tengo problemas con controlar mas leds , :(

este es la imagen que quiero obtener   : si envio D   B   D   B   A   B   A   B   D   B

espero obtener el resultado que esta en el cuadro 
La leyenda indica
A 10 (off) 11 (on)
B 10 (on) 11 (off)
C 10 (on) 11 (on)
D 10 (off) 11 (off)



Modifique el código para que realice mas instrucciones  como, encender los 2 leds ala vez , pero solo enciende 1 , trabajan a lo opuesto  :( ( no domino mucho manejo de EEPROM )
Muchas gracias por su atención

Code: [Select]




#include <EEPROM.h>

//Variables para leds
const byte led10 =  10;
const byte led11 =  11;

//Variables para la memoria eeprom
byte ee_valor[10];
byte direccion=0;

void setup() {
  Serial.begin(9600);
 
  pinMode(led10, OUTPUT); //Inicializa el pin 10 como salida     
  pinMode(led11, OUTPUT); //Inicializa el pin 11 como salida     
 
}
void loop(){
   for(byte i=0; i<10; i++){
     
     digitalWrite(led10, EEPROM.read(i));
     digitalWrite(led11, !EEPROM.read(i));
     delay(10);     
  }

 
if(Serial.available()){
   byte dato=Serial.read();

// Si el DATO es guardado  el pin 10 pasa a tener un valor alto
  if(dato=='A') {     
     digitalWrite(led10, LOW);
     digitalWrite(led11, HIGH);
     EEPROM.write(direccion, 1); 
     }
// Si el DATO es guardado  el pin 10 pasa a tener un valor bajo   
   if(dato=='B'){   
      digitalWrite(led10, HIGH);
      digitalWrite(led11, LOW);
      delay(50);
      EEPROM.write(direccion, 0);
      }
 // Si el DATO es guardado  el pin 10 pasa a tener un valor alto
  if(dato=='C') {     
     digitalWrite(led10, HIGH);
     digitalWrite(led11, HIGH);
     EEPROM.write(direccion, 2); 
     }
// Si el DATO es guardado  el pin 10 pasa a tener un valor bajo   
   if(dato=='D'){   
      digitalWrite(led10, LOW);
      digitalWrite(led11, LOW);
      delay(50);
      EEPROM.write(direccion, 3);
      }
     direccion++;    //para subir la direccion de la eeprom
  }

}

Go Up