# Version PRUEBAS HILOS for Python
######################################################## GALERIAS IMPORTADAS ########################################################
from tkinter import *
from tkinter import messagebox
import tkinter as tk
import time
from datetime import datetime, timedelta
import RPi.GPIO as GPIO
import os
import locale
import sched
import threading
from multiprocessing import Process
import sqlite3
import urllib.request
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
######################################################## ANULACIÓN DE "X" DE CERRADO DE VENTANAS ########################################################
def botonCerrarTotal():
pass
######################################################## INTERFACE GENERAL ########################################################
raiz = Tk()
raiz.resizable(False,False)
raiz.geometry("1024x768")
raiz.attributes('-fullscreen', True)
raiz.protocol('WM_DELETE_WINDOW', botonCerrarTotal)
######################################################## FONDO DE PANTALLA PRINCIPAL ########################################################
FramePrincipal=Frame(raiz)
FramePrincipal.pack()
FramePrincipal.config(bg="black", width="1024", height="768")
######################################################## ETIQUETAS DE INFORMACIÓN ########################################################
FrameLetreroFalloAlimentacion=Frame(raiz)
FrameLetreroFalloAlimentacion.pack()
FrameLetreroFalloAlimentacion = tk.Label(raiz, text=" FALLO \n ALIMENTACION ", bg="white", fg="black", relief="sunken", bd=2, font=('Tahoma', 10))
FrameLetreroFalloAlimentacion.place(x=6, y=380)
######################################################## BOTON REARME MANUAL ########################################################
STBotonRearmeManual = tk.BooleanVar()
STBotonRearmeManual.set(True)
def pulsacionBotonRearmeManual():
if STBotonRearmeManual.get() == True:
STBotonRearmeManual.set(True)
STBotonParoManual.set(False)
BotonRearmeManual.config(image=ImagenBotonRearmeManualPulsado)
BotonParoManual.config(image=ImagenBotonParoManualSinPulsar)
else:
STBotonRearmeManual.set(True)
STBotonParoManual.set(False)
BotonRearmeManual.config(image=ImagenBotonRearmeManualPulsado)
BotonParoManual.config(image=ImagenBotonParoManualSinPulsar)
EventoBotonRearmeManual = datetime.now().strftime("%A, %d de %B de %Y a las %H:%M:%S")
print("PULSADOR REARME MANUAL ACTIVADO " + time.strftime(EventoBotonRearmeManual))
BotonRearmeManual=Frame(raiz)
BotonRearmeManual.pack()
ImagenBotonRearmeManualDeshabilitado = PhotoImage (file = "BOTON_ON_STANDBY.png")
ImagenBotonRearmeManualHabilitado = PhotoImage (file = "BOTON_ON_STANDBY.png")
ImagenBotonRearmeManualSinPulsar = PhotoImage (file = "BOTON_ON_STANDBY.png")
ImagenBotonRearmeManualPulsado = PhotoImage (file = "BOTON_ON_VERDE.png")
BotonRearmeManual = tk.Button(raiz, image=ImagenBotonRearmeManualDeshabilitado, command=pulsacionBotonRearmeManual)
BotonRearmeManual.config(width="120", height="120")
BotonRearmeManual.place(x=279, y=394)
######################################################## BOTON PARO EMERGENCIA ########################################################
STBotonParoManual = tk.BooleanVar()
STBotonParoManual.set(False)
def pulsacionBotonParoManual():
if STBotonParoManual.get() == False:
STBotonRearmeManual.set(False)
STBotonParoManual.set(True)
BotonParoManual.config(image=ImagenBotonParoManualPulsado)
BotonRearmeManual.config(image=ImagenBotonRearmeManualSinPulsar)
EventoBotonParoManual = datetime.now().strftime("%A, %d de %B de %Y a las %H:%M:%S")
print("PULSADOR PARO EMERGENCIA ACTIVADO " + time.strftime(EventoBotonParoManual))
else:
STBotonRearmeManual.set(False)
STBotonParoManual.set(True)
BotonParoManual.config(image=ImagenBotonParoManualPulsado)
BotonRearmeManual.config(image=ImagenBotonRearmeManualSinPulsar)
BotonParoManual=Frame(raiz)
BotonParoManual.pack()
ImagenBotonParoManualDeshabilitado = PhotoImage (file = "BOTON_ON_STANDBY.png")
ImagenBotonParoManualHabilitado = PhotoImage (file = "BOTON_ON_STANDBY.png")
ImagenBotonParoManualSinPulsar = PhotoImage (file = "BOTON_ON_STANDBY.png")
ImagenBotonParoManualPulsado = PhotoImage (file = "BOTON_ON_ROJO.png")
BotonParoManual = tk.Button(raiz, image=ImagenBotonParoManualDeshabilitado, command=pulsacionBotonParoManual)
BotonParoManual.config(width="120", height="120")
BotonParoManual.place(x=536, y=350)
######################################################## CERRAR EL SISTEMA NEMESIS ########################################################
def salirSistema():
raiz.destroy()
######################################################## CONFIGURACIÓN SISTEMA GPIO ########################################################
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(3, GPIO.OUT) # TESTIGO LUMINOSO - FALLO ALIMENTACION + REPORTE CRA - FALLO ALIMENTACION
GPIO.setup(5, GPIO.OUT) # TESTIGO LUMINOSO - FALLO DETECCION INCENDIO + REPORTE CRA - FALLO DETECCION INCENDIO
GPIO.setup(7, GPIO.OUT) # CONTROL - BUZZER
GPIO.setup(11, GPIO.OUT) # TESTIGO LUMINOSO - DETECCION INCENDIO + REPORTE CRA - DETECCION INCENDIO
GPIO.setup(13, GPIO.OUT) # TESTIGO LUMINOSO - EXTINTOR SURTIDORES + REPORTE CRA - EXTINTOR SURTIDORES
GPIO.setup(15, GPIO.OUT) # TESTIGO LUMINOSO - DETECTOR DE FUGAS TANQUE + REPORTE CRA - DETECTOR DE FUGAS
GPIO.setup(19, GPIO.OUT) # TESTIGO LUMINOSO - SISTEMA FUNCIONANDO
GPIO.setup(21, GPIO.OUT) # TESTIGO LUMINOSO - SISTEMA PARADO + REPORTE CRA - NOTIFICACION PARO SISTEMA
GPIO.setup(23, GPIO.OUT) #
GPIO.setup(29, GPIO.OUT) #
GPIO.setup(31, GPIO.OUT) #
GPIO.setup(33, GPIO.OUT) #
GPIO.setup(35, GPIO.OUT) # CONTROL - CORTE SUMINISTRO SURTIDORES
GPIO.setup(37, GPIO.OUT) # CONTROL - ANULACION ALIMENTACION BUZZER
GPIO.setup(8, GPIO.IN, GPIO.PUD_UP) # CONTROL LOCAL - REARME SISTEMA (CUADRO)
GPIO.setup(10, GPIO.IN, GPIO.PUD_UP) # CONTROL LOCAL - PARO EMERGENCIA SISTEMA (SETA)
GPIO.setup(12, GPIO.OUT) #
GPIO.setup(16, GPIO.OUT) #
GPIO.setup(18, GPIO.IN, GPIO.PUD_UP) # MONITORIZACION INSTALACION - DETECTOR INCENDIO
GPIO.setup(22, GPIO.IN, GPIO.PUD_UP) # MONITORIZACION INSTALACION - FALLO DETECTOR INCENDIO
GPIO.setup(24, GPIO.IN, GPIO.PUD_UP) # MONITORIZACION INSTALACION - EXTINTOR SURTIDORES
GPIO.setup(26, GPIO.IN, GPIO.PUD_UP) # MONITORIZACION INSTALACION - DETECTOR DE FUGAS TANQUE
GPIO.setup(32, GPIO.IN, GPIO.PUD_UP) # MONITORIZACION INSTALACION - FALLO ALIMENTACION
GPIO.setup(36, GPIO.IN, GPIO.PUD_UP) # CONTROL REMOTO - REARME SISTEMA
GPIO.setup(38, GPIO.IN, GPIO.PUD_UP) # CONTROL REMOTO - PARO EMERGENCIA SISTEMA
GPIO.setup(40, GPIO.OUT) # CONTROL - ANULACION ALIMENTACION GPIO
######################################################## CONTROL SISTEMA GPIO ########################################################
# BUZZER ALARMAS Y LICENCIAS:
STBuzzerAlarmas = tk.BooleanVar()
STBuzzerAlarmas.set(False)
STBuzzerLicencias = tk.BooleanVar()
STBuzzerLicencias.set(False)
def LeerEstadoBuzzerAlarmas():
STBuzzerAlarmas.get()
print(STBuzzerAlarmas.get())
def LeerEstadoBuzzerLicencias():
STBuzzerLicencias.get()
print(STBuzzerLicencias.get())
def CambioEstadoBuzzer():
while (True):
if STBuzzerAlarmas.get() == False and STBuzzerLicencias.get() == False:
while (STBuzzerAlarmas.get() == False and STBuzzerLicencias.get() == False):
GPIO.output(7, GPIO.LOW)
raiz.update()
if STBuzzerAlarmas.get() == False and STBuzzerLicencias.get() == True:
while (STBuzzerAlarmas.get() == False and STBuzzerLicencias.get() == True):
GPIO.output(7, GPIO.HIGH)
time.sleep(0.1)
raiz.update()
GPIO.output(7, GPIO.LOW)
time.sleep(0.1)
raiz.update()
GPIO.output(7, GPIO.HIGH)
time.sleep(0.1)
raiz.update()
GPIO.output(7, GPIO.LOW)
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
time.sleep(0.2)
if STBuzzerAlarmas.get() == True:
break
raiz.update()
if STBuzzerAlarmas.get() == True and STBuzzerLicencias.get() == False:
while (STBuzzerAlarmas.get() == True and STBuzzerLicencias.get() == False):
GPIO.output(7, GPIO.HIGH)
time.sleep(0.25)
raiz.update()
GPIO.output(7, GPIO.LOW)
time.sleep(0.25)
raiz.update()
if STBuzzerAlarmas.get() == True and STBuzzerLicencias.get() == True:
while (STBuzzerAlarmas.get() == True and STBuzzerLicencias.get() == True):
GPIO.output(7, GPIO.HIGH)
time.sleep(0.25)
raiz.update()
GPIO.output(7, GPIO.LOW)
time.sleep(0.25)
raiz.update()
def VerificacionParoEstadoBuzzerAlarmas():
if STFalloAlimentacion.get() == True:
pass
else:
ParoBuzzerAlarmas()
def ActivacionBuzzerAlarmas():
lock.acquire()
STBuzzerAlarmas.set(True)
lock.release()
def ParoBuzzerAlarmas():
lock.acquire()
STBuzzerAlarmas.set(False)
lock.release()
def ActivacionBuzzerLicencias():
lock.acquire()
STBuzzerLicencias.set(True)
lock.release()
def ParoBuzzerLicencias():
lock.acquire()
STBuzzerLicencias.set(False)
lock.release()
######################################################## ALARMA LUMINOSA FALLO ALIMENTACION ########################################################
STFalloAlimentacion = tk.BooleanVar()
STFalloAlimentacion.set(False)
def LeerEstadoFalloAlimentacion():
STFalloAlimentacion.get()
print(STFalloAlimentacion.get())
def ActivacionEstadoFalloAlimentacion():
if (BotonRearmeManual["state"] and BotonParoManual["state"] == tk.DISABLED):
pass
else:
EventoActivacionEstadoFalloAlimentacion = datetime.now().strftime("%A, %d de %B de %Y a las %H:%M:%S")
if STFalloAlimentacion.get() == True:
pass
else:
lock.acquire()
STFalloAlimentacion.set(True)
lock.release()
print("FALLO DE SUMINISTRO ELECTRICO " + time.strftime(EventoActivacionEstadoFalloAlimentacion))
ActivacionBuzzerAlarmas()
def ParoEstadoFalloAlimentacion():
EventoParoEstadoFalloAlimentacion = datetime.now().strftime("%A, %d de %B de %Y a las %H:%M:%S")
if STFalloAlimentacion.get() == False:
pass
else:
lock.acquire()
STFalloAlimentacion.set(False)
lock.release()
print("RESTABLECIMIENTO DE FALLO DE SUMINISTRO ELECTRICO " + time.strftime(EventoParoEstadoFalloAlimentacion))
VerificacionParoEstadoBuzzerAlarmas()
def CambioEstadoFalloAlimentacion():
if STFalloAlimentacion.get() == False:
FrameLetreroFalloAlimentacion.config (bg="white")
raiz.update()
else:
FrameLetreroFalloAlimentacion.config (bg="red")
raiz.update()
# ACTIVACION / PARO SISTEMA GPIO:
def CambioEstadoInputGPIO():
while (True):
# CONTROL LOCAL - REARME SISTEMA (CUADRO)
if GPIO.input(8) == False: # ACTIVACION
STBotonRearmeManual.set(True)
pulsacionBotonRearmeManual()
# CONTROL LOCAL - PARO EMERGENCIA (SETA)
if GPIO.input(10) == False: # ACTIVACION
STBotonParoManual.set(False)
pulsacionBotonParoManual()
# CONTROL REMOTO - REARME SISTEMA
if GPIO.input(36) == False: # ACTIVACION
pulsacionRearmeRemoto()
# CONTROL REMOTO - PARO EMERGENCIA SISTEMA
if GPIO.input(38) == False: # ACTIVACION
pulsacionParoRemoto()
# MONITORIZACION INSTALACION - FALLO ALIMENTACION
if GPIO.input(32) == False: # ACTIVACION
ActivacionEstadoFalloAlimentacion()
CambioEstadoFalloAlimentacion()
ActivacionBuzzerAlarmas()
else: # DESACTIVACION
ParoEstadoFalloAlimentacion()
CambioEstadoFalloAlimentacion()
VerificacionParoEstadoBuzzerAlarmas()
######################################################## CONFIGURACION HILOS DE PROCESOS ########################################################
lock = threading.Lock()
HiloBuzzer = threading.Thread(target=CambioEstadoBuzzer)
HiloBuzzer.start()
HiloInputGPIO = threading.Thread(target=CambioEstadoInputGPIO)
HiloInputGPIO.start()
def contadorHilosActivos():
threading.active_count()
print ("Hilos activos: " + str(threading.active_count()))
######################################################## BARRA DE MENÚ ########################################################
barraMenu=Menu(raiz)
raiz.config(menu=barraMenu)
sistemaMenu=Menu(barraMenu, tearoff=0)
sistemaMenu.add_command(label="Salir", command=salirSistema)
sistemaMenu.add_separator()
pruebaMenu=Menu(barraMenu, tearoff=0)
pruebaMenu.add_command(label="Activar Buzzer Alarmas", command=ActivacionBuzzerAlarmas)
pruebaMenu.add_separator()
pruebaMenu.add_command(label="Silenciar Buzzer Alarmas", command=VerificacionParoEstadoBuzzerAlarmas)
pruebaMenu.add_separator()
pruebaMenu.add_command(label="Activar Buzzer Licencias", command=ActivacionBuzzerLicencias)
pruebaMenu.add_separator()
pruebaMenu.add_command(label="Silenciar Buzzer Licencias", command=ParoBuzzerLicencias)
pruebaMenu.add_separator()
pruebaMenu.add_command(label="Activar Fallo Alimentación", command=lambda:[ActivacionEstadoFalloAlimentacion(), CambioEstadoFalloAlimentacion()])
pruebaMenu.add_separator()
pruebaMenu.add_command(label="Parar Fallo Alimentación", command=lambda:[ParoEstadoFalloAlimentacion(), CambioEstadoFalloAlimentacion()])
pruebaMenu.add_separator()
programacionMenu=Menu(barraMenu, tearoff=0)
programacionMenu.add_separator()
programacionMenu.add_command(label="Contador Hilos Activos", command=contadorHilosActivos)
barraMenu.add_cascade(label="Sistema", menu=sistemaMenu)
barraMenu.add_cascade(label="Prueba de Sistema", menu=pruebaMenu)
barraMenu.add_cascade(label="Programacion", menu=programacionMenu)
raiz.protocol("WM_DELETE_WINDOW", salirSistema)
raiz.mainloop()