×

多面液晶闹钟开源分享

消耗积分:0 | 格式:zip | 大小:0.57 MB | 2022-11-03

分享资料个

描述

这个项目是我之前构建的更新版本以前版本的主要问题是,除非背光打开,否则您无法读取显示。要打开背光,您要么必须编译代码以使其永久打开,要么实际按下其中一个按钮。前者不适合,因为我不希望我的房间在我晚上睡觉时被点亮,而后者意味着我必须停止我正在做的事情才能按下其中一个按钮来查看时间。

检测环境光

为了解决上述问题,我添加了一个带有比较器电路的光敏电阻 (LDR)。LDR 会根据其是暗还是亮来改变其电阻。当光线充足时,它将具有低电阻,并且背光打开,从而可以读取屏幕。在黑暗的房间中,电阻很高,它将允许背光关闭。您仍然可以通过按任何按钮将其打开 10 秒钟。

我使用了一个带有微调电位器的简单比较器电路来将光照水平设置为背光应该永久打开的位置。当光照水平接近阈值时,比较器电路会在有少量光照变化时开启和关闭。即 ON 阈值和 OFF 阈值相同。为了解决这个问题,少量的输出被反馈到输入以增强变化(正反馈)。这称为滞后,根据反馈量,这会使 ON 阈值升高,OFF 阈值降低,

pYYBAGNh9w-AIcAKAAFKO8y2vbY520.jpg
R3 提供正反馈,因此有一个不同的 ON 和 OFF 阈值
 

时钟功能

  • 十种不同的展示风格
  • 设置时间、当前日期、出生日期和闹钟
  • 水银开关关闭警报
  • 自动和手动背光控制
  • DHT21温湿度传感器

使用时钟

时钟有三个按钮——设置、增量、减量和一个倾斜开关。

当背光关闭时,按任意按钮将打开背光。如果在背光打开时未按任何按钮,则在黑暗的房间中,它会在 10 秒后自行关闭。当房间光线充足时,背光将自动打开。背光打开时,按钮将执行以下任务:

SETUP - 这将打开 SETUP 屏幕。右尖括号字符是光标。按 INCREMENT 或 DECREMENT 按钮将分别增加或减少光标所在的值。再次按下 SETUP 按钮将使光标在小时、分钟、日、月、年、出生日、出生月、出生年、闹钟小时、闹钟分钟之间循环并返回时钟模式。

poYBAGNh9xWAKKvxAABiCzpQdkc804.jpg
设置屏幕 - 直角括号字符是光标
 

INCREMENT - 当不在设置屏幕中时,此按钮在各种时钟样式之间切换。

pYYBAGNh9xqAZYioAAFNki4wS1E330.jpg
各种时钟样式 - 所有显示都带有闹钟
 

减量- 当不在设置屏幕中时,此按钮可打开或关闭警报。

TILT SWITCH - 当闹钟响起时,倾斜时钟或按下任何按钮将关闭闹钟。

构建一个完整的时钟

首先,您需要一块印刷电路板 (PCB)。如果您希望将 PCB 商业化制造或像我一样自己制造,请附上 Eagle 文件。我使用了碳粉方法。

注意:由于 LCD 1602 显示器使用直角排针连接到主 PCB,因此当电路板和显示器已经焊接在一起时,很难将它们插入外壳中。拥有一个带通孔电镀的双面板可以让您将显示器就地焊接到板上。

pYYBAGNh9xyAIWH9AABMMWSneWo836.png
LCD 1602 显示器使用直角排针连接到主 PCB
 

该处理器是使用 Arduino UNO 引导加载程序编程的 ATmega328 DIL。ATmega328 的振荡器使用一个 16MHz 晶体和两个 22pf 陶瓷电容器。5V稳压器为7805 TO-220型,100uF 16V电容用于平滑。RTC 是一个带有 32.768 kHz 手表晶体的 DS1302。扬声器为无源蜂鸣器,采用 10uF 16V 电容进行直流隔离。0.1uF和1uF电容为独石陶瓷电容(5mm孔距)。电阻为 1/8 瓦。水银开关可以是任何尺寸。安装在电路板背面的三个触觉按钮为 6mmx6mm,轴为 13mm。

poYBAGNh91OAI6t3AARViUyAhqw924.png
闹钟示意图
 
poYBAGNh912Ad503AAWyvovjWlM829.jpg
电路板布局
 

外壳是 3D 打印的,层高为 0.2 毫米,没有支撑。使用 2.5 毫米钻头钻出 PCB 安装孔,并使用 3 毫米丝锥创建螺纹。使用 M3 6mm 螺钉将板固定到位。我还将 PCB 上的两个安装孔钻出 4 毫米,以便在固定电路板时进行任何必要的调整,以防止按钮粘在外壳上。

pYYBAGNh92SAE0dzAAN8AqOg96o636.jpg
PCB安装在外壳
 

我使用的 LDR 标记为 P1241-05。它的尺寸约为 5 毫米 x 3 毫米,在强光下的电阻约为 200 欧姆,在黑暗时的电阻约为 4000 欧姆。DHT21 传感器安装在机箱背面。您需要从 DHT21 的底座上去除少量塑料,以便电线可以穿过提供的孔并仍然隐藏在护罩下。

