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....
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();
}
}
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
#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
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.
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 ?
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.
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:
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.