Índice:

Estação meteorológica: ESP8266 com sono profundo, SQL, gráficos por Flask e Plotly: 3 etapas
Estação meteorológica: ESP8266 com sono profundo, SQL, gráficos por Flask e Plotly: 3 etapas

Vídeo: Estação meteorológica: ESP8266 com sono profundo, SQL, gráficos por Flask e Plotly: 3 etapas

Vídeo: Estação meteorológica: ESP8266 com sono profundo, SQL, gráficos por Flask e Plotly: 3 etapas
Vídeo: Mini Meteo Forecast by ESP8266 and Arduino ide 2024, Julho
Anonim
Estação meteorológica: ESP8266 com sono profundo, SQL, gráficos por Flask & Plotly
Estação meteorológica: ESP8266 com sono profundo, SQL, gráficos por Flask & Plotly

Seria divertido saber a temperatura, umidade ou intensidade da luz em sua varanda? Eu sei que sim. Então fiz uma estação meteorológica simples para coletar esses dados. As seções a seguir são as etapas que executei para construir um.

Vamos começar!

Etapa 1: Estação meteorológica com sensores de luz, temperatura e umidade

Estação meteorológica com sensores de luz, temperatura e umidade
Estação meteorológica com sensores de luz, temperatura e umidade
Estação meteorológica com sensores de luz, temperatura e umidade
Estação meteorológica com sensores de luz, temperatura e umidade
Estação meteorológica com sensores de luz, temperatura e umidade
Estação meteorológica com sensores de luz, temperatura e umidade
Estação meteorológica com sensores de luz, temperatura e umidade
Estação meteorológica com sensores de luz, temperatura e umidade

Quando planejei construir uma estação meteorológica, sonhava em ter uma estação meteorológica completa que tivesse velocidade do vento, medição de chuva, sensor solar de espectro total, mas descobri que não seria barato e o custo de compra poderia acabar até pelo menos $ 100. Desisti de todas as opções e comecei a construir uma com $ 10, mais ou menos. $ 10 é o custo dos componentes básicos da estação meteorológica conforme as peças abaixo.

Aqui estão as peças:

1. ESP8266 marca Wemos custa $ 2,39 pcs no Aliexpress. Eu recomendaria a marca Wemos porque seu EPS8266 é mais fácil de programar, atualizar e tem 4 MB de flash ou mais.

2. Wemos Charger-Boost Shield custa $ 1,39 unidades. Esse é outro benefício de usar essa marca. Tem uma placa de reforço para bateria de lítio (tensão nominal = 3,7 V) a 5 V para ESP8266. A placa também vem com opção de carregamento com uma corrente de carregamento máxima = 1M.

* Observação: há uma opção mais barata para carregar / aumentar a bateria de lítio. Este custa $ 1,77 para 5pcs. No entanto, quando usei esta placa para ESP8266 (seja Wemos ou um ESP8266 vazio), o modo de sono profundo do ESP8266 acionou uma reinicialização logo após fazer o ESP8266 em um loop de sleep-reset-sleep, o que é muito irritante. Se você sabe o que está acontecendo, por favor, me mande uma mensagem.

3. Wemos também tem vários escudos para temperatura e umidade, mas vou construir com componentes individuais. Fotoresistor (ou resistor dependente de luz - ldr, barato), um sensor de luminosidade como BH1780 ou TSL2561 (cerca de 0,87-0,89c pcs), um sensor de temperatura como DS18B20 (75c cada) e uma combinação de umidade e temperatura como DHT22 ($ 2,35 aqui) ou SHT21 ($ 2,20 aqui). Um custo total para o sensor ~ $ 4.

4. Bateria de lítio. Eu recuperei uma bateria de 7,4 V da Canon, que são duas baterias de 3,7 V em série ou bateria de lítio 18650. Cada 18650 custa cerca de US $ 5 cada. Tenho uma foto que mostra a destruição da bateria da câmera. Porém, tenha cuidado, um curto-circuito ao cortar a tampa de plástico pode gerar calor extremo e queimar.

5. Placa PCB, jumper, fio, solda, seu tempo, talvez algumas habilidades de depuração.

