-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
198 lines (152 loc) · 6.43 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
'''
[PARCIAL - CORTINAS INTELIGENTES v2.0]
hecho por: Esteban Vergara Giraldo
Jonathan Betancur Espinosa
manual de
fabricación: https://docs.google.com/document/d/1S8KZpc69cQ6S1qoQciOljn6loe1zCqPxLhJy1a0WGjw/
link anvil: https://cortinas-inteligentes.anvil.app/
'''
import anvil.pico
import uasyncio as a
from machine import Pin, ADC # uso de pines digitales y análogos
from random import randint # simulación de luz nocturna
UPLINK_KEY = "server_V6XYAKDSY2BV6XTRE7MOXHGF-M33JCTKEAWVOBO7S"
# Sólo se usa para mostrar que se usó un botón desde anvilworks.
led = Pin("LED", Pin.OUT, value=1)
#salidas digitales
dia = Pin(17, Pin.OUT, value=1)
noche = Pin(16, Pin.OUT, value=0)
toma_led = Pin(18, Pin.OUT, value=1)
#entradas digitales (entran desde anvilworks
modo = True # True = Dia | False = Noche
powermode = True # True = Encendido | False = Apagado
toma_datos= True # True = Toma datos de luz | False = No toma datos de luz
#entrada análoga
luz_pin = ADC(28)
#salida análoga (también mostrada en anvil)
cortina_pin = ADC(27)
cortina = 50 #inicializamos la variable en un valor intermedio
#------------[FUNCIONES]---------------------
#Sólo para ver al led integrado titilar cuando se presione un botón
@anvil.pico.callable(is_async=True)
async def titilar():
for _ in range(10):
led.toggle()
sleep(0.1)
# alterna entre noche y día
@anvil.pico.callable(is_async=True)
async def dia_noche():
global modo
modo = not modo
# dependiendo de si es de día o de noche, se enciende un led o el otro
# Día (17) | Noche (16)
if modo:
dia.value(1)
noche.value(0)
else:
dia.value(0)
noche.value(1)
# retorna el cambio que se ha hecho, para ser impreso en la consola de anvilworks
return "Modo día" if modo else "Modo noche"
# enciende y apaga el sistema de cortinas automáticas, aunque los datos se siguen tomando.
@anvil.pico.callable(is_async=True)
async def encendido_apagado():
global powermode
powermode = not powermode
# cuando el sistema de automatización se apaga, el led integrado deja de brillar
if powermode:
led.value(1)
else:
led.value(0)
# retorna el cambio que se ha hecho, para ser impreso en la consola de anvilworks
return "La cortina automática ha sido encendida" if powermode else "La cortina automática ha sido apagada"
# enciende y apaga el sistema de cortinas automáticas, aunque los datos se siguen tomando.
@anvil.pico.callable(is_async=True)
async def toma_notoma():
global toma_datos
toma_datos = not toma_datos
if toma_datos:
toma_led.value(1)
else:
toma_led.value(0)
# retorna el cambio que se ha hecho, para ser impreso en la consola de anvilworks
return "Ahora la cortina tomará datos de luz" if toma_datos else "Ahora la cortina NO tomará datos de luz"
# para obtener el valor actual del modo(Día/Noche)
@anvil.pico.callable(is_async=True)
async def get_modo():
return "Día" if modo else "Noche" # es mostrado por modo_label
# para obtener el valor actual del powermode(Encendido/Apagado)
@anvil.pico.callable(is_async=True)
async def get_powermode():
return "Encendida" if powermode else "Apagada" # es mostrado por powermode_label
# para obtener el valor actual del powermode(Encendido/Apagado)
@anvil.pico.callable(is_async=True)
async def get_toma():
return "Toma datos" if toma_datos else "No toma datos" # es mostrado por powermode_label
# para obtener la medición análoga actual. Puede ser simulada con un potenciómetro
@anvil.pico.callable(is_async=True)
async def get_luz():
if toma_datos:
if modo:
luz = luz_pin.read_u16() # da valores entre 0 y 65025
else:
luz = randint(3000,5000) # simula los bajos valores de luz que hay en la noche
# retornamos el valor para ser graficado en plot_luz
return luz
else:
return None
# dependiendo de la luz, dice qué tan abierta estará la cortina (porcentaje). 5 modos
@anvil.pico.callable(is_async=True)
async def get_cortina(luz):
global cortina
# si el sistema está apagado, no hay cambios en la cortina.
# lo mismo si se dejaron de tomar datos de luz
if powermode and toma_datos:
# lo dividimos en 5 rangos de luz, a cada uno le corresponde un nivel de apertura para la cortina
# a mayor luz, menor apertura
if modo: #es de día
if 50000 < luz:
cortina = 0
elif 40000 <= luz and luz < 50000:
cortina = 20
elif 30000 <= luz and luz < 40000:
cortina = 40
elif 20000 <= luz and luz < 30000:
cortina = 60
elif 10000 <= luz and luz < 20000:
cortina = 80
elif 0 <= luz and luz < 10000:
cortina = 100
# pero en la noche, la cortina se cierra por privacidad
else:
cortina = 0
# retornamos el valor para ser graficado en plot_cortina
return cortina
# una versión simplificada de get_cortina. Debían ser dos funciones diferentes, o el return se confundiría
@anvil.pico.callable(is_async=True)
async def conversor(luz_conversor):
cortina_conversor = 0 # una variable diferente a la global
if 50000 < luz_conversor:
cortina_conversor = 0
elif 40000 <= luz_conversor and luz_conversor < 50000:
cortina_conversor = 20
elif 30000 <= luz_conversor and luz_conversor < 40000:
cortina_conversor = 40
elif 20000 <= luz_conversor and luz_conversor < 30000:
cortina_conversor = 60
elif 10000 <= luz_conversor and luz_conversor < 20000:
cortina_conversor = 80
elif 0 <= luz_conversor and luz_conversor < 10000:
cortina_conversor = 100
return cortina_conversor
# se conecta a nuestro proyecto en anvilworks
anvil.pico.connect(UPLINK_KEY)
'''
_ ___ _.--. ----------- REQUERIMIENTOS: --------------
\`.|\..----...-'` `-._.-'_.-'` Proyecto en AnvilWorks
/ ' ` , _.-' Raspberry Pi Pico W
)/' _/ \ `-_, / Potenciómetro
`-'" `"\_ ,_.-;_.-\_ ', 2 LEDs
_.-'_./ {_.' ; /
{_.-``-' {_/
'''