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:
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()
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
#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");
}*/
}