Despertador falando com o tema Raspberry Pi baseado em Jarvis
Despertador-falando-com-o-tema-Raspberry-Pi-baseado-em-Jarvisblog_image_banner

"Bom Dia. São 7h00. O clima em Malibu é de 72 graus com nuvens dispersas. As condições de surf são boas, com linhas altas da cintura aos ombros. A maré alta será às 10:52 am ”. Cada vez que ouço essa voz de Jarvis no filme Homem de Ferro, sinto calafrios na espinha. Tenho certeza de que, assim como eu, muitos teriam sonhado em viver uma vida tão sofisticada quanto Tony Stark. Mas, infelizmente, não avançamos com tecnologia para um reator Arc em miniatura ou uma IA tão inteligente quanto o JARVIS. Mas é possível substituir nossos chatos despertadores matinais por um semelhante ao Jarvis usando um Raspberry Pi. No final deste projeto, iremos criar uma GUI muito básica com a qual podemos definir um alarme e quando o alarme disparar teremos uma voz que nos diz a hora e o dia atuais com algum texto pré-definido. Parece legal, certo! Então, vamos construir um.

Materiais necessários


Raspberry Pi
Tela LCD TFT de 3,5 ”
Alto falante
Cabo AUX
Conexão de internet

Pré-requisitos

Presume-se que o seu Raspberry Pi já tenha um sistema operacional atualizado e seja capaz de se conectar à Internet. Caso contrário, siga o tutorial Introdução ao Raspberry Pi antes de continuar. Aqui estamos usando Rasbian Jessie instalado Raspberry Pi 3.

Também é assumido que você tem acesso ao seu pi por meio de janelas de terminal ou por meio de outro aplicativo com o qual você pode escrever e executar programas em Python e usar a janela de terminal.

Você também pode querer verificar como fazer a interface do LCD TFT de 3,5 ”com o Raspberry Pi, já que o usaremos neste projeto.

Instale o TTS Engine (Espeak) para Raspberry Pi

Como o título do projeto indica, vamos construir um relógio falante. Para fazer seu Pi falar, precisamos de um mecanismo de texto em fala (TTS). Existem tantas opções para selecionar, mas por uma questão de simplicidade, selecionei o Espeak Engine. Para instalar o Espeak no seu Pi, basta executar o seguinte comando no seu terminal:


sudo apt-get install espeak
sudo apt-get install espeak python-espeak


Criando GUI para Raspberry Pi Speaking Alarm Clock


Para este projeto precisamos desenvolver uma GUI que represente um despertador para que o usuário possa visualizar a hora atual e também definir o alarme. Existem muitas opções para desenvolver uma GUI usando Python, mas a mais popular e versátil é o PyQt4, então usaremos isso para desenvolver nossa GUI. Nos títulos abaixo, discutimos como usar o PyQt4 para projetar sua própria GUI, mas se você não estiver interessado, pode pular diretamente para o título “Programa para despertador falante”.


Instalando PyQt4 com Qt designer em sua máquina Windows


Eu instalei os pacotes Python e PQt na minha máquina Windows. se não estiver interessado nisso, você pode desenvolver sua GUI no próprio raspberry pi, simplesmente pulando esta etapa. Para instalar o PQt no Windows, baixe este arquivo exe e, durante o procedimento de instalação, certifique-se de verificar o software Qt designer, pois o usaremos em nosso projeto.


Instalando PyQt em máquinas Pi / Linux / MAC


Para instalar o PyQt em uma máquina Linux, basta executar a seguinte linha em seu terminal de comando:


sudo apt-get install python-qt4

Projetando a GUI usando Qt Designer


Uma vantagem notável de usar o PyQt4 para seus designs de GUI é que ele possui o software Qt designer. Este software pode ser usado para criar botões, visores, textos e outros gráficos simplesmente arrastando coisas para a tela e colocando-as onde for necessário. Isso nos economiza muito tempo, pois não temos que inserir manualmente o tamanho e a posição dos objetos em nossa tela. Eu instalei o Qt designer junto com Python e PyQt4 no meu laptop Windows usando o arquivo exe conforme discutido no parágrafo acima. Depois de instalar, abra seu Qt Designer e você verá esta tela.


No lado esquerdo você pode encontrar o layout, espaçadores, botões e outros itens que você pode simplesmente usar arrastando-os para a janela. Você também pode personalizar os objetos conforme necessário usando as janelas à direita. Usei um display LCD de 7 segmentos, um botão, uma linha de texto e um objeto de tempo definido para criar a IU do nosso despertador. Depois de usar layouts para colocar todos os objetos no lugar e tamanho necessários, minha janela ficou mais ou menos assim abaixo

Assim que sua GUI estiver pronta, você pode salvar seu design como um arquivo .ui. Posteriormente, a qualquer momento quando desejar fazer alterações em sua GUI, você pode simplesmente abrir este arquivo e fazer as alterações sem ter que rolar para cima e para baixo em seu programa. O arquivo .ui para o relógio falante pode ser baixado se você quiser fazer alguma alteração neste design. Quando estiver satisfeito com o design da GUI, você pode exportá-lo como um código Python de onde pode começar sua programação Python.

