Buenas tardes a todos.
Estoy intentando conseguir en una casa, gobernar las luces con una placa SSR y los pulsadores con modulos capacitativos. Para no tener un codigo muy extenso y repetitivo (2, 8 circuitos), he intentado emplear la libreria Button.h, que incluyo al final.
Realmente lo que persigo es poder asignar los diferentes pulsadores a diferentes salidas SSR, de manera que sea un sistema totalmente flexible. La casa esta cableada para aceptar esta configuracion. Para el arduino, empleo un MEGA R3, y placas SSR de cuatro y ocho circuitos.
Posteriormente, sería bueno, teniendo las variables de los pulsadores guardadas, poder manipular los circuitos desde otro arduino, haciendo referencia a las variables del primero, mediante un shield ethernet. El problema es que no consigo obtener el array de variables pol*. Os incluyo el codigo que utilizo para poder iniciar el proyecto, ya que soy "novatillo" en el tema, aunque cada dia apasiona mas el tema.*
Tambien os incluyo la captura de panatalla para que veais el error.
Cualquier ayuda me permitiria continuar con el proyecto, pero le doy vueltas y vueltas y no consigo salir del punto muerto donde estoy. Si se os ocurre otra manera o alguien lo ha hecho de otro modo, os agradecere mucho vuestra ayuda y soporte. Muchas gracias. Edu924``
StateChanged_prova.ino (534 Bytes)
Button.h (2 KB)
Button.cpp (7.1 KB)
Voy avanzando, con horas y horas, pero ahora el problema es otro..... solo me queda este resquicio.... alguna ayuda por favor?? Gracias
Edu924
Hola.
Si no he malentendido tu código, lo que estás intentando es crear un array de objetos Button, para luego repasarlos con un for, ¿no?
Bien. Entonces la declaración correcta sería:
Button pol[10];
A continuación podrías construir cada uno de los objetos, bien individualmente, o si son pines consecutivos, con un for (supongamos que va de los pines 2 al 11:
for (int i=0; i < 10; i++)
{
pol[i] = Button(j+2, BUTTON_PULLUP_INTERNAL);
}
Ahí sí que podrías recorrer sus estados con un for:
for (int i=0; i < 10; i++)
{
if (pol[i].stateChanged) // ha cambiado el estado del button i.
}
Muchisimas gracias por tus comentarios. De hecho, viendo lo que dices, parece que es lo mas correcto y debe funcionar. El problema es que lo he probado y no funciona. Te adjunto el scketch y el mensaje de error que lo acompaña. Parece ser que la libreria no acepta con pol[] que no defina los argumentos que conlleva, los cuatro. Lo he intentado hacer y tampoco funciona. Te parece que puede ser que la libreria que utilizo y puse en el post no sea la correcta??? Tambien he hablado con un amigo que programa y me dice que lo que tu propones es lo correcto, pero mira los mensajes de error, no entiendo porque no funciona.
Gracias por la ayuda y si se te ocurre algo, me harias salir del atolladero. Gracias.
edu924
#include <Button.h>
void setup()
{
Serial.begin(9600);
Button pol[10];
}
void loop()
{
for (int i=0; i < 10; i++)
{
// Button pol[i](i, BUTTON_PULLUP_INTERNAL, true, 20); por probar¡¡
pol[i] = Button(i+2, BUTTON_PULLUP_INTERNAL);
pinMode(i+10,OUTPUT);
}
for (int j=0; j < 10; j++)
if(pol[j].stateChanged())
{
Serial.println("stateChanged");
digitalWrite(j,HIGH);
}
else
{
digitalWrite(j,LOW);
}
}
errores.txt (1.13 KB)
StateChanged_prova2.ino (543 Bytes)
Por favor, a menos que el código exceda las capacidades del editor, publica errores y código en el post y no como adjuntos.
Serán mas personas las que se interesen en responderte.
Bien. He visto tu problema y por el momento debo decir que no es posible.
Primero no has visto como se usa la librería ya que por los errores que tiene tu código me doy cuenta que no has usado el ejemplo minimo de asignar un botón y luego claro intentar aumentarlo a 2 o mas.
Ejemplo mínimo de la librería Button.h
#include <Button.h>
/*
create a Button object at pin 12
connect button between pin 12 and GND
*/
Button button = Button(12,BUTTON_PULLUP); // la web dice PULLUP pero la librería pide definirlo asi
void setup(){
pinMode(13,OUTPUT); //debug to led 13
}
void loop(){
if(button.isPressed()){
digitalWrite(13,HIGH);
}else{
digitalWrite(13,LOW);
}
}
como verás la definición del objeto Button exige un pin y el modo en que trabajará dicho pin.
Asi que para definir un array de objetos deberías poder pasarle un array de pines
El problema es que tal como estan las cosas no lo permite.
O yo no veo como hacerlo.
A ver que opina Noter u otro experto en programación.
Se me ocurre pero yo no se aún como hacerlo, creando una nueva clase que contenga la clase Button, agregando las características que ahora son necesarias.
Ejercicio interesante!!
OK, lo siento, voy aprendiendo Arduino y a manejar los posts..... gracias
Bueno.
Es lo que tiene no probar el código antes de proponerlo. Efectivamente, hay que establecer los datos de inicialización en la declaración del array.
Prueba esto a ver si te funciona:
#include <Button.h>
Button pol[10] = {
Button(2, BUTTON_PULLUP_INTERNAL),
Button(3, BUTTON_PULLUP_INTERNAL),
Button(4, BUTTON_PULLUP_INTERNAL),
Button(5, BUTTON_PULLUP_INTERNAL),
Button(6, BUTTON_PULLUP_INTERNAL),
Button(7, BUTTON_PULLUP_INTERNAL),
Button(8, BUTTON_PULLUP_INTERNAL),
Button(9, BUTTON_PULLUP_INTERNAL),
Button(10, BUTTON_PULLUP_INTERNAL),
Button(11, BUTTON_PULLUP_INTERNAL)
};
void setup()
{
Serial.begin(9600);
}
void loop()
{
for (int j=0; j < 10; j++)
if(pol[j].stateChanged())
{
Serial.print("stateChanged on button ");
Serial.println(j);
}
}
Y ya para saciar la insaciable curiosidad de surbyte también podríamos crear un array de punteros a Button y asignarles direcciones de button creados dinámicamente:
#include <Button.h>
Button *pol[10];
void setup()
{
Serial.begin(9600);
for (int i=0; i<10; i++)
pol[i] = new Button(i+2, BUTTON_PULLUP_INTERNAL);
}
void loop()
{
for (int j=0; j < 10; j++)
if(pol[j]->stateChanged())
{
Serial.print("stateChanged on button ");
Serial.println(j);
}
}
Ambas formas compilan, pero faltaría por comprobar si funcionan (espero que sí).
Ya veo mi error. Yo intenté de otro modo.
Cree un vector con los pines de los botones y luego quería que se creara un array de botones.
La verdad que visualicé la forma en que lo hiciste tu, Serafín. Una vez mas, lección aprendida.