Reveil connecté au planning du boulot pour les horaires variables

Medium ur0mojvn0hobrsly3swx

Difficulté:

Il est créé à base d’un Raspberry et programmé en Python.


C’est Migoku avec son chronomètre qui m’a donné l’idée de faire un réveil connecté à l’agenda, afin de ne plus s’embêter à modifier sans arrêt l’heure de l’alarme du réveil en fonction des horaires du matin. Voici un réveil qui se connecte tous les jours à 18h au planning disponible sur le site web du boulot.
Il est créé à base d’un Raspberry et programmé en Python.


Fonctionnement:
L’affichage reste éteint afin de ne réveiller personne. Si on appuie sur le champignon, il affiche l’heure actuelle (sauf si la sonnerie sonne et dans ce cas le champignon la coupe..)
Le bouton rotatif sert à ajouter/soustraire manuellement des minutes à l’heure de l’alarme.
Quand on appuie sur le bouton rotatif, le réveil affiche l’heure de l’alarme (qui s’est mise à jour automatiquement tous les jours à 18h).
Le bouton sur l’arrière du réveil: un push -> reconnexion au planning pour un rafraîchissement de l’heure de l’alarme, et un push prolongé -> arrêt du système.
L’affichage peut écrire 3 messages d’erreur:
reso -> en cas de problème de connexion au site web
stop -> l’alarme est désactivée (congé sur le planning ou désactivée manuellement avec le bouton rotatif)
bye -> quand le système s’arrête..

Matériel

Budget:

0 €

un ancien Raspberry modèle Pi 2 va très bien
1 clé usb wifi si c’est un ancien modèle de Raspberry
4 afficheurs 7 segments avec chacun 1 cathode commune – Attention: pas + que 15mA par segment (le max par Gpio)
un bouton champignon
un bouton rotatif & poussoir
un bouton simple poussoir
une batterie en cas de coupure secteur: batterie USB de secours pour téléphone portable 5v 2A
un buzzer 5v
ici le chassi est fait à base d’éléments de robots Makeblock – Source: http://makeblock.com
15 resistances de 100 ohms
5 transistor NPN
et un transfo USB 5v

Etape 1 : Construction du chassi

Ici j’ai utilisé les pièces de construction robotique métalique Makeblock (http://makeblock.com) afin de le faire solide, pour pouvoir “taper” sur le champignon le matin au réveil.

Etape 2 : Câblage multiplexé des 4 afficheurs

On relie les 4 segments A sur un Gpio, puis les 4 B sur une autre sortie, jusqu’aux segments G.
Après on utilise 4 autres Gpio reliés à 4 transistors NPN afin de couper la cathode (borne négative) de chaque afficheur.
Donc pour allumer un segment, il faut activer 2 Gipo. Enfin pour afficher nos 4 chiffres, on affiche le premier durant 0.005 seconde, puis les suivants le même
temps: l’oeil humain ne verra même pas un scintillement 🙂 (Si ça venait à scintiller, on peut le corriger avec 4 condensateurs)

Etape 3 : Le programme Python

Medium eyeyninz5l9givdvarmd

Voici le programme, sans couleurs c’est barbare, mais copié dans un éditeur ce sera + lisible 😉
( Il est disponible dans “Fichiers techniques” )

#!/usr/bin/python
from urllib import urlopen
import RPi.GPIO as gpio
import time
import os

# on utilise le mode BMC ca veut dire qu on utilise le numero GPIO plutot que sa position physique sur la carte
gpio.setmode(gpio.BCM)
os.system(‘clear’) # on utilise la librairie os pour effacer l’ecran

# on definit les numero des gpio
segmentA = 23
segmentB = 22
segmentC = 27
segmentD = 18
segmentE = 17
segmentF = 6
segmentG = 12
afficheur1 = 19 # le + a gauche..
afficheur2 = 16
afficheur3 = 26
afficheur4 = 20
buzzer = 24
champignon = 25 # bouton qui affiche l heure actuelle et arrete la sonnerie
shutdown = 21 # bouton qui eteind la raspberry (et rafraichit heure de l alarme du site si maintien enfoncer?)
rot_select = 13 # ajoute + 5min d alarme manuelle (et si le bouton rot_enfonce a ete presser: + 1h et si re-push: + 1 min sans ajouter 1h au passage de 59 a 00)
rot_enfonce = 5 # bouton qui affiche l heure prevue de l alarme

# on definit tous les ports comme etant des sorties output (ou entree input)
gpio.setup(afficheur1, gpio.OUT)
gpio.setup(afficheur2, gpio.OUT)
gpio.setup(afficheur3, gpio.OUT)
gpio.setup(afficheur4, gpio.OUT)
gpio.setup(segmentA, gpio.OUT)
gpio.setup(segmentB, gpio.OUT)
gpio.setup(segmentC, gpio.OUT)
gpio.setup(segmentD, gpio.OUT)
gpio.setup(segmentE, gpio.OUT)
gpio.setup(segmentF, gpio.OUT)
gpio.setup(segmentG, gpio.OUT)
gpio.setup(buzzer, gpio.OUT)
gpio.setup(champignon, gpio.IN)
gpio.setup(shutdown, gpio.IN)
gpio.setup(rot_select, gpio.IN)
gpio.setup(rot_enfonce, gpio.IN)

def affiche(nb, afficheur): # fonction affichage (nb: chiffre ou lettre a afficher. afficheur: selection du digit 1 a 4)
if afficheur == 1: # choix afficheur
gpio.output(afficheur1, gpio.HIGH)
else:
gpio.output(afficheur1, gpio.LOW)
if afficheur == 2:
gpio.output(afficheur2, gpio.HIGH)
else:
gpio.output(afficheur2, gpio.LOW)
if afficheur == 3:
gpio.output(afficheur3, gpio.HIGH)
else:
gpio.output(afficheur3, gpio.LOW)
if afficheur == 4:
gpio.output(afficheur4, gpio.HIGH)
else:
gpio.output(afficheur4, gpio.LOW)

if nb == ‘9’: # choix des segments a allumer (pour les chiffres et les lettres)
gpio.output(segmentA, gpio.HIGH)
gpio.output(segmentB, gpio.HIGH)
gpio.output(segmentC, gpio.HIGH)
gpio.output(segmentD, gpio.HIGH)
gpio.output(segmentE, gpio.LOW)
gpio.output(segmentF, gpio.HIGH)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘8’:
gpio.output(segmentA, gpio.HIGH)
gpio.output(segmentB, gpio.HIGH)
gpio.output(segmentC, gpio.HIGH)
gpio.output(segmentD, gpio.HIGH)
gpio.output(segmentE, gpio.HIGH)
gpio.output(segmentF, gpio.HIGH)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘7’:
gpio.output(segmentA, gpio.HIGH)
gpio.output(segmentB, gpio.HIGH)
gpio.output(segmentC, gpio.HIGH)
gpio.output(segmentD, gpio.LOW)
gpio.output(segmentE, gpio.LOW)
gpio.output(segmentF, gpio.LOW)
gpio.output(segmentG, gpio.LOW)
if nb == ‘6’:
gpio.output(segmentA, gpio.HIGH)
gpio.output(segmentB, gpio.LOW)
gpio.output(segmentC, gpio.HIGH)
gpio.output(segmentD, gpio.HIGH)
gpio.output(segmentE, gpio.HIGH)
gpio.output(segmentF, gpio.HIGH)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘5’:
gpio.output(segmentA, gpio.HIGH)
gpio.output(segmentB, gpio.LOW)
gpio.output(segmentC, gpio.HIGH)
gpio.output(segmentD, gpio.HIGH)
gpio.output(segmentE, gpio.LOW)
gpio.output(segmentF, gpio.HIGH)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘4’:
gpio.output(segmentA, gpio.LOW)
gpio.output(segmentB, gpio.HIGH)
gpio.output(segmentC, gpio.HIGH)
gpio.output(segmentD, gpio.LOW)
gpio.output(segmentE, gpio.LOW)
gpio.output(segmentF, gpio.HIGH)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘3’:
gpio.output(segmentA, gpio.HIGH)
gpio.output(segmentB, gpio.HIGH)
gpio.output(segmentC, gpio.HIGH)
gpio.output(segmentD, gpio.HIGH)
gpio.output(segmentE, gpio.LOW)
gpio.output(segmentF, gpio.LOW)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘2’:
gpio.output(segmentA, gpio.HIGH)
gpio.output(segmentB, gpio.HIGH)
gpio.output(segmentC, gpio.LOW)
gpio.output(segmentD, gpio.HIGH)
gpio.output(segmentE, gpio.HIGH)
gpio.output(segmentF, gpio.LOW)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘1’:
gpio.output(segmentA, gpio.LOW)
gpio.output(segmentB, gpio.HIGH)
gpio.output(segmentC, gpio.HIGH)
gpio.output(segmentD, gpio.LOW)
gpio.output(segmentE, gpio.LOW)
gpio.output(segmentF, gpio.LOW)
gpio.output(segmentG, gpio.LOW)
if nb == ‘0’:
gpio.output(segmentA, gpio.HIGH)
gpio.output(segmentB, gpio.HIGH)
gpio.output(segmentC, gpio.HIGH)
gpio.output(segmentD, gpio.HIGH)
gpio.output(segmentE, gpio.HIGH)
gpio.output(segmentF, gpio.HIGH)
gpio.output(segmentG, gpio.LOW)
if nb == ‘s’: # s de stop
gpio.output(segmentA, gpio.HIGH)
gpio.output(segmentB, gpio.LOW)
gpio.output(segmentC, gpio.HIGH)
gpio.output(segmentD, gpio.HIGH)
gpio.output(segmentE, gpio.LOW)
gpio.output(segmentF, gpio.HIGH)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘t’: # t de stop
gpio.output(segmentA, gpio.LOW)
gpio.output(segmentB, gpio.LOW)
gpio.output(segmentC, gpio.LOW)
gpio.output(segmentD, gpio.HIGH)
gpio.output(segmentE, gpio.HIGH)
gpio.output(segmentF, gpio.HIGH)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘o’: # o de stop
gpio.output(segmentA, gpio.LOW)
gpio.output(segmentB, gpio.LOW)
gpio.output(segmentC, gpio.HIGH)
gpio.output(segmentD, gpio.HIGH)
gpio.output(segmentE, gpio.HIGH)
gpio.output(segmentF, gpio.LOW)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘p’: # p de pb01
gpio.output(segmentA, gpio.HIGH)
gpio.output(segmentB, gpio.HIGH)
gpio.output(segmentC, gpio.LOW)
gpio.output(segmentD, gpio.LOW)
gpio.output(segmentE, gpio.HIGH)
gpio.output(segmentF, gpio.HIGH)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘b’: # b de pb01
gpio.output(segmentA, gpio.LOW)
gpio.output(segmentB, gpio.LOW)
gpio.output(segmentC, gpio.HIGH)
gpio.output(segmentD, gpio.HIGH)
gpio.output(segmentE, gpio.HIGH)
gpio.output(segmentF, gpio.HIGH)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘r’: # r de reso
gpio.output(segmentA, gpio.LOW)
gpio.output(segmentB, gpio.LOW)
gpio.output(segmentC, gpio.LOW)
gpio.output(segmentD, gpio.LOW)
gpio.output(segmentE, gpio.HIGH)
gpio.output(segmentF, gpio.LOW)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘e’: # e de reso
gpio.output(segmentA, gpio.HIGH)
gpio.output(segmentB, gpio.LOW)
gpio.output(segmentC, gpio.LOW)
gpio.output(segmentD, gpio.HIGH)
gpio.output(segmentE, gpio.HIGH)
gpio.output(segmentF, gpio.HIGH)
gpio.output(segmentG, gpio.HIGH)
if nb == ‘y’: # y de type et de bye
gpio.output(segmentA, gpio.LOW)
gpio.output(segmentB, gpio.HIGH)
gpio.output(segmentC, gpio.HIGH)
gpio.output(segmentD, gpio.HIGH)
gpio.output(segmentE, gpio.LOW)
gpio.output(segmentF, gpio.HIGH)
gpio.output(segmentG, gpio.HIGH)

# fin de la fonction affiche()

def efface(): # fonction qui efface l affichage (a executer apres la fonction affiche)
gpio.output(afficheur1, gpio.LOW)
gpio.output(afficheur2, gpio.LOW)
gpio.output(afficheur3, gpio.LOW)
gpio.output(afficheur4, gpio.LOW)
gpio.output(segmentA, gpio.LOW)
gpio.output(segmentB, gpio.LOW)
gpio.output(segmentC, gpio.LOW)
gpio.output(segmentD, gpio.LOW)
gpio.output(segmentE, gpio.LOW)
gpio.output(segmentF, gpio.LOW)
gpio.output(segmentG, gpio.LOW)
# fin de la fonction efface()

# on recupere l heure d alarme prevue sur rasp_reveil.php (soit HHMM, stop ou reso)
# ensuite dans la boucle infinie on fera ce check que a 18:00
html = urlopen(“http://www.site.com/page.php”) # ici on recupere tout ce qu il y a entre les balises et (a adapter a chaque site..)
reponse = html.read() # met le code HTML complet dans la variable $reponse
#on affiche ce qui est entre les balises html:
i = 0
i = reponse.find(‘html’, i)
#trouve le prochain ‘>’ apres ‘html’
i = reponse.find(‘>’, i+1)
#trouve le premier ”, i+1)
#trouve le premier ‘ Arret de la sonnerie..”)
enfonce_tmp = 0
time.sleep(0.1)
# puis on fait une boucle de 50
for i in range(50): # boucle qui repete la sonnerie (50x ce block qui dure 9sec donc 7.5 minutes
gpio.output(buzzer, gpio.LOW) # on coupe le buzzer et on attend 7 sec
if enfonce_tmp != 0: # si $enfonce_tmp = 0 on laisse le buzzer couper
for i in range(23): # boucle de 23 pour le sleep 23×0.3sec donc 6.9sec
if(gpio.input(champignon) == False): # check bouton champignon pour arreter la sonnerie
print(“Vous appuyez sur le champignon -> Arret de la sonnerie..”)
enfonce_tmp = 0
time.sleep(0.3)
if enfonce_tmp != 0: # si $enfonce_tmp = 0 on laisse le buzzer couper
gpio.output(buzzer, gpio.HIGH) # on lance le buzzer durant 2sec
for i in range(7): # boucle de 7 pour le sleep 7×0.3sec donc 2.1sec
if(gpio.input(champignon) == False): # check bouton champignon pour arreter la sonnerie
print(“Vous appuyez sur le champignon -> Arret de la sonnerie..”)
enfonce_tmp = 0
time.sleep(0.3)
if enfonce_tmp == 0:
break # si le champignon a ete appuyer on sort de la boucle 50
# fin de la boucle for 50x
gpio.output(buzzer, gpio.LOW) # on coupe le buzzer car suivant ou on est sorti il est tjs cozant
enfonce_tmp = 0
variable = “stop” # on desactive l alarme definitivement
# fin de la sonnerie

# check bouton shutdown
if(gpio.input(shutdown) == False):
print(‘Vous appuyez sur le bouton shutdown et rafraichir’)
time.sleep(1.4) # on attend un moment et on recheck la position du bouton: si lever -> rafraich et si tjs enfoncer -> shutdown
if(gpio.input(shutdown) == False): # tjs appuyer -> shutdown
print(“Le bouton shutdwon est maintenu -> goodbye!”)
#ci-dessous: on affiche “bye”
rebour = 200 # definit le temps que l affichage s allume
while rebour >= 0:
affiche(“b”,1) # envoie le chiffre ou la lettre (p b s t o) a dessiner et le numero de l afficheur
time.sleep(0.005)
affiche(“y”,2)
time.sleep(0.005)
affiche(“e”,3)
time.sleep(0.005)
rebour = rebour – 1
# fin boucle quand retour on rafraichit l heure de l alarme
print(“Le bouton shutdwon n’est pas maintenu -> on rafraichit l’heure de l’alarme”)
# on recupere l heure d alarme prevue sur rasp_reveil.php (soit HHMM, stop ou reso)
html = urlopen(“http://www.site.com/page.php”) # ici on recupere tout ce qu il y a entre les balises et (a adapter a chaque site..)
reponse = html.read() # met le code HTML complet dans la variable $reponse
#on affiche ce qui est entre les balises html:
i = 0
i = reponse.find(‘html’, i)
#trouve le prochain ‘>’ apres ‘html’
i = reponse.find(‘>’, i+1)
#trouve le premier ‘= 0:
affiche(heure_actuelle[0],1) # envoie le chiffre ou la lettre (p b s t o) a dessiner et le numero de l afficheur
time.sleep(0.005)
affiche(heure_actuelle[1],2)
time.sleep(0.005)
affiche(heure_actuelle[2],3)
time.sleep(0.005)
affiche(heure_actuelle[3],4)
time.sleep(0.005)
rebour = rebour – 1
# fin boucle quand retour Ajout de +5 min a l’heure d’alarme..”)
rebour = 20 # definit le temps que l affichage s allume
if variable1 == “s” or variable1 == “t” or variable1 == “r”: # c est stop ou type ou reso: on remet 00:00 (en variable type decimal)
print(“L’heure etait sur stop, type ou reso -> on la remet a 00:00”)
if enfonce_tmp == 0: # on met 00:00 car on fait heure alarme +5min
variable = ‘0000’
variable1 = ‘0’
variable2 = ‘0’
variable3 = ‘0’
variable4 = ‘0’
else: # enfonce_tmp == 1: # on met 23:55 car on fait heure alarme -5min
variable = ‘2355’
variable1 = ‘2’
variable2 = ‘3’
variable3 = ‘5’
variable4 = ‘5’
else:
minute = (int(variable1)*600)+(int(variable2)*60)+(int(variable3)*10)+(int(variable4)*1) # on transforme heure alarm en min
if enfonce_tmp == 0: # on ajoute ou enleve 5 min en fonction de la position de $enfonce_tmp definit par le bouton rot_enfonce
minute = (int(minute)+5)
else:
minute = (int(minute)-5)
if int(minute) > 1439 or int(minute) 9:
variable3 = minute[0]
variable4 = minute[1]
else:
minute = “0”+(minute)
variable3 = “0”
variable4 = minute[1]
variable = variable1 + variable2 + variable3 + variable4 # retour en HHMM
while rebour >= 0:
affiche(variable1,1) # on envoie la nouvelle heure d alarme (HHMM) sur l afficheur
time.sleep(0.005)
affiche(variable2,2)
time.sleep(0.005)
affiche(variable3,3)
time.sleep(0.005)
affiche(variable4,4)
time.sleep(0.005)
rebour = rebour – 1
# fin boucle quand retour Affiche l’heure de l’alarme, et inverse le sens de rotation du bouton rot_select..”)
if enfonce_tmp == 0:
enfonce_tmp = 1 # heure alarme +5min
else:
enfonce_tmp = 0 # heure alarme -5min
rebour = 200 # definit le temps que l affichage s allume
while rebour >= 0:
affiche(variable1,1) # on envoie l heure de l alarme (HHMM) sur l afficheur
time.sleep(0.005)
affiche(variable2,2)
time.sleep(0.005)
affiche(variable3,3)
time.sleep(0.005)
affiche(variable4,4)
time.sleep(0.005)
rebour = rebour – 1
# fin boucle quand retour < 0
efface() # on reset l affichage
# fin bouton rot_enfonce

# une petite pause entre chaque boucle, afin de reduire la charge sur le CPU
time.sleep(0.06)
#retour debut de la boucle

http://ouiaremakers.com/wp-includes/images/media/text.png

Vous aimez ce tutoriel ?


framboise314

18 déc. 2016 à 09:11

Bonjour Pascal
vous avez remporté le concours ENI
et avez gagné un kit media center et mon livre...
merci de me contacter contact@framboise314.fr
ou ENI news@editions-eni.fr
cordialement
François

la.couenne

21 déc. 2016 à 21:10

Wow trop bô!!!
Déjà quand je vois dans les notifications que Framboise314 a commenté mon tuto ça me touche, mais alors pour me dire que j'ai gagné je suis trop content!
Merci merci :)


Gotronic

Voir l'espace DIY gotronic


S'inscrire:


  • Vues: 501
  • J'aime: 4