Control de luces de Acuario

Yo solo quería ver que se habia mostrado en la pantalla con el testText y creo que fue esto

unsigned long testText() {
  tft.fillScreen(BLACK);
  unsigned long start = micros();
  tft.setCursor(0, 0);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(YELLOW); tft.setTextSize(2);
  tft.println(1234.56);
  tft.setTextColor(RED);    tft.setTextSize(3);
  tft.println(0xDEADBEEF, HEX);
  tft.println();
  tft.setTextColor(GREEN);
  tft.setTextSize(5);
  tft.println("Groop");
  tft.setTextSize(2);
  tft.println("I implore thee,");
  tft.setTextSize(1);
  tft.println("my foonting turlingdromes.");
  tft.println("And hooptiously drangle me");
  tft.println("with crinkly bindlewurdles,");
  tft.println("Or I will rend thee");
  tft.println("in the gobberwarts");
  tft.println("with my blurglecruncheon,");
  tft.println("see if I don't!");
  return micros() - start;
}

Si es así y esto toma 189572 useg = 189.5 mseg entonces tenemos un ganador.
Hace lo que quieres a esa velocidad.

Crea un nuevo sketch modificando este. Quitando todo lo demás y que quede el texto, elimina lo que no sirve y agrega el soporte RTC para leer la hora.

No se si entiendo a lo que te refieres, he creado este código:

#include <Wire.h>
#include "RTClib.h"
#include <UTFTGLUE.h>             //tft
UTFTGLUE tft(0,A2,A1,A3,A4,A0);   //tft

RTC_DS3231 rtc; // Declaramos un RTC DS3231

unsigned long S ;

//Declaramos variables monitor TFT---------------------------------------
int Segundo,Minuto,hora,dia,mes,diaDeLaSemana;
char Vsegundo[2];

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define GRAY    0x8410

uint16_t version = MCUFRIEND_KBV_H_;

DateTime HoraFecha;

void setup () {
  Serial.begin(9600);

   // Comprobamos si tenemos el RTC conectado
  if (! rtc.begin()) {
   Serial.println("No hay un módulo RTC");
   while (1);
  }

  //definimos propiedades monitor tft------------------------------------------------ 
    uint16_t ID = tft.readID(); //
    tft.begin(ID);
    tft.setRotation(1); //pantalla horizontal
    tft.fillScreen(0x0000); //Rellenamos la pantalla de color negro
}

 
void loop () {
  DateTime now = rtc.now();
  HoraFecha = rtc.now(); //obtenemos la hora y fecha actual
  
  if (millis() - S> 1000UL) {   //mostrará la hora cada 1 segundo o 1000 mseg
    queSegundo();  
    testText();
                     
      S = millis();
      Serial.println(S);
  }
}

void queSegundo(){
  Segundo = HoraFecha.second();
}

unsigned long testText() {
  sprintf(Vsegundo,"%02d", Segundo);
  tft.setCursor(155, 60);
  tft.setTextColor(WHITE, BLACK); 
  tft.setTextSize(4);
  tft.println(Vsegundo);
  
 /* tft.fillScreen(BLACK);
  unsigned long start = micros();
  tft.setCursor(0, 0);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(YELLOW); tft.setTextSize(2);
  tft.println(1234.56);
  tft.setTextColor(RED);    tft.setTextSize(3);
  tft.println(0xDEADBEEF, HEX);
  tft.println();
  tft.setTextColor(GREEN);
  tft.setTextSize(5);
  tft.println("Groop");
  tft.setTextSize(2);
  tft.println("I implore thee,");
  tft.setTextSize(1);
  tft.println("my foonting turlingdromes.");
  tft.println("And hooptiously drangle me");
  tft.println("with crinkly bindlewurdles,");
  tft.println("Or I will rend thee");
  tft.println("in the gobberwarts");
  tft.println("with my blurglecruncheon,");
  tft.println("see if I don't!");
  return micros() - start;*/
}

Si pongo el ejemplo que has puesto antes me da de resultado que tarda S=1876
Si pongo el segundero mas el código que has puesto (este código sin comentarios) S=1922
Si pongo solo el segundero S=1047

En los tres casos dura mas de 1 seg, así que no se....

No es posible.
dijiste que te llevaba 189.5 mseg como ahora te toma 1 segundo.

Como calculas el tiempo transcurrido?

