Project

General

Profile

codigoFinal.py

Cristofer Pinto, 12/11/2024 02:53 AM

Download (8.48 KB)

 
1
import asyncio
2
import time
3
import grovepi
4
from grove_rgb_lcd import setText, setRGB  # Librería para la pantalla LCD
5
from telegram import Update
6
from telegram.ext import Application, CommandHandler, ContextTypes
7

    
8
# Configuración de los pines
9
TEMP_HUM_SENSOR_PORT = 6  
10
LIGHT_SENSOR_PORT = 0
11
relay_pin = 5
12
red_pin = 7
13
blue_pin = 2
14

    
15
grovepi.pinMode(LIGHT_SENSOR_PORT, "INPUT")
16
grovepi.pinMode(relay_pin, "OUTPUT")
17
grovepi.pinMode(red_pin, "OUTPUT")
18
grovepi.pinMode(blue_pin, "OUTPUT")
19

    
20
# Límites configurados (Variables globales)
21
temp_H = 30
22
temp_L = 20
23
luz_L = 300
24
hum_H = 50
25
hum_L = 35
26

    
27
# Flag para el modo automático
28
auto_mode = False
29

    
30
# Funciones para manejar la pantalla LCD
31
def mostrar_comandos_lcd():
32
    """Muestra en la pantalla LCD los comandos disponibles."""
33
    texto = "/datos /autoON\n/comandos"
34
    setText(texto)
35
    setRGB(0, 128, 64)  # Color verde para indicar estado listo
36

    
37
# Funciones de lectura de sensores
38
def read_temp_humidity():
39
    try:
40
        [temp, humidity] = grovepi.dht(TEMP_HUM_SENSOR_PORT, 0)
41
        return temp, humidity
42
    except Exception as e:
43
        return None, None
44

    
45
def read_light():
46
    try:
47
        return grovepi.analogRead(LIGHT_SENSOR_PORT)
48
    except Exception as e:
49
        return None
50

    
51
# Funciones para encender dispositivos
52
def encender_ventilador():
53
    grovepi.digitalWrite(relay_pin, 1)
54
    time.sleep(15)
55
    grovepi.digitalWrite(relay_pin, 0)
56

    
57
def encender_calentador():
58
    grovepi.digitalWrite(red_pin, 1)
59
    time.sleep(10)
60
    grovepi.digitalWrite(red_pin, 0)
61

    
62
def encender_luz():
63
    grovepi.digitalWrite(blue_pin, 1)
64
    time.sleep(10)
65
    grovepi.digitalWrite(blue_pin, 0)
66

    
67
# Comandos del bot
68
async def enviar_datos(update: Update, context: ContextTypes.DEFAULT_TYPE):
69
    temp, humidity = read_temp_humidity()
70
    light = read_light()
71
    mensaje = ""
72

    
73
    # Datos de temperatura y humedad
74
    if temp is not None and humidity is not None:
75
        mensaje += f"Temperatura: {temp}°C\nHumedad: {humidity}%\n"
76
        if temp > temp_H:
77
            mensaje += "Advertencia: Temperatura alta. Considere encender el ventilador.\n"
78
        elif temp < temp_L:
79
            mensaje += "Advertencia: Temperatura baja. Considere encender el calentador.\n"
80
        if humidity > hum_H:
81
            mensaje += "Advertencia: Humedad alta. Verifique las condiciones.\n"
82
        elif humidity < hum_L:
83
            mensaje += "Advertencia: Humedad baja. Verifique las condiciones.\n"
84
    else:
85
        mensaje += "Error al leer el sensor de temperatura y humedad.\n"
86

    
87
    # Datos de luz
88
    if light is not None:
89
        mensaje += f"Intensidad de luz: {light}\n"
90
        if light < luz_L:
91
            mensaje += "Advertencia: Luminosidad baja. Considere encender la luz.\n"
92
    else:
93
        mensaje += "Error al leer el sensor de luz.\n"
94

    
95
    await update.message.reply_text(mensaje)
96

    
97
async def comando_ventilador(update: Update, context: ContextTypes.DEFAULT_TYPE):
98
    encender_ventilador()
99
    await update.message.reply_text("Ventilador encendido durante 15 segundos.")
100

    
101
async def comando_calentador(update: Update, context: ContextTypes.DEFAULT_TYPE):
102
    encender_calentador()
103
    await update.message.reply_text("Calentador encendido durante 10 segundos.")
104

    
105
async def comando_luz(update: Update, context: ContextTypes.DEFAULT_TYPE):
106
    encender_luz()
107
    await update.message.reply_text("Luz encendida durante 10 segundos.")
108

    
109
# Comandos para activar/desactivar modo automático
110
async def auto_on(update: Update, context: ContextTypes.DEFAULT_TYPE):
111
    global auto_mode
112
    if auto_mode:
113
        await update.message.reply_text("El modo automático ya está activado.")
114
        return
115

    
116
    auto_mode = True
117
    await update.message.reply_text("Modo automático activado, desactivalo con /autoOFF. Enviando datos periódicamente...")
118

    
119
    async def enviar_periodicamente():
120
        while auto_mode:
121
            await enviar_datos(update, context)
122
            await asyncio.sleep(10)
123

    
124
    # Crear una tarea asincrónica que envíe datos periódicamente
125
    asyncio.create_task(enviar_periodicamente())
126

    
127
async def auto_off(update: Update, context: ContextTypes.DEFAULT_TYPE):
128
    global auto_mode
129
    if not auto_mode:
130
        await update.message.reply_text("El modo automático ya está desactivado.")
131
        return
132

    
133
    auto_mode = False
134
    await update.message.reply_text("Modo automático desactivado.")
135

    
136
# Comando /comandos
137
async def comandos(update: Update, context: ContextTypes.DEFAULT_TYPE):
138
    mensaje = (
139
        "Comandos disponibles:\n"
140
        "/datos - Muestra los datos de temperatura, humedad y luz.\n"
141
        "/ventilador - Enciende el ventilador durante 15 segundos.\n"
142
        "/calentador - Enciende el calentador durante 10 segundos.\n"
143
        "/luz - Enciende la luz durante 10 segundos.\n"
144
        "/autoON - Activa el modo automático, enviando datos periódicamente.\n"
145
        "/autoOFF - Desactiva el modo automático.\n"
146
        "/comandos - Muestra este mensaje de comandos.\n"
147
        "/setTempH <valor> - Cambia el límite superior de temperatura.\n"
148
        "/setTempL <valor> - Cambia el límite inferior de temperatura.\n"
149
        "/setHumH <valor> - Cambia el límite superior de humedad.\n"
150
        "/setHumL <valor> - Cambia el límite inferior de humedad.\n"
151
        "/setLightL <valor> - Cambia el límite inferior de luz.\n"
152
    )
153
    await update.message.reply_text(mensaje)
154

    
155
# Comandos para cambiar los límites
156
async def set_temp_H(update: Update, context: ContextTypes.DEFAULT_TYPE):
157
    global temp_H
158
    try:
159
        temp_H = float(context.args[0])
160
        await update.message.reply_text(f"Límite superior de temperatura cambiado a {temp_H}°C.")
161
    except (IndexError, ValueError):
162
        await update.message.reply_text("Por favor, usa el formato correcto: /setTempH <valor>.")
163

    
164
async def set_temp_L(update: Update, context: ContextTypes.DEFAULT_TYPE):
165
    global temp_L
166
    try:
167
        temp_L = float(context.args[0])
168
        await update.message.reply_text(f"Límite inferior de temperatura cambiado a {temp_L}°C.")
169
    except (IndexError, ValueError):
170
        await update.message.reply_text("Por favor, usa el formato correcto: /setTempL <valor>.")
171

    
172
async def set_hum_H(update: Update, context: ContextTypes.DEFAULT_TYPE):
173
    global hum_H
174
    try:
175
        hum_H = float(context.args[0])
176
        await update.message.reply_text(f"Límite superior de humedad cambiado a {hum_H}%.")
177
    except (IndexError, ValueError):
178
        await update.message.reply_text("Por favor, usa el formato correcto: /setHumH <valor>.")
179

    
180
async def set_hum_L(update: Update, context: ContextTypes.DEFAULT_TYPE):
181
    global hum_L
182
    try:
183
        hum_L = float(context.args[0])
184
        await update.message.reply_text(f"Límite inferior de humedad cambiado a {hum_L}%.")
185
    except (IndexError, ValueError):
186
        await update.message.reply_text("Por favor, usa el formato correcto: /setHumL <valor>.")
187

    
188
async def set_light_L(update: Update, context: ContextTypes.DEFAULT_TYPE):
189
    global luz_L
190
    try:
191
        luz_L = int(context.args[0])
192
        await update.message.reply_text(f"Límite inferior de luz cambiado a {luz_L}.")
193
    except (IndexError, ValueError):
194
        await update.message.reply_text("Por favor, usa el formato correcto: /setLightL <valor>.")
195

    
196
# Configuración del bot
197
bot_token = "7810567946:AAHTBjbefEg6rPvpLA2-t-2AIhoLkU-M34U"
198
application = Application.builder().token(bot_token).build()
199

    
200
# Asignar los comandos al bot
201
application.add_handler(CommandHandler("datos", enviar_datos))
202
application.add_handler(CommandHandler("ventilador", comando_ventilador))
203
application.add_handler(CommandHandler("calentador", comando_calentador))
204
application.add_handler(CommandHandler("luz", comando_luz))
205
application.add_handler(CommandHandler("autoON", auto_on))
206
application.add_handler(CommandHandler("autoOFF", auto_off))
207
application.add_handler(CommandHandler("comandos", comandos))  # Añadir el comando /comandos
208
application.add_handler(CommandHandler("setTempH", set_temp_H))
209
application.add_handler(CommandHandler("setTempL", set_temp_L))
210
application.add_handler(CommandHandler("setHumH", set_hum_H))
211
application.add_handler(CommandHandler("setHumL", set_hum_L))
212
application.add_handler(CommandHandler("setLightL", set_light_L))
213

    
214
# Mostrar comandos en la pantalla LCD
215
mostrar_comandos_lcd()
216

    
217
# Iniciar el bot
218
print("Bot de Telegram en funcionamiento. Usa los comandos /datos, /autoON, /autoOFF, /comandos.")
219
application.run_polling()
220