ESP8266直连1602实现桌面时钟

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

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

硬件部分

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

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

node MCU 引脚图ESP8266直连1602实现桌面时钟_第2张图片
1602引脚说明

ESP8266直连1602实现桌面时钟_第3张图片

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服务器获取网络时间,然后在屏幕上显示出来。

直接给出全部代码:

#include 
#include 
#include                
#include                  
#include 
  
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屏幕做更美观更具实用性的桌面信息牌。


春未老,风细柳斜斜

我的微信公众号

名称:工程师小凤
微信号:theyfaded
我有丰富的.NET、C++、Python开发经验,现在从事方向为物联网,同时一直在学习和实践Web前端开发!一起来交流进步吧!
ESP8266直连1602实现桌面时钟_第4张图片

你可能感兴趣的:(工具使用,单片机,iot)