-
Notifications
You must be signed in to change notification settings - Fork 3
/
MHZ19_getppm_LCD_WiFi.ino
230 lines (186 loc) · 8.86 KB
/
MHZ19_getppm_LCD_WiFi.ino
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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
/*----------------------------------------------------------
MH-Z19 CO2 sensor SAMPLE - VERSIÓN PARA WEMOS D1 MINI
----------------------------------------------------------*/
#include <MHZ19_uart.h> // incluye librería para manejo del sensor de CO2
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP8266WiFi.h> // manejo de wifi de wemos
// Network SSID - nombre de la red wifi y clave
const char* ssid = "nombre_red"; // nombre de la red
const char* password = "xxxxxxxxx"; // clave
WiFiServer server(80); // crea un servicio que escucha conecciones entrantes de un puerto específico
//Crear el objeto display dirección 0x27 y 16 columnas x 2 filas
LiquidCrystal_I2C display(0x27,16,2); //
const int rx_pin = 14; //Serial rx pin no
const int tx_pin = 16; //Serial tx pin no
const int buzzer = 0 ;
int cnt = 0; // cuenta LOOPS
MHZ19_uart mhz19; // asigna medidor al sensor
int co2ppm;
void setup() {
// empieza programa de medición
pinMode(buzzer, OUTPUT); //Inicia buzzer, pita para avisar que arrancó
tone(buzzer, 55,20);
// Inicializar el display
display.begin();
display.clear(); // borra pantalla
//Encender la luz de fondo.
display.backlight();
Serial.begin(115200); // abre puerto serie para comunicarse
delay(10);
// Connecta con WiFi
Serial.println();
Serial.println();
Serial.print("Conectándose a ");
Serial.println(ssid); // escribe en el puerto serie a la red que intenta conectarse
WiFi.hostname("Medidor_CO2"); // nombre con el que aparece el medidor en el router de wifi
WiFi.begin(ssid, password); // abre la conexión wifi
while (WiFi.status() != WL_CONNECTED) {
display.setCursor(0, 0); // Ubicamos el cursor en la primera posición(columna:0) de la primera línea(fila:1)
display.print("BUSCANDO WIFI "); // AVISA QUE BUSCA CONECTARSE A WIFI
display.setCursor(0, 1); // Ubicamos el cursor en la primera posición(columna:0) de la segunda línea(fila:1)
display.print(++cnt); // AVISA QUE BUSCA CONECTARSE A WIFI
Serial.print("."); // mientras que no se conecta escribe "." en el puerto serie
delay(1000);
display.clear(); // borra pantalla
}
cnt = 0; // pone contador de loops en cero
display.setCursor(0, 0); // Ubicamos el cursor en la primera posición(columna:0) de la primera línea(fila:1)
display.print("WIFI conectado"); // AVISA QUE SE CONECTÓ A WIFI
display.setCursor(0, 1); // Ubicamos el cursor en la primera posición(columna:0) de la primera línea(fila:1)
display.print( WiFi.localIP().toString().c_str()); // MUESTRA IP de WIFI
delay(5000); // espera 5 segundos
display.clear(); // borra pantalla
Serial.println("");
Serial.println("WiFi conectado"); // avisa en el puerto serie que está conectado
// Print the IP address
Serial.printf("Servidor Web Iniciado, abra %s en un mavegador web\n", WiFi.localIP().toString().c_str()); // avisa que se abrió la el puerto y da el número
server.begin();
// Escribimos Mensaje de inicio en el display.
display.setCursor(0, 1); // Ubicamos el cursor en la primera posición(columna:0) de la segunda línea(fila:1)
display.print("INICIANDO");
delay(5000); // espera 5 segundos
display.clear(); // borra pantalla
/*----------------------------------------------------------
calentando MH-Z19 CO2 sensor
----------------------------------------------------------*/
mhz19.begin(rx_pin, tx_pin); // inicializa el sensor
mhz19.setAutoCalibration(false); // deshabilita autocalibrado automático
// muestra indicación de que está calentando
display.setCursor(0, 0); // Ubicamos el cursor en la primera posición(columna:0) de la primera línea(fila:0)
display.print("Calentando"); // Escribe primera linea del cartel
display.setCursor(0, 1); // Ubicamos el cursor en la primera posición(columna:0) de la segunda línea(fila:0)
display.print("Espere 2 minutos"); // Escribe segunda linea del cartel
delay(90000); // espera minuto y medio
display.clear(); // borra pantalla
tone(buzzer, 55,100); // pitido de 55Hz indicando que funciona normal, calentado
}
// prepara página web para mandar a un cliente (servidor web)
String prepareHtmlPage()
{
String htmlPage;
htmlPage.reserve(1024); // prevent ram fragmentation
htmlPage = F("HTTP/1.1 200 OK\r\n"
"Content-Type: text/html\r\n"
"Connection: close\r\n" // the connection will be closed after completion of the response
"Refresh: 5\r\n" // refresh the page automatically every 5 sec
"\r\n"
"<!DOCTYPE HTML>"
"<html>"
"co2: ");
htmlPage += co2ppm; // imprime el valor de CO2
htmlPage += F("</html>"
"\r\n");
return htmlPage;
}
/*----------------------------------------------------------
MH-Z19 CO2 sensor loop
----------------------------------------------------------*/
void loop() {
if ( ++cnt % 30 == 0) { // Si cnt es múltiplo de 30
display.clear(); // borra pantalla
display.setCursor(0,0);
display.print("MEDIDOR CO2"); // Cada minuto muestra leyenda institucional
display.setCursor(0, 1); // Ubicamos el cursor en la primera posición(columna:0) de la segunda línea(fila:1)
display.print("UNAHUR"); // Escribe texto
delay(3000); //demora 3 seg entre mediciones
cnt = 0; // vuelve a empezar LOS LOOPS
} else {
}
// int co2ppm = mhz19.getPPM(); // mide CO2
co2ppm = mhz19.getPPM(); // mide CO2
int temp = mhz19.getTemperature(); // mide temperatura
// Muestra medición de CO2
display.clear(); // borra pantalla
display.setCursor(0, 0); // Ubicamos el cursor en la primera posición(columna:0) de la primera línea(fila:0)
display.print("co2: "); // Escribe texto
display.setCursor(8, 0); // Ubicamos el cursor en la novena posición(columna:8) de la primera línea(fila:0)
display.print(co2ppm); // Escribe CO2
display.setCursor(12, 0); // Ubicamos el cursor en la treceava posición(columna:12) de la primera línea(fila:0)
display.print("ppm"); // Escribe texto
// Muestra medición de temperatura
display.setCursor(0, 1); // Ubicamos el cursor en la primera posición(columna:0) de la segunda línea(fila:1)
display.print("temp: "); // Escribe texto
display.setCursor(8, 1); // Ubicamos el cursor en la novena posición(columna:8) de la segunda línea(fila:1)
display.print(temp); // Escribe temperatura
display.setCursor(12, 1); // Ubicamos el cursor en la treceava posición(columna:12) de la segunda línea(fila:1)
display.print("*C"); // Escribe texto
// Emite un sonido en función del resultado
int tono = co2ppm / 100;
switch (tono){
// case 5: // menor a 600ppm, 55Hz, 0.1 seg
// tone(buzzer, 55,100); break;
// case 6: // menor a 700ppm, 55Hz, 0.1 seg// menor a 600ppm
// tone(buzzer, 55,100); break;
// case 7: // menor a 800ppm, 55Hz, 0.1 seg
// tone(buzzer, 55,100); break;
case 8: // menor a 900ppm, 110Hz, 1 seg
tone(buzzer, 110,1000); break;
case 9: // menor a 1000ppm, 220Hz, 2 seg
tone(buzzer, 220,2000); break;
case 10: // menor a 1100ppm, 440Hz, 2 seg
tone(buzzer, 440,2000); break;
case 11: // menor a 120ppm, 880Hz, 2 seg
tone(buzzer, 880,2000); break;
case 12: // menor a 1300ppm, 880Hz, 4 seg
tone(buzzer, 880,4000); break;
default: // otro valor, no hace ruido
break;
}
Serial.println(co2ppm); // escribe en el puerto serie el valor de CO2
WiFiClient client = server.available();
// wait for a client (web browser) to connect
if (client)
{
//* Serial.println("\n[Client connected]");
while (client.connected())
{
// read line by line what the client (web browser) is requesting
if (client.available())
{
String line = client.readStringUntil('\r');
//* Serial.print(line);
// wait for end of client's request, that is marked with an empty line
if (line.length() == 1 && line[0] == '\n')
{
client.println(prepareHtmlPage());
break;
}
}
}
while (client.available()) {
// but first, let client finish its request
// that's diplomatic compliance to protocols
// (and otherwise some clients may complain, like curl)
// (that is an example, prefer using a proper webserver library)
client.read();
}
// close the connection:
client.stop();
//* Serial.println("[Client disconnected]");
}
if(WiFi.status() == WL_DISCONNECTED){ // si se desconectó
Serial.println("Se perdió la conexion WiFi! Reiniciando..."); // avisa que se perdió la conexión de wifi
}
delay(10000); //demora 10 seg entre mediciones
}