Eu sei que muitas coisas aqui teriam saltado sobre sua cabeça, mas não é possível explicar como usar a biblioteca Qt4 em um único tutorial. Você pode consultar a série de tutoriais sentdex PyQt4 para saber mais sobre como usar o software PyQt4 e Qt designer.


Programa Python para Raspberry Pi Speaking Alarm Clock


O código Python completo para este projeto é fornecido no final desta página. Você pode executá-lo diretamente no seu Raspberry pi para obter a saída, mas, mais adiante, expliquei o programa em pequenos trechos para que você possa entender como funciona o programa.

Quase metade do código já foi escrito para nós pelo software Qt designer, este código contém então informações sobre o tipo, estilo, tamanho e posição dos objetos que estão no topo de nossa tela. Agora, tudo o que temos a fazer é fornecer propósito e função para esses objetos.

O display de 7 segmentos é usado para mostrar a hora atual. O objeto set-time é usado para selecionar a hora do alarme e o botão “set alarm” deve ser clicado para definir o alarme na hora selecionada. A linha de texto na parte inferior mostra quando o alarme está definido e outras informações úteis. Além disso, também temos de tocar o alarme por voz quando o alarme é definido e disparado.

Para nosso programa, precisamos do PyQt4 para projetar a GUI e espeak para reproduzir alarme por voz e pacote de tempo strftime para ler a hora atual de Pi. Portanto, importamos todos os três pacotes usando a linha de código abaixo:


from PyQt4 import QtCore, QtGui #PyQt4 is used for designing the GUI

from espeak import espeak #text to speech sonversion

from time import strftime # To get time from Raspberry pi


A seguir temos um bloco de códigos que foi obtido do designer Qt, esses códigos consistirão na posição e no tamanho dos widgets que colocamos na tela. Editamos um pouco o código para atribuir um propósito ao widget. Primeiro, no widget LCD de 7 segmentos, temos que exibir a hora atual, isso pode ser feito usando o método strftime, que nos dará a hora atual que está sendo executada no Pi. Podemos então exibir esse tempo no LCD conforme mostrado abaixo:


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")) #get time from Pi and display it

 self.gridLayout.addWidget(self.Time_LCD, 1, 0, 1, 3)


Em seguida, temos um botão pressionado, quando este botão é pressionado, temos que definir o alarme. Portanto, usamos um método chamado button_pressed. Sempre que este botão for pressionado, a função button_pressed será chamada:


self.pushButton = QtGui.QPushButton(self.centralwidget)

        self.pushButton.setObjectName(_fromUtf8("pushButton"))

        self.pushButton.clicked.connect(self.button_pressed) #when button pressed call the button pressed function

        self.gridLayout.addWidget(self.pushButton, 2, 1, 1, 1)

        MainWindow.setCentralWidget(self.centralwidget)


A função button_pressed é mostrada abaixo. Aqui lemos os valores de hora e minutos do widget de tempo definido. Essas informações serão em forma de string, portanto, podem ser ajustadas para obter o valor da hora e dos minutos e armazenadas nas variáveis alarm_h e alarm_m. Assim que tivermos o valor de minuto e hora, podemos usá-lo para compará-lo com os minutos e horas atuais.

Finalmente, após a hora definida ser lida, também exibimos um texto usando a variável string message. Esta mensagem será exibida como um texto de rótulo.



def button_pressed(self): #when set alarm button is pressed

        print("Button Pressed")

        alarm_time = str(self.Set_Time.time())

       

        self.alarm_h = int(alarm_time[19:21]) #value of hour is sotred in index value 19 and 20

        self.alarm_m = int (alarm_time[23:25]) #value of minute is sotred in index value 23 and 24

        message = "Alarm is set at " + str(self.alarm_h) + " hours " + str(self.alarm_m) + " minutes"

        self.label.setText(_translate("MainWindow", message, None)) #display the message on GUI screen 

        espeak.synth (message) #speak the message through audio jack


Também damos um alerta de voz informando que o alarme foi definido para fulano de tal hora usando o método espeak. Este método apenas fala qualquer texto transmitido a ele por meio do conector de áudio. Aqui, a string na mensagem variável é lida


espeak.synth (message) #speak the message through audio jack


Finalmente, precisamos de mais um método, que compare a hora atual com a hora definida e quando ambas coincidirem, ele deve notificar o usuário por meio de voz. Para este propósito, temos a função de tempo em nosso código, ela compara current_h com alarm_h e current_m com alarm_m. Quando ambas coincidem, ele dispara o alarme falando o texto armazenado na variável message1. Você pode personalizar a variável message1 se quiser fazer o relógio falar outra coisa; neste momento ele irá desejar bom dia juntamente com a hora e dia atuais:


def Time(self): #Function to compare current time with set time

        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): #if the both time match

            print("ALARM ON!!!!!")

           

            message1 = " The time is " + str(self.alarm_h) + " : " + str(self.alarm_m) + " on " + strftime("%A")

            message = "Sir, Good morning.. This is your wake up Alarm." + message1

            self.label.setText(_translate("MainWindow",message1, None)) #display the message on GUI screen 

            espeak.synth (message) #speak the message through audio jack

            time.sleep(1)


Configuração de hardware para despertador Raspberry Pi


A configuração do hardware para este projeto é muito simples. Estamos usando apenas uma tela LCD TFT de 3,5 ”com nosso PI. Para configurar a tela, você pode seguir o tutorial Interfacing Pi com LCD de 3,5 ”. Assim que a interface estiver concluída, você poderá usar a caneta e navegar pelo sistema operacional do raspberry pi. Para reproduzir o som, você precisa de um alto-falante, conectei um alto-falante portátil ao pi através do cabo AUX. Depois que tudo estiver configurado e o programa iniciado, minha configuração ficou assim abaixo:


Funcionamento do despertador falante baseado em Pi


Prepare o hardware conforme mostrado acima e certifique-se de ter instalado o PyQt4 e o Espeak em seu Pi. Em seguida, use o código python fornecido a seguir, apenas cole-o no IDLE do python e execute o programa.


Mostra a hora atual e também fornece uma caixa de texto para definir o alarme. Use sua caneta para definir a hora do alarme e pressione o botão definir alarme. Isso lhe dará uma mensagem de voz informando que o alarme está definido. Agora é só esperar até que a hora atual exibida no display 7-seg seja igual à hora do alarme. Quando estiver igual, o alarme é disparado, novamente uma mensagem de voz com a hora e o dia atuais. Este alarme se repetirá quatro vezes antes que o valor dos minutos mude. O funcionamento completo do projeto pode ser encontrado no link de vídeo abaixo.

Esta é apenas uma base para o projeto e você pode facilmente construí-la adicionando o botão soneca e parar. Além disso, personalize a mensagem de voz com base em sua preferência ou com base na localização e quais não? Deixe-me saber o que você tem em mente. Espero que você tenha entendido o tutorial e gostado de criá-lo. Se você tiver qualquer problema, sinta-se à vontade para colocá-los na seção de comentários ou usar os fóruns para outras questões técnicas:


# Speaking alarm clock using Raspberry Pi

#Connect 3.5" LCD and speaker though AUX and run the program with PyQt4 and espeak packages

# Program by: B.Aswinth Raj

# Website: circuitdigest.com

#

# GUI code was created using Qt Designer 

import sys

import time

from PyQt4 import QtCore, QtGui #PyQt4 is used for designing the GUI

from espeak import espeak #text to speech sonversion

from time import strftime # To get time from Raspberry pi

#Code from Qt Designer

try:

    _fromUtf8 = QtCore.QString.fromUtf8

except AttributeError:

    def _fromUtf8(s):

        return s

try:

    _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)

class 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")) #get time from Pi and display it 

        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)

#End of code from Qt Designer

        

    def retranslateUi(self, MainWindow): #update the GUI window 

        print("Dispay Re-translated")

        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))

        self.label.setText(_translate("MainWindow", "Alarm curretly Turned off", None))

        self.pushButton.setText(_translate("MainWindow", "Set Alarm", None))

    

    def Time(self): #Function to compare current time with set time 

        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): #if the both time match 

            print("ALARM ON!!!!!")

            

            message1 = " The time is " + str(self.alarm_h) + " : " + str(self.alarm_m) + " on " + strftime("%A")

            message = "Sir, Good morning.. This is your wake up Alarm." + message1

  

            self.label.setText(_translate("MainWindow",message1, None)) #display the message on GUI screen  

            espeak.synth (message) #speak the message through audio jack 

            time.sleep(1)

            

            

    def button_pressed(self): #when set alarm button is pressed 

        print("Button Pressed")

        alarm_time = str(self.Set_Time.time())

        

        self.alarm_h = int(alarm_time[19:21]) #value of hour is sotred in index value 19 and 20

        self.alarm_m = int (alarm_time[23:25]) #value of minute is sotred in index value 23 and 24

        message = "Alarm is set at " + str(self.alarm_h) + " hours " + str(self.alarm_m) + " minutes"

        self.label.setText(_translate("MainWindow", message, None)) #display the message on GUI screen  

        espeak.synth (message) #speak the message through audio jack 

if __name__ == "__main__": #main function 

    

    app = QtGui.QApplication(sys.argv)

    MainWindow = QtGui.QMainWindow()

    ui = Ui_MainWindow()

    ui.setupUi(MainWindow)

    MainWindow.show()

    sys.exit(app.exec_())



ENTRE EM CONTATO COM A LOJAMUNDI.

Assine nossa Newsletter! É gratuito!

Cadastre seu nome e email para receber novidades e materiais gratuitos da Lojamundi.