一、项目介绍
1. 简介:本项目是一个可以通过显示屏显示出湿度,温度和时间信息的智能闹钟,用户如果设定了闹钟,那么就可以选择关闭闹铃的方式,可以是一键关闭,也可以是通过输入正确的密码来关闭闹铃,以此来增强闹钟的叫醒功能,让睡眠更安心。由于主控使用了ESP32,其可以使用蓝牙和WiFi的功能也为后续接入其他物联网设备提供了可能。
2.市场应用介绍:该产品以较为新颖的概念,有别于传统的闹钟,以输入密码才能关闭闹钟的方式,可以预防他人误关你的闹钟,也集成了温湿度,让功能更齐全,同时主控为ESP32的缘故,也可做为丰富物联网生态的产品。
二、原理图及PCB介绍
流程图及原理图初步设计都是使用得捷的Scheme-it来完成,非常方便!!也希望在后续在更多的项目上用起来!在元件上,MCU使用了FastBond活动中要求厂商中的乐鑫ESP32-S3,强大的处理性能和功能助力我更便捷得实现了该项目。
本项目的主要框图如下,得捷网站链接如下:智能闹钟
使用Scheme-it设计的原理图导出到KiCad后,有一些地方并不匹配,比如网络标签并不识别,用户自定义的符号引脚未分配等等,因此需要继续更改加以完善。经过完善的原理图如下:
本项目由于采用机械键盘轴做为矩阵按键,故为节省PCB空间,节约成本,在原理图中并未添加ESP32-S3和电源部分,而是采用ESP32-S3的供电口为闹钟供电,而且将各数据IO口用排针引出,便于ESP32-S3连接,接下来对重点模块进行介绍:
该模块是本智能闹钟设计重点,设计需求为16个按键的键盘矩阵输出,而采用传统的矩阵电路,不仅要占用8个IO口,而且为防止鬼键现象,还需添加16个二极管,这不仅抢占了PCB空间,也为产品的稳定性埋下隐患,故该项目,采用74hc165d移位寄存器,它有串行输出,并行输入的特点,同时也支持多个74hc165d进行级联,扩充更多的并行输入口,例如本项目就采用两个74hc165d来扫描16个按键信息,而且经过级联后,对于MCU的IO口占用不变,仅需3个即可,采用该方案还能实现全键无冲的功能,为后续开发键盘提供了技术基础。
之后便是PCB绘制了,PCB图如下:
三、功能展示
图中OLED显示屏年月时钟时间显示正常,DHT11的温湿度也读取正在,其中Alarm Clock显示ON,表示闹钟已开启,下面便显示闹钟时间为18:30,后面的P(Password)显示ON,表明密码关闭闹钟已开启。
四、关键代码展示
74hc165读取并行输入口数据代码:
def key_74hc165_read_2byte():
i = 0
temp = 0
HC165_CE.value(1)
HC165_PL.value(0)
HC165_PL.value(1)
HC165_CE.value(0)
if HC165_OUT() == 1:
temp |= 0x01
while i < 15:
temp = temp << 1
HC165_CLK.value(0)
time.sleep_us(5)
#time.sleep_us(5)
HC165_CLK.value(1)
if HC165_OUT() == 1:
temp |= 0x01
i += 1
return temp
读取时间代码:
from machine import RTC
def get_current_time(rtc):
"""
获取当前时间并返回一个包含年、月、日、时、分和秒的元组。
"""
current_time = rtc.datetime()
year, month, day, week, hour, minute, second, _ = current_time
return year, month, day, hour, minute, second
def format_time_strings(year, month, day, hour, minute, second):
"""
根据给定的时间信息,格式化日期和时间字符串。
"""
date_str = "{:02d}-{:02d}-{:02d}".format(year, month, day)
time_str = "{:02d}:{:02d}:{:02d}".format(hour, minute, second)
return date_str, time_str
读取dht11数据:
import dht
from machine import Pin
class DHT11:
def __init__(self, pin):
self.dht_sensor = dht.DHT11(Pin(pin))
def read_temperature_and_humidity(self):
try:
self.dht_sensor.measure()
temperature_celsius = self.dht_sensor.temperature()
humidity_percentage = self.dht_sensor.humidity()
return temperature_celsius, humidity_percentage
except Exception as e:
return None
将74hc165读取数据与按键值匹配:
def key():
key_74hc165_init()
key_num = 0
key_last = key_74hc165_read_2byte()
time.sleep_us(40)
key_next = key_74hc165_read_2byte()
if key_last == key_next:
if key_next == 32512: key_num = 1
if key_next == 48896: key_num = 2
if key_next == 57088: key_num = 3
if key_next == 61184: key_num = 4
if key_next == 63232: key_num = 5
if key_next == 64256: key_num = 6
if key_next == 64768: key_num = 7
if key_next == 65024: key_num = 8
if key_next == 65408: key_num = 9
if key_next == 65344: key_num = 10
if key_next == 65312: key_num = 11
if key_next == 65296: key_num = 12
if key_next == 65288: key_num = 13
if key_next == 65284: key_num = 14
if key_next == 65282: key_num = 15
if key_next == 65281: key_num = 16
return key_num
五、总结
很感谢硬禾学堂举办的FastBond2活动,让我有机会通过这个活动使用一些未曾尝试过的芯片来做一些不大但很有意义的制作。这之中虽然遇到了很多难题,例如由于ESP-S3使用的micro python在网络上实例和教程少,加之没学过python,第一次学习该语言,对语言有应用熟练度也不高,对自身挑战难度高,但经过埋头学习后,收获颇大。对于该产品来说还不够便携,后续也打算不断优化,将MCU和电池一起加装在PCB上,同时也使用更高功率的喇叭,提高闹钟的音量,让该闹钟能真正实用起来,走进我的日常生活中。