No compila if [SOLUCIONADO]

Saludos, soy nuevo en esto, estoy desarrollando un proyecto mio con ayuda de algunos vídeos, estoy cerca de terminar la base de la programación y me encuentro con un problema que no se solucionar.

El proyecto es el “control de la iluminación de una tira de neopixel por tiempo” lo quiero para simular el amanecer, el medio día y el ocaso para mi pecera con plantas naturales.

El código es el siguiente:

#include <Wire.h>                                       
#include <RTClib.h>   
#include <LiquidCrystal_I2C.h>
#include <Adafruit_NeoPixel.h>
                                 
RTC_DS1307 rtc; 
LiquidCrystal_I2C lcd (0x26, 2, 1, 0, 4, 5, 6, 7); 
Adafruit_NeoPixel tira = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);
          

void setup() {
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);                                    
lcd.begin(16, 2);
tira.begin(); 
tira.show();

if (! rtc.begin()) {                                   
                                                       
 lcd.println("Modulo RTC no encontrado !");
 while (1);                                            
                                                       
}

rtc.adjust(DateTime(__DATE__, __TIME__));       



void loop() {    
 tira.setBrightness(20);
 tira.setPixelColor(0, 0, 0, 0);
 tira.show();
                                        
 DateTime fecha = rtc.now();   
 
 lcd.setCursor(4,0);
 lcd.print(fecha.day());                             
 lcd.print("/");                                    
 lcd.print(fecha.month());
 lcd.print("/");
 lcd.print(fecha.year());
 
 lcd.setCursor(4,1);                                    
 lcd.print(fecha.hour());
 lcd.print(":");
 lcd.print(fecha.minute());
 lcd.print(":");
 lcd.print(fecha.second());
 delay(1000); 

    [color=red]if(fecha.hour(10)){[/color]
     tira.setPixelColor(2, 120, 120, 120);
     }

Tengo problemas con la sentencia “if”, (la verdad es que no se si la tengo que poner, yo espero que si) y el caso es que escriba como la escriba no compila.

1º Puedo usar este comando?

2º Me podéis ayudar??

He probado aponer también:

if(fecha.hour ==10){

entre paréntesis, menor que… no se , de un montón de formas.

el caso es que hasta dicha función si funciona y si esta probado y montado.

Gracias y saludos.

Tu problema es simple si es lo que has posteado aquí.
Faltan } que cierren el setup y el loop

Entonces el código arroja todo tipo de errores que nada tiene que ver con el problema o tal vez lo diga pero no lo veo en tus comentarios.

#include <Arduino.h>
#include <Wire.h>                                      
#include <RTClib.h>  
#include <LiquidCrystal_I2C.h>
#include <Adafruit_NeoPixel.h>
                                
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd (0x26, 2, 1, 0, 4, 5, 6, 7);
Adafruit_NeoPixel tira = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);
          

void setup() {
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);                                    
  lcd.begin(16, 2);
  tira.begin();
  tira.show();

  if (! rtc.begin()) {                                  
    lcd.println("Modulo RTC no encontrado !");
    while (1);                                            
  }
  rtc.adjust(DateTime(__DATE__, __TIME__));      
}


void loop() {    
  tira.setBrightness(20);
  tira.setPixelColor(0, 0, 0, 0);
  tira.show();

  DateTime fecha = rtc.now();  

  lcd.setCursor(4,0);
  lcd.print(fecha.day());                            
  lcd.print("/");                                    
  lcd.print(fecha.month());
  lcd.print("/");
  lcd.print(fecha.year());

  lcd.setCursor(4,1);                                    
  lcd.print(fecha.hour());
  lcd.print(":");
  lcd.print(fecha.minute());
  lcd.print(":");
  lcd.print(fecha.second());
  delay(1000);

  if (fecha.hour(10)){
    tira.setPixelColor(2, 120, 120, 120);
  }
}

Ante todo siempre se ordenado, postea usando sangría o sea seperación desde izq a derecha de todo lo que vas haciendo y conforme abres un if, while, for, lo que sigue debe ir desplazado para que se entienda que es un loop dentro de algo, asi quien lo lee no pierde tiempo entendiendo que has querído hacer.

Mira a ver si ahora funciona.

Pues lo siento pero no compila.

Gracias, sí me había dejado unas llaves en el setup y no copié las del loop que sí estaban.

Y es siempre la línea del comando “if” y como antes, si borro esa línea y la del resultado de la comparación (if) si compila todo, aun copiando tus correcciones.
:frowning:

Yo no puedo ejecutarlo porque no se cuales son las librerías

#include <Wire.h>                                     
#include <RTClib.h> 
#include <LiquidCrystal_I2C.h>
#include <Adafruit_NeoPixel.h>