Por un lado tenemos el testText que es el que ha dado esos 189.5 mseg...

Y aquí debe de venir mi confusión, seguramente no lo estoy calculando bien o me estoy liando con las unidades o no se... pero cuando lo pongo ahí, si resto los tiempos que me va dando, por ejemplo entre el segundo valor y el tercero me da que tarda los tiempos que he indicado antes

  if (millis() - S> 1000UL) {   //mostrará la hora cada 1 segundo o 1000 mseg
    queSegundo();  
    testText();
                     
      S = millis();
      Serial.println(S);
  }

Si pongo el ejemplo que has puesto antes me da de resultado que tarda S=1876
Si pongo el segundero mas el código que has puesto (este código sin comentarios) S=1922
Si pongo solo el segundero S=1047

Lo curioso es que antes hice una prueba sacando del if la función testText(); como resultado da un error, tiempo 00 y entre medias de forma muy rápida e intermitente si que pinta el segundero de forma correcta.... con lo que creo que no es un problema de velocidad del tft sino de programación, vamos que algo no estoy haciendo bien.

(Antes de que me caiga la bronca... si vale de algo decir que no soy programador ;))

Asi estas midiendo mal
Como vas a medir el tiempo Absoulto.

S = millis();
 Serial.println(S);

Lees S y lo imprimes eso no dice que tarde 1876 mseg o mayor.

A ver.. voy a revistar el código. Y luego lo posteo aca. Asi que revista esta respueta que editaré luego.

void loop () {
  DateTime now = rtc.now();
  HoraFecha = rtc.now(); //obtenemos la hora y fecha actual
  
  if (millis() - S> 1000UL) {   //mostrará la hora cada 1 segundo o 1000 mseg
      unsigned long start = micros(); 
      testText();
      Serial.println(micros() - start);
      S = millis();
  }
}

Asi debe ser!

oks muchas gracias!

Los resultados son estos:

Solo con el ejemplo del texto alterna estos tres valores:874964, 874960, 874968

Solo con el segundero quitando el texto ejemplo testText va dando valores desde 46108 46112, 46128,46124, creo que llega a 46136... veo que se salta un segundo de vez en cuando

Si pongo los segundos y el ejemplo de texto se mueve en estos rangos: 921068, 921080, 92088, 92092

Coloca los segundos y quita el testText que no tiene sentido.

asi dices?

#include <Wire.h>
#include "RTClib.h"
#include <UTFTGLUE.h>             //tft
UTFTGLUE tft(0,A2,A1,A3,A4,A0);   //tft

RTC_DS3231 rtc; // Declaramos un RTC DS3231

unsigned long S ;

//Declaramos variables monitor TFT---------------------------------------
int Segundo;
char Vsegundo[2];

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define GRAY    0x8410

uint16_t version = MCUFRIEND_KBV_H_;

DateTime HoraFecha;

void setup () {
  Serial.begin(9600);

   // Comprobamos si tenemos el RTC conectado
  if (! rtc.begin()) {
   Serial.println("No hay un módulo RTC");
   while (1);
  }

  //definimos propiedades monitor tft------------------------------------------------ 
    uint16_t ID = tft.readID(); //
    tft.begin(ID);
    tft.setRotation(1); //pantalla horizontal
    tft.fillScreen(0x0000); //Rellenamos la pantalla de color negro
}

void loop () {
  DateTime now = rtc.now();
  HoraFecha = rtc.now(); //obtenemos la hora y fecha actual
  
  if (millis() - S> 1000UL) {   //mostrará la hora cada 1 segundo o 1000 mseg
    unsigned long start = micros(); 
    queSegundo();                 
      S = millis();
      Serial.println(micros() - start);
  }
}

unsigned long queSegundo() {
  Segundo = HoraFecha.second();
  sprintf(Vsegundo,"%02d", Segundo);
  tft.setCursor(155, 60);
  tft.setTextColor(WHITE, BLACK); 
  tft.setTextSize(4);
  tft.println(Vsegundo);
}

De esta forma es lo que comentaba, salta un segundo cada 10 o 20, las lecturas que da son de 46108 a 46136

Ok. Vamos a organizarnos.

Olvidemos esto por ahora.

Que deberías presentar en el TFT?

la hora, fecha, qué mas?

Necesito que trabajemos en algo mas concreto y definitivo porque será febrero y seguiremos con esto a este ritmo.

