[quote='laserdisko' pid='315829' dateline='1490628632']
Hola Antonio y participantes del foro, después de casi 1 año de receso por falta de tiempo he retomado mi proyecto de control del acuario con arduino mostrado en la pagina 25; he cargado el CaoSeta V1.0 y lo he adaptado adicionándole el control de un lcd 16x2 I2c y dos sondas de temperatura sumergibles 18b20 conectadas en modo parásito (que hasta ahora no han dado problemas en las pruebas) a las cuales falta hacerles el modding de impermeabilizado (me parece increible que tengamos que hacer esto, ya compré tres chips 18b20 y si se dañan los sensores "profesionales" haré unos caseros con estos que parece es casi el mismo trabajo), monté en prueba circuitos para control de bombas y calentadores y funcionan correctamente. Para efecto amanecer-anochecer con IRFZ44V ó TIP42C hice pruebas que hasta ahora son buenas y solo falta implementarlo en el código.
El detalle es que no he podido pintar la fecha y la hora en la pantalla lcd 16x2 I2c y, aunque no es estrictamente necesario, me gustaría hacerlo para que la pantalla me muestre las temperaturas de las sondas y la fecha y hora.
Para ello, he realizado pruebas y modificado códigos que me han permitido ver los datos en la pantalla, pero no he podido incluírlos en el código del caoseta.
Por lo anterior, agradecería mucho si me pudieran ayudar para solucionar este detalle.
Con este codigo modificado puedo ver los datos en mi pantalla:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <MD_DS3231.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // configura LCD address a 0x27, 16 caracteres por 2 lineas
#define BUZZER_PIN 11 // digital pin for tone buzzer
void p2dig(uint8_t v)
// Print 2 digits with leading zero
{
if (v < 10) lcd.print("0");
lcd.print(v);
}
char *dow2String(uint8_t code)
// Day of week to string. DOW 1=Sunday, 0 is undefined
{
static char *str[] = {"---", "Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"};
return(str
Código:
);
}
void printTime(void)
// Display the current time on the display
{
// display the date and day
lcd.clear();
lcd.setCursor(0,0);
lcd.print(dow2String(RTC.dow));
lcd.print(" ");
lcd.setCursor(5,0);
lcd.print(RTC.yyyy);
lcd.print("-");
p2dig(RTC.mm);
lcd.print("-");
p2dig(RTC.dd);
// display the current time
lcd.setCursor(2,1);
p2dig(RTC.h);
lcd.print(":");
p2dig(RTC.m);
lcd.print(":");
p2dig(RTC.s);
if (RTC.status(DS3231_12H) == DS3231_ON)
lcd.print(RTC.pm ? " pm" : " am");
lcd.setCursor(13,1);
lcd.print("MGR");
}
void setup()
{
uint8_t c[8];
// initialise 16x2 LCD display shield
lcd.begin(16,2);
lcd.clear();
lcd.noCursor();
lcd.backlight();
// Buzzer
pinMode(BUZZER_PIN, OUTPUT);
// RTC global initialisation
RTC.control(DS3231_12H, DS3231_OFF); // 24 hour clock
}
void loop()
{
RTC.readTime();
printTime();
delay(500);
}
Estoy compilando con windows 10 x64 y el IDE Arduino 1.8.1 y no he tenido problemas con el código del caoseta.
[/quote]
En el codigo de CAO_SETAv1_0 tienes
[code]#include <Arduino.h>
#include <Wire.h> // I2C
// #include "ProgChar.h"
#include "CaoSeta_RTC_DS3231.h"
#include "CaoSeta_ProgPins.h"
#include "CaoSeta_Turn.h"
Y más abajo se usa en las funciones setup() y en la función loop()
Código:
// *****************************************************************************************
// **** SETUP ****
// *****************************************************************************************
void setup() {
Wire.begin();
Serial.begin(9600);
while (!Serial) ; // Necesario esperar para Arduino leonardo y Arduino Pro Micro.
// Verificamos el RTC y si no viene con fecha y hora válidas, forzaremos su inicio
// con una fecha y hora válidas.
while (! VerificarRTC()){
delay(5000);
}
SetPinsProgram();
Turn.EveryMillis(1000);
HelpIntro();
}
// *****************************************************************************************
// **** MAIN LOOP ****
// *****************************************************************************************
void loop(){
GetMonitorSerial(); // Si hay conexion serial permite ajuste
if (Turn.Shoot(1)){ // Si ya le toca el turno (cada segundo)...
// ... actualizar estado de las salidas
RTC.readDateTime(&verano, &year, &month, &dayOfMonth, &dayOfWeek, &hour, &minute, &second);
ProgPins.ActualizarEstadoPins(dayOfWeek, hour, minute, second);
if (Turn.Shoot(15)){ // Si ya le toca el turno (cada 15 seg)...
// ... mostrar Fecha Hora y estado salidas.
Serial_DDMMYYhhmmss(dayOfMonth, month, year, hour, minute, second);
ProgPins.Serial_OutputStatus();
Serial.println();
}
}
}
Al usar unas librerías distintas lo más fácil es respetar las librerías de CAO_SETAv1_0 y añadir solo las librerías y las funcionalidades que necesites para no obligarte a hacer cambios masivos en la aplicacion.
En otras palabras puedes usar la librería LiquidCrystal_I2C.h, pero si usas
la libreria MD_DS3231.h entrará en conflicto con CaoSeta_RTC_DS3231.h
que se usa en toda la aplicación CAO_SETAv1_0
Fíjate como se muestra por el puerto Serial la información del reloj.
Código:
// *****************************************************************************************
// Mostrar fecha hora en formato ES 'DD/MM/YYYY hh:mm:ss' por el puerto Serial
// *****************************************************************************************
void Serial_DDMMYYhhmmss(int DD, int MM, int YY, int hh, int mm, int ss){
char Cad[24];
snprintf(Cad, sizeof(Cad), "%02d/%02d/20%02d %02d:%02d:%02d ",
DD, MM, YY, hh, mm, ss);
Serial.print(Cad);
}
Transformar esa función en una equivalente para LCD sería enviar el String Cad al LCD.
Como tu LCD es de 16x2 tendras que obtener una cadena algo menor y para ello tendrás que usar un formato diferente en snprintf()
Tienes la referencia de snprintf() y algunos ejemplos en
http://www.cplusplus.com/reference/cstdio/snprintf/
Para entender como se especifican los formatos debes mirar en la documentación de printf()
Tienes la referencia de printf() y algunos ejemplos en
http://www.cplusplus.com/reference/cstdio/printf/
Estas funciones necesitan que la correspondencia de los tipos de datos empleados coincida con lo especificado en la cadena que describe el formato, porque en caso contrario los resultados pueden ser erróneos.