Оглавление:

Метеостанция: ESP8266 с глубоким сном, SQL, построение графиков с помощью Flask и Plotly: 3 шага
Метеостанция: ESP8266 с глубоким сном, SQL, построение графиков с помощью Flask и Plotly: 3 шага

Видео: Метеостанция: ESP8266 с глубоким сном, SQL, построение графиков с помощью Flask и Plotly: 3 шага

Видео: Метеостанция: ESP8266 с глубоким сном, SQL, построение графиков с помощью Flask и Plotly: 3 шага
Видео: Интернет.... Начало! ESP8266 в FLProg 2024, Июль
Anonim
Метеостанция: ESP8266 с глубоким сном, SQL, построением графиков с помощью Flask и Plotly
Метеостанция: ESP8266 с глубоким сном, SQL, построением графиков с помощью Flask и Plotly

Было бы интересно узнать температуру, влажность или интенсивность света на вашем балконе? Я знаю, что хотел бы. Поэтому я сделал простую метеостанцию для сбора таких данных. В следующих разделах описаны шаги, которые я предпринял для его создания.

Давайте начнем!

Шаг 1: метеостанция с датчиками освещенности, температуры и влажности

Метеостанция с датчиками освещенности, температуры и влажности
Метеостанция с датчиками освещенности, температуры и влажности
Метеостанция с датчиками освещенности, температуры и влажности
Метеостанция с датчиками освещенности, температуры и влажности
Метеостанция с датчиками освещенности, температуры и влажности
Метеостанция с датчиками освещенности, температуры и влажности
Метеостанция с датчиками освещенности, температуры и влажности
Метеостанция с датчиками освещенности, температуры и влажности

Когда я планировал построить метеостанцию, я мечтал иметь полноценную метеостанцию со скоростью ветра, измерением дождя и датчиком солнечного излучения полного спектра, но оказалось, что это будет недешево, и стоимость покупки может закончиться минимум 100 долларов. Я отказался от всех вариантов и начал строить его примерно за 10 долларов. 10 долларов - это стоимость основных компонентов метеостанции, указанных ниже.

Вот детали:

1. Бренд ESP8266 Wemos на Алиэкспресс стоит 2,39 $ за шт. Я бы порекомендовал бренд Wemos, потому что его EPS8266 проще программировать, обновлять и иметь флэш-память 4 МБ или более.

2. Wemos Charger-Boost Shield стоит 1,39 $ шт. Это еще одно преимущество использования этого бренда. Он имеет повышающую плату для литиевой батареи (номинальное напряжение = 3,7 В) до 5 В для ESP8266. Плата также поставляется с опцией зарядки с максимальным зарядным током = 1M.

* Примечание. Существует более дешевый вариант зарядки / повышения мощности литиевой батареи. Этот стоит 1,77 доллара за 5 шт. Однако, когда я использовал эту плату для ESP8266 (либо Wemos, либо пустой ESP8266), режим глубокого сна ESP8266 запускал сброс сразу после того, как ESP8266 перешел в цикл сна-сброса-сна, что очень раздражает. Если вы знаете, что происходит, напишите мне на почту.

3. Wemos также имеет несколько экранов для защиты от температуры и влажности, но я собираюсь строить их из отдельных компонентов. Фоторезистор (или светозависимый резистор - ldr, дешевый), датчик освещенности, такой как BH1780 или TSL2561 (около 0,87-0,89c шт.), Датчик температуры, такой как DS18B20 (75c каждый), и комбинация влажности и температуры, такая как DHT22 (здесь 2,35 доллара) или SHT21 (здесь 2,20 доллара). Общая стоимость датчика ~ 4 $.

4. Литиевая батарея. Я спас один от батареи Canon 7,4 В, которая представляет собой две последовательно соединенные батареи 3,7 В или литиевую батарею 18650. Каждый 18650 стоит около 5 долларов за штуку. У меня есть фотография, на которой показан демонтаж аккумуляторной батареи камеры. Однако будьте осторожны, короткое замыкание при разрезании пластиковой крышки может привести к сильному нагреву и ожогу.

5. Плата печатной платы, перемычка, провод, пайка, ваше время, возможно, некоторые навыки отладки.

Соедините компоненты вместе, как показано на схеме выше.

Затем найдите задачу в цикле настройки. Это просто однократный запуск задач, который завершается командой сна.

