Go Down

Topic: RTC con DS1302 para controlar relevadores (Read 143 times) previous topic - next topic

kr0n0z

May 16, 2017, 10:05 pm Last Edit: May 16, 2017, 10:30 pm by surbyte
que tal amigos estoy haciendo un proyecto para controlar con un rtc una placa de relevadores para activar unas lamaparas
el circuito de potencia es una placa para arduino de 8 relays interfaz visual es una lcd de 16x2  con protocolo de comunicacion I2R la placa es una arduino uno
el primr problema que me encontre es que no puedo activarlo con la concicion if por que solo se activa un minuto ejemplo:
Code: [Select]

 Time t = rtc.time();
  if(t.hr==19 && t.min==16)
  {
          digitalWrite(5,HIGH);
         // delay(300);
          digitalWrite(5,LOW);
          //delay(500);
  }
  else if(t.hr==19 && t.min==18)
  {
     digitalWrite(5,LOW);
         // delay(500);
  }


y me di cuenta que los delay interferian con el fuincionmiento de la actualizacion de la pantalla entonces use un void relay donce use la funcion milli()
Code: [Select]
void loop(){
printTime();
 if(t.hr>=19 && t.min>=16)
  {
relay();
}
if(t.hr>=22 && t.min>=00)
  {
lcd.print("relay off");
}
}
void relay(){
unsigned long currentMillis = millis();
unsigned long currentMillis1 = millis();

if (currentMillis - previousMillis >= 300) {
    previousMillis = currentMillis;
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
     digitalWrite( 5, ledState);
    
  }
  
  if (currentMillis1 - previousMillis1 >=300 ) {
    previousMillis1 = currentMillis1;
    if (ledState1 == HIGH) {
      ledState1 = LOW;
    } else {
      ledState1 = HIGH;
    }
     digitalWrite( 6, ledState1);
  }
  
}


entonces me di cuenta que la funcion millis no los toma encuenta y solo osila con el segundero del RTC
entoncs despues lo intente sacando de del void relay y de todas maneras sigue el problema
no apaga cuando lo necesito y tampoco osila los 300 milli que necesito;
anexo el codigo que tengo espero me puedan ayudar

Code: [Select]
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <stdio.h>
#include <DS1302.h>

LiquidCrystal_I2C lcd(0x3F,16,2);
boolean ledState = LOW;
boolean ledState1 = HIGH;
unsigned long previousMillis = 0;        
unsigned long previousMillis1 = 0;  
namespace {


const int kCePin   = 2;                                // Chip Enable
const int kIoPin   = 3;                                // Input/Output
const int kSclkPin = 4;                                // Serial Clock

DS1302 rtc(kCePin, kIoPin, kSclkPin);                  // Create a DS1302 object.

String dayAsString(const Time::Day day) {
  switch (day) {
    case Time::kSunday: return "Dom";
    case Time::kMonday: return "Lunes";
    case Time::kTuesday: return "Martes";
    case Time::kWednesday: return "Mier";
    case Time::kThursday: return "Jueves";
    case Time::kFriday: return "Vier";
    case Time::kSaturday: return "Sabado";
  }
  return "(unknown day)";
}

void printTime() {
 
  Time t = rtc.time();                                  

 
  const String day = dayAsString(t.day);                

  char buf[50];
 
  Wire.begin();
  lcd.begin(16, 2);

  lcd.clear();

  lcd.backlight();
  lcd.setCursor(0, 0);
  sprintf(buf, "%s",day.c_str());
  lcd.print(buf);
lcd.backlight();
  lcd.setCursor(6, 0);
  sprintf(buf, "%02d/%02d/%04d",t.date, t.mon, t.yr);
  lcd.print(buf);

  
  lcd.setCursor(8, 1);
  sprintf(buf,"%02d:%02d:%02d",t.hr, t.min, t.sec);
  lcd.print(buf);
 }


}                                                       // namespace
/*void relay(){
  
boolean ledState = LOW;
boolean ledState1 = HIGH;
unsigned long previousMillis = 0;        
unsigned long previousMillis1 = 0;    
unsigned long currentMillis = millis();
unsigned long currentMillis1 = millis();

if (currentMillis - previousMillis >= 300) {
    previousMillis = currentMillis;
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
     digitalWrite( 5, ledState);
    
  }
  
  if (currentMillis1 - previousMillis1 >=300 ) {
    previousMillis1 = currentMillis1;
    if (ledState1 == HIGH) {
      ledState1 = LOW;
    } else {
      ledState1 = HIGH;
    }
     digitalWrite( 6, ledState1);
  }
  

  }*/