Deixe os componentes do fio juntos seguir o esquema acima.

Em seguida, dê uma olhada na tarefa no loop de configuração. É simplesmente uma execução única de tarefas e termina com um comando de suspensão.

void setup () {Serial.begin (115200); Serial.println ("Nó inicial nomeado" + String (SENSORNAME)); setup_wifi (); atraso (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("TSL2561 não encontrado"); enquanto (1); } atraso (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (true); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); atraso (100); sensores_event_t event; tsl.getEvent (& event); if (event.light) lux = event.light; else Serial.println ("Sobrecarga do sensor");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (false); tempSensor.begin (); atraso (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 não encontrado no pino% d / n", ds18b20); Serial.flush (); atraso (1000); } atraso (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); atraso (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (callback); reconectar (); atraso (100); ESP.deepSleep (3e8); // 300 milhões de micro segundos, 300 segundos, 5 minutos; }

Durante a depuração ou configuração, comande o ESP.deepsleep () para ter uma leitura serial continuamente. Como sempre, o código completo para upload para ESP8266 está hospedado aqui (GitHub).

Lembre-se de colocar o jumper entre RST e D0 / GPIO16 para acionar um despertar após um período de sono profundo.

Agora, é hora de fazer o upload do código usando o IDE do Arduino para o ESP8266.

Etapa 2: MQTT: um meio flexível para publicar e assinar dados

MQTT: um meio flexível para publicar e assinar dados
MQTT: um meio flexível para publicar e assinar dados
MQTT: um meio flexível para publicar e assinar dados
MQTT: um meio flexível para publicar e assinar dados

Primeiro, estou começando a gostar de usar o MQTT para enviar e receber dados por meio de diferentes sensores e clientes em minha casa. Isso ocorre porque a flexibilidade para enviar dados ilimitados categorizados por um tópico e clientes ilimitados para assinar um tópico de um broker MQTT. Em segundo lugar, não estou qualificado para discutir o MQTT em profundidade. Conheci o MQTT algumas vezes no ano passado (2017) ao seguir tutoriais para configurar uma estação meteorológica e sensores usando o Node-RED. De qualquer forma, farei o possível para apresentar a vocês algumas informações. Outro bom lugar para começar é a Wikipedia.

Se você não tem tempo para ler sobre a teoria e deseja configurar um broker MQTT, postei outro tutorial apenas para isso. Pesquise esta postagem e role para baixo até a Etapa 4.

Para explicar o que é MQTT (Message Queuing Telemetry Transport) no meu entendimento, preparei um diagrama conforme acima. Resumindo, MQTT é um padrão ISO, e um produto como mosquitto e mosquitto-client, dois pacotes que usei para construir o corretor MQTT em um Raspberry Pi, deve estar em conformidade com esse padrão. O broker MQTT então se torna um meio para que os publicadores enviem uma mensagem e os assinantes escutem um tópico de destino.

A combinação da biblioteca Arduino PubSubclient com o ArduinoJson, graças ao seu criador knolleary e bblanchon, torna mais fácil para os criadores e desenvolvedores um conjunto de ferramentas de sensores a um equipamento alvo ou um cliente final.

Vamos prosseguir com a criação do banco de dados e exibir alguns dados.

Etapa 3: Salvar dados em SQL e exibi-los em um servidor web

Salvar dados em SQL e exibi-los em um servidor web
Salvar dados em SQL e exibi-los em um servidor web
Salvar dados em SQL e exibi-los em um servidor web
Salvar dados em SQL e exibi-los em um servidor web

Usei sqlite3 para criar um banco de dados para o servidor web. Instale o sqlite3 no Rapberry Pi por:

sudo apt-get install sqlite3

criou um banco de dados e uma tabela digitando no terminal:

sqlite3 weatherstation.db

CREATE TABLE weatherdata (id INT PRIMARY KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // para sair da linha de comando sqlite e retornar ao terminal Linux

Para ouvir um tópico publicado pela estação meteorológica, usei uma biblioteca Paho com Python:

#! / usr / bin / python3 # adotado 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: