Go Down

Topic: amanecer atardecer (Read 924 times) previous topic - next topic

mirceadaniel

Hola a todos,

Tengo una pequeña pero grande problema.
Un amigo me a pedido a ayodarlo con un automato de amanecer, atardecer para los pajaros. El esta muy aficionado a pajaros.
ESta es tambien el momento cuando descubrio Arduino. Leyendo muchos tutoriales he hecho un automato , usando leds de potencia,
para encender y apagar  las luces , todo functionaba muy bien, pero me ha pedido que le pongo un rele temporizador, y han empezado las problemas. Como el no quiere gastar mucho dinero he montado un enchufe programable, que tiene conectado un cargador de movil, cuando es la hora de ponerse en marcha las luces, el cargador genera  un HIGH, a travers de un optoacoplador y cuando se para el programador el pin cae en LOW. Pero yo he intentado hacer todas las cosas y no me a salido nada. Necesito un consejo.

tengo dos salidas:
      ventilador y ledPin,
   tres entradas:
      buttondown para atardecer
      butonup para amanecer
      inputPin para optoacoplador


int inputPin = 2;
int buttondown = 3;
int butonup = 4;
int ventilador = 5;
int ledPin = 10;
int ledDelay = 5000;
int state2 = digitalRead ( inputPin);

void setup () {
  pinMode ( ledPin, OUTPUT);
  pinMode ( ventilador, OUTPUT);
  digitalWrite (ventilador, LOW);
  digitalWrite ( ledPin, LOW);

}

void loop () {
  int state = digitalRead ( butonup);
  int state1 = digitalRead ( buttondown);
  int state2 = digitalRead ( inputPin);

  if ( state == HIGH ) {
    upLights ();
  }
  else if ( state1 == HIGH) {
    downLights ();
  }
  else if ( state2 == HIGH) {
    delay (1000);
   upLights() ;
//  digitalWrite (ventilador, HIGH);
//  digitalWrite (ledPin, HIGH) ;


    digitalRead ( state2);
    digitalRead ( ledPin);
    while ( state2 == HIGH && (ledPin != LOW));
//  attachInterrupt (0, downLights, FALLING);     
    dayLights ();
//    delay ( 5000 );

  }
}

void upLights () // amanecer
{
  digitalWrite (ventilador, HIGH) ;
  delay (1000);
  for (int i=0; i<=255; i++)
  {
    analogWrite (ledPin, i);
    delay (500);
  }
      if ( state2 == HIGH && (ledPin != LOW));
//    dayLights ();
  dayLights () ;
//  return;

}


void dayLights () // luz dia
{
//  attachInterrupt (0, downLights, FALLING);
  digitalWrite (ventilador, HIGH);
  digitalWrite (ledPin, HIGH) ;
//  return;

}

void downLights ()  // atardecer
{
  detachInterrupt (0 );
  digitalWrite (ventilador, HIGH);
  digitalWrite (ledPin, HIGH);
  delay ( ledDelay);
  for (int i = 255; i>=0; i--)
  {
    analogWrite (ledPin, i);
    delay (100);
  }
  delay (ledDelay);
  digitalWrite ( ventilador, LOW);
  delay ( ledDelay);
//  detachInterrupt (0);
return;
}
 


American2020

Hola. Explica un poco mejor que tiene que pasar en cada caso.

¿La idea es que mientras el "inputPin para optoacoplador" este LOW, todo esté apagado?

Los "buttondown para atardecer" y "butonup para amanecer" son botones físicos.

¿Siempre que prendes luces, también el ventilador?

Bueno, por empezar eso, aunque no soy un experto, veo por ahí algunas cosas raras en el código, pero para empezar hay que saber que es lo que quieres lograr exactamente con las 3 inputs y como deben reaccionar las salidas en cada caso.
My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

mirceadaniel

Los botones, butonup y buttondown son para el funcionamiento sin programa. Cuando quieres entrar el trastero donde son los pajaros aprietas butonup para encender los luces  y el montaje ejecuta programa " upLights" y se queda encendido, cuando salgas fuera aprietas otro boton, Programa ejecuta " downLights" y se apaga las luces. El ventilador es para los leds, como he usado leds de 5 Watios con radiador he elegido poner un ventilador para sobrecalentamiento ( He quemado 5 leds hasta ahora), el ventilador se pone primero en marcha y se apaga ultimo. Los programas " upLight" y "downLight" funcionan sin problemas, pero cuando el " inputPin pasa de LOW  a HIGH y se queda en HIGH programa ejecuta sin parar " upLights" sin pararse. Yo no encontró manera para que el programa se queda en "upLights" hasta que el " inputPin cae en LOW, y después que ejecuta "downLights". 

American2020

#3
Apr 04, 2013, 11:41 pm Last Edit: Apr 04, 2013, 11:43 pm by American2020 Reason: 1
Hola, mirá, estoy armando un código, pero no entiendo el por qué de los 2 botones. ¿No debería ser el mismo botón en estado ON y OFF ¿O son pulsadores que envían la señal y luego se vuelven a LOW?

Avisame ese detalle, quizás podrías y sería más fácil resolver todo ese con un solo botón.

Acá el del Pin 2 funciona perfecto, estaba probando el código para los botones, pero es un "conflicto" porque estamos usando 2 botones, dónde se podría usar solo 1, ya que uno entra en conflicto con lo que hace el otro.

Te dejo el código, no es perfecto, pero funciona, seguro alguien puede ayudar a mejorarlo, ya que no soy experto y veo que estoy mandando HIGH a cosas que ya están HIGH, quizás si se ponen algunos IF más, se soluciona eso.

Code: [Select]
int inputPin = 2;
int buttondown = 3;
int butonup = 4;
int ventilador = 5;
int ledPin = 10;
int ledDelay = 500; //Estaba en 5000 lo bajé para probar
int state2 = digitalRead (inputPin);
int estupLights = 0; //Para saber si se corrió el "upLights"
int estdownLights = 0; //Para saber si se corrió el "downLights"


void setup () {
  pinMode (ledPin, OUTPUT);
  pinMode (ventilador, OUTPUT);
  digitalWrite (ventilador, LOW);
  digitalWrite (ledPin, LOW);
 
  //Estos 3 también a LOW?
  digitalWrite (inputPin, LOW);
  digitalWrite (buttondown, LOW);
  digitalWrite (butonup, LOW);
}


void loop () {
  int estadoUP = digitalRead (butonup);
  int estadoDOWN = digitalRead (buttondown);
  int estadoPIN = digitalRead (inputPin);


 
  //ALTO ¿Son botones que quedan pulsados, o mandan señal y vuelven a low?
  // En todo caso, por que no usar un sólo botón, ya que el comportamiento
  // de uno es el inverso del otro ¿Qué pasaría si los 2 quedan pulsados?
 
   if (estadoPIN == HIGH) { //Si se activa el .... eso.... :P
   delay (1000);
   
   //Vemos si no habíamos hecho "upLights" antes
   if (estupLights == 0) { upLights(); estupLights = 1; estdownLights = 0; } //Si no se había corrido antes
   
   else if (estupLights == 1) { dayLights (); } // Ya corrimos el uplights, dejamos las luces prendidas
   }//FIN state2 HIGH

  else if (estadoPIN == LOW) { //Si NO se activa el .... eso.... :P
   delay (1000);
   
   //Vemos si no habíamos hecho "downLights" antes
   if (estdownLights == 0) { downLights(); estdownLights = 1; estupLights = 0; } //Si no se había corrido antes
   
   else if (estdownLights == 1) { noLights (); } // Ya corrimos el downlights, dejamos las luces apagadas
   }//FIN state2 LOW




}// FIN loop





void upLights () // amanecer
{
  digitalWrite (ventilador, HIGH) ;
  delay (1000);
  for (int i=0; i<=255; i++)
  {
    analogWrite (ledPin, i);
    delay (10);
  }
  digitalWrite (ledPin, HIGH);
}// FIN upLights

void downLights ()
{
  digitalWrite (ventilador, HIGH);
  digitalWrite (ledPin, HIGH);
  delay (ledDelay);
  for (int i = 255; i>=0; i--)
  {
    analogWrite (ledPin, i);
    delay (10);
  }
  delay (ledDelay);
  digitalWrite (ventilador, LOW);
  digitalWrite (ledPin, LOW);
  delay (ledDelay);
}// FIN downLights


void dayLights () { digitalWrite (ventilador, HIGH); digitalWrite (ledPin, HIGH); }
void noLights () { digitalWrite (ventilador, LOW); digitalWrite (ledPin, LOW); }



PD: ¿Si el pin2 está HIGH, y alguien presiona ButtonUP, entonces no debería pasar nada, pero si alguien presiona el DOWN, se debería apagar todo, aún estando el pin2 en HIGH?

O en otras palabras, la idea es tenes un boton que nos prenda o apague las luces, mientras que pin 2 esté LOW y el resto del tiempo que ese botón no haga nada?
My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

Go Up