FastBond智能建筑之墨水屏时钟
本项目使用ESP-12F模组作为主控,控制墨水屏进行数据显示。带DS1302实时时钟芯片,通过ESP-12F连接到NTP服务器端获取网络的时间并校准本地的DS1302时间。TC4056A充电管理芯片,可以使用锂电池供电。
标签
PCB
墨水屏
实时时钟
燃谷00
更新2021-12-09
1050

选择了FastBond主题五:智能建筑

 

简介:

   本项目使用ESP-12F模组作为主控,控制2.13寸的墨水屏进行数据显示。带DS1302实时时钟芯片,可作为断网时的时钟使用,联网的情况下,通过ESP-12F连接到NTP服务器端获取网络的时间并校准本地的DS1302时间。带TC4056A充电管理芯片,可对锂电池进行充电使用,使得板子可以使用锂电池进行供电,减少线路的束缚。

硬件介绍:

   1、主控芯片:ESP-12F
      厂家:安信可
      用途:主控模块,用于读取温湿度数据以及显示
 
 
   2、LDO芯片:LT1963AEST-3.3
      厂家:ADI       
      用途:将5V输入电压转换为3.3V
 

   3、实时时钟芯片:DS1302
      厂家:MAXIM
      用途:读取和存储实时时钟信息

 

   4、充放电管理:TC4056A
      厂家:富满电子
      用途:锂电池管理,用于控制锂电池的充放电


 
   5、下载芯片:CH340C
       厂家:WCH
       用途:用于将程序代码下载到ESP-12F中

软件介绍:
   Arduino IDE:Arduino IDE是一款专业的Arduino开发工具,主要用于Arduino程序的编写和开发,拥有开放源代码的电路图设计、支持ISP在线烧,同时支持Flash、Max/Msp、VVVV、PD、C、Processing等多种程序兼容的特点。
   Altium Designer:是一个设计原理图和PCB的专业软件,功能十分强大,且使用方便,比较容易上手。
 
原理图简介:
1、供电:采用TYPE-C供电,输入电压为5v。采用ADI的LT1963AEST-3.3芯片将电压降压为3.3v输出。LT1963AEST-3.3是一款低压差稳压器,针对快速瞬态响应进行了优化。该器件能够提供1.5A的输出电流,其压差为340mV。运行静态电流为1mA,关断时降至<1µA。静态电流得到很好的控制,相对于压差的变化并不会上升。除快速瞬态响应外,LT1963A还具有非常低的输出噪声,因此非常适合敏感型射频应用。输出电压范围从1.21V到20V。LT1963A可使用低至10µF输出电容保持稳定。内部保护电路包括反向电池保护,限流,热限制与反向电流保护。
FrOe80avWCnA5Nzn17KMoGZvlLlh
   2、程序下载:CH340C 是一个 USB 总线的转接芯片,实现 USB 转串口功能。其实物封装为标准的 16 脚贴片,CH340C内置时钟,无需外部晶振。设计中主要关注UD-、UD+、TXD、RXD、DTR#、RTS#。CH340C的TXD、RXD分别接到ESP-12F的RX与TX上。UD+、UD-分别对应USB的D+、D-。采用一对数字三极管,通过对DTR#、RTS#的控制,实现对芯片的复位与程序下载(IO0为低电平有效)的控制。
FlIjSkP675IqkTS1pk2dlbsnAamv
   3、充放电管理:TC4056A 是专门为一节锂离子或锂聚合物电池而设计的线性充电器电路,利用芯片内部的功率晶体管对电池进行恒流和恒压充电。充电电流可以用外部电阻编程设定,最大持续充电电流可达 1A,不需要另加阻流二极管和电流检测电阻。TC4056A 包含两个漏极开路输出的状态指示输出端,充电状态指示端 CHRG 和电池故障状态指示输出端 STDBY。
FujY6PAQVeC9QdNS5rXanGdBGxKF
   4、实时时钟:DS1302 可慢速充电实时时钟芯片包含实时时钟/日历和 31 字节的非易失性静态 RAM。它经过一个简单的串行接口与微处理器通信。实时时钟/日历可对秒,分,时,日,周,月,和年进行计数,对于小于31 天的月,月末的日期自动进行调整,还具有闰年校正的功能。
FnlNrBalVgFIsPnl3OMAJXYlAqdi

关键性代码及说明:

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

   2、源码
#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);
    }
}
功能演示结果:
   将实物通过TYPE-C接口连接到电源后,模组会先尝试从网络获取时间,如果网络获取失败,则会读取本地存储的时间,然后进行显示。
FtDgwXG0E3htDbWMYIJo4EQVISel

总结:

  这次参加FastBond的活动。学习到了很多以前没有了解到的知识,也玩儿了一些更有意思的模块,增加了学习的兴趣。这次开发使用了Arduino进行开发,用到了很多的库函数,基于这些库函数,可以让开发变得更加的轻松,可以快速的实现想要的效果。

附件下载
ePaper_Clock.rar
源码
ePaper_Clock.pdf
原理图
团队介绍
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号