Y como te dije.. los temas cuando se alargan dejan de interesarme.
Asi que hay que concretar.

Haz una lista de lo que tienes que presentar en la pantalla y con que tamaño y color.

Entonces veremos cómo hacerlo TODO dentro de los márgenes disponibles.

OKs, la idea es que en la pantalla muestre la hora, minuto, segundo, día, mes, año y día de la semana.

Ademas debe mostrar las temperaturas de los 7 sensores... bueno realmente lo hace, pero con los problemas que ya comente

Ahí pongo el código completo que tengo por el momento

Al final si que se esta alargando la cosa!, muchas gracias por la ayuda y paciencia

leds_Acuario_completo_2.ino.ino (16.8 KB)

Por Fin!!! hoy he tenido la tarde inspirada y ya he conseguido que funcione todo!!! ;D

Una pregunta.... hay alguna forma de hacer que guarde variables en la memoria?

Ahora mismo si hay un corte de luz, las luces se vuelven un poco locas hasta que van pasando las horas y se van asignando los valores como corresponde.

Bueno ahí pongo el código completo y funcionado!

leds_Acuario_completo_3.ino.ino (16.6 KB)

Lo guardas en la EEPROM pero debes asegurarte de usarlo una vez no dentro de un loop porque la cantidad de usos de la EEPROM esta limitada. Cuantas veces? 100.000. Son muchas? parecen muchas pero si un loop x error graba sin control las 100.000 se agotarán enseguida.

Hola!me alegro de que finalmente lo hayais conseguido. yo tengo una duda al respecto para un proyecto parecido.
que modelo de mosfet utilizariais para el mismo proyecto pero alimentado con una fuente de 12v y 8.5A ?

muchas gracias de antemano.

Puedes usar un MOSFET IRL520 en adelante.
El IRL520 permite hasta 9.2A a 25 Celsius
El IRL530 permite hasta 15 A que me parece el mas apropiado.

@Tortugaz, para la próxima recuerda hacer tus preguntas en tu propio hilo (Sección Hardware) sin desviar la idea de ESTE hilo.
Como no lo haces del todo te he respondido pero acá termina la consulta.
Si te interesa seguir, crea un un hilo propio.

Mil gracias @surbyte

Aunque ya parecía que estaba todo funcionando he ido mejorando el programa, pero me quedaba un cabo suelto, los ventiladores:

Unas veces se encendían los 4, otras 3 y otras 2... pensaba que era por que habría alguna soldadura mal puesta, las repase.... y seguían fallando igual.

Así que dándole vueltas empece a tomar lecturas del voltaje que llega a los ventiladores y me he dado cuenta que de la salida del transistor 2N2222 solo esta entregando por el emisor 3,9V como mucho, con lo que no es suficiente para poder moverlos

Se supone que esos transistores pueden trabajar con 12V no?, al final puse unos ventiladores de 12V.... pero vamos que no les llegan ni los 5V que deberían llegarles, he probado aponer el step donw a 7V y el transistor sigue dando 3,9V

Según el Datasheet entiendo que estos transistores deberían funcionar sin problemas... que puede estar pasando? puede ser por haber unido los GRN? (los he separado y creo que pasa igual)

Tendría que poner otros transistores que aguanten mas V?, cual iría mejor?

Ahí pongo el gráfico y el programa mejorado tal y como lo tengo en estos momentos:

leds_Acuario_completo_3.ino.ino (17.2 KB)

Wow, de no saber nada, sobre arduino, y sus diferentes aplicaciones mi interés de automatizar mi acuario subido mas.

Espero que logres detectar el fallo, ya sean los transistores 2n2222 u otra complicacion.

Felicidades por tu perseverancia en el proyecto, seguiré estudiando analizando cada línea del sketch para aprender.

Gracias!

Si, resolví el problema, al final puse un TIP120, y modifique un poco las uniones de los GRN ya funciona perfecto el circuito. Adjunto el esquema definitivo. La pantalla la tengo funcionando desde enero y va perfecta por el momento.

También pongo el código con algunas mejoras que hice, aunque tengo pendiente revisar el tiempo exacto de los millies del contador del dimmer, hay un pequeño desfase que aun no he podido revisar.

leds_Acuario_completo_5.ino.ino (16.9 KB)

Felicitaciones @Perdido.