选择了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进行开发,用到了很多的库函数,基于这些库函数,可以让开发变得更加的轻松,可以快速的实现想要的效果。