Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Reloj Inteligente LCD 128x64 con Hora Analógica/Digital y Temperatura – Arduino Nano + RTC DS3231

Componentes y materiales

Componente Cantidad Notas
Arduino Nano R3 1
Maxim Integrated DS3231M - ±5ppm, RTC I2C 1
Potenciómetro mono-vuelta - 10k ohmios 1 Para ajuste de contraste del display
Pulsador momentáneo 1 Cambio de pantalla
Display LCD gráfico 128x64 1

Herramientas necesarias

Sobre este proyecto

En la página web de Arduino e Cia se presenta un reloj Arduino con display LCD gráfico 128x64, un potenciómetro para ajustar el contraste del display, el módulo RTC DS3231 y un pulsador. El módulo RTC se conecta al Arduino en los pines A4 (SDA) y A5 (SCL). El botón se conecta al pin digital 3, con la resistencia pull-up interna de Arduino habilitada via software. El programa usa algunas librerías que tendrás que instalar antes de compilar. Descomprime las librerías y colócalas dentro de la carpeta LIBRARIES del IDE de Arduino.

El programa tiene dos pantallas:

Las pantallas se seleccionan presionando el pulsador conectado al pin digital 3.

Vista del reloj en funcionamiento
[Imagen del proyecto]

Para configurar la fecha y hora del módulo RTC DS3231, usa el monitor serie e introduce la información en formato: año, mes, día, hora, minuto, segundo.

Si escribiste la información correctamente, se mostrará el mensaje "Horario modificado para:" seguido de la fecha y hora configurada.

Código

Código principal (Arduino)

// Programa: Display LCD 128x64 y RTC DS3231
// Autor: Arduino e Cia

#include <U8glib.h>
#include <DS3232RTC.h>
#include <Streaming.h>
#include <Time.h>
#include <Wire.h>

// La línea siguiente define las conexiones del display y debe
// ajustarse conforme al modelo utilizado
U8GLIB_ST7920_128X64_1X u8g(6, 5, 4, 7); // Enable, RW, RS, RESET

int X2 = 0, Y2 = 0, X3 = 0, Y3 = 0;
float angulo = 0;
int posicao = 0, posicaoh = 0;
int temperatura = 0;
int min_temp = 500, max_temp = -500;
int ScreenWith = 128, ScreenWithC = 96;
int ScreenHeight = 64, ScreenHeightC = 32;

#define botao 3
int estado_botao = 0;

char* dia_da_semana[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

void tela_1() {
  u8g.drawRFrame(0, 0, 128, 64, 3);
  
  // Muestra temperatura
  u8g.setPrintPos(20, 30);
  u8g.print(temperatura);
  u8g.drawStr(42, 30, "C");
  u8g.drawCircle(37, 34, 2);
  
  mostra_relogio_digital();
  
  // Muestra reloj analógico
  fundo_relogio();
  
  // Actualiza manecilla de horas
  desenha_ponteiro(hour() - 1, 12.0, 10);
  // Actualiza manecilla de minutos
  desenha_ponteiro(minute() - 5, 60.0, 19);
  // Actualiza manecilla de segundos
  desenha_ponteiro(second() - 5, 60, 21);
}

void tela_2() {
  u8g.drawRFrame(0, 0, 128, 64, 3);
  u8g.drawRFrame(68, 4, 55, 56, 2);
  mostra_relogio_digital();
  
  u8g.setFont(u8g_font_5x8);
  u8g.drawStr(78, 35, "MIN");
  u8g.drawStr(78, 53, "MAX");
  
  u8g.setFont(u8g_font_6x13);
  u8g.setPrintPos(25, 41);
  u8g.print(dia_da_semana[(weekday() - 1)]);
  
  // Temperatura actual
  u8g.setPrintPos(83, 19);
  u8g.print(temperatura);
  u8g.drawStr(105, 19, "C");
  u8g.drawCircle(100, 12, 2);
  
  // Temperatura mínima
  u8g.setPrintPos(98, 36);
  u8g.print(min_temp);
  u8g.drawCircle(113, 29, 2);
  
  // Temperatura máxima
  u8g.setPrintPos(98, 54);
  u8g.print(max_temp);
  u8g.drawCircle(113, 47, 2);
}

void desenha_ponteiro(float valor, float rotacao, int Radius) {
  angulo = valor * 2.0 * 3.1415 / rotacao - 1.5707;
  X2 = ScreenWithC + Radius * cos(angulo);
  Y2 = ScreenHeightC + Radius * sin(angulo);
  u8g.drawLine(ScreenWithC, ScreenHeightC, X2, Y2);
}

void fundo_relogio() {
  u8g.drawCircle(ScreenWithC, ScreenHeightC, 27);
  u8g.drawCircle(ScreenWithC, ScreenHeightC, 1);
  u8g.setFont(u8g_font_6x13);
  u8g.setFontPosTop();
  u8g.drawStr(90, 9, "12");
  u8g.drawStr(114, 25, "3");
  u8g.drawStr(94, 44, "6");
  u8g.drawStr(74, 25, "9");
  
  for(int traco_minuto = 0; traco_minuto < 12; traco_minuto++) {
    angulo = traco_minuto / 12.0 * 2 * 3.1415;
    X2 = ScreenWithC + 25 * cos(angulo);
    Y2 = ScreenHeightC + 25 * sin(angulo);
    X3 = ScreenWithC + 25 * cos(angulo);
    Y3 = ScreenHeightC + 25 * sin(angulo);
    u8g.drawLine(X2, Y2, X3, Y3);
  }
}

void mostra_relogio_digital() {
  // Muestra la fecha
  u8g.setFont(u8g_font_5x8);
  u8g.setPrintPos(8, 55);
  u8g.print(day());
  u8g.drawStr(19, 55, "/");
  u8g.setPrintPos(24, 55);
  u8g.print(month());
  u8g.drawStr(35, 55, "/");
  u8g.setPrintPos(41, 55);
  u8g.print(year());
  
  // Muestra hora y minutos
  u8g.drawRBox(3, 4, 62, 21, 2);
  u8g.setColorIndex(0);
  u8g.setFont(u8g_font_fub17);
  u8g.drawStr(29, 21, ":");
  
  // Ajusta posición del dígito si la hora es menor que 10
  if (hour() < 10) {
    u8g.drawStr(3, 23, "0");
    posicaoh = 16;
  } else posicaoh = 3;
  
  u8g.setPrintPos(posicaoh, 23);
  u8g.print(hour());
  
  // Ajusta posición del dígito si el minuto es menor que 10
  if (minute() < 10) {
    u8g.drawStr(38, 23, "0");
    posicao = 51;
  } else posicao = 38;
  
  u8g.setPrintPos(posicao, 23);
  u8g.print(minute());
  u8g.setColorIndex(1);
}

void setup() {
  pinMode(3, INPUT_PULLUP);
  Serial.begin(9600);
  
  if (u8g.getMode() == U8G_MODE_R3G3B2) u8g.setColorIndex(255); // white
  else if (u8g.getMode() == U8G_MODE_GRAY2BIT) u8g.setColorIndex(3); // max intensity
  else if (u8g.getMode() == U8G_MODE_BW) u8g.setColorIndex(1); // pixel on
  
  setSyncProvider(RTC.get);
  Serial << F("RTC Sync");
  if (timeStatus() != timeSet) Serial << F(" FAIL!");
  Serial << endl;
}

void loop() {
  temperatura = RTC.temperature() / 4.0;
  
  if (temperatura >= max_temp) max_temp = temperatura;
  if (temperatura <= min_temp) min_temp = temperatura;
  
  static time_t tLast;
  time_t t;
  tmElements_t tm;
  
  // Verifica si se ha establecido una nueva hora
  // Formato: año, mes, día, hora, minuto, segundo
  if (Serial.available() >= 12) {
    int y = Serial.parseInt();
    if (y >= 100 && y < 1000) 
      Serial << F("Error: Año debe tener dos o cuatro dígitos!") << endl;
    else {
      if (y >= 1000) tm.Year = CalendarYrToTm(y);
      else tm.Year = y2kYearToTm(y);
      
      tm.Month = Serial.parseInt();
      tm.Day = Serial.parseInt();
      tm.Hour = Serial.parseInt();
      tm.Minute = Serial.parseInt();
      tm.Second = Serial.parseInt();
      
      t = makeTime(tm);
      RTC.set(t);
      setTime(t);
      Serial << F("Horario modificado para: ");
      printDateTime(t);
      Serial << endl;
      
      while (Serial.available() > 0) Serial.read();
    }
  }
  
  t = now();
  if (t != tLast) {
    tLast = t;
    printDateTime(t);
    Serial << endl;
  }
  
  // Verifica si el botón fue presionado
  boolean valor_botao = digitalRead(3);
  if (valor_botao != 1) {
    while(digitalRead(3) != 1) {
      delay(100);
    }
    // Invierte el estado
    estado_botao = !estado_botao;
  }
  
  // Picture loop
  u8g.firstPage();
  do {
    if (estado_botao == 0) tela_1();
    if (estado_botao == 1) tela_2();
  } while(u8g.nextPage());
  
  delay(10);
}

// Muestra fecha y hora en serie
void printDateTime(time_t t) {
  printI00(day(t), 0);
  Serial << monthShortStr(month(t)) << _DEC(year(t));
  Serial << ' ';
  printI00(hour(t), ':');
  printI00(minute(t), ':');
  printI00(second(t), ' ');
}

// Corrección para imprimir "00" en vez de "0" si el valor es menor que 10
void printI00(int val, char delim) {
  if (val < 10) Serial << '0';
  Serial << _DEC(val);
  if (delim > 0) Serial << delim;
  return;
}

Librerías necesarias

Descarga las librerías e instálalas en la carpeta libraries del IDE Arduino.

Esquemáticos

[Diagrama de conexiones disponible en el proyecto original]

Conexiones principales:

Proceso de manufactura

  1. Reloj POV con Arduino: Construye una pantalla LED de persistencia de visión
  2. Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
  3. Crea Animaciones y Juegos en LCD 16×2 con Arduino UNO
  4. Monitor de Temperatura y Reloj en Tiempo Real con Arduino Due y Pantalla TFT 3.2"
  5. Reloj Digital TM1637 con Configuración de Hora y Alarma - Prototipo Arduino Nano
  6. Construye un voltímetro DIY con Arduino y pantalla Nokia 5110 – Guía paso a paso
  7. Visualiza Temperatura, Humedad y Presión BME280 en Pantalla Táctil Nextion
  8. Medición de Distancia en Tiempo Real con Sonar Arduino y Visualización en Processing
  9. Construye un reloj despertador fiable con RTC DS1302 y Arduino UNO
  10. Señales Analógicas y Digitales: Fundamentos de Instrumentación Industrial
  11. Sensores Analógicos vs Digitales: Tipos, Aplicaciones y Ejemplos Prácticos