poYBAGNh92qAF9rgAAA7mcbgMCY758.jpg
拆下塑料底座的一部分,并通过提供的孔将电线送入。
 

编程

将 FTDI 编程器连接到 PCB 上的 FTDI Basic 接头,并上传通过 Arduino IDE 提供的软件。

poYBAGNh922AJS1cAACHboYPVVM608.png
FTDI程序员
 

请参阅以下有关更改代码以定制消息时钟和世界时钟的部分。

生物节律钟面

poYBAGNh93CAZa9TAAAiazjSc14740.jpg
生物节律钟面
 

据推测,根据我们的出生日期,生物节律可能决定我们生活的高潮和低谷。生物节律包括三个周期:23天的身体周期、28天的情绪周期和33天的智力周期。生物节律时钟将每个状态显示为条形。

pYYBAGNh93KAOw3aAAA1mBZIcuY939.png
生物节律时钟将每个状态显示为条形
 

该条显示生物节律处于正循环(顶部条)或负循环(底部条)。条形的长度显示了它在周期中的积极或消极程度。

消息钟面

poYBAGNh93aAeN9NAAAln0fDVYY407.jpg
消息钟面
 

此钟面在第二行显示一个旋转的消息栏。在代码中有一个表格,其中包含日期和消息,以便在这些日期过去时显示。

const char D00[] PROGMEM = "Today is ";
const char D01[] PROGMEM = "Your Brithday";
const char D02[] PROGMEM = "New Years Day";
const char D03[] PROGMEM = "Australia Day";
const char D04[] PROGMEM = "Good Friday";
const char D05[] PROGMEM = "Easter Monday";
const char D06[] PROGMEM = "Anzac Day";
const char D07[] PROGMEM = "Mother's Day";
const char D08[] PROGMEM = "the Queen's Birthday";
const char D09[] PROGMEM = "Father's Day";
const char D10[] PROGMEM = "Labour Day";
const char D11[] PROGMEM = "Xmas Day";
const char D12[] PROGMEM = "Good";
const char D13[] PROGMEM = "morning";
const char D14[] PROGMEM = "afternoon";
const char D15[] PROGMEM = "evening";
const char D16[] PROGMEM = ", it is ";

const MSG msgs[] = {
{ 0, 1, 1, D02 },
{ 0, 1, 26, D03 },
{ 2021, 4, 2, D04 },
{ 2021, 4, 5, D05 },
{ 0, 4, 25, D06 },
{ 0, 5, 9, D07 },
{ 2021, 6, 14, D08 },
{ 0, 9, 5, D09 },
{ 2021, 10, 4, D10 },
{ 0, 12, 25, D11 },
{ 0, 0, 0, NULL }
};

msgs数组中,每个元素由 4 个组件组成。第一个是年份。值为零的年份表示所有年份。接下来是月份(1 到 12),然后是日期(1 到 31)。最后是对应该显示的消息的引用。该表目前是为澳大利亚新南威尔士州 2021 设置的。您可以通过添加和删除项目来修改它。确保您保留表中的最后一个条目不变。软件使用它来确定表格的结尾。

一般形式的消息是:

[morning|afternoon|evening] ,现在是[ day of week ] [ day ][st|nd|rd|th] [ month name ] [ year ] {今天是[ message ]}

世界时间的脸

pYYBAGNh93iAc7WcAAAlY2FDbLE367.jpg
世界时间脸
 

世界时钟显示当前时间和另一个城市的时间。此时钟完全支持使用时区库的夏令时。您需要设置本地时区和要显示的其他时区。

//Australia Eastern Time Zone (Sydney, Melbourne)
#define LOCAL_CITY_ABV "SYD"                   //3 Character city name
#define LOCAL_TIMEZONE(loc) ausET.toUTC(loc)   //Function to access Timezone function

TimeChangeRule aEDT = {"AEDT", First, Sun, Oct, 2, 660};    //UTC + 11 hours
TimeChangeRule aEST = {"AEST", First, Sun, Apr, 3, 600};    //UTC + 10 hours
Timezone ausET(aEDT, aEST);

//US Eastern Time Zone (New York, Detroit)
#define WORLD_CITY_ABV "NYC"                    //3 Character city name
#define WORLD_TIMEZONE(utc) usET.toLocal(utc)   //Function to access Timezone function

TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 2, -240};  //UTC - 4 hours
TimeChangeRule usEST = {"EST", First, Sun, Nov, 2, -300};   //UTC - 5 hours
Timezone usET(usEDT, usEST);

首先,您需要设置 TimeChangeRules。有关如何执行此操作的完整说明以及一些示例,请参阅GitHub 上的Ardino 时区库。

接下来修改两个#define 语句。第一个包含时区所在的 3 个字符的城市名称,第二个需要知道赋予 Timezone 对象的名称。仅更改句点左侧的名称。

学分

这个时钟是各种制造商多年来制造的许多时钟的混搭。

该时钟的基础是带闹钟功能的 Arduino 数字时钟(定制 PCB)。我修改了箱子,所以它打印成两件而不是四件。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !