En mi caso tengo un peke en casa y ya sabes, enreda como el solo.
Vale, me ha surgido otra duda. Ya se como hacer lo del tiempo. La persiana tarda aproximadamente 18 segundos en subir o bajar. Para probar he creado el primer movimiento que haría por la mañana, que seria subirse durante 6 segundos. Voy a mantener el interruptor que venia con la persiana:
El neutro va conectado al motor y la fase pasa por el interruptor que cambia entre parado, subir y bajar.
El interruptor lo voy a desconectar y conectarlo a arduino. El Rele1 activa y desactiva el motor y el Rele2 selecciona el sentido de giro.
Actualmente me mueve la persiana según la ldr y la NTC (resistencia térmica) y manualmente cuando pulso un botón. Ahora va mi problema. El valor Posicion es donde se encuentra la persiana, abajo es 0 y arriba es 20 (Son segundos). si la persiana se mueve automáticamente funcionaria bien, pero cuando la muevo manualmente necesito que también cambie el valor Posicion. Para eso he intentado usar la función pulseIn que en teoría mide el tiempo que esta un botón pulsado. si pudiese medir el tiempo que subo la persiana manualmente se lo podría sumar al valor Posicion y saber donde esta aunque la controle de forma manual. El problema es que no consigo hacer funcionar pulseIn.
A, lo de la automatización todavía no lo he configurado. he creado el primer movimiento que la levanta por la mañana 6 segundos para probar si funciona. Cuando tenga el resto completo creare todos los movimientos automáticos Este es el que he creado:
if (Posicion == 0)
{
if (NTCValue <= 200)
{
if (LDRValue > 100)
{
Posicion =+ 6;
digitalWrite(Rele1, HIGH);
digitalWrite(Rele2, LOW);
delay(6000);
digitalWrite(Rele1, LOW);
digitalWrite(Rele2, LOW);
}
}
Este es el desastre que tengo por código en el que se que es una burrada la forma en la que he intentado usar pulseIn. Los comentarios no están la mayoría bien puestos, como estoy modificando algunos son incorrectos.
int LDR = A0; // select the input pin for the LDR
int NTC = A1; // select the input pin for the NTC
int Down = 12; // select the input pin for the down button
int Up = 13; // select the input pin for the up button
int Rele1 = 2; // select the pin 2 for the Rele 1
int Rele2 = 3; // select the pin 3 for the Rele 2
int Led = 4; // select the pin 4 for the Led
int LDRValue = 0; // variable to store the value coming from the LDR
int NTCValue = 0; // variable to store the value coming from the LDR
int DownValue = 0; // variable to store the value coming from the LDR
int UpValue = 0; // variable to store the value coming from the LDR
int TiempoSubir = 0;
int TiempoSubiendo = 0;
int Posicion = 0; // set the position to 0
void setup() {
Serial.begin(9600);
// declare the Rele1 Pin as an OUTPUT:
pinMode(Rele1, OUTPUT);
// declare the Rele2 Pin as an OUTPUT:
pinMode(Rele2, OUTPUT);
// declare the Rele2 Pin as an OUTPUT:
pinMode(Led, OUTPUT);
digitalWrite(Rele1, HIGH);
digitalWrite(Rele2, HIGH);
digitalWrite(Led, HIGH);
delay(20000);
digitalWrite(Rele1, LOW);
digitalWrite(Rele2, LOW);
digitalWrite(Led, LOW);
digitalWrite(TiempoSubiendo, LOW);
}
void loop() {
// Leer valor de la ldr:
LDRValue = analogRead(LDR);
// Leer valor de la NTC:
NTCValue = analogRead(NTC);
// Leer valor de Down button:
DownValue = digitalRead(Down);
// Leer valor de Up button:
UpValue = digitalRead(Up);
if (Posicion >= 20)
{
Posicion = 19;
}
switch (DownValue) {
case HIGH:
//BOTON BAJAR
digitalWrite(Rele1, HIGH);
digitalWrite(Rele2, HIGH);
digitalWrite(Led, HIGH);
break;
case LOW:
switch (UpValue) {
case HIGH:
//BOTON SUBIR
digitalWrite(Rele1, HIGH);
digitalWrite(Rele2, LOW);
digitalWrite(Led, HIGH);
digitalWrite(TiempoSubiendo, HIGH);
TiempoSubir = pulseIn(TiempoSubiendo, HIGH);
break;
case LOW:
//SIN BOTONES
digitalWrite(Rele1, LOW);
digitalWrite(Rele2, LOW);
digitalWrite(Led, LOW);
digitalWrite(TiempoSubiendo, LOW);
if (Posicion == 0)
{
if (NTCValue <= 200)
{
if (LDRValue > 100)
{
Posicion =+ 6;
digitalWrite(Rele1, HIGH);
digitalWrite(Rele2, LOW);
delay(6000);
digitalWrite(Rele1, LOW);
digitalWrite(Rele2, LOW);
}
}
}
break;
}
break;
}
Serial.print("Posicion: ");
Serial.print(Posicion);
Serial.print("\t LDR:" );
Serial.print(LDRValue);
Serial.print("\t NTC:" );
Serial.print(NTCValue);
Serial.print("\t Down:" );
Serial.print(DownValue);
Serial.print("\t Up:" );
Serial.println(UpValue);
Serial.print("\t Tiempo subir:" );
Serial.println(TiempoSubir);
}
Muchas gracias si alguien ha tenido la paciencia para leer toda la reply y por la ayuda. Seguro que he explicado alguna cosa mal o de forma incompleta. Comentármelo y lo amplio.
No entiendo lo de "El Rele1 activa y desactiva el motor y el Rele2 selecciona el sentido de giro." Imagino que esos relés son los que alimentan el motor de la persiana, ¿no? Entonces, ¿por qué no pones el Rele1 para subir persiana y el Rele2 bajar persiana? Lo veo más lógico y así cada vez que quieres hacer una maniobra sólo tienes que activar un relé.
Para el tiempo mejor que pulseIn utiliza millis().
Los relés los coloco así porque aunque tenga que activar 2 relés evito que se puedan hacer cortocircuitos por un fallo en el código o un rele que se quede bloqueado. Luego publico un dibujo para que veas a que me refiero.
A, ahora que lo pienso ya veo la utilidad de millis() y si, voy a probar a ver si consigo que me funcione bien.
Gracias.
Bien pensado, yo suelo hacerlo con relés con contactos auxiliares que los cruzo. Pero creo que se complica más que lo tuyo.
Son propuestas que seguramente locas usar un sensor hall como encoder y saber cuanto se mueve la persina. Un sensor hall en marco de ventana y un iman en la persina para ajustar el fin o principio de recorrido.
Ya creo que se hacer toda la programación, ademas tengo la ayuda del código de vic20 que me lo ha podido enviar. Muchas gracias por vuestra ayuda. Voy a terminarla en lo que me llegan los relés y cuando lo tenga funcionando pondré todo en el foro.
Mas tarde me gustaría añadir módulos xbee o algo parecido para que las persianas se comuniquen, cierre y apertura centralizada, mando a distancia.... a parte de mas cosas que se me ocurran.
En cuanto funcione o tenga algún problema os lo comento.
Tambien se podria hacer igual que funciona los accionamientos que mueven los faros del coche. El motor lleva un potenciómetro en el eje y todo lo gobierna un IC de 8 patillas que hace invertir el giro del motor hasta que llega a la posición que define el nivel de tensión de uno de los pines.
Esto lo tengo probado pero para mover los estores, que no llevan finales de carrera y no se puede limitar el recorrido.
Voy a buscarlo y os digo cual es el IC.
Estaría bien y es una buena idea, pero no me merece la pena. Quiero tener automatizadas todas las persianas de mi casa de la forma mas barata posible. No me importa que tenga un fallo de 10cm.
Lo de comunicar todas las persianas, es lo que tengo en mente ahora, pero en lugar de con módulos xbee lo estoy intentado con nrf24, que son más baratos.
La idea es poner cada persiana con un arduino nano y un modulo nrf24 y controlarlos todos por medio de otro arduino en el que estén programadas las alarmas y guarde las posiciones de cada persiana, con conexión a la red para poder acceder al sistema desde internet.
De momento ya acciono un relé a distancia, a ver si tengo tiempo y lo puedo hacer con 2 nodos al mismo tiempo.
Si, el tema es tenerlas todas conectadas y poder controlarlas desde cualquier sitio, aunque lo que tu planteas es un sistema centralizado. ¿No seria mejor que fuesen independientes y que el control centralizado fuese una utilidad a parte? Lo digo por el tema de que como te falle la conexión inalambrica o el modulo central te quedas sin persianas. Si fuese descentralizado solo puede fallar la persiana con problemas.
adrian_gn:
Si, el tema es tenerlas todas conectadas y poder controlarlas desde cualquier sitio, aunque lo que tu planteas es un sistema centralizado. ¿No seria mejor que fuesen independientes y que el control centralizado fuese una utilidad a parte? Lo digo por el tema de que como te falle la conexión inalambrica o el modulo central te quedas sin persianas. Si fuese descentralizado solo puede fallar la persiana con problemas.
Ahora veo que lo que intentas es controlar la persiana exclusivamente a través de la placa Arduino. Esa es una opción que desheché en mis desarrollo del control, pues cuando se está cerca de un equipo, no hay nada más cómodo que accionarlo desde su propio interruptor. Por ese motivo he desarrollado unas placas de relés que me permitan detectar cuándo el interruptor manual cambia de estado y el control con arduino directamente se desconecta.
Por otro lado, no he visto que hayáis hablado nada de la alimentación de vuestra placa de control. ¿Vais a usar una pila o le vais a añadir al conjunto un transformador? Yo me decidí por esta última opción, de forma que el control se alimentase directamente de la misma alimentación que la persiana.
Si os interesa, en el hilo del sistema de domótica que estoy desarrollando tenéis toda la información de la placa de relés, el esquema de conexión y algunas cosas más que pueden ser de utilidad. Os dejo el enlace:
http://arduino.cc/forum/index.php/topic,92963.0.html
P.D.: En los ejemplos que publiqué en el hilo anterior, todo aparece relacionado a un equipo de encendido-apagado. Una persiana se comporta como 2 equipos de encendido-apagado, pero como sobran salidas de arduino, ambos se pueden controlar con una única placa arduino y 2 de relés,
Como es lógico vamos a usar un transformador para alimentar a arduino. La ventaja de lo que tu dices puede ser para evitar cableado en algunos casos, pero lo que nosotros hacemos es desenchufar el interruptor del motor, conectarlo a arduino y configurarlo para que funcione como si arduino no estuviese entre el interruptor y el motor. Esto nos permite saber fácilmente la posición de la persiana porque sabemos el tiempo que se mueve manualmente y de forma automática. Ademas no tenemos que hacer circuitos para detectar en que posición esta el interruptor. En definitiva hacemos lo mismo pero sin tener que poner sensores y encima nos da la ventaja de que si queremos añadir otras funciones al interruptor con pulsaciones repetidas podemos.
adrian_gn:
Como es lógico vamos a usar un transformador para alimentar a arduino. La ventaja de lo que tu dices puede ser para evitar cableado en algunos casos, pero lo que nosotros hacemos es desenchufar el interruptor del motor, conectarlo a arduino y configurarlo para que funcione como si arduino no estuviese entre el interruptor y el motor. Esto nos permite saber fácilmente la posición de la persiana porque sabemos el tiempo que se mueve manualmente y de forma automática. Ademas no tenemos que hacer circuitos para detectar en que posición esta el interruptor. En definitiva hacemos lo mismo pero sin tener que poner sensores y encima nos da la ventaja de que si queremos añadir otras funciones al interruptor con pulsaciones repetidas podemos.
Mira, en lo de aplicarle comportamientos diferentes en función de las pulsaciones del interruptor manual no había caído. Es una gran idea. A lo mejor la trato de implementar.
... En definitiva hacemos lo mismo pero sin tener que poner sensores y encima nos da la ventaja de que si queremos añadir otras funciones al interruptor con pulsaciones repetidas podemos.
Bien pensado, no se me había pasado por la cabeza.
Si, así con un mismo interruptor puedes seleccionar entre dos lamparas de una sala, cambiar la intensidad de iluminación y todas esas cosillas que se te puedan ocurrir. Me gusta tu proyecto pero no me llegan a convencer lo de los módulos esos de relés que detectan el estado del circuito.
Mira acabo de encontrar el actuador de los faros del coche que te contaba
Las conexiones del TDA3629
PIN1 POTENCIOMETRO
PIN2 ALIMENTACION
PIN3 MOTOR
PIN4 SIN CONECTAR
PIN5 GND
PIN6 MOTOR
PIN7 ALIMENTACION
PIN8 ENTRADA ANALOGICA
En vez de un motor de continua colocas dos reles, uno al pin4 y otro al pin6 (subir-bajar). Luego al pin 8 le puedes conectar un potenciómetro digital I2C y al arduino.
Ya lo mas de lo mas seria conectar la salida PWM del Xbee al TDA3629
¿Que os parece?
TDA3629.pdf (176 KB)
Me parece que puede estar bien y ser una buena idea, pero realmente no le veo la necesidad. Da igual que la persiana se descalibre 10 cm, no voy a darme cuenta si esta unos centímetros mas arriba o abajo.
tampoco se como sera de precio, pero yo por 20€ con mi sistema se puede automatizar la persiana.
Sigo el tema ya que yo quiero automatizar luces y persianas. Al leer todo el hilo hay cosas en las que coincidimos como por ejemplo darle varias utilidades a un pulsador de la persiana o al que sea, yo por ejemplo tenia pensado hacer:
Función del pulsador de cada persiana :
- Pulsacion corta subir: la persiana sube hasta el final
- Pulsacion corta bajar: la persiana sube hasta el final
si se pulsa cualquiera mientras sube o baja parar el motor, es por si no queremos que suba o baje hasta el final
*Pulsacion de 3 segundos o mas en pulsador subir: la misma funcion que la pulsacion corta pero envia orden a todas las demás persianas de que suban.
*Pulsacion de 3 segundos o mas en pulsador bajar: la misma funcion que la pulsacion corta pero envia orden a todas las demás persianas de que bajen.
Función del pulsador de cada una de las luces:
Pulsacion corta: Enciende/apaga la luz
Pulsacion larga: Apaga todas las luces de la casa
Lo de las pulsaciones largas esta bien si por ejemplo tienes una casa de varias plantas asi por ejemplo desde el recibidor antes de irte puedes hacer una pulsacion larga y saber que acabas de apagar todas las luces de toda la casa o incluso si no quieres subir para apagarla tenerlo todo centralizado desde cualquier punto de la casa, en mi caso por ejemplo la idea es desde el pulsador del cabecero de la cama hacer que si pulso el de enceder/apagar la luz de la habitación hacer que suban/bajen todas las persianas de la casa, cuando me acuesto que todas las luces se apaguen y bajen todas las persianas, y cuando me levante que suban todas las persianas.
Si tienes alarma o la haces con arduino, puedes hacer que, si salta la alarma todas las persianas se bajen, todas las luces se apaguen y los pulsadores manuales no funcionen, asi el caco estará a oscuras, como minimo le entorpeces el trabajo.
Logicamente al programar todo esto se puede pulir o incluso implementar tu idea del sensor de luz y temperatura, yo creo que si hay que poner sensor fuera pero tambien dentro, por lo que dices si hay luz fuera pero esta dando el sol de lleno en casa no subir entera la persiana sinó dejar pasar la luz necesaria para ver pero que no se caliente en exceso la habitacion, asi ahorramos aire acondicionado.
Perdón por el rollo que he soltado ![]()
No estoy seguro de la necesidad de una ldr en el interior de la habítacion por que también voy a regularla según la temperatura. Lo que me permite subirla o bajarla un poco si hace mucho calor o mucho frío. Cuando lo monte si no funciona bien le añadiré la ldr interior.
