Оглавление:
- Шаг 1: BoM - Спецификация материалов
- Шаг 2: аналоговый УФ-датчик
- Шаг 3: Установка дисплея: OLED
- Шаг 4: локальный УФ-метр
- Шаг 5: Установка DHT22 для измерения температуры и влажности воздуха
- Шаг 6: Отправка данных на ThingSpeak.com
- Шаг 7: Заключение
Видео: IoT Made Easy: удаленный сбор данных о погоде: УФ-излучение, температура и влажность воздуха: 7 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-02-01 14:42
В этом руководстве мы будем собирать удаленные данные, такие как УФ (ультрафиолетовое излучение), температура и влажность воздуха. Эти данные будут очень важны и будут использоваться в будущей полной метеостанции.
Блок-схема показывает, что мы получим в конце.
Шаг 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 в наш УФ-метр (этот шаг не является обязательным).
Во время тестов можно использовать 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 (или его брат DHT11), цифровой датчик относительной влажности и температуры. Он использует емкостной датчик влажности и термистор для измерения окружающего воздуха и выдает цифровой сигнал на вывод данных (выводы аналогового ввода не требуются).
Датчик должен иметь напряжение от 3,3 В до 5 В и работать от -40 ° C до + 80 ° C с точностью +/- 0,5 ° C для температуры и +/- 2% для относительной влажности. Также важно иметь в виду, что период измерения составляет в среднем 2 секунды (минимальное время между измерениями). Сайт Adafruit предоставляет много информации как о DHT22, так и о его брате DHT11. Для получения дополнительных сведений посетите страницу учебного пособия DHT22 / 11.
DHT22 имеет 4 контакта (обращенный к датчику, контакт 1 - крайний левый):
- VCC (подключим к 3.3V от NodeMCU);
- Данные на выходе;
- Не подключен и
- Земля.
Как только вы обычно будете использовать датчик на расстоянии менее 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
До сих пор мы использовали только NodeMCU ESP12-E как обычную и обычную плату Arduino. Конечно, мы только «поцарапали» реальный потенциал этой эффектной маленькой фишки, и теперь самое время взлететь в рай! Или лучше к звездам! Эх… в облако!;-)
Давай начнем!
- Во-первых, у вас должна быть учетная запись на ThinkSpeak.com.
- Следуйте инструкциям по созданию канала и запишите свой идентификатор канала и ключ API записи.
- Обновите приведенный ниже код, указав свою сеть Wi-Fi и учетные данные Thinkspeak.
- Запускаем программу в 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:
Салудо с юга мира!
Увидимся в моем следующем инструктаже!
Спасибо, Марсело
Рекомендуемые:
(Проект IOT) Получение данных о погоде с помощью ESP8266 и Openweather API: 5 шагов
(Проект IOT) Получение данных о погоде с помощью ESP8266 и Openweather API: в этом руководстве мы собираемся создать простой проект IOT, в котором данные о погоде в нашем городе будут извлекаться из openweather.com/api и отображаться с помощью программного обеспечения для обработки
EAL - Сбор данных GPS в соответствии с Индустрией 4.0 на радиоуправляемом автомобиле: 4 шага
EAL - Индустрия 4.0 Сбор данных GPS на радиоуправляемом автомобиле: в этом руководстве мы поговорим о том, как мы устанавливаем модуль GPS на радиоуправляемом автомобиле и размещаем собранные данные на веб-странице для удобства мониторинга. Ранее мы составили инструкцию о том, как мы сделали нашу радиоуправляемую машину, которую можно найти здесь. Это использует
Автоматизация теплицы с помощью LoRa! (Часть 1) -- Датчики (температура, влажность, влажность почвы): 5 шагов
Автоматизация теплицы с помощью LoRa! (Часть 1) || Датчики (температура, влажность, влажность почвы): в этом проекте я покажу вам, как я автоматизировал теплицу. Это означает, что я покажу вам, как я построил теплицу и как я подключил силовую и автоматическую электронику. Также я покажу вам, как программировать плату Arduino, которая использует L
Сбор данных с помощью ESP8266 / ESP32: 7 шагов
Сбор данных с помощью ESP8266 / ESP32: Вы когда-нибудь хотели получить данные для своих проектов Arduino, но для этого нет общедоступного API? Или в таких случаях, как Instagram API, когда процесс настройки не очень удобен? В этом руководстве мы рассмотрим 2 различных варианта
Отображение температуры и влажности и сбор данных с помощью Arduino и обработка: 13 шагов (с изображениями)
Отображение температуры и влажности и сбор данных с помощью Arduino и обработки: Введение: это проект, в котором используется плата Arduino, датчик (DHT11), компьютер с Windows и программа обработки (загружаемая бесплатно) для отображения данных температуры и влажности в цифровом и форма гистограммы, отображение времени и даты и запуск подсчета времени