前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ESP8266直连1602实现桌面时钟

ESP8266直连1602实现桌面时钟

原创
作者头像
角落工程师
发布2022-06-11 09:09:48
1.7K0
发布2022-06-11 09:09:48
举报
文章被收录于专栏:工程师养成记

用ESP8266 node MCU开发板和1602A的LCD屏,参考网上教程做了个桌面时钟。没有什么技术含量,主要是为了积累通过MCU驱动屏幕显示的经验,方便以后做功能更多更具实用性的东西。

先上个最终的结果图:

8266_1602.jpg
8266_1602.jpg

焊点那个鸟样一言难尽,我真实水平不这样

硬件部分
  1. ESP8266 node MCU开发板
  2. 1602A LCD 显示屏
  3. 10K 电位器(或者用电阻代替,有教程上说5K的电阻比较合适)
  4. 面包板和杜邦线

因为我没有I2C的转接板,所以用8266与1602A直接连的,这种方式就需要占用更多的MCU IO口,连线看上去也就比较乱。下面先给出node MCU开发板的引脚图和1602A的引脚图,方便大家对各个引脚的功能有个大致了解:

node MCU 引脚图
nodemcu.png
nodemcu.png
1602引脚说明
1602.png
1602.png
node MCU 和 1602引脚连接关系(按引脚标识)

MCU

1602

D1

D4

D2

D5

D3

D6

D4

D7

D5

E

D6

RS

GND

VSS、RW、K

VIN

VDD、A

GND

V0

这个连接关系基本是参考网上的方法来的,结果证明也是可行的。需要说明一下的就是,上面这个连接关系图是按照引脚标识写的,如果按引脚序号来说,LCD的1、5、16引脚需要接开发板的GND,LCD的2,15引脚需要接开发板的VIN,看清楚就行。

最后有一个特别要注意的地方就是1602的V0引脚,也就是第3个引脚,不能悬空,这个是调整对比度的引脚,如果不连接或者连接后调整不好,会导致内容在屏幕上看不到,这个坑曾让我误以为是别的引脚接的不对。这个引脚我没查到具体怎么接,我是用一个10K的电位器,开发板的GND(或者是D2引脚)接电位器的输入,电位器的输出接这个1602的V0,然后调整电位器,直到屏幕能清晰展示。

ESP8266 固件程序

固件程序是直接用的别人的代码,只做了小小改动。程序是基于Arduino的,用的也是Arduino 官方IDE,如果没有配置过ESP8266的开发环境,那还需要先配置好node MCU 的开发板环境,然后安装好用到的函数库。怎么配环境和安装函数库这里就不说了,网上的教程也很多。

功能也很简单,就是利用ESP8266的WI-FI功能,连接好Wi-Fi后,请求NTP服务器获取网络时间,然后在屏幕上显示出来。

直接给出全部代码:

代码语言:c
复制
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>               
#include <TimeLib.h>                 
#include <LiquidCrystal.h>
  
LiquidCrystal lcd(D6, D5, D1, D2, D3, D4); 

char* ssid = "your-wifi-name";  //wifi 名称
char* password = "your-wifi-pwd";   //wifi 密码

WiFiUDP ntpUDP;
//设置NTPClient
#define NTP_OFFSET   60 * 60 * 8  // 时区偏移量
#define NTP_ADDRESS  "ntp1.aliyun.com"  // NTP服务器


NTPClient timeClient(ntpUDP,  NTP_ADDRESS, NTP_OFFSET);

char Time[ ] = "TIME:00:00:00";
char Date[ ] = "DATE:00/00/2000";
byte last_second, second_, minute_, hour_, day_, month_;
int year_;

 

void setup() {

  Serial.begin(115200);
  lcd.begin(16, 2);                 // Initialize 16x2 LCD Display
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(Time);
  lcd.setCursor(0, 1);
  lcd.print(Date);

  WiFi.begin(ssid, password);
  Serial.print("Connecting.");

  while ( WiFi.status() != WL_CONNECTED ) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("connected");
  timeClient.begin();
}
 

void loop() {

  timeClient.update();
  unsigned long unix_epoch = timeClient.getEpochTime();    // Get Unix epoch time from the NTP server

  second_ = second(unix_epoch);
  if (last_second != second_) {
 

    minute_ = minute(unix_epoch);
    hour_   = hour(unix_epoch);
    day_    = day(unix_epoch);
    month_  = month(unix_epoch);
    year_   = year(unix_epoch);

 

    Time[12] = second_ % 10 + 48;
    Time[11] = second_ / 10 + 48;
    Time[9]  = minute_ % 10 + 48;
    Time[8]  = minute_ / 10 + 48;
    Time[6]  = hour_   % 10 + 48;
    Time[5]  = hour_   / 10 + 48;

 

    Date[5]  = day_   / 10 + 48;
    Date[6]  = day_   % 10 + 48;
    Date[8]  = month_  / 10 + 48;
    Date[9]  = month_  % 10 + 48;
    Date[13] = (year_   / 10) % 10 + 48;
    Date[14] = year_   % 10 % 10 + 48;

    Serial.println(Time);
    Serial.println(Date);

    lcd.setCursor(0, 0);
    lcd.print(Time);
    lcd.setCursor(0, 1);
    lcd.print(Date);
    last_second = second_;

  }
  delay(500);
}

按照上述方法连接好,然后把程序编译好后下载到开发板中,上电,调整电位器,就能看到时间显示在屏幕上了。

总结

以上主要是对调试的过程做了个总结,原理性的东西比如引脚为什么要这么接、代码为什么要这么写,还需要自己再去理解和查阅资料。后续计划换TFT屏幕做更美观更具实用性的桌面信息牌。

春未老,风细柳斜斜

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 硬件部分
    • node MCU 引脚图
      • 1602引脚说明
        • node MCU 和 1602引脚连接关系(按引脚标识)
        • ESP8266 固件程序
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档