AYUDA A CAMBIA LOGICA

#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

 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

Solo cambia esto

PotLED=map(tiempo,InicioAmanecerLED,FinAmanecerLED,MaxLED,0);

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

if (PotLED < 0)
  {
    PotLED = 0;
  }

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

pones

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.

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 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

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

if (PotLED < 0)

{
   PotLED = 0;
 }

if (PotLED > MaxLED)
 {

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




pones



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. 


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

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

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

surbyte:
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

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

agrega estas variables

  // 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

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

agrega estas variables

  // define buttonStateLast de igual modo que buttonState

#define INTERVALO 3601000 // 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