128x64 LCD 上的模拟、数字时钟和温度计
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
|
关于这个项目
在 arduinoecia 网页上展示了带有 128x64 LCD 图形显示器的 Arduino 时钟、一个用于调整显示对比度的电位器、DS3231 RTC 模块和一个按钮。 RTC 模块通过 A4 (SDA) 和 A5 (SCL) 引脚连接到 Arduino。该按钮连接到数字引脚 3,通过软件启用 Arduino 的内部上拉电阻。该程序使用了一些您必须在编译前安装的库。解压缩库并将它们放在 Arduino IDE 的 LIBRARIES 文件夹中。
程序有两个屏幕:第一个( screen_1 ),显示模拟时钟、数字时钟以及当前日期和温度。
第二个屏幕 ( screen_2 ) 显示数字时钟、星期几、日期和当前温度信息、最低温度和最高温度。通过按下连接到数字引脚 3 的按钮选择屏幕。
要设置 RTC DS3231 模块的日期和时间,请使用串行监视器并以年、月、日、时、分、秒格式输入信息。
如果您输入的信息正确,则会显示消息“ ”。
代码
- 代码
- 图书馆
代码Arduino
//Programa:Display LCD 128x64 e RTC DS3231//Autor:Arduino e Cia#include#include #include #include #include //A linha abaixo 定义为 conexoes do display e deve ser //ajustadaconforme o modelo utilizadoU8GLIB_ST7920_128X64_1X u8g(6, 5, 4 , 7); //启用, RW, RS, RESETint X2 =0;int Y2 =0;int X3 =0;int Y3 =0;float angulo =0;int posicao =0;int posicaoh =0;int tempatura =0;int min_temp =500;int max_temp =-500;int ScreenWith =128;int ScreenWithC =96;int ScreenHeight =64;int ScreenHeightC =32;#define botao 3int estado_botao =0;char* dia_da_semana[]={ "Sun", "Mon ", "Tue", "Wed", "Thu", "Fri", "Sat"};void tela_1() { u8g.drawRFrame(0, 0, 128, 64, 3); //Mostra tempatura u8g.setPrintPos(20, 30); u8g.print(温度); u8g.drawStr(42, 30, "C"); u8g.drawCircle(37, 34, 2); mostra_relogio_digital(); //Mostra relogio analogico fundo_relogio(); //Atualiza Ponteiro de horas desenha_ponteiro(hour()-1, 12.0, 10); //Atualiza Ponteiro de minutos desenha_ponteiro(minute()-5, 60.0, 19); //Atualiza Ponteiro 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)]); //Mostra tempatura atual u8g.setPrintPos(83, 19); u8g.print(温度); u8g.drawStr(105, 19, "C"); u8g.drawCircle(100, 12, 2); //最低温度 u8g.setPrintPos(98, 36); u8g.print(min_temp); u8g.drawCircle(113, 29, 2); //Mostra tempatura maxima 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 + 半径 * 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++) { //Desenha linhas relogio analogico 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(){ //Mostra a data 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()); //Mostra hora e minutos u8g.drawRBox(3, 4, 62, 21,2); u8g.setColorIndex(0); u8g.setFont(u8g_font_fub17); u8g.drawStr(29,21,":"); //Acerta a posicao do digito caso a hora //seja menor do que 10 if (hour() <10) { u8g.drawStr(3,23,"0"); posicaoh =16;否则 posicaoh =3; u8g.setPrintPos(posicaoh, 23); u8g.print(小时()); //Acerta a posicao do digito caso o minuto //seja menor do que 10 if (minute() <10) { u8g.drawStr(38,23,"0"); posicao =51; } 否则 posicao =38; u8g.setPrintPos(posicao,23); u8g.print(分钟()); u8g.setColorIndex(1);}void setup() { pinMode(3, INPUT_PULLUP); Serial.begin(9600);如果 (u8g.getMode() ==U8G_MODE_R3G3B2) u8g.setColorIndex(255); // 白色 else if ( u8g.getMode() ==U8G_MODE_GRAY2BIT ) u8g.setColorIndex(3); // 最大强度 else if ( u8g.getMode() ==U8G_MODE_BW ) u8g.setColorIndex(1); // setSyncProvider(RTC.get) 上的像素;串行 < =max_temp){ max_temp =温度; } if (temperatura <=min_temp) { min_temp =tempatura; } 静态 time_t tLast;时间_t; tmElements_t tm; //Verifica se foi setado um novo horario //格式:ano, mes, dia, hora, minuto, segundo if (Serial.available()>=12) { int y =Serial.parseInt(); if (y>=100 &&y <1000) Serial< =1000) tm.Year =CalendarYrToTm(y); else //(y <100) 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);设置时间(t); Serial < 0) Serial.read(); } } t =现在();如果(t !=tLast){ tLast =t;打印日期时间(t);串行< 0) Serial < 库Arduino
无预览(仅限下载)。
示意图
制造工艺