Necesito los links de cada una o dime si las obtuviste del gestor de librerías del IDE

#include <LiquidCrystal_I2C.h>

esta es la unica que saque del exterior, el resto d¡son del IDE

este es el link:

https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/

Los links van con etiquetas como todo lo demás, lee las normas de nuevo para entender como se postean.

Ahora lo pruebo a ver que ocurre

Acá he corregido tu código y compila sin problemas

#include <Arduino.h>
#include <Wire.h>                                     
#include <RTClib.h> 
#include <LiquidCrystal_I2C.h>
#include <Adafruit_NeoPixel.h>
                               
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd (0x26, 2, 1, 0, 4, 5, 6, 7);
Adafruit_NeoPixel tira = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);
         

void setup() {
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);                                   
  lcd.begin(16, 2);
  tira.begin();
  tira.show();

  if (! rtc.begin()) {                                 
    lcd.println("Modulo RTC no encontrado !");
    while (1);                                           
  }
  rtc.adjust(DateTime(__DATE__, __TIME__));     
}


void loop() {   
  tira.setBrightness(20);
  tira.setPixelColor(0, 0, 0, 0);
  tira.show();

  DateTime fecha = rtc.now(); 

  lcd.setCursor(4,0);
  lcd.print(fecha.day());                           
  lcd.print("/");                                   
  lcd.print(fecha.month());
  lcd.print("/");
  lcd.print(fecha.year());

  lcd.setCursor(4,1);                                   
  lcd.print(fecha.hour());
  lcd.print(":");
  lcd.print(fecha.minute());
  lcd.print(":");
  lcd.print(fecha.second());
  delay(1000);

  if (fecha.hour()== 10){   // <=== LINEA DEL PROBLEMA
    tira.setPixelColor(2, 120, 120, 120);
  }
}

Hola de nuevo y gracias de nuevo, lo pruebo ahora mismo.

Respecto a tu comentario anterior, te refieres a que lo haga igual que cuando pongo el código??

Creo que antes de seguir voy a "terminar de leer" las normas.

Ya he leido las normas, gracias por la paciencia.

Una pregunta:

has insertado una librería que yo no tengo y no se que es, me explicas parea que sirve??

#include <Arduino.h>

Saludos.

Olvidala. La uso porque no uso IDE.

Funciona, perfecto.

Antes de terminar.

Basándote en el código anterior, puedes darme una ligera opinión sobre de que puede ser que el lcd me muestre 3 dígitos en el segundero cuando el minutero tiene uno solo? cuando el minutero tiene 2 el segundero muestra do, parece como si ese segmento tuviera que tener un dígito siempre y cuando no lo tiene que tener muestra el 9.

Si quieres abro otro foro pero creo que una tonteria como la del if como para abrir otro.

Gracias

Es que esta mal programado.

Esta forma resuelve el problema,

void loop() {    
  char buffer[20];

  tira.setBrightness(20);
  tira.setPixelColor(0, 0, 0, 0);
  tira.show();

  DateTime fecha = rtc.now();  

  lcd.setCursor(4,0);
  sprintf(buffer, "%02d/%02d/%4d", fecha.day(), fecha.month(), fecha.year());
  lcd.print(buffer);
 
  lcd.setCursor(4,1);    
  sprintf(buffer, "%02d:%02d:%02d", fecha.hour(), fecha.minute(), fecha.second());
  lcd.print(buffer);
  delay(1000);

  if (fecha.hour(10)){
    tira.setPixelColor(2, 120, 120, 120);
  }
}

sprintf() es una rutina que convierte lo que tienes entre " " usando un formato preestablecido para enteros, cadenas, binarios, etc a una cadena de caracteres que he llamado buffer y que tiene como máximo la longitud de columnas de tu lcd o sea 20 caracteres.
Solo posicionas con lcd.setCursor y estableces que deseas imprimir (todo menos floats).
%02d quiere decir
d es para enteros
2 que reserva dos espacios asi que si tu entero es 9 o 14 no importa
el 0 a la izquierda completará con un 0 si el entero es de solo un dígito y de lo contrario pondrá los dos digitos que correspondan.
obviamente % es el delimitador que entiende la instrucción para formatear lo que sigue

Asi como ves he formado un formato para fechas y horas
00/00/0000 fechas o sea esperas cosas como
12/03/2020 para la fecha de hoy

y 00:00:00 para la hora
en este momento son las 18:44:05 o sea que en tu caso el 5 haría que se desplace todo a la derecha pero aca se muestra asi

18:44:05

ok, Tomo nota.

Un placer y muuuuuuchas gracias por prestarme tu tiempo, que hace del mio el desahogo de mi tiempo libre.

Gracias a ti y a la comunidad.

Saludos cordiales

J.