Tabla de contenido:
- Paso 1: estación meteorológica con sensores de luz, temperatura y humedad
- Paso 2: MQTT: un medio flexible para publicar y suscribir datos
- Paso 3: guardar datos en SQL y mostrarlos en un servidor web
Video: Estación meteorológica: ESP8266 con sueño profundo, SQL, representación gráfica por matraz y trazado: 3 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:40
¿Sería divertido saber la temperatura, la humedad o la intensidad de la luz en su balcón? Sé que lo haría. Así que hice una sencilla estación meteorológica para recopilar esos datos. Las siguientes secciones son los pasos que tomé para construir uno.
¡Empecemos!
Paso 1: estación meteorológica con sensores de luz, temperatura y humedad
Cuando planeé construir una estación meteorológica, estaba soñando con tener una estación meteorológica completa que tuviera velocidad del viento, medición de lluvia, sensor solar de espectro completo, pero resultó que eso no sería barato y el costo de compra podría terminar. hasta al menos $ 100. Renuncié a todas las opciones y comencé a construir una con $ 10, más o menos. $ 10 es el costo de los componentes básicos de la estación meteorológica como las partes a continuación.
Aquí están las partes:
1. La marca ESP8266 Wemos cuesta $ 2.39 unidades en Aliexpress. Recomendaría la marca Wemos porque su EPS8266 es más fácil de programar, actualizar y tiene 4 MB de flash o más.
2. Wemos Charger-Boost Shield cuesta $ 1.39 unidades. Este es otro beneficio de usar esta marca. Tiene una placa de refuerzo para batería de Litio (voltaje nominal = 3.7V) a 5V para ESP8266. La placa también viene con la opción de carga con una corriente de carga máxima = 1M.
* Nota: Existe una opción más económica para cargar / aumentar la batería de litio. Este cuesta $ 1,77 por 5 piezas. Sin embargo, cuando usé esta placa para ESP8266 (ya sea de Wemos o ESP8266), el modo de suspensión profunda de ESP8266 activó un reinicio justo después de hacer que el ESP8266 entrara en un ciclo de suspensión-reinicio-suspensión, lo cual es muy molesto. Si sabe lo que estaba pasando, por favor envíeme una bandeja de entrada.
3. Wemos también tiene varios protectores para la temperatura y la humedad, pero los voy a construir a partir de componentes individuales. Fotorresistor (o resistor dependiente de la luz - ldr, barato), un sensor de luminosidad como BH1780 o TSL2561 (aproximadamente 0.87-0.89c pcs), un sensor de temperatura como DS18B20 (75c cada uno) y un combo de humedad y temperatura como DHT22 ($ 2.35 aquí) o SHT21 ($ 2.20 aquí). Un costo total por el sensor ~ $ 4.
4. Batería de litio. Rescaté uno de una batería Canon de 7.4V que son dos baterías de 3.7V en serie o una batería de litio 18650. Cada 18650 cuesta alrededor de $ 5 cada uno. Tengo una imagen que muestra el desmontaje de la batería de la cámara. Sin embargo, tenga cuidado, un cortocircuito al cortar la cubierta de plástico podría generar un calor extremo y quemarse.
5. Placa PCB, puente, cable, soldadura, su tiempo, tal vez algunas habilidades de depuración.
Deje que los componentes de alambre juntos sigan el esquema anterior.
Luego, busque la tarea en el ciclo de configuración. Es simplemente una ejecución de tareas y finaliza con un comando de suspensión.
configuración vacía () {Serial.begin (115200); Serial.println ("Nodo inicial llamado" + String (SENSORNAME)); setup_wifi (); retraso (100); Wire.begin (); pinMode (ldrPin, ENTRADA); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("TSL2561 no encontrado"); mientras (1); } retraso (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (verdadero); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); retraso (100); evento sensor_evento_t; tsl.getEvent (& evento); if (event.light) lux = event.light; else Serial.println ("Sobrecarga del sensor");
h = SHT21.getHumidity ();
t = SHT21.getTemperature (); tempSensor.setWaitForConversion (falso); tempSensor.begin (); retraso (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 no encontrado en el pin% d / n", ds18b20); Serial.flush (); retraso (1000); } retraso (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nLuz:% d lux / t", lux); Serial.printf ("LDR:% d / 1024 / t", ldr); Serial.printf ("T:% 0.2f * C / t", t); Serial.printf ("H:% 0.2f / t", h); Serial.printf ("HIC:% 0.2f / t", hic); retraso (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (devolución de llamada); reconectar (); retraso (100); ESP.deepSleep (3e8); // 300 millones de microsegundos, 300 segundos, 5 minutos; }
Durante la depuración o la configuración, ordene el ESP.deepsleep () para tener lectura serial continuamente. Como siempre, el código completo para cargar en ESP8266 está alojado aquí (GitHub).
Recuerde ponerse el puente entre RST y D0 / GPIO16 para activar un despertador después de un período de sueño profundo.
Ahora es el momento de cargar el código usando Arduino IDE al ESP8266.
Paso 2: MQTT: un medio flexible para publicar y suscribir datos
Primero, estoy empezando a gustarme de usar MQTT para enviar y recibir datos a través de diferentes sensores y clientes en mi hogar. Esto se debe a la flexibilidad para enviar datos ilimitados categorizados por un tema y clientes ilimitados para suscribirse a un tema de un corredor de MQTT. En segundo lugar, no estoy calificado para discutir MQTT en profundidad. Llegué a conocer MQTT a veces el año pasado (2017) cuando seguí los tutoriales para configurar una estación meteorológica y sensores usando Node-RED. De todos modos, haré todo lo posible para presentarles algo de información. Otro buen lugar para comenzar es Wikipedia.
Si no tiene tiempo para leer sobre la teoría y desea configurar un corredor de MQTT, publiqué otro tutorial solo para hacerlo. Busque esta publicación y desplácese hacia abajo hasta el Paso 4.
Para explicar qué es el transporte de telemetría de Message Queue Server (MQTT) a mi entender, preparé un diagrama como el anterior. En pocas palabras, MQTT es un estándar ISO, y un producto como mosquitto y mosquitto-client, dos paquetes que utilicé para compilar MQTT broker en una Raspberry Pi, deben cumplir con ese estándar. El corredor de MQTT se convierte en un medio para que los editores envíen un mensaje y los suscriptores escuchen un tema de destino.
La combinación de la biblioteca Arduino PubSubclient con ArduinoJson, gracias a su creador knolleary y bblanchon, facilita a los tinkers y desarrolladores un conjunto de herramientas desde sensores hasta un equipo objetivo o un cliente final.
Continúe con la creación de la base de datos y muestre algunos datos.
Paso 3: guardar datos en SQL y mostrarlos en un servidor web
Usé sqlite3 para crear una base de datos para el servidor web. Instale sqlite3 en Rapberry Pi de la siguiente manera:
sudo apt-get install sqlite3
creó una base de datos y una tabla escribiendo en la terminal:
estación meteorológica sqlite3.db
CREAR TABLA weatherdata (id INT PRIMARY KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);
.exit // para salir de la línea de comando sqlite y regresar a la terminal de Linux
Para escuchar un tema publicado por la estación meteorológica, utilicé una biblioteca Paho con Python:
#! / usr / bin / python3 # adoptado de: > # binh nguyen, august 04, 2018, from time import localtime, strftime, sleep import paho.mqtt.client as mqtt import sqlite3, json
mqtt_topic = 'balcony/weatherstation'
mqtt_username = "johndoe" mqtt_password = "password" dbfile = "/path/to/databse/weatherstation.db" mqtt_broker_ip = '192.168.1.50'
# the callback for when the client receives a connack response from the server.
def on_connect(client, userdata, flags, rc): print("connected with result code "+str(rc)) client.subscribe(mqtt_topic) # the callback for when a publish message is received from the server. def on_message(client, userdata, msg): thetime = strftime("%y-%m-%d %h:%m:%s", localtime())
topic = msg.topic
payload = json.dumps(msg.payload.decode('utf-8')) sql_cmd = sql_cmd = """insert into weatherdata values ({0}, '{1}', {2[ldr]}, {2[tsl2561]}, {2[ds18b20]}, {2[tsht21]}, {2[hsht21]})""".format(none, time_, payload) writetodb(sql_cmd) print(sql_cmd) return none
def writetodb(sql_cmd):
conn = sqlite3.connect(dbfile) cur = conn.cursor() cur.execute(sql_command) conn.commit()
client = mqtt.client()
client.on_connect = on_connect client.on_message = on_message client.username_pw_set(username=mqtt_username, password=mqtt_password) client.connect(mqtt_broker_ip, 1883, 60) sleep(1) client.loop_forever()
to display data from use another sql command to query data from the database such as:
sql_command = """ select * from weatherdata order by thetime desc limit 1000;"
this sql command is included in the app.py that uses flask framework and plotty to make a web server and plotting a graph.
the complete code is hosted on the github.
if the esp8266 cannot read the ds18b20, it assigned a value of -127 as the temperature which skews the relative range of other readable temperatures. i cleaned up those values by set a null value to those equals to -127:
sqlite3 weatherstation.db
sqlite3> update weatherdata set ds18b20 = null where ds18b20 = -127;
to set up an environment for this mini web server, i used the shared libraries on raspberry pi. a virtualenv is a better option if the web server is hosted on a powerful computer. start the web server by:
python3 app.py
press control + c to stop the server.
the web server is set to auto-refreshed for every 60 seconds. you can change the interval in index.html file:
battery performance:
i did not measure the current between the normal state or sleep state of esp8266. many others did so. the first google search turned to this page. the normal state of esp8266 consumes about 100ma depends on the rate of transmitting and wifi activity. the deep-sleep state needs in the range of micro a, which a thousand times less.
for 5-minute interval between sleeping and waking up, one single lithium 18650 (2000mah) could fuel my weather station for 12 days. the same battery only enough for esp 8266 ran less than a day with a normal working state. the one i took from the camera battery pack (did not know the capacity) was enough to run the weather station with deep sleep for 5-6 days.
thank you for spending time with me to this end.
Recomendado:
Lectura y representación gráfica de datos de sensores de luz y temperatura con Raspberry Pi: 5 pasos
Lectura y representación gráfica de datos de sensores de luz y temperatura con Raspberry Pi: en este Instructable aprenderá a leer un sensor de luz y temperatura con raspberry pi y un convertidor analógico a digital ADS1115 y graficarlo usando matplotlib. Comencemos con los materiales necesarios
Estación meteorológica NaTaLia: estación meteorológica con energía solar Arduino hecha de la manera correcta: 8 pasos (con imágenes)
Estación meteorológica NaTaLia: estación meteorológica con energía solar Arduino hecha de la manera correcta: después de 1 año de operación exitosa en 2 ubicaciones diferentes, estoy compartiendo los planes del proyecto de mi estación meteorológica con energía solar y explicando cómo evolucionó a un sistema que realmente puede sobrevivir durante mucho tiempo períodos de energía solar. Si tu sigues
Sensor de movimiento ESP-01 con sueño profundo: 5 pasos
Sensor de movimiento ESP-01 con sueño profundo: he estado trabajando en la fabricación de sensores de movimiento caseros que envían un mensaje de correo electrónico cuando se activan. Hay muchos ejemplos de instructables y otros ejemplos de cómo hacer esto. Recientemente necesitaba hacer esto con un sensor de movimiento PIR que funciona con baterías y un ESP
Estación meteorológica gráfica: 7 pasos (con imágenes)
Estación meteorológica gráfica: ¿Siempre quiso tener una estación meteorológica gráfica? ¿Y con sensores precisos? Quizás este proyecto sea algo para ti. Con esta estación meteorológica puedes ver qué está " haciendo " el tiempo. Las temperaturas, por ejemplo, pueden subir o bajar. Desde un
Ahorro de batería con sueño profundo: 20 pasos
Ahorro de vida útil de la batería con sueño profundo: ¿Está interesado en usar una batería con su ESP32? Si es así, hoy discutiré información técnica importante sobre este tema. Sabemos que este microcontrolador gasta mucha energía cuando transmite información. Consume