Quiero encender y apagar un Led tanto enviado comandos por puerto serie o USB del Arduino UNO r3 y interruptores o pulsadores al mismo tiempo, es decir, si por el puerto serie envio este comando.
Led1_ON, se encienda el Led 1.
Si pulso el interruptor o pulsador, que haga lo mismo.
Aquí tengo algo del código, espero que se entienda, así se modifica o mejora cosas que aún no logro.
#include <EEPROM.h>
int estadoBoton1 = 0; // Guarda el estado del botón en HIGH o LOW.
int estadoBoton2 = 0;
char caracter; // Alacenas carácteres de entrada.
String comando;
int pinLed1 = 9; // Declaramos la variable pin del Led.
int pinLed2 = 8;
int pinLed3 = 7;
int pinLed4 = 6;
int pinLed5 = 5;
int pinLed6 = 4;
int pinLed7 = 3;
int pinLed8 = 2;
int Direccion = 0; // Dirección de memoria de la EEPROM.
byte Dato; // Dato de la EEPROM.
byte Dato2;
void setup()
{
pinMode(pinLed1, OUTPUT); // Inicializa el pin del Led 1 como salida.
pinMode(pinLed2, OUTPUT);
pinMode(pinLed3, OUTPUT);
pinMode(pinLed4, OUTPUT);
pinMode(pinLed5, OUTPUT);
pinMode(pinLed6, OUTPUT);
pinMode(pinLed7, OUTPUT);
pinMode(pinLed8, OUTPUT);
pinMode(A0,INPUT); // Salida digital para el Led 1.
Serial.begin(115200); // Puerto serie 115200 baudios.
delay(200); // Retardo 0,2 segundos.
Serial.println(EEPROM.read(Direccion),DEC); // Imprime en pantalla la dirección en decimal.
Dato2 = EEPROM.read(Direccion); // Lee la dirección y lo almacena en la variable Dato2.
// Lee los datos almacenados en al EEPROM al iniciar el programa.
switch (Dato2)
{
case B0:
digitalWrite(pinLed1, HIGH); // Enciende el Led 1.
break;
case B1:
digitalWrite(pinLed1, LOW); // Apaga el Led 1.
break;
}
}
void loop()
{
/* Leyendo carácter a carácter lo que se resive por el canal del puerto serie
y los voy concatenando uno tras otro en una cedena. */
while (Serial.available()>0)
{
caracter= Serial.read();
comando.concat(caracter);
delay(10);
}
// Si los carácteres es recibido y verdadero.
if (comando.equals("Led1_ON") == true)
{
digitalWrite(pinLed1, HIGH); // Enciende el Led 1.
Serial.println("El comando es Led1_ON"); // Muestra este mensaje en pantalla.
Dato = B0; // Dato binario se almacena en la variable Dato.
EEPROM.write(Direccion, Dato); // Escribe dirección y dato en la EEPROM.
}
// Si los carácteres es recibido y verdadero.
if (comando.equals("Led1_OFF")== true)
{
digitalWrite(pinLed1, LOW); // Apaga el Led 1.
Serial.println("El comando es Led11_OFF"); // Muestra este mensaje en pantalla.
Dato = B1; // Dato binario se almacena en la variable Dato.
EEPROM.write(Direccion, Dato); // Escribe dirección y dato en la EEPROM.
}
// Limpiamos la cadena para volver a recibir el siguiente comando.
comando="";
// Interruptor físico.
estadoBoton1 = digitalRead(A0);
// Si detecta que el botón está pulsado, se enciende el Led 1.
if (estadoBoton1 == HIGH)
{
digitalWrite(pinLed1, HIGH);
}
// Si no, no.
else
{
digitalWrite(pinLed1, LOW);
}
}
He simplificado un poco lo que tenías, según lo que entendí debería ser algo más o menos así:
(sólo he modificado la función loop)
void loop()
{
/* Leyendo carácter a carácter lo que se recibe por el canal del puerto serie
y los voy concatenando uno tras otro en una cadena. */
while (Serial.available()>0)
{
caracter= Serial.read();
comando.concat(caracter);
delay(10);
}
// Interruptor físico.
estadoBoton1 = digitalRead(A0);
if (comando.equals("Led1_ON") == true || estadoBoton1 == HIGH){ // Si los carácteres es recibido y verdadero o se ha presionado el botón físico.
digitalWrite(pinLed1, HIGH); // Enciende el Led 1.
if(sizeof(comando) > 0){ // Si fue enviado por Serial
Serial.println("El comando es Led1_ON"); // Muestra este mensaje en pantalla.
Dato = B0; // Dato binario se almacena en la variable Dato.
EEPROM.write(Direccion, Dato); // Escribe dirección y dato en la EEPROM.
}
}else if (comando.equals("Led1_OFF")== true || estadoBoton1 == LOW){ // Si los carácteres es recibido y verdadero o se ha presionado el botón físico..
digitalWrite(pinLed1, LOW); // Apaga el Led 1.
if(sizeof(comando) > 0){ // Si fue enviado por Serial
Serial.println("El comando es Led11_OFF"); // Muestra este mensaje en pantalla.
Dato = B1; // Dato binario se almacena en la variable Dato.
EEPROM.write(Direccion, Dato); // Escribe dirección y dato en la EEPROM.
}
}
comando=""; // Limpiamos la cadena para volver a recibir el siguiente comando.
}
Me ocurre dos cosas. Cuando le das al serial de Arduino IDE, me aparece todo el rato el mensaje uno tras otro, sin parar y tampoco me responde las intrucciones que les envío como por ahí para que cambie de estado.
El mensaje que aparece es este todo el rato. El comando es Led1_ON
A pesar que el botón físico si funciona, los comandos Led1_ON y Led1_OFF no hacen nada.
El código es este:
#include <EEPROM.h>
int estadoBoton1 = 0; // Guarda el estado del botón en HIGH o LOW.
int estadoBoton2 = 0;
int estadoBoton3 = 0;
int estadoBoton4 = 0;
int estadoBoton5 = 0;
int estadoBoton6 = 0;
int estadoBoton7 = 0;
int estadoBoton8 = 0;
char caracter; // Alacenas carácteres de entrada.
String comando;
int pinLed1 = 9; // Declaramos la variable pin del Led.
int pinLed2 = 8;
int pinLed3 = 7;
int pinLed4 = 6;
int pinLed5 = 5;
int pinLed6 = 4;
int pinLed7 = 3;
int pinLed8 = 2;
int Direccion = 0; // Dirección de memoria de la EEPROM.
byte Dato; // Dato de la EEPROM.
byte Dato2;
void setup()
{
pinMode(pinLed1, OUTPUT); // Inicializa el pin del Led 1 como salida.
pinMode(pinLed2, OUTPUT);
pinMode(pinLed3, OUTPUT);
pinMode(pinLed4, OUTPUT);
pinMode(pinLed5, OUTPUT);
pinMode(pinLed6, OUTPUT);
pinMode(pinLed7, OUTPUT);
pinMode(pinLed8, OUTPUT);
pinMode(A0,INPUT); // Salida digital para el Led 1.
pinMode(A1,INPUT);
pinMode(A2,INPUT);
pinMode(A3,INPUT);
pinMode(A4,INPUT);
pinMode(A5,INPUT);
Serial.begin(115200); // Puerto serie 115200 baudios.
delay(200); // Retardo 0,2 segundos.
Serial.println(EEPROM.read(Direccion),DEC); // Imprime en pantalla la dirección en decimal.
Dato2 = EEPROM.read(Direccion); // Lee la dirección y lo almacena en la variable Dato2.
// Lee los datos almacenados en al EEPROM al iniciar el programa.
switch (Dato2)
{
case B0:
digitalWrite(pinLed1, HIGH); // Enciende el Led 1.
break;
case B1:
digitalWrite(pinLed1, LOW); // Apaga el Led 1.
break;
}
}
void loop()
{
/* Leyendo carácter a carácter lo que se resive por el canal del puerto serie
y los voy concatenando uno tras otro en una cedena. */
while (Serial.available()>0)
{
caracter= Serial.read();
comando.concat(caracter);
delay(10);
}
// Interruptor físico.
estadoBoton1 = digitalRead(A0);
if (comando.equals("Led1_ON") == true || estadoBoton1 == HIGH){ // Si los carácteres es recibido y verdadero o se ha presionado el botón físico.
digitalWrite(pinLed1, HIGH); // Enciende el Led 1.
if(sizeof(comando) > 0){ // Si fue enviado por Serial
Serial.println("El comando es Led1_ON"); // Muestra este mensaje en pantalla.
Dato = B0; // Dato binario se almacena en la variable Dato.
EEPROM.write(Direccion, Dato); // Escribe dirección y dato en la EEPROM.
}
}else if (comando.equals("Led1_OFF")== true || estadoBoton1 == LOW){ // Si los carácteres es recibido y verdadero o se ha presionado el botón físico..
digitalWrite(pinLed1, LOW); // Apaga el Led 1.
if(sizeof(comando) > 0){ // Si fue enviado por Serial
Serial.println("El comando es Led11_OFF"); // Muestra este mensaje en pantalla.
Dato = B1; // Dato binario se almacena en la variable Dato.
EEPROM.write(Direccion, Dato); // Escribe dirección y dato en la EEPROM.
}
}
// Limpiamos la cadena para volver a recibir el siguiente comando.
comando="";
}
Pensé nuevamente una manera diferente de ejecutar el código. Lo primero es que tenía una duda sin embargo, hice una modificación de como funciona el botón para poder obtener los resultados que deseas, de otra manera, no se me ocurre como podría haber funcionado
En este momento el botón enciende o apaga el led cada vez que se presiona, y no como antes que lo mantenía encendido mientras se pulsaba y cuando lo soltabas se apagaba.
entonces ahora cuando presionas el botón si está apagado lo enciende, y viceversa, el monitor serial reescribe una variable global por lo cual si escribes Led1_ON y está encendido, se mantendrá así y si estaba apagada lo encenderá.
#include <EEPROM.h>
int estadoBoton1 = 0; // Guarda el estado del botón en HIGH o LOW.
int estadoBoton2 = 0;
int estadoBoton3 = 0;
int estadoBoton4 = 0;
int estadoBoton5 = 0;
int estadoBoton6 = 0;
int estadoBoton7 = 0;
int estadoBoton8 = 0;
char caracter; // Alacenas carácteres de entrada.
String comando;
int pinLed1 = 9; // Declaramos la variable pin del Led.
int pinLed2 = 8;
int pinLed3 = 7;
int pinLed4 = 6;
int pinLed5 = 5;
int pinLed6 = 4;
int pinLed7 = 3;
int pinLed8 = 2;
int Direccion = 0; // Dirección de memoria de la EEPROM.
byte Dato; // Dato de la EEPROM.
byte Dato2;
int ultimoEstado = 0;
int estado = 0;
void setup()
{
pinMode(pinLed1, OUTPUT); // Inicializa el pin del Led 1 como salida.
pinMode(pinLed2, OUTPUT);
pinMode(pinLed3, OUTPUT);
pinMode(pinLed4, OUTPUT);
pinMode(pinLed5, OUTPUT);
pinMode(pinLed6, OUTPUT);
pinMode(pinLed7, OUTPUT);
pinMode(pinLed8, OUTPUT);
pinMode(A0,INPUT); // Salida digital para el Led 1.
pinMode(A1,INPUT);
pinMode(A2,INPUT);
pinMode(A3,INPUT);
pinMode(A4,INPUT);
pinMode(A5,INPUT);
Serial.begin(115200); // Puerto serie 115200 baudios.
delay(200); // Retardo 0,2 segundos.
Serial.println(EEPROM.read(Direccion),DEC); // Imprime en pantalla la dirección en decimal.
Dato2 = EEPROM.read(Direccion); // Lee la dirección y lo almacena en la variable Dato2.
// Lee los datos almacenados en al EEPROM al iniciar el programa.
switch (Dato2)
{
case B0:
digitalWrite(pinLed1, HIGH); // Enciende el Led 1.
break;
case B1:
digitalWrite(pinLed1, LOW); // Apaga el Led 1.
break;
}
}
void loop()
{
/* Leyendo carácter a carácter lo que se resive por el canal del puerto serie
y los voy concatenando uno tras otro en una cedena. */
while (Serial.available() > 0)
{
caracter= Serial.read();
comando.concat(caracter);
delay(10);
}
// Interruptor físico.
estadoBoton1 = digitalRead(A0);
if(estadoBoton1 == HIGH && ultimoEstado == LOW){
estado = estado-1;
}
if(comando.equals("Led1_ON") == true){
estado = 1;
escribeProm(B0);
}else if(comando.equals("Led1_OFF") == true){
estado = 0;
escribeProm(B1);
}
ultimoEstado = estadoBoton1;
if(estado == 1){
digitalWrite(pinLed1, HIGH);
}else{
digitalWrite(pinLed1, LOW);
}
// Limpiamos la cadena para volver a recibir el siguiente comando.
comando="";
}
void escribeProm(byte = Dato){
EEPROM.write(Direccion, Dato);
}
si no te sirve por el modo de funcionamiento del botón, me avisas para ver como solucionarlo.
Led13.ino: In function 'void loop()':
Led13.ino:83:19: error: 'escribeProm' was not declared in this scope
Led13.ino:86:19: error: 'escribeProm' was not declared in this scope
Error de compilación
This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
#include <EEPROM.h>
int estadoBoton1 = 0; // Guarda el estado del botón en HIGH o LOW.
int estadoBoton2 = 0;
int estadoBoton3 = 0;
int estadoBoton4 = 0;
int estadoBoton5 = 0;
int estadoBoton6 = 0;
int estadoBoton7 = 0;
int estadoBoton8 = 0;
char caracter; // Alacenas carácteres de entrada.
String comando;
int pinLed1 = 9; // Declaramos la variable pin del Led.
int pinLed2 = 8;
int pinLed3 = 7;
int pinLed4 = 6;
int pinLed5 = 5;
int pinLed6 = 4;
int pinLed7 = 3;
int pinLed8 = 2;
int Direccion = 0; // Dirección de memoria de la EEPROM.
byte Dato; // Dato de la EEPROM.
byte Dato2;
int ultimoEstado = 0;
int estado = 0;
void setup()
{
pinMode(pinLed1, OUTPUT); // Inicializa el pin del Led 1 como salida.
pinMode(pinLed2, OUTPUT);
pinMode(pinLed3, OUTPUT);
pinMode(pinLed4, OUTPUT);
pinMode(pinLed5, OUTPUT);
pinMode(pinLed6, OUTPUT);
pinMode(pinLed7, OUTPUT);
pinMode(pinLed8, OUTPUT);
pinMode(A0,INPUT); // Salida digital para el Led 1.
pinMode(A1,INPUT);
pinMode(A2,INPUT);
pinMode(A3,INPUT);
pinMode(A4,INPUT);
pinMode(A5,INPUT);
Serial.begin(115200); // Puerto serie 115200 baudios.
delay(200); // Retardo 0,2 segundos.
Serial.println(EEPROM.read(Direccion),DEC); // Imprime en pantalla la dirección en decimal.
Dato2 = EEPROM.read(Direccion); // Lee la dirección y lo almacena en la variable Dato2.
// Lee los datos almacenados en al EEPROM al iniciar el programa.
switch (Dato2)
{
case B0:
digitalWrite(pinLed1, HIGH); // Enciende el Led 1.
break;
case B1:
digitalWrite(pinLed1, LOW); // Apaga el Led 1.
break;
}
}
void escribeProm(byte = Dato){
EEPROM.write(Direccion, Dato);
}
void loop()
{
/* Leyendo carácter a carácter lo que se resive por el canal del puerto serie
y los voy concatenando uno tras otro en una cedena. */
while (Serial.available() > 0)
{
caracter= Serial.read();
comando.concat(caracter);
delay(10);
}
// Interruptor físico.
estadoBoton1 = digitalRead(A0);
if(estadoBoton1 == HIGH && ultimoEstado == LOW){
estado = estado-1;
}
if(comando.equals("Led1_ON") == true){
estado = 1;
escribeProm(B0);
}else if(comando.equals("Led1_OFF") == true){
estado = 0;
escribeProm(B1);
}
ultimoEstado = estadoBoton1;
if(estado == 1){
digitalWrite(pinLed1, HIGH);
}else{
digitalWrite(pinLed1, LOW);
}
// Limpiamos la cadena para volver a recibir el siguiente comando.
comando="";
}
No funciona bien y el mensaje de estado no le llega. A veces funciona, si toco el botón físico, tampoco funciona.
El mensaje no llega simplemente porque no lo he agregado, deberías intentar entender el código, aún sin ese mensaje, el led se enciende y se apaga. Lo que sucede con el botón, puede ser debido al rebote del mismo, he agregado un pequeño delay que debería solucionarlo:
#include <EEPROM.h>
int estadoBoton1 = 0; // Guarda el estado del botón en HIGH o LOW.
int estadoBoton2 = 0;
int estadoBoton3 = 0;
int estadoBoton4 = 0;
int estadoBoton5 = 0;
int estadoBoton6 = 0;
int estadoBoton7 = 0;
int estadoBoton8 = 0;
char caracter; // Alacenas carácteres de entrada.
String comando;
int pinLed1 = 13; // Declaramos la variable pin del Led.
int pinLed2 = 8;
int pinLed3 = 7;
int pinLed4 = 6;
int pinLed5 = 5;
int pinLed6 = 4;
int pinLed7 = 3;
int pinLed8 = 2;
int Direccion = 0; // Dirección de memoria de la EEPROM.
byte Dato; // Dato de la EEPROM.
byte Dato2;
int ultimoEstado = 0;
int estado = 0;
void setup()
{
pinMode(pinLed1, OUTPUT); // Inicializa el pin del Led 1 como salida.
pinMode(pinLed2, OUTPUT);
pinMode(pinLed3, OUTPUT);
pinMode(pinLed4, OUTPUT);
pinMode(pinLed5, OUTPUT);
pinMode(pinLed6, OUTPUT);
pinMode(pinLed7, OUTPUT);
pinMode(pinLed8, OUTPUT);
pinMode(A0,INPUT); // Salida digital para el Led 1.
pinMode(A1,INPUT);
pinMode(A2,INPUT);
pinMode(A3,INPUT);
pinMode(A4,INPUT);
pinMode(A5,INPUT);
Serial.begin(115200); // Puerto serie 115200 baudios.
delay(200); // Retardo 0,2 segundos.
Serial.println(EEPROM.read(Direccion),DEC); // Imprime en pantalla la dirección en decimal.
Dato2 = EEPROM.read(Direccion); // Lee la dirección y lo almacena en la variable Dato2.
// Lee los datos almacenados en al EEPROM al iniciar el programa.
switch (Dato2)
{
case B0:
digitalWrite(pinLed1, HIGH); // Enciende el Led 1.
break;
case B1:
digitalWrite(pinLed1, LOW); // Apaga el Led 1.
break;
}
}
void escribeProm(byte = Dato){
EEPROM.write(Direccion, Dato);
}
void loop()
{
/* Leyendo carácter a carácter lo que se resive por el canal del puerto serie
y los voy concatenando uno tras otro en una cedena. */
while (Serial.available() > 0)
{
caracter= Serial.read();
comando.concat(caracter);
delay(10);
}
// Interruptor físico.
estadoBoton1 = digitalRead(A0);
if(estadoBoton1 == HIGH && ultimoEstado == LOW){
estado = estado-1;
delay(20); //rebote del boton
}
if(comando.equals("Led1_ON") == true){
estado = 1;
escribeProm(B0);
Serial.println("El comando es Led1_ON");
}else if(comando.equals("Led1_OFF") == true){
estado = 0;
escribeProm(B1);
Serial.println("El comando es Led1_OFF");
}
ultimoEstado = estadoBoton1;
if(estado == 1){
digitalWrite(pinLed1, HIGH);
}else{
digitalWrite(pinLed1, LOW);
}
// Limpiamos la cadena para volver a recibir el siguiente comando.
comando="";
}
si hay veces en que todavía falla el botón aumenta el valor del delay a 25 o 30.
que nunca te ocurra gepd que por tener mal las condiciones de las variables resulte en una resta negativa.
Esto es la primera vez que lo veo: estado = estado -1
Se suele usar estado != estado o estado = !estado;
es mas mira como son las cosas... cuando comienzo esto no reparé en las condiciones de las que te hablo y que ocurre, que estan mal.
Defines a estado como
#include <EEPROM.h>
int estadoBoton1 = 0; // Guarda el estado del botón en HIGH o LOW.
int estadoBoton2 = 0;
int estadoBoton3 = 0;
int estadoBoton4 = 0;
int estadoBoton5 = 0;
int estadoBoton6 = 0;
int estadoBoton7 = 0;
int estadoBoton8 = 0;
char caracter; // Alacenas carácteres de entrada.
String comando;
int pinLed1 = 13; // Declaramos la variable pin del Led.
int pinLed2 = 8;
int pinLed3 = 7;
int pinLed4 = 6;
int pinLed5 = 5;
int pinLed6 = 4;
int pinLed7 = 3;
int pinLed8 = 2;
int Direccion = 0; // Dirección de memoria de la EEPROM.
byte Dato; // Dato de la EEPROM.
byte Dato2;
int ultimoEstado = 0;
int estado = 0;
void setup()
{
pinMode(pinLed1, OUTPUT); // Inicializa el pin del Led 1 como salida.
pinMode(pinLed2, OUTPUT);
pinMode(pinLed3, OUTPUT);
pinMode(pinLed4, OUTPUT);
pinMode(pinLed5, OUTPUT);
pinMode(pinLed6, OUTPUT);
pinMode(pinLed7, OUTPUT);
pinMode(pinLed8, OUTPUT);
pinMode(A0,INPUT); // Salida digital para el Led 1.
pinMode(A1,INPUT);
pinMode(A2,INPUT);
pinMode(A3,INPUT);
pinMode(A4,INPUT);
pinMode(A5,INPUT);
Serial.begin(115200); // Puerto serie 115200 baudios.
delay(200); // Retardo 0,2 segundos.
Serial.println(EEPROM.read(Direccion),DEC); // Imprime en pantalla la dirección en decimal.
Dato2 = EEPROM.read(Direccion); // Lee la dirección y lo almacena en la variable Dato2.
// Lee los datos almacenados en al EEPROM al iniciar el programa.
switch (Dato2)
{
case B0:
digitalWrite(pinLed1, HIGH); // Enciende el Led 1.
break;
case B1:
digitalWrite(pinLed1, LOW); // Apaga el Led 1.
break;
}
}
void escribeProm(byte = Dato){
EEPROM.write(Direccion, Dato);
}
void loop()
{
/* Leyendo carácter a carácter lo que se resive por el canal del puerto serie
y los voy concatenando uno tras otro en una cedena. */
while (Serial.available() > 0)
{
caracter= Serial.read();
comando.concat(caracter);
delay(10);
}
// Interruptor físico.
estadoBoton1 = digitalRead(A0);
if(estadoBoton1 == HIGH && ultimoEstado == LOW){
estado != estado;
delay(20); //rebote del boton
}
if(comando.equals("Led1_ON") == true){
estado = 1;
escribeProm(B0);
Serial.println("El comando es Led1_ON");
}else if(comando.equals("Led1_OFF") == true){
estado = 0;
escribeProm(B1);
Serial.println("El comando es Led1_OFF");
}
ultimoEstado = estadoBoton1;
if(estado == 1){
digitalWrite(pinLed1, HIGH);
}else{
digitalWrite(pinLed1, LOW);
}
// Limpiamos la cadena para volver a recibir el siguiente comando.
comando="";
}
Funciona los comandos por vía serie pero no del interruptor. Nota, uso interruptor cuando hablo de botón.
gracias por la sugerencia surbyte, en verdad el código del botón no lo había probado porque no tenía uno a mano, acabo de testear uno y a parte del problema que en el if encontré otro
la lectura del botón la haces desde un pin analógico: estadoBoton1 = digitalRead(A0); y debería ser digital:
ese código me ha funcionado sin problemas (cambia los pines correspondiente a tu configuración)
#include <EEPROM.h>
int estadoBoton1 = 0; // Guarda el estado del botón en HIGH o LOW.
int estadoBoton2 = 0;
int estadoBoton3 = 0;
int estadoBoton4 = 0;
int estadoBoton5 = 0;
int estadoBoton6 = 0;
int estadoBoton7 = 0;
int estadoBoton8 = 0;
char caracter; // Alacenas carácteres de entrada.
String comando;
int pinLed1 = 13; // Declaramos la variable pin del Led.
int pinLed2 = 8;
int pinLed3 = 7;
int pinLed4 = 6;
int pinLed5 = 5;
int pinLed6 = 4;
int pinLed7 = 3;
int pinLed8 = 2;
int Direccion = 0; // Dirección de memoria de la EEPROM.
byte Dato; // Dato de la EEPROM.
byte Dato2;
int ultimoEstado = 0;
int estado = 0;
void setup()
{
pinMode(pinLed1, OUTPUT); // Inicializa el pin del Led 1 como salida.
pinMode(pinLed2, OUTPUT);
pinMode(pinLed3, OUTPUT);
pinMode(pinLed4, OUTPUT);
pinMode(pinLed5, OUTPUT);
pinMode(pinLed6, OUTPUT);
pinMode(pinLed7, OUTPUT);
pinMode(pinLed8, OUTPUT);
pinMode(A0,INPUT); // Salida digital para el Led 1.
pinMode(A1,INPUT);
pinMode(A2,INPUT);
pinMode(A3,INPUT);
pinMode(A4,INPUT);
pinMode(A5,INPUT);
Serial.begin(115200); // Puerto serie 115200 baudios.
delay(200); // Retardo 0,2 segundos.
Serial.println(EEPROM.read(Direccion),DEC); // Imprime en pantalla la dirección en decimal.
Dato2 = EEPROM.read(Direccion); // Lee la dirección y lo almacena en la variable Dato2.
// Lee los datos almacenados en al EEPROM al iniciar el programa.
switch (Dato2)
{
case B0:
digitalWrite(pinLed1, HIGH); // Enciende el Led 1.
break;
case B1:
digitalWrite(pinLed1, LOW); // Apaga el Led 1.
break;
}
}
void escribeProm(byte = Dato){
EEPROM.write(Direccion, Dato);
}
void loop()
{
/* Leyendo carácter a carácter lo que se resive por el canal del puerto serie
y los voy concatenando uno tras otro en una cedena. */
while (Serial.available() > 0)
{
caracter= Serial.read();
comando.concat(caracter);
delay(10);
}
// Interruptor físico.
estadoBoton1 = digitalRead(3);
if(estadoBoton1 == HIGH && ultimoEstado == LOW){
estado = !estado;
delay(20); //rebote del boton
}
if(comando.equals("Led1_ON") == true){
estado = 1;
escribeProm(B0);
Serial.println("El comando es Led1_ON");
}else if(comando.equals("Led1_OFF") == true){
estado = 0;
escribeProm(B1);
Serial.println("El comando es Led1_OFF");
}
ultimoEstado = estadoBoton1;
Serial.println(estado);
if(estado == 1){
digitalWrite(pinLed1, HIGH);
}else{
digitalWrite(pinLed1, LOW);
}
// Limpiamos la cadena para volver a recibir el siguiente comando.
comando="";
}
Voy a probar el código y te cuento los resultados. Pensé que se ponía como entra digital, quiero decir, transformar la entrada analógica en digital, como si fuera digitales puro y duro.
A ver.. yo no hable de la definición del pin sino del comentario
// DICE SALIDA cuando estaba definido como entrada.
Como los tiene cableados no se porque no lei nada al respecto.
Si son salidas tienes razón, y que ponga OUTPUT pero eso pasa porque no dar bien la información.
Un esquema a mano alzada, una foto, se sube y no estamos perdiendo el tiempo hablando de lo que puede ser o no..
Solo se que esta definido una cosa y el comentario dice otra.
por lo visto entendi bien
pinMode(pinLed1, OUTPUT); // Inicializa el pin del Led 1 como salida.
pinMode(pinLed2, OUTPUT);
pinMode(pinLed3, OUTPUT);
pinMode(pinLed4, OUTPUT);
pinMode(pinLed5, OUTPUT);
pinMode(pinLed6, OUTPUT);
pinMode(pinLed7, OUTPUT);
pinMode(pinLed8, OUTPUT);
Entonces me he equivocado desde el principio a la hora de explicar.
Con el ejemplo de arriba, me funciona los comandos en serie, pero no el pulsador físico.
Por lo que veo, debe ser algo así.
Si botón Led1 está pulsado OR comando serie es Led1_ON
{
Se activa el Led 1.
}
Si no
{
Se apaga el LEd 2.
}
No olvidar que cuando el interruptor está fijo encendido y apagado, debe cambiar su estado en los comandos del serial. Por eso cuesta programarlo, o cogerle el truco como se hace, y mejor saber, si realmente Arduino es capaz de hacerlo.
Yo creo que debes tener algo mal conectado, yo lo probé y me funciona el boton y los comando por serie.
Si presiono el botón 1 vez, se enciende el led, si lo presiono otra vez se apaga.
Si presiono el boton 1 vez, se enciende el led, si escribo Led1_OFF el led se apaga.
-Si escribo Led1_ON, el led se enciende, si presiono el botón, el led se apaga.
y así...
esto es lo que entendí que querías y así está funcionando.
no entiendo cual es el problema que estás teniendo.