void setup () {Serial.begin (115200); Serial.println ("Имя начального узла" + String (SENSORNAME)); setup_wifi (); задержка (100); Wire.begin (); pinMode (ldrPin, ВХОД); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("TSL2561 не найден"); в то время как (1); } задержка (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (истина); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); задержка (100); sensor_event_t событие; tsl.getEvent (& событие); если (event.light) lux = event.light; else Serial.println ("Перегрузка датчика");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (ложь); tempSensor.begin (); задержка (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 не найден на контакте% d / n", ds18b20); Serial.flush (); задержка (1000); } задержка (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nСвет:% d люкс / t", люкс); Serial.printf ("LDR:% d / 1024 / t", ldr); Serial.printf ("T:% 0.2f * C / t", t); Serial.printf ("H:% 0,2f / t", ч); Serial.printf ("HIC:% 0.2f / t", hic); задержка (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (обратный вызов); повторно подключиться (); задержка (100); ESP.deepSleep (3e8); // 300 миллионов микросекунд, 300 секунд, 5 минут; }

Во время отладки или настройки подайте команду ESP.deepsleep () для непрерывного считывания последовательного порта. Как всегда, полный код для загрузки на ESP8266 размещен здесь (GitHub).

Не забудьте установить перемычку между RST и D0 / GPIO16 для запуска пробуждения после периода глубокого сна.

Теперь пора загрузить код с помощью Arduino IDE в ESP8266.

Шаг 2. MQTT: гибкое средство для публикации и подписки на данные

MQTT: гибкое средство для публикации и подписки на данные
MQTT: гибкое средство для публикации и подписки на данные
MQTT: гибкое средство для публикации и подписки на данные
MQTT: гибкое средство для публикации и подписки на данные

Во-первых, я все больше люблю использовать MQTT для отправки и получения данных с разных датчиков и клиентов в моем доме. Это связано с гибкостью отправки неограниченного количества данных, категоризированных по теме, и неограниченным количеством клиентов для подписки на одну тему от брокера MQTT. Во-вторых, я не могу подробно обсуждать MQTT. Я иногда знакомился с MQTT в прошлом году (2017), когда следовал руководствам по настройке метеостанции и датчиков с помощью Node-RED. В любом случае, я постараюсь представить вам некоторую информацию. Еще одно хорошее место для начала - Википедия.

Если у вас нет времени читать теорию, и вы хотите настроить брокера MQTT, я разместил еще один учебник только для этого. Посмотрите этот пост и прокрутите вниз до шага 4.

Чтобы объяснить, что, в моем понимании, представляет собой передача телеметрии очереди сообщений (MQTT), я подготовил диаграмму, как указано выше. В двух словах, MQTT - это стандарт ISO, и такие продукты, как mosquitto и mosquitto-client, два пакета, которые я использовал для сборки брокера MQTT на Raspberry Pi, должны соответствовать этому стандарту. Затем брокер MQTT становится средой, в которой издатели могут отправлять сообщение, а подписчики - слушать целевую тему.

Комбинация библиотеки Arduino PubSubclient с ArduinoJson, благодаря knolleary и bblanchon ее создателя, упрощает для мастеров и разработчиков набор инструментов от датчиков до целевого оборудования или конечного клиента.

Давайте перейдем к созданию базы данных и отобразим некоторые данные.

Шаг 3. Сохраните данные в SQL и отобразите их на веб-сервере

Сохраняйте данные в SQL и отображайте их на веб-сервере
Сохраняйте данные в SQL и отображайте их на веб-сервере
Сохраняйте данные в SQL и отображайте их на веб-сервере
Сохраняйте данные в SQL и отображайте их на веб-сервере

Я использовал sqlite3 для создания базы данных для веб-сервера. Установите sqlite3 в Rapberry Pi:

sudo apt-get install sqlite3

создал базу данных и таблицу, набрав в терминале:

sqlite3 weatherstation.db

СОЗДАТЬ ТАБЛИЦУ погодных данных (id INT PRIMARY KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // для выхода из командной строки sqlite и возврата в терминал Linux

Чтобы послушать тему, опубликованную метеостанцией, я использовал библиотеку Paho с Python:

#! / usr / bin / python3 # заимствовано из: > # 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.

Рекомендуемые: