May-04-2022, 01:26 PM
Hello,
I have this assigment to do. An interface for an alarm system. I came up with this code at first.
Thank you
I have this assigment to do. An interface for an alarm system. I came up with this code at first.
from time import sleep import time import smtplib import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) bouton_alert_Del1 = 16 senseur_Del2 = 12 DEL1 = 18 DEL2 = 22 GPIO.setwarnings(False) GPIO.setup(bouton_alert_Del1,GPIO.IN,pull_up_down=GPIO.PUD_UP) GPIO.setup(senseur_Del2,GPIO.IN,pull_up_down=GPIO.PUD_UP) GPIO.setup(DEL1,GPIO.OUT,) GPIO.setup(DEL2,GPIO.OUT) led_off1=False led_off2=False sender = "[email protected]" receiver = "[email protected]" message = f"""\ Subject: Message de Raspberry Pi To: {receiver} From: {sender} Alarme de la maison!""" def decompte_E(t): while t: min , sec = divmod(t,60) timer = '{:02d}:{:02d}'.format(min, sec) print(timer, end='\r') time.sleep(1) t -= 1 if t == 0: print('Code refusé!') else: print('Code accepté!') t = 10 def decompte(t): while t: min , sec = divmod(t,60) timer = '{:02d}:{:02d}'.format(min, sec) print(timer, end='\r') time.sleep(1) t -= 1 print('Code accepté!') t = 10 def delai(): #délai d'entrée print('Vous avez 10 secondes avant l`enclenchement de l`alarme!') print("Entrez votre code:") GPIO.output(DEL1,True) time.sleep(.1) decompte(int(t)) GPIO.output(DEL1,True) time.sleep(1) GPIO.output(DEL1,False) time.sleep(1) GPIO.output(DEL1,True) def courriel(): print("Il y a un intrus!") try: server= smtplib.SMTP("smtp.mailtrap.io", 2525) server.login("096477fce46f57", "49f784782bcc12") server.sendmail(sender, receiver, message) print('Courriel envoyé') except smtplib.SMTPException: print("Impossible d'envoyer le courriel à " + receiver) except (smtplib.socket.error, smtplib.SMTPConnectError): print("Connexion impossible au serveur SMTP") while(True): if GPIO.input(bouton_alert_Del1)==0: if led_off1==False: print("Le système d'alarme est activé") delai() GPIO.output(DEL1,True) led_off1=True sleep(.5) else: print('Vous avez 10 secondes pour entrer votre code!') decompte(int(t)) print("Le système d'alarme est désactivé") GPIO.output(DEL1,False) GPIO.output(DEL2,False) led_off1=False sleep(.5) if GPIO.input(senseur_Del2)==1 and GPIO.input(bouton_alert_Del1)==1: if led_off1==True: print('Vous avez 10 secondes pour entrer votre code!') decompte_E(int(t)) GPIO.output(DEL2,True) time.sleep(.2) GPIO.output(DEL2,False) time.sleep(.2) led_off2=True sleep(.5) if courriel: courriel() courriel = None else: GPIO.output(DEL2,False) led_off2=True sleep(.5)Now i have to turn this into this example from the teacher.
Created on 22 avril 2022 @author: basanets ''' from enum import Enum from RPiSim import GPIO from threading import Thread import sys import signal import time PORTE_PIN = 5 BOUTON_PIN = 17 SIRENE_PIN = 18 DEL_PIN = 23 class Etat(Enum): OFF = 1 DELAI_E = 2 ARME = 3 DELAI_S = 4 SIRENE = 5 etat = Etat.OFF class Event(Enum): porte = 1 btnArm = 2 code = 3 boutonInterface = 4 finDelais = 5 ############################################### """ Les fonctions """ ############################################### def terminer(signum, frame): print("Terminer") GPIO.output(SIRENE_PIN, GPIO.LOW) GPIO.cleanup() sys.exit(0) def event_btnArm(channel): print("event bouton arm") setEtat(Event.btnArm) def event_porte(channel): print("event porte") setEtat(Event.porte) def setEtat(event): global etat print("set etat") if event == Event.btnArm: if etat == Etat.OFF: print ("Delais de sortie") etat = Etat.DELAI_S thread = Thread(target=blinkDEL, args=()) thread.start() # Afficher ecran Désarmé elif etat == Etat.ARME: print ("Desarmer") etat = Etat.OFF GPIO.output(DEL_PIN, GPIO.LOW) GPIO.output(SIRENE_PIN, GPIO.LOW) # Affficher ecran armé elif etat == Etat.DELAI_S: print ("Desarmer") etat = Etat.OFF thread.stop() GPIO.output(DEL_PIN, GPIO.LOW) # Affficher ecran armé elif etat == Etat.SIRENE: print ("Desarmer") etat = Etat.OFF GPIO.output(DEL_PIN, GPIO.LOW) GPIO.output(SIRENE_PIN, GPIO.LOW) # Affficher ecran armé elif etat == Etat.DELAI_E: print ("Desarmer") etat = Etat.OFF thread.stop() GPIO.output(DEL_PIN, GPIO.LOW) # Affficher ecran armé elif event == Event.finDelais: if etat == Etat.DELAI_S: print ("Armer") etat = Etat.ARME GPIO.output(DEL_PIN, GPIO.HIGH) # Afficher ecran Désarmé elif etat == Etat.DELAI_E: print("Sirene") etat = Etat.SIRENE GPIO.output(SIRENE_PIN, GPIO.HIGH) elif event == Event.porte: if etat == Etat.ARME: print("Ouverture d'une porte") etat = Etat.DELAI_E thread = Thread(target=blinkDEL, args=()) thread.start() def blinkDEL(): DELAI = 5 delai = 0 while delai <= DELAI: if GPIO.input(DEL_PIN): GPIO.output(DEL_PIN, GPIO.LOW) else: GPIO.output(DEL_PIN, GPIO.HIGH) time.sleep(1) delai = delai + 1 setEtat(Event.finDelais) ################################### """ Mon programme """ ################################### """ Configuration des GPIOs """ signal.signal(signal.SIGINT, terminer) try: GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) """ Bouton poussoir on/off """ GPIO.setup(BOUTON_PIN,GPIO.MODE_IN,pull_up_down = GPIO.PUD_UP) GPIO.add_event_detect(BOUTON_PIN, GPIO.FALLING, callback=event_btnArm) """ Porte """ GPIO.setup(PORTE_PIN,GPIO.MODE_IN,pull_up_down = GPIO.PUD_UP) GPIO.add_event_detect(PORTE_PIN, GPIO.FALLING, callback=event_porte) """ Sirene """ GPIO.setup(SIRENE_PIN,GPIO.MODE_OUT, initial=GPIO.LOW) """ DEL """ GPIO.setup(DEL_PIN,GPIO.MODE_OUT, initial=GPIO.LOW) except Exception: print("Problème avec les GPIO") while True: time.sleep(0.5)Now deanhystad came with this interesting code that looks a lot like what the teacher wants.
from re import A import time import enum import RPi.GPIO as GPIO class LEDModes(enum.IntEnum): OFF = 0 ON = 1 BLINK = 2 class LED(): """Class to control LED. Turn on, off or blink""" def __init__(self, pin, period=0.5): self.pin = pin self.period = period GPIO.setup(pin, GPIO.OUT) self.mode = LEDModes.OFF @property def mode(self): return self._mode @mode.setter def mode(self, value): """Set to OFF, ON or BLINK""" self._mode = value self.state = value in (LEDModes.ON, LEDModes.BLINK) GPIO.output(self.pin, self.state) self.blink_time = time.time() def update(self): """Call periodically to support blinking""" if self._mode == LEDModes.BLINK: t = time.time() if t - self.blink_time >= self.period: self.state = not self.state GPIO.output(self.pin, self.state) self.blink_time += self.period class Button(): """Class that makes buttons easier to work with""" def __init__(self, pin): self.pin = pin GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) def pressed(self): """Return True if button pressed""" return GPIO.input(self.pin) == 0 GPIO.setmode(GPIO.BOARD) arm_button = Button(16) arm_lamp = LED(22) alarm_button = Button(12) alarm_lamp = LED(18) armed = alarm = False while True: new_armed = arm_button.pressed() new_alarm = alarm_button.pressed() and new_armed if new_armed != armed: armed = new_armed arm_lamp.mode = LEDModes.ON if armed else LEDModes.OFF if new_alarm != alarm: alarm = new_alarm if alarm: # send email alarm_lamp.mode = LEDModes.BLINK else: alarm_lamp.mode = LEDModes.OFF alarm_lamp.update() # Update alarm lamp so it will blinkNow i must create a code like the one deanhystad has suggested and include an interface like this one, i am trying to do, but is not working very well for next week.
# -*- coding: utf-8 -*- import pygame from pygame.locals import * import sys import time #screen = pygame.display.set_mode((128, 128)) clock = pygame.time.Clock() pygame.init() #display = pygame.display.set_mode((300, 300)) pygame.display.set_caption('Panneau de contr\u00f4le') FPS_CLOCK = pygame.time.Clock() #counter, text = 10, '10'.rjust(3) #pygame.time.set_timer(pygame.USEREVENT, 1000) #font = pygame.font.SysFont('Consolas', 30) #pygame.init() BLEU = (0, 0, 255) BLANC = (255, 255, 255) ROUGE = (255, 0, 0) GREEN = (0, 255, 0) BLACK = (0, 0, 0) GRIS = (200, 200, 200) BLANC = (255, 255, 255) NOIR = (0, 0, 0) screen = pygame.display.set_mode([700, 500]) # Charger un police de caract\u00e8re sysfont = pygame.font.get_default_font() font = pygame.font.SysFont(None, 48) def bouton_A(screen, pos, texte): rayon = 55 pygame.draw.circle(screen, GREEN, pos, rayon) txtBtn = font.render(texte, True, NOIR) rectBtn = txtBtn.get_rect() rectBtn.center = (pos) screen.blit(txtBtn, rectBtn) def bouton_D(screen, pos, texte): rayon = 55 pygame.draw.circle(screen, ROUGE, pos, rayon) txtBtn = font.render(texte, True, NOIR) rectBtn = txtBtn.get_rect() rectBtn.center = (pos) screen.blit(txtBtn, rectBtn) def bouton_nb(screen, pos, texte): rayon = 25 pygame.draw.circle(screen, GRIS, pos, rayon) txtBtn = font.render(texte, True, NOIR) rectBtn = txtBtn.get_rect() rectBtn.center = (pos) screen.blit(txtBtn, rectBtn) def decompte(): #screen = pygame.display.set_mode((128, 128)) #clock = pygame.time.Clock() counter, text = 10, '10'.rjust(3) pygame.time.set_timer(pygame.USEREVENT, 1000) font = pygame.font.SysFont('Consolas', 30) run = True while run: for e in pygame.event.get(): if e.type == pygame.USEREVENT: counter -= 1 text = str(counter).rjust(3) if counter > 0 else 'Merci!' if e.type == pygame.QUIT: run = False screen.blit(font.render(text, True, (255, 255, 255)), (300, 408)) pygame.display.flip() clock.tick(60) def horloge(): theFont=pygame.font.Font(None,42) clock = pygame.time.Clock() while True: clock.tick(1) theTime=time.strftime("%H:%M:%S", time.localtime()) timeText=theFont.render(str(theTime), True,(255,255,255),(0,0,0)) screen.blit(timeText, (518,428)) #pygame.display.update() sysfont = pygame.font.get_default_font() font = pygame.font.SysFont(None, 36) def image(): image = pygame.image.load(r'C:/home/pi/Documents/3.png') display_surface.blit(image, (93, 406)) running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False #mouse_presses = pygame.mouse.get_pressed() #if mouse_presses[0]: if event.type == pygame.MOUSEBUTTONDOWN: x , y = pygame.mouse.get_pos() print(x,y) if x > 104 and x < 204 and y > 196 and y < 301: img = font.render("Entrez votre code pour d\u00e9sarmer le systeme d'alarme!", True, NOIR) screen.blit(img, (20, 100)) img = font.render("Veuillez entrer votre code pour armer le systeme d'alarme!", True, BLANC) screen.blit(img, (20, 100)) decompte() if x < 549 and x > 444 and y > 192 and y < 309: img = font.render("Veuillez entrer votre code pour armer le systeme d'alarme!", True, NOIR) screen.blit(img, (20, 100)) img = font.render("Entrez votre code pour d\u00e9sarmer le systeme d'alarme!", True, BLANC) screen.blit(img, (20, 100)) #if event.type == pygame.USEREVENT: #counter -= 1 #text = str(counter).rjust(3) if counter > 0 else 'Merci!' #if event.type == pygame.QUIT: #run = False #screen.fill((255, 255, 255)) #screen.blit(font.render(text, True, (255, 255, 255)), (300, 408)) #pygame.display.flip() #clock.tick(60) #screen.fill(BLANC) bouton_A(screen, (150, 250), "Activ\u00e9") bouton_D(screen, (500, 250), "D\u00e9sactiv\u00e9") bouton_nb(screen, (265, 200), "1") bouton_nb(screen, (320, 200), "2") bouton_nb(screen, (375, 200), "3") bouton_nb(screen, (265, 255), "4") bouton_nb(screen, (320, 255), "5") bouton_nb(screen, (375, 255), "6") bouton_nb(screen, (265, 310), "7") bouton_nb(screen, (320, 310), "8") bouton_nb(screen, (375, 310), "9") #pygame.draw.circle(screen, GRIS, (260, 250), 25) #pygame.display.flip() img = font.render("Bienvenue", True, ROUGE) screen.blit(img, (20, 20)) pygame.display.flip() pygame.display.update() #horloge() #image() FPS_CLOCK.tick(30) pygame.quit()I dont know where to begin. Any suggestion is welcome.
Thank you