“早上好。现在是早上 7:00 马里布的天气是 72 度,云层散落。冲浪条件公平,腰部到肩的高线。涨潮时间为上午 10:52”。每次在电影钢铁侠中听到贾维斯的这个声音,都会让我脊背发凉。我敢肯定,就像我一样,很多人都梦想过像托尼·斯塔克一样精致的生活。但遗憾的是,我们还没有在微型 Arc 反应堆或像 JARVIS 一样聪明的 AI 方面取得进步。但是可以用类似于 Jarvis 使用 Raspberry Pi 的闹钟来代替我们无聊的早晨闹钟。在这个项目结束时,我们将创建一个非常基本的 GUI,我们可以使用它来设置闹钟,当闹钟响起时,我们将通过一些预定义的文本告诉我们当前时间和日期。听起来很酷吧!!所以让我们建立一个。
所需材料
3.5” TFT液晶屏
扬声器
辅助电缆
网络连接
先决条件
假设您的 Raspberry Pi 已刷入操作系统并能够连接到 Internet。如果没有,请 在继续之前遵循Raspberry Pi 入门教程。这里我们使用 Rasbian Jessie 安装 Raspberry Pi 3。
还假设您可以通过终端窗口或其他应用程序访问您的 pi,您可以使用这些应用程序编写和执行 python 程序并使用终端窗口。
您可能还想了解如何将 3.5 英寸 TFT LCD 与 Raspberry Pi 连接,因为我们将在此项目中使用它。
为 Raspberry Pi 安装 TTS 引擎 (Espeak)
正如项目标题所述,我们将构建一个说话时钟。为了让您的 Pi 说话,我们需要一个文本到语音 (TTS) 引擎。有很多选项可供选择,但为了简单起见,我选择了Espeak Engine。要在您的 Pi 上安装 Espeak,只需在终端上运行以下命令
sudo apt-get install espeak
sudo apt-get install espeak python-espeak
为 Raspberry Pi 口语闹钟创建 GUI
对于这个项目,我们需要开发一个代表闹钟的 GUI,以便用户可以查看当前时间并设置闹钟。使用 Python 开发 GUI有很多选择,但最流行和通用的一个是PyQt4,所以我们将使用它来开发我们的 GUI。在下面的几个标题中,我们讨论了如何使用 PyQt4 设计自己的 GUI,但如果您不感兴趣,可以直接跳到“语音闹钟程序”标题。
在 Windows 机器上使用 Qt 设计器安装 PyQt4
由于我们正在设计一个 GUI,我们将首先在我们的笔记本电脑(windows/Linux)上开始我们的编程,然后将这个 python 脚本移植到我们的 Pi 上。由于 PyQt4 具有非常好的可移植性,大多数开发人员都会这样做,因为在笔记本电脑上进行开发既简单又快捷,而实际上在 Raspberry Pi 上进行。
我已经在我的 windows 机器上安装了 python 和 PQt 包;如果您对此不感兴趣,您可以跳过此步骤在您的树莓派上开发您的 GUI。要在 Windows 上安装 PQt,请下载此 exe 文件,并在安装过程中确保您已检查 Qt 设计器软件,因为我们将在我们的项目中使用它。
在 Pi/Linux/MAC 机器上安装 PyQt
要在 Linux 机器上安装 PyQt,只需在命令终端上运行以下行
sudo apt-get install python-qt4
使用 Qt Designer 设计 GUI
使用 PyQt4 进行 GUI 设计的一个显着优势是它具有Qt 设计器软件。该软件可用于创建按钮、显示、文本和其他图形,只需将东西拖到屏幕上并将它们放置在需要的地方。这为我们节省了大量时间,因为我们不必手动输入屏幕上对象的大小和位置。我已经使用上面段落中讨论的 exe 文件在我的 Windows 笔记本电脑上安装了 Qt 设计器以及 Python 和 PyQt4。安装后打开你的 Qt Designer,你会得到这个屏幕。
在左侧,您可以找到布局、间隔、按钮和其他项目,您只需将其拖到窗口中即可使用。您还可以使用右侧的窗口根据需要自定义对象。我使用了一个7 段 LCD 显示屏、一个按钮、一个文本行和设置时间对象来为我们的闹钟创建 UI。使用布局将所有对象放置在所需的位置和大小后,我的窗口如下所示
准备好 GUI 后,您可以将设计保存为.ui文件。以后,当您希望对 GUI 进行更改时,您只需打开此文件并进行更改,而无需在程序中上下滚动。如果您希望对此设计进行任何更改,可以下载口语时钟的.ui 文件。一旦您对 GUI 设计感到满意,您可以将其导出为 Python 代码,您可以从那里开始您的 Python 编程。
我知道这里有很多事情会让您不知所措,但是不可能在一个教程中解释如何使用 Qt4 库。您可以参考sentdex PyQt4 教程系列,了解如何使用 PyQt4 和 Qt 设计器软件。
用于树莓派口语闹钟的 Python 程序
此项目的完整 python 代码在本页末尾给出。您可以直接在您的 Raspberry pi 上运行它以获取输出,但下面我将程序解释为小片段,以便您了解该程序的工作原理。
Qt 设计器软件已经为我们编写了几乎一半的代码,然后该代码包含有关我们屏幕顶部对象的类型、样式、大小和位置的信息。现在我们要做的就是为这些对象提供用途和功能。
7 段显示器用于显示当前时间。设置时间对象用于选择闹铃时间,点击“设置闹铃”按钮设置闹铃时间。底部的文本行显示设置警报的时间和其他有用信息。除此之外,我们还必须在设置和触发警报时播放语音警报。
对于我们的程序,我们需要PyQt4来设计 GUI 和espeak 来播放语音警报和时间包strftime来从 Pi 读取当前时间。所以我们使用下面的代码行导入所有三个包。
from PyQt4 import QtCore, QtGui #PyQt4 用于设计 GUI from espeak import espeak #text to Speech Sonversion from time import strftime # To get time from Raspberry pi
接下来我们有一个从 Qt 设计器获得的代码块,这些代码将包含我们放置在屏幕上的小部件的位置和大小。我们对代码进行了一些编辑,以便为小部件指定用途。首先,在 7 段 LCD 小部件上,我们必须显示当前时间,这可以通过使用strftime方法来完成,该方法将为我们提供在 Pi 上运行的当前时间。然后我们可以在 LCD 上显示这个时间,如下所示。
self.Time_LCD = QtGui.QLCDNumber(self.centralwidget) self.Time_LCD.setObjectName(_fromUtf8("Time_LCD")) self.Time_LCD.setDigitCount(8) self.Time_LCD.display(strftime("%H"+":"+ "%M"+":"+"%S")) #从 Pi 获取时间并显示 self.gridLayout.addWidget(self.Time_LCD, 1, 0, 1, 3)
接下来我们有一个按钮按下按钮,当按下这个按钮时,我们必须设置警报。所以我们使用了一种叫做button_pressed的方法。每当按下此按钮时,都会调用函数button_pressed 。
self.pushButton = QtGui.QPushButton(self.centralwidget) self.pushButton.setObjectName(_fromUtf8("pushButton")) self.pushButton.clicked.connect(self.button_pressed) #当按钮按下时调用按钮按下函数 self.gridLayout。 addWidget(self.pushButton, 2, 1, 1, 1) MainWindow.setCentralWidget(self.centralwidget)
button_pressed函数如下所示。在这里,我们从设置的时间小部件中读取小时和分钟的值。此信息将采用字符串形式,因此可以对其进行修剪以获得小时和分钟的值并存储在变量alarm_h和alarm_m中。一旦我们有了分钟和小时的值,我们就可以使用它与当前的分钟和小时进行比较。
最后,在读取设置的时间后,我们还使用字符串变量消息显示文本。此消息将显示为标签文本。
def button_pressed(self): #当设置闹钟按钮被按下时 print("Button Pressed") alarm_time = str(self.Set_Time.time()) self.alarm_h = int(alarm_time[19:21]) #小时值为存储在索引值 19 和 20 self.alarm_m = int (alarm_time[23:25]) #分钟值存储在索引值 23 和 24 message = "警报设置在 " + str(self.alarm_h) + " hours " + str(self.alarm_m) + " minutes" self.label.setText(_translate("MainWindow", message, None)) #显示GUI 屏幕上 的消息 espeak.synth (message) #通过音频插孔说出消息
我们还通过使用espeak方法发出语音警报,说明警报已设置为某某时间。此方法只是说出通过音频插孔传递给它的任何文本。这里读出了变量message中的字符串
espeak .synth (message) #通过音频插孔说出消息
最后,我们还需要一种方法,将当前时间与设定时间进行比较,当两者匹配时,它必须通过语音通知用户。为此,我们的代码中有时间函数,它将 current_h 与 alarm_h 和 current_m 与 alarm_m 进行比较。当两者都匹配时,它会通过说出存储在变量 message1 中的文本来触发警报。如果你想让时钟说别的东西,你可以自定义变量 message1;现在它会祝你早安以及当前的时间和日期。
def Time(self): #比较当前时间和设置时间 的函数 self.Time_LCD.display(strftime("%H"+":"+"%M"+":"+"%S")) self.current_h = int (strftime("%H")) self.current_m = int (strftime("%M")) if (self.current_h == self.alarm_h) and (self.current_m == self.alarm_m) and ((int(strftime("%S"))%15) == 0): #如果两个时间都匹配 print ("ALARM ON!!!!!") message1 = " 时间是 " + str(self.alarm_h) + " : " + str(self.alarm_m) + " on " + strftime("%A") message = “先生,早上好……这是您的起床闹钟。” + 消息1 self.label.setText(_translate("MainWindow",message1, None)) #在GUI屏幕上显示 消息 espeak.synth (message) #通过音频插孔朗读消息 time.sleep (1)
Raspberry Pi 闹钟的硬件设置
该项目的硬件设置非常简单。我们的 PI 仅使用3.5 英寸 TFT LCD 屏幕。要设置显示器,您可以按照接口 Pi 与 3.5 英寸 LCD 教程进行操作。一旦你的接口完成,你应该能够使用手写笔并浏览树莓派的操作系统。为了播放您需要扬声器的声音,我通过 AUX 电缆将便携式扬声器连接到 pi。一切设置好并启动程序后,我的设置如下所示。
基于 Pi 的口语闹钟的工作原理
如上所示准备硬件,然后确保您已在 Pi 上安装 PyQt4 和 Espeak。然后使用下面给出的python代码,只需将其粘贴到python IDLE中并运行程序。它将启动 GUI 窗口,如下所示
它显示当前时间,还提供一个文本框来设置闹钟。使用触控笔设置闹钟时间并按下设置闹钟按钮。这将为您提供一条语音消息,说明已设置警报。现在只需等待 7 段显示屏上显示的当前时间等于警报时间。当它等于触发警报时,这将再次提供带有当前时间和日期的语音消息。在分钟值更改之前,此警报将重复四次。该项目的完整工作可以在下面给出的视频链接中找到。
# 使用 Raspberry Pi 说话闹钟
#通过 AUX 连接 3.5" LCD 和扬声器,并使用 PyQt4 和 espeak 包运行程序
# 程序作者:B.Aswinth Raj
# 网站: circuitdigest.com
#
# GUI 代码是使用 Qt Designer 创建的
导入系统
导入时间
from PyQt4 import QtCore, QtGui #PyQt4 用于设计 GUI
from espeak import espeak #text to Speech Sonversion
from time import strftime # To get time from Raspberry pi
#Qt Designer 中的代码
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
尝试:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui. QApplication.translate(context, text, disambig)
类 Ui_MainWindow(object):
def setupUi(self, MainWindow):
self.alarm_h = 0
self.alarm_m = 0
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(676, 439)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget" ))
self.gridLayout = QtGui.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.label = QtGui.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize( 14)
self.label.setFont(font)
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout.addWidget(self.label, 3, 0, 1, 1)
self.Time_LCD = QtGui.QLCDNumber(self.centralwidget)
self.Time_LCD.setObjectName(_fromUtf8("Time_LCD"))
self.Time_LCD.setDigitCount(8)
self.Time_LCD.display(strftime("%H"+":"+ "%M"+":"+"%S")) #从 Pi 获取时间并显示
self.gridLayout.addWidget(self.Time_LCD, 1, 0, 1, 3)
self.timer = QtCore.QTimer(MainWindow)
self.timer.timeout.connect(self.Time)
self.timer.start(1000)
current_time = QtCore.QTime()
self.Set_Time = QtGui.QTimeEdit(self.centralwidget)
self .Set_Time.setObjectName(_fromUtf8("Set_Time"))
self.Set_Time.setTime(current_time.currentTime())
self.gridLayout.addWidget(self.Set_Time, 2, 0, 1, 1)
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.pushButton.clicked.connect(self.button_pressed)
self.gridLayout.addWidget(self.pushButton, 2, 1 , 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 676, 21))
self.menubar.setObjectName(_fromUtf8( "menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
#Qt Designer 代码结束
def retranslateUi(self, MainWindow): #更新GUI窗口
print("Dispay Re-translated")
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
self.label.setText(_translate("MainWindow" , "警报当前已关闭", None))
self.pushButton.setText(_translate("MainWindow", "Set Alarm", None))
def Time(self): #比较当前时间和设置时间
的函数 self.Time_LCD.display(strftime("%H"+":"+"%M"+":"+"%S"))
self.current_h = int (strftime("%H"))
self.current_m = int (strftime("%M"))
if (self.current_h == self.alarm_h) and (self.current_m == self.alarm_m) and ((int(strftime("%S"))%15) == 0): #如果两个时间都匹配
print ("ALARM ON!!!!!")
message1 = " 时间是 " + str(self.alarm_h) + " : " + str(self.alarm_m) + " on " + strftime("%A")
message = “先生,早上好……这是您的起床闹钟。” + message1
self.label.setText(_translate("MainWindow",message1, None)) #在GUI屏幕上显示
消息 espeak.synth (message) #通过音频插孔朗读消息 time.sleep
(1)
def button_pressed(self): #当设置闹钟按钮被按下时
print("Button Pressed")
alarm_time = str(self.Set_Time.time())
self.alarm_h = int(alarm_time[19:21]) #小时值为存储在索引值 19 和 20
self.alarm_m = int (alarm_time[23:25]) #分钟值存储在索引值 23 和 24
message = "警报设置在 " + str(self.alarm_h) + " hours " + str(self.alarm_m) + " minutes"
self.label.setText(_translate("MainWindow", message, None)) #显示GUI 屏幕上
的消息 espeak.synth (message) #通过音频插孔说出消息
if __name__ == "__main__": #main function
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.执行_())
评论
查看更多