用ESP8266 node MCU开发板和1602A的LCD屏,参考网上教程做了个桌面时钟。没有什么技术含量,主要是为了积累通过MCU驱动屏幕显示的经验,方便以后做功能更多更具实用性的东西。 先上个最终的结果图:
焊点那个鸟样一言难尽,我真实水平不这样
硬件部分
- ESP8266 node MCU开发板
- 1602A LCD 显示屏
- 10K 电位器(或者用电阻代替,有教程上说5K的电阻比较合适)
- 面包板和杜邦线
因为我没有I2C的转接板,所以用8266与1602A直接连的,这种方式就需要占用更多的MCU IO口,连线看上去也就比较乱。下面先给出node MCU开发板的引脚图和1602A的引脚图,方便大家对各个引脚的功能有个大致了解:
node MCU 引脚图
1602引脚说明
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 <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";
char* password = "your-wifi-pwd";
WiFiUDP ntpUDP;
#define NTP_OFFSET 60 * 60 * 8
#define NTP_ADDRESS "ntp1.aliyun.com"
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);
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();
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前端开发!一起来交流进步吧!
|