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 ?
#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);
}
}}
#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,
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
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
#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
}
}
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
#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
}
}
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
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
#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
}
}