void setup() {
  Serial.begin(115200);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
                                                        
  rtc.writeProtect(false);
  rtc.halt(false);

                                                          // Sunday, September 22, 2013 at 01:38:50.
 //Time t(2017, 5, 16, 14, 14, 00, Time::kTuesday);

                                                            // Set the time and date on the chip.
// rtc.time(t);
}

                                                          // Loop and print the time every second.
void loop() {
  printTime();
    
unsigned long currentMillis = millis();
unsigned long currentMillis1 = millis();

if (currentMillis - previousMillis >= 300) {
    previousMillis = currentMillis;
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
     digitalWrite( 5, ledState);
    
  }
  
  if (currentMillis1 - previousMillis1 >=300 ) {
    previousMillis1 = currentMillis1;
    if (ledState1 == HIGH) {
      ledState1 = LOW;
    } else {
      ledState1 = HIGH;
    }
     digitalWrite( 6, ledState1);
  }
  
 //if(t.hr>=6 && t.min>=40);
//  relay();
  
/* else(t.hr>=20 && t.min>=45);
  {
      lcd.setCursor(0, 1);
      lcd.print("relay OFF");
  }*/
  
}

surbyte

Quote
el primr problema que me encontre es que no puedo activarlo con la concicion if por que solo se activa un minuto ejemplo
Se activa un minuto porque tu código dice eso.
Code: [Select]
if(t.hr==19 && t.min==16)
  {
          digitalWrite(5,HIGH);
         // delay(300);
          digitalWrite(5,LOW); // <== QUE SENTIDO TIENE ESTO LUEGO DE PONERLO EN HIGH?
          //delay(500);
  }
  else if(t.hr==19 && t.min==18)
  {
     digitalWrite(5,LOW);
         // delay(500);
  }


Ahi dice a las 19:16 pin 5 en HIGH y luego pones PIN 5 en LOW inmediatamente
Comenta esa linea que te marco
a las 19:18 supuestamente lo apagas

Lo de millis() no lo vi aún.

kr0n0z

surbyte los delay los quite por que me genran problemas , pero lo que  necesito una osilacion entre esos dos relay cuando uno este encendio el otro deve de estar apagado
y digamos que en el codigo siguinte quiero que por un periodo de 5 horas esten osilando y despus se apaguen 
if(t.hr>=19 && t.min>=16)
  {
          digitalWrite(6,LOW);
          digitalWrite(5,HIGH);
          delay(300);
          digitalWrite(6,HIGH);
          digitalWrite(5,LOW); // <== QUE SENTIDO TIENE ESTO LUEGO DE PONERLO EN HIGH? necesito la cecuencia d encendido y apagado para los relevadores que controlan una servo valvula
          delay(500);
  }
  else if(t.hr>=19 && t.min>=18)
  {
     digitalWrite(5,LOW);
digitalWrite(6,LOW);}
ese seria el codgio que use ,para ver que los delay no funciona,¿ porque? ponen en pausa el controlador y la hora se ve afectada cuando la imprimo en la pantalla, ese retraso no me deja visualizar los segundos corridos durante la pausa y brica d 2 en 2 osea 2,4,6,8, n.... en ocaciones el desface puede ser de 3

surbyte

#3
May 17, 2017, 04:32 pm Last Edit: May 17, 2017, 04:37 pm by surbyte
Vamos a entendernos bien porque lo anterior para mi esta confusa la idea

Tienes un horario en el que quieres que los reles cambien

Code: [Select]
         digitalWrite(6,LOW);
          digitalWrite(5,HIGH);
          delay(300);
          digitalWrite(6,HIGH);
          digitalWrite(5,LOW);


o sea cada 300 mseg?
y todo x 5 hs
Ahora para tu prueba lo haces por 2 minutos, es asi?

Hay que explicarse en la vida para entendernos.

Go Up