选择了FastBond主题五:智能建筑
简介:
本项目使用ESP-12F模组作为主控,控制2.13寸的墨水屏进行数据显示。带DS1302实时时钟芯片,可作为断网时的时钟使用,联网的情况下,通过ESP-12F连接到NTP服务器端获取网络的时间并校准本地的DS1302时间。带TC4056A充电管理芯片,可对锂电池进行充电使用,使得板子可以使用锂电池进行供电,减少线路的束缚。
硬件介绍:
3、实时时钟芯片:DS1302
厂家:MAXIM
用途:读取和存储实时时钟信息
4、充放电管理:TC4056A
厂家:富满电子
用途:锂电池管理,用于控制锂电池的充放电
5、下载芯片:CH340C
厂家:WCH
用途:用于将程序代码下载到ESP-12F中
关键性代码及说明:
1、硬件接口
e-Peper ESP-12F
CLK <------> IO14
MOSI <------> IO13
CS <------> IO15
DC <------> IO0
RST <------> IO2
BUSY <------> IO4
GND <------> GND
VCC <------> VCC
DS1302 ESP-12F
DATA <------> IO16
CLK <------> IO5
CE <------> IO12
GND <------> GND
VCC <------> VCC
#include <Arduino.h>
#include "SPI.h"
#include "PDLS_EXT3_Basic.h"
#include <ThreeWire.h>
#include <RtcDS1302.h>
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
// DS1302 CLK/SCLK --> ESP-12F 5
// DS1302 DAT/IO --> ESP-12F 16
// DS1302 RST/CE --> ESP-12F 12
int DS1302_RST = 12;
int DS1302_DAT = 16;
int DS1302_CLK = 5;
const char *ssid = "Xiaomi_5E92";
const char *password = "qwer0129";
ThreeWire myWire(DS1302_DAT,DS1302_CLK,DS1302_RST); // DAT, CLK, RST
RtcDS1302<ThreeWire> Rtc(myWire);
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
Screen_EPD_EXT3 myScreen(eScreen_EPD_EXT3_213, boardLaunchPad); // size:212x104
void wait(uint8_t second)
{
for (uint8_t i = second; i > 0; i--)
{
Serial.print(formatString(" > %i \r", i));
delay(1000);
}
Serial.print(" \r");
}
int count = 50;
int sysMode = 0; // 0->WiFi模式 1->本地模式
RtcDateTime dt;
String timeStr = "";
unsigned long lastConnectionTime = 60000;
unsigned long postingInterval = 60000; // 查询时间间隔 单位 毫秒
RtcDateTime now;
void setup()
{
Rtc.Begin();
Serial.begin(115200);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED && count != 0)
{
delay ( 500 );
Serial.print ( "." );
count--;
}
if (WiFi.status() == WL_CONNECTED)
{
sysMode = 0;
timeClient.setTimeOffset(60*60*8); //东八区时间设置
timeClient.begin();
Serial.println("WL_CONNECTED");
if (!Rtc.IsDateTimeValid())
{
timeClient.update();
now = RtcDateTime(2021, 12, 01, timeClient.getHours(), timeClient.getMinutes(), timeClient.getSeconds());
Rtc.SetDateTime(now); //调用SetDateTime函数为RTC模块写入时间
}
}
else
{
sysMode = 1;
}
myScreen.begin();
myScreen.clear();
myScreen.setOrientation(7);
myScreen.setPenSolid();
myScreen.selectFont(Font_Terminal16x24);
}
void loop()
{
if (millis() - lastConnectionTime > postingInterval)
{
lastConnectionTime = millis();
switch (sysMode)
{
case 0: // WiFi模式
timeClient.update();
timeStr = timeClient.getFormattedTime();
now = RtcDateTime(2021, 12, 01, timeClient.getHours(), timeClient.getMinutes(), timeClient.getSeconds());
Rtc.SetDateTime(now); // 调用SetDateTime函数为RTC模块写入时间
break;
case 1: // 本地模式
now = Rtc.GetDateTime();
timeStr = String(now.Hour())+String(":")+String(now.Minute())+String(":")+String(now.Second());
break;
}
// 显示数据
myScreen.gText(42, 30, timeStr, myColours.red);
myScreen.flush();
Serial.println(timeStr);
}
}
总结:
这次参加FastBond的活动。学习到了很多以前没有了解到的知识,也玩儿了一些更有意思的模块,增加了学习的兴趣。这次开发使用了Arduino进行开发,用到了很多的库函数,基于这些库函数,可以让开发变得更加的轻松,可以快速的实现想要的效果。