Оглавление:

IoT Made Easy: удаленный сбор данных о погоде: УФ-излучение, температура и влажность воздуха: 7 шагов
IoT Made Easy: удаленный сбор данных о погоде: УФ-излучение, температура и влажность воздуха: 7 шагов

Видео: IoT Made Easy: удаленный сбор данных о погоде: УФ-излучение, температура и влажность воздуха: 7 шагов

Видео: IoT Made Easy: удаленный сбор данных о погоде: УФ-излучение, температура и влажность воздуха: 7 шагов
Видео: IoT сервис ThingSpeak и Arduino / ESP8266 2024, Июль
Anonim
IoT Made Easy: сбор данных о погоде из удаленных источников: УФ-излучение, температура и влажность воздуха
IoT Made Easy: сбор данных о погоде из удаленных источников: УФ-излучение, температура и влажность воздуха

В этом руководстве мы будем собирать удаленные данные, такие как УФ (ультрафиолетовое излучение), температура и влажность воздуха. Эти данные будут очень важны и будут использоваться в будущей полной метеостанции.

Блок-схема показывает, что мы получим в конце.

Изображение
Изображение

Шаг 1: BoM - Спецификация материалов

NodeMCU (ESP8266-12E) - 9 долларов США

Датчик влажности и температуры (DHT22) - 10,00 долларов США

УФ-датчик - 4 доллара США.

OLED - 12 долларов США.

Макетная плата - 1 доллар США.

Шаг 2: аналоговый УФ-датчик

Аналоговый УФ-датчик
Аналоговый УФ-датчик
Аналоговый УФ-датчик
Аналоговый УФ-датчик
Аналоговый УФ-датчик
Аналоговый УФ-датчик

Этот УФ-датчик генерирует аналоговый выходной сигнал, пропорциональный ультрафиолетовому излучению в светочувствительном спектре. В нем используется УФ-фотодиод (на основе нитрида галлия), который может обнаруживать диапазон света 240–370 нм (который покрывает УФB и большую часть спектра UVA). Уровень сигнала от фотодиода очень мал, на уровне наноампер, поэтому в модуль встроен операционный усилитель для усиления сигнала до более читаемого уровня напряжения (от 0 до 1 В).

Датчик и операционный усилитель можно запитать, подключив VCC к 3,3 В постоянного тока (или 5 В постоянного тока) и GND к заземлению. Аналоговый сигнал может быть получен с вывода OUT.

Его выход будет в милливольтах и будет считан аналоговым входом нашего NodeMCU. После прочтения мы должны «преобразовать» (или «сопоставить») его, чтобы значения лучше обрабатывались кодом. Мы можем сделать это с помощью функции readSensorUV ():

/ * Считываем УФ-датчик в мВ и вызываем расчет УФ-индекса * /

void readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; для (int i = 0; i <numOfReadings; i ++) {dataSensorUV + = analogRead (sensorUVPin); задержка (200); } dataSensorUV / = numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); }

Получив УФ-данные, мы можем легко вычислить УФ-индекс, как определено в приведенной выше таблице. Функция indexCalculate () сделает это за нас:

/ * Расчет УФ-индекса * /

void indexCalculate () {если (dataSensorUV <227) indexUV = 0; иначе, если (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; иначе, если (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; иначе, если (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; иначе, если (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; иначе, если (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; иначе, если (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; иначе, если (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; иначе, если (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; иначе, если (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; иначе, если (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; иначе indexUV = 11; }

Шаг 3: Установка дисплея: OLED

Установка дисплея: OLED
Установка дисплея: OLED
Установка дисплея: OLED
Установка дисплея: OLED

В целях тестирования мы включим OLED в наш УФ-метр (этот шаг не является обязательным).

Во время тестов можно использовать Serial Monitor, но что происходит, когда вы используете свои прототипы вдали от ПК в автономном режиме? Для этого установим OLED-дисплей SSD1306, основные характеристики которого:

  • Размер дисплея: 0,96 дюйма
  • I2C IIC SPI Последовательный
  • 128X64
  • Белый светодиод OLED LCD

Следуйте электрической схеме и подключите 4 контакта нашего OLED:

  • VCC переходит на 3,3 В
  • GND идет на землю
  • SCL переходит к NodeMCU (GPIO 2) ==> D4
  • SDA переходит в NodeMCU (GPIO 0) ==> D3

После того, как мы подключили дисплей, давайте загрузим и установим его библиотеку в нашу Arduino IDE: «Драйвер ESP8266 OLED для дисплея SSD1306», разработанный Дэниелом Эйххорном (убедитесь, что вы используете версию 3.0.0 или выше!).

Установите библиотеку на свою Arduino IDE, которую можно найти на SSD1306Wire.h

После перезапуска IDE библиотека должна быть уже установлена.

Библиотека поддерживает протокол I2C для доступа к OLED-дисплею с помощью встроенной библиотеки Wire.h:

/ * OLED * /

# включить "SSD1306Wire.h" # включить "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Проводной дисплей (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);

Перечислим некоторые важные API, которые будут использоваться с нашим OLED-дисплеем. Полный список можно найти на GITHub, указанном выше.

A. Управление дисплеем:

void init (); // Инициализируем дисплей

void displayOn (void); // Включаем отображение void displayOff (void); // Отключить отображение void clear (void); // Очистить локальный буфер пикселей void flipScreenVertical (); // Переворачиваем дисплей вверх дном

Б. Текстовые операции:

void drawString (int16_t x, int16_t y, текст строки); // (xpos, ypos, "Текст")

void setFont (const char * fontData); // Устанавливает текущий шрифт.

Доступные шрифты по умолчанию:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Как только сам OLED и его библиотека будут установлены, давайте напишем простую программу для его тестирования. Введите в IDE приведенный ниже код, в результате должен появиться экран, как показано на фотографии выше:

* OLED * /

# включить "SSD1306Wire.h" # включить "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Проводной дисплей (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * Запуск и отображение данных настройки на OLED * / void displaySetup () {display.init (); // инициализируем отображение display.clear (); // Очистить отображение display.flipScreenVertical (); // Перевернуть дисплей вверх дном display.display (); // Выводим данные на дисплей Serial.println ("Запуск теста дисплея"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, «OLED»); // (xpos, ypos, «Текст») display.setFont (ArialMT_Plain_16); display.drawString (18, 29, «Тест начат»); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serial BaudRate:"); display.drawString (90, 52, String (11500)); display.display (); // Выводим данные на дисплей delay (3000); }

Вышеупомянутую программу можно скачать с моего GitHub:

NodeMCU_OLED_Test

Шаг 4: локальный УФ-метр

Местный УФ-метр
Местный УФ-метр
Местный УФ-метр
Местный УФ-метр

Теперь, с установленным OLED-дисплеем, мы можем подключить аккумулятор и провести удаленное тестирование с помощью нашего «УФ-метра».

#define SW_VERSION "UV_Sensor_V.1"

/ * УФ-датчик * / #define sensorUVPin A0 int dataSensorUV = 0; int indexUV = 0; / * OLED * / #include «SSD1306Wire.h» #include «Wire.h» const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Проводной дисплей (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } недействительный цикл () {readSensorUV (); displayUV (); задержка (1000); } / * Запуск и отображение данных настройки на OLED * / void displaySetup () {display.init (); // инициализируем отображение display.clear (); // Очистить отображение display.flipScreenVertical (); // Перевернуть дисплей вверх дном display.display (); // Выводим данные на дисплей Serial.println ("Запуск проверки УФ-датчика"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, «MJRoBot»); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, «Проверка УФ-датчика»); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, «SW Ver.:»); display.drawString (45, 52, SW_VERSION); display.display (); задержка (3000); } / * Считываем УФ-датчик в мВ и вызываем расчет УФ-индекса * / void readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; для (int я = 0; я <numOfReadings; я ++) {dataSensorUV + = analogRead (sensorUVPin); задержка (200); } dataSensorUV / = numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * Расчет УФ-индекса * / void indexCalculate () {if (dataSensorUV <227) indexUV = 0; иначе, если (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; иначе, если (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; иначе, если (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; иначе, если (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; иначе, если (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; иначе, если (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; иначе, если (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; иначе, если (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; иначе, если (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; иначе, если (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; иначе indexUV = 11; } / * Отображение УФ-значений на локальном OLED * / void displayUV () {display.clear (); display.setFont (ArialMT_Plain_16); display.drawString (20, 0, «УФ-датчик»); display.drawString (0, 23, «УФ (мВ):»); display.drawString (80, 23, String (dataSensorUV)); display.drawString (0, 48, «УФ-индекс:»); display.setFont (ArialMT_Plain_24); display.drawString (82, 42, String (indexUV)); display.display (); }

Приведенный выше код можно загрузить с моего GitHun: NodeMCU_UV_Sensor_OLED.ino

Шаг 5: Установка DHT22 для измерения температуры и влажности воздуха

Установка DHT22 для измерения температуры и влажности воздуха
Установка DHT22 для измерения температуры и влажности воздуха
Установка DHT22 для измерения температуры и влажности воздуха
Установка DHT22 для измерения температуры и влажности воздуха

Одним из наиболее часто используемых датчиков для сбора данных о погоде является DHT22 (или его брат DHT11), цифровой датчик относительной влажности и температуры. Он использует емкостной датчик влажности и термистор для измерения окружающего воздуха и выдает цифровой сигнал на вывод данных (выводы аналогового ввода не требуются).

Датчик должен иметь напряжение от 3,3 В до 5 В и работать от -40 ° C до + 80 ° C с точностью +/- 0,5 ° C для температуры и +/- 2% для относительной влажности. Также важно иметь в виду, что период измерения составляет в среднем 2 секунды (минимальное время между измерениями). Сайт Adafruit предоставляет много информации как о DHT22, так и о его брате DHT11. Для получения дополнительных сведений посетите страницу учебного пособия DHT22 / 11.

DHT22 имеет 4 контакта (обращенный к датчику, контакт 1 - крайний левый):

  1. VCC (подключим к 3.3V от NodeMCU);
  2. Данные на выходе;
  3. Не подключен и
  4. Земля.

Как только вы обычно будете использовать датчик на расстоянии менее 20 м, между выводами Data и VCC необходимо подключить резистор 10 кОм. Выходной контакт будет подключен к контакту D3 NodeMCU (см. Схему выше). После установки датчика в нашем модуле загрузите библиотеку DHT из репозитория Adafruit GitHub и установите ее в файл библиотеки Arduino. После перезагрузки Arduino IDE должна быть установлена «библиотека датчиков DHT».

В начале кода мы должны включить строки:

/ * DHT22 * /

#include "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); float hum = 0; температура поплавка = 0;

Будет создана новая функция для чтения датчика:

/ * Получить данные DHT * /

void getDhtData (void) {float tempIni = temp; поплавок humIni = hum; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Проверяем, нет ли сбоев при чтении, и завершаем работу раньше (чтобы повторить попытку). {Serial.println («Не удалось прочитать с датчика DHT!»); temp = tempIni; hum = humIni; возвращение; }}

Полный код, включая датчики UV и DHT, можно загрузить с моего GitHub: NodeMCU_UV_DHT_Sensor_OLED

Шаг 6: Отправка данных на ThingSpeak.com

Отправка данных на ThingSpeak.com
Отправка данных на ThingSpeak.com
Отправка данных на ThingSpeak.com
Отправка данных на ThingSpeak.com
Отправка данных на ThingSpeak.com
Отправка данных на ThingSpeak.com

До сих пор мы использовали только NodeMCU ESP12-E как обычную и обычную плату Arduino. Конечно, мы только «поцарапали» реальный потенциал этой эффектной маленькой фишки, и теперь самое время взлететь в рай! Или лучше к звездам! Эх… в облако!;-)

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

  1. Во-первых, у вас должна быть учетная запись на ThinkSpeak.com.
  2. Следуйте инструкциям по созданию канала и запишите свой идентификатор канала и ключ API записи.
  3. Обновите приведенный ниже код, указав свою сеть Wi-Fi и учетные данные Thinkspeak.
  4. Запускаем программу в IDE

Прокомментируем наиболее важные части кода:

Сначала вызовем библиотеку ESP8266, определим клиента WiFi и определим свой локальный маршрутизатор и учетные данные Thinkspeak:

/ * ESP12-E и Thinkspeak * /

# включить клиент WiFiClient; const char * MY_SSID = "ВАШ ИДЕНТИФИКАТОР SSD ЗДЕСЬ"; const char * MY_PWD = "ВАШ ПАРОЛЬ ЗДЕСЬ"; const char * TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "КЛЮЧ API ЗАПИСИ ВАШЕГО КАНАЛА";

Во-вторых, давайте включим очень важную библиотеку для проектов IoT: SimpleTimer.h:

/ * ТАЙМЕР * /

#include SimpleTimer timer;

В-третьих, во время setup () мы инициируем последовательную связь, вызовем функцию connectWiFi () и определим таймеры. Обратите внимание, что строка кода: timer.setInterval (60000L, sendDataTS); будет вызывать функцию sendDataTS () каждые 60 секунд для загрузки данных в канал ThinkSpeak.

установка void ()

{… Serial.begin (115200); задержка (10); … ConnectWifi (); timer.setInterval (60000L, sendDataTS); …}

Наконец, что не менее важно, во время цикла loop () единственная необходимая команда - запустить таймер, и все!

пустой цикл ()

{… Timer.run (); // Запускает SimpleTimer}

Ниже вы можете увидеть две важные функции, используемые для взаимодействия с Thinkspeak:

Подключение ESP12-E к вашей сети Wi-Fi:

/***************************************************

* Подключение WiFi ********************************************* *** / void connectWifi () {Serial.print ("Подключение к" + * MY_SSID); WiFi.begin (MY_SSID, MY_PWD); в то время как (WiFi.status ()! = WL_CONNECTED) {задержка (1000); Serial.print ("."); } Serial.println (""); Serial.println («WiFi подключен»); Serial.println (""); }

ESP12-E отправляет данные в ThinkSpeak:

/***************************************************

* Отправка данных на канал Thinkspeak. ******************************************* ****** / void sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr + = "& field1 ="; postStr + = Строка (dataSensorUV); postStr + = "& field2 ="; postStr + = Строка (indexUV); postStr + = "& field3 ="; postStr + = Строка (темп); postStr + = "& field4 ="; postStr + = String (гул); postStr + = "\ г / п / г / п"; client.print ("POST / обновить HTTP / 1.1 / n"); client.print ("Хост: api.thingspeak.com / n"); client.print ("Соединение: закрыть / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Content-Type: application / x-www-form-urlencoded / n"); client.print ("Длина содержимого:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); задержка (1000); } отправлено ++; client.stop (); }

Полный код можно найти на моем GitHub: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

После того, как вы загрузите код в свой NodeMCU. Давайте подключим внешнюю батарею и проведем измерения на солнце. Я поставил удаленную станцию на крышу и начал собирать данные на ThingSpeak.com, как показано на фотографиях выше.

Шаг 7: Заключение

Заключение
Заключение

Как всегда, я надеюсь, что этот проект поможет другим найти свой путь в захватывающий мир электроники!

Для получения подробной информации и окончательного кода посетите мой депозитарий GitHub: RPi-NodeMCU-Weather-Station

Чтобы узнать больше о проектах, посетите мой блог: MJRoBot.org

Будьте на связи! В следующем уроке мы отправим данные с удаленной метеостанции на центральную на основе веб-сервера Raspberry Pi:

Изображение
Изображение

Салудо с юга мира!

Увидимся в моем следующем инструктаже!

Спасибо, Марсело

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