Go Down

Topic: AYUDA A CAMBIA LOGICA (Read 1 time) previous topic - next topic

7orres

Code: [Select]
#include <Wire.h>   
#include "RTClib.h" 
#include <OneWire.h> 
RTC_DS1307 RTC; // Crea el objeto RTC

void setup () 
{
Serial.begin(9600); // Establece la velocidad de datos del puerto serie
Wire.begin(); // Establece la velocidad de datos del bus I2C
RTC.begin();// Establece la velocidad de datos del RTC
//RTC.adjust(DateTime(__DATE__, __TIME__)); Solo lo habilitamos la primera vez para poner en hora el reloj
}

void loop () {
  int minute;
  int hour;
  int tiempo;
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print("Dia de la semana: ");
Serial.println(now.dayOfWeek(), DEC);

tiempo=(now.hour()*60)+now.minute(); // Para que sea un numero entero lo medimos en minutos

 if (tiempo < 60) 
  { 
   tiempo=tiempo+1440; // para cuando sean las 12 de la noche (00 horas)
  } 
Serial.println();
Serial.print("Tiempo: ");
Serial.println(tiempo);
delay(1000); // La información se actualiza cada 1 seg.
Luces (tiempo);

}


void Luces(int tiempo) 

 ///////////tiempos de progamacion////////// 
 int PotLED; 
 int InicioAmanecerLED=608; //10;00
 int FinAmanecerLED=670; //11:00 // 
 int InicioAnochecerLED=1110; //18:30// 
 int FinAnochecerLED=1170; //7:30 PM// 
 int MaxLED=255;  //Maximo que vamos a encender los LED sobre 255 
     

 //Noche 
 if (tiempo >FinAnochecerLED || tiempo < InicioAmanecerLED )   
  { 
   PotLED=0; 
   Serial.println();
   Serial.print("NOCHE: ");
   Serial.println(PotLED);
   Serial.println(); 
   
  } 

 //Amanecer 
 if (tiempo >= InicioAmanecerLED && tiempo <= FinAmanecerLED)   
  { 
   PotLED=map(tiempo,InicioAmanecerLED,FinAmanecerLED,0,MaxLED); 
   Serial.println();
   Serial.print("AMANECIENDO: ");
   Serial.println(PotLED); 
   Serial.println();
  } 

 //Dia 
 if (tiempo > FinAmanecerLED && tiempo < InicioAnochecerLED)   
  { 
   PotLED=MaxLED; 
   Serial.println();
   Serial.print("DIA: ");
   Serial.println(PotLED); 
   Serial.println();
  } 

 //Anochecer 
 if (tiempo >= InicioAnochecerLED && tiempo <= FinAnochecerLED) 
  { 
   PotLED=map(tiempo,InicioAnochecerLED,FinAnochecerLED,MaxLED,0); 
   Serial.println();
   Serial.print("ANOCHECIENDO: ");
   Serial.println(PotLED); 
   Serial.println();
  } 
 //Control 
 if(PotLED < 0)   
  { 
   PotLED=0; 
  } 

 if(PotLED >MaxLED)   
  { 
   PotLED=MaxLED; 
  } 
 analogWrite(5, PotLED); 

 

bueno pues aqui esta el codigo de alguien en este foro que me paso amablemente.
con esto controlo mi lampara led de mi acuario perfectamente,pero ahora quiero controlar relay o rele  una placa de 8 canales pero como es china  y su logica es difrnte,esdecir..
cuandose desactivan y cuando estan en 0 se activan
0=on
1 a 255 =off pero pues como no me estra el lenguaje de arduino la verdad no se como cambiarlo 
he tratado de cambiar la programacion de inicio de amanecer por la noche  osea
Code: [Select]
int PotLED; 
 int InicioAmanecerLED=1200; //8;00 PM
 int FinAmanecerLED=1201; //8:01PM // 
 int InicioAnochecerLED=580; //9:30AM// 
 int FinAnochecerLED=581; //7:31AM // 
 int MaxLED=255;

pero como es de noche  siempre aparece en 0 
alguien que me pueda ayudar a cambiar la logica de  0=off(apagado)  a 255=on(prendido)
lo que quiero es activar  relays por la noche o la manana
espero alguien me ayude con esto

surbyte

Solo cambia esto

Code: [Select]
PotLED=map(tiempo,InicioAmanecerLED,FinAmanecerLED,MaxLED,0);

surbyte

#2
Dec 13, 2014, 07:43 pm Last Edit: Dec 13, 2014, 07:44 pm by surbyte
Perdón por mi error, ya te doy la solución.
Lo que no entiendo porque usas un relé donde el programa intenta variar el brillo de los LEDs?
Vuelve al programa original y donde dice
Code: [Select]
if (PotLED < 0)
  {
    PotLED = 0;
  }

  if (PotLED > MaxLED)
  {
    PotLED = MaxLED;
  }
  analogWrite(5, PotLED);


pones

Code: [Select]
if (PotLED < 0)
  {
    PotLED = 0;
  }

  if (PotLED > MaxLED)
  {
    PotLED = MaxLED;
  }
  analogWrite(5, MaxLED-PotLED);


eso invertirá las cosas. Ahora para mi esta mal.
Repito un relé es si no, no necesita 0-255 para activarse.

En todo caso otra solucion sería.
Code: [Select]
if (PotLED < 0)
  {
    PotLED = 0;
    digitalWrite(5, HIGH);  // considerando que debe hacer lo inverso de lo que hace
  }

  if (PotLED > MaxLED)
  {
    PotLED = MaxLED;
    digitalWrite(5, LOW);  // considerando que debe hacer lo inverso de lo que hace
}
 //analogWrite(5, PotLED);


para que funcione esto último debes agregar en el setup() esto

   pinMode(5, OUTPUT);

7orres

que tal gracias  y disculpa por la tardanza pues aun no hago nada mas de lo que me aconsejaste por falta de tiempo ,pues puse estode 0 a 255 como es el codigo de un companero de aqui y comoo yo no entiendo de esto pues se me hizo facil
la ultima modificacion se me hace mas logica gracias por tu tiempo y cuando lo pruebe lo publicare 

7orres

Perdón por mi error, ya te doy la solución.
Lo que no entiendo porque usas un relé donde el programa intenta variar el brillo de los LEDs?
Vuelve al programa original y donde dice
Code: [Select]
if (PotLED < 0)
  {
    PotLED = 0;
  }

  if (PotLED > MaxLED)
  {

    PotLED = MaxLED;
  }
  analogWrite(5, PotLED);


pones

Code: [Select]
if (PotLED < 0)
  {
    PotLED = 0;
  }

  if (PotLED > MaxLED)
  {
    PotLED = MaxLED;
  }
  analogWrite(5, MaxLED-PotLED);


eso invertirá las cosas. Ahora para mi esta mal.
Repito un relé es si no, no necesita 0-255 para activarse.

En todo caso otra solucion sería.
Code: [Select]
if (PotLED < 0)
  {
    PotLED = 0;
    digitalWrite(5, HIGH);  // considerando que debe hacer lo inverso de lo que hace
  }

  if (PotLED > MaxLED)
  {
    PotLED = MaxLED;
    digitalWrite(5, LOW);  // considerando que debe hacer lo inverso de lo que hace
}
 //analogWrite(5, PotLED);


para que funcione esto último debes agregar en el setup() esto

   pinMode(5, OUTPUT);
Que tal pues si me sivio mucho esto que me pasaste gracias otra duda espero me ayudes pues tengo un boton  y quiero que al precionarlo se active mi relay durante 2 o 3 minutos  y copiado el codigo del foro
Code: [Select]
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);      
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);    
}

void loop(){
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {    
    // turn LED on:    
    digitalWrite(ledPin, HIGH);  
  }
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

 tendre que usar delay  para mantener mi releay activo durante 3 minutos
(180000 milisegundos)  ?y disculpa si incomoda

surbyte

no puedes usar delays tan largos porque detienes la ejecución del programa y vas a comenzar a sentir como que no funciona.

7orres

no puedes usar delays tan largos porque detienes la ejecución del programa y vas a comenzar a sentir como que no funciona.
Que tal surbyte me ha serviido de mucho tu modificacion  ,ahora he tratado de hacer la otra tarea pero no me ha quedado
lo que quiero es encender un rele  durante cierto tiemp cuando preciono un boton
espero me aconsejes

surbyte

Modificación de código para que funcione en on por X minutos

agrega estas variables
Code: [Select]


  // define buttonStateLast de igual modo que buttonState
#define INTERVALO 3*60*1000    // 3 minutos
unsigned long StartDelay = 0;
int buttonState = 0;
int buttonStateLast = 0;
bool EstadoBoton = false;

void loop(){
  // read the state of the pushbutton value:

  buttonStateLast = buttonState;
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH && buttonStateLast == LOW) { // miro cambio de 0 a 1
        EstadoBoton = true;
        StartDelay = millis();
  }

  if (EstadoBoton && (millis() - StartDelay < INTERVALO)) {
    digitalWrite(ledPin, HIGH);      // turn LED on:   
  }
  else {
      digitalWrite(ledPin, LOW);   // turn LED off:
      StartDelay = false;
  }


Probá a ver si funciona

7orres

Modificación de código para que funcione en on por X minutos

agrega estas variables
Code: [Select]


  // define buttonStateLast de igual modo que buttonState
#define INTERVALO 3*60*1000    // 3 minutos
unsigned long StartDelay = 0;
int buttonState = 0;
int buttonStateLast = 0;
bool EstadoBoton = false;

void loop(){
  // read the state of the pushbutton value:

  buttonStateLast = buttonState;
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH && buttonStateLast == LOW) { // miro cambio de 0 a 1
        EstadoBoton = true;
        StartDelay = millis();
  }

  if (EstadoBoton && (millis() - StartDelay < INTERVALO)) {
    digitalWrite(ledPin, HIGH);      // turn LED on:   
  }
  else {
      digitalWrite(ledPin, LOW);   // turn LED off:
      StartDelay = false;
  }


Probá a ver si funciona
Que tal surbyte ya hasta pena me da que te tomes el tiempo para hacer esto, he compilado y me sale este error


el codigo lo quiero para encender las luces de toda mi casa  cada luz cada boton ,como mi arduino mega 2560  se estropeo y solo le sirven como 20 pines (solo usare como 7)  usare solo este para mis luces ,este codigo seria si el otro que tengo
muchas gracias por el favor

Go Up