Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Мониторинг качества воздуха Smart City на основе LoRa

Компоненты и расходные материалы

Arduino UNO
× 1
Seeed Base Shield V2
× 1
NodeMCU ESP8266 Breakout Board
× 1
Датчик видимой громкости
× 1
Seeed Grove - датчик качества воздуха v1.3
× 1
Seeed Grove - датчик температуры и влажности (DHT11)
× 1
Модуль Reyax LoRa
× 1
Маленькая солнечная панель Seeed 80x100 мм, 1 Вт
× 1
Seeed LiPo Rider Pro
× 1
Аккумулятор, 3,7 В
× 1

Необходимые инструменты и машины

3D-принтер (общий)

Приложения и онлайн-сервисы

IDE Arduino
Великолепие
Grandeur Canvas

Об этом проекте

Умный город и качество воздуха

Всемирный банк определяет умный город как город с высокими технологиями. Это означает высокоэффективные общественные услуги.

Одна из фундаментальных особенностей умных городов - обеспечение устойчивой окружающей среды. Для обеспечения устойчивой окружающей среды необходимо контролировать условия окружающей среды для выявления источников загрязнения и их смягчения. В этом контексте тысячи датчиков качества воздуха размещены для предоставления информации в реальном времени как правительству, так и гражданам. Эти данные можно превратить в полезную информацию, позволяющую нам принимать более обоснованные решения - делать ли планирование транспорта или знать, по какому маршруту лучше всего идти на работу.

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

Проблема и решение

Повышенный уровень загрязнения воздуха в больших городах стал серьезной проблемой из-за риска, который он представляет для здоровья человека. В этом контексте технология стала очень полезным инструментом для мониторинга загрязнения и возможного смягчения его воздействия. В частности, существуют различные предложения, использующие парадигму Интернета вещей (IoT), в которой используются взаимосвязанные датчики для измерения различных загрязнителей. Сеть недорогих узлов датчиков мониторинга качества воздуха может быть развернута для мониторинга качества воздуха и метеорологических параметров. Следовательно, обнаруживая источники загрязнения, город может принять корректирующие меры и улучшить состояние окружающей среды. Устанавливая системы обнаружения бедствий, такие как решения для мониторинга наводнений и дождя, в вашем районе. граждане могут быть предупреждены заранее в случае катастрофического события. Можно вывести целостное представление, позволяющее властям принимать решения о планировании инфраструктуры и политики на основе данных.

План проекта

В этом проекте мы собираемся отслеживать несколько наиболее важных параметров окружающей среды, таких как шум, температура, влажность и качество воздуха. Он передает данные в реальном времени по протоколу беспроводной связи на облачную платформу. Оборудование полностью работает от солнечной энергии с резервным аккумулятором. Данные с устройства доступны на приборной панели, которая визуализирует и анализирует данные в желаемых форматах.

Для мониторинга качества воздуха в умном городе необходимо разместить узлы датчиков в разных местах. С точки зрения энергопотребления и стоимости подключать каждый узел датчика к облаку по отдельности - не лучший вариант. Лучше собирать данные со всех сенсорных узлов небольшой области и публиковать все данные в облаке с одного шлюза. LoRa может дать нам это преимущество, поэтому я выбрал LoRa для своего проекта.

Что касается облачной службы, я использую для своего проекта Grandeur. Grandeur - это сравнительно новая удобная для производителей IoT-платформа, где мы можем хранить наши данные и визуализировать данные, создавая графические виджеты с помощью метода перетаскивания. Они также предоставляют Arduino, JavaScript и Python SDK с примерами кода. Таким образом, можно легко подключиться к их сервису с помощью Arduino, NodeMCU и Raspberry Pi.

Лучший способ запитать сенсорный узел - использовать солнечную батарею. Поскольку узлы датчиков размещены в другом удаленном месте, частая замена батареи или обеспечение питания от электросети не всегда возможны. Я питаю свой сенсор с помощью солнечной панели и литий-ионного аккумулятора.

Создание сенсорного узла

Я хочу контролировать качество воздуха, уровень шума, температуру и влажность. Поэтому я использовал датчик качества воздуха Grove, датчик шума Grove и датчик температуры и влажности Grove DHT11. В датчиках Grove есть одна хорошая особенность:вы можете подключить все датчики Grove к Arduino, используя базовый экран Grove, без пайки.

Для питания схемы я использовал солнечную батарею Grove 1 Вт и литий-ионный аккумулятор. Для зарядки аккумулятора от солнечной панели я использовал солнечное зарядное устройство Seeed LiPo Rider Pro со встроенным повышающим преобразователем на 5 В. Таким образом, мы можем легко запустить Arduino, используя выходные данные LiPo Rider.

Большинство используемых здесь компонентов доступны на Seeedstudio.com. На следующем изображении показано тестовое соединение Plug and Play для всех компонентов узла датчика.

Для передачи данных сенсора на шлюз IoT я использовал трансивер Reyax LoRa. На следующем изображении показан модуль Reyax RYLR998 Lora со схемой контактов.

Подготовка Reyax RYLR998 LoRa Engine для подключения к Arduino Base Shield

RYLR998 имеет выход с 5 штырьковыми контактами и не совместим с базовым экраном Grove. Для подключения к Grove Shield я припаял кабель Grove к монтажной плате с 5-контактным гнездовым разъемом. Схема подключения следующая:

Модуль RYLR998 LoRa может безопасно работать до 3,6 В. Вывод Arduino TX обеспечивает выходное напряжение 5 В, что небезопасно для LoRa. Итак, я использовал делитель напряжения, чтобы получить 3,4 В с вывода Arduino TX. С другой стороны, вывод Arduino RX отлично работает с логикой 3,3 В. Итак, я подключил вывод TX LoRa напрямую к выводу RX Arduino. Для нормальной работы вывод RST LoRa должен быть в высоком состоянии.

Теперь указанный выше модуль LoRa можно легко подключить к базовому экрану с помощью следующей схемы преобразователя.

Но перед подключением модуля к базовому экрану убедитесь, что кнопка питания базового экрана находится в положении 3,3 В, как показано на изображении ниже.

После подключения модуля LoRa к базовому экрану мы можем протестировать, отправив AT-команду модулю из Arduino.

Связь с использованием приемопередатчика RYLR896 LoRa

Чтобы установить связь между двумя модулями LoRa, они должны иметь возможность находить друг друга по адресу. Схема адресации экосистемы LoRa немного зависит от модулей и реализации. Проще говоря, модуль позволяет нам установить идентификатор сети и адрес. Модули в одной сети (с одинаковым идентификатором сети) могут взаимодействовать друг с другом. Каждый модуль должен иметь уникальный идентификатор (адрес) в сети. Если у модуля есть адрес 0, этот модуль может получать данные от всех устройств в сети.

Каждый модуль поставляется с частотой по умолчанию, идентификатором сети и адресом, но вам может потребоваться изменить значение по умолчанию. Идентификатор сети по умолчанию для указанного выше модуля - 18, а адрес - 0.

В данный момент нам не нужно ничего менять для нашего демонстрационного проекта. Но если вы хотите изменить какой-либо параметр, пожалуйста, сверьтесь с таблицей данных для деталей AT-команд.

Чтобы отправить сообщение (ПРИВЕТ, ПРИЕМНИК!), Нам просто нужно отправить команду «AT + SEND =0, 15, ПРИВЕТ, ПРИЕМНИК!» при последовательном подключении модуля. Значение первого параметра «0» - это адрес модуля приемника. Следующее значение ’15’ - это количество символов / байтов, которые должны быть отправлены. Значение третьего параметра - это отправляемое сообщение:«HELLO RECEIVER!» (15 символов).

Код для сенсорного узла

Следующий код разработан для узла датчика для сбора всех данных датчика и передачи их на шлюз IoT.

  #include "AirQuality.h" // библиотека качества воздуха в роще 
#include "Arduino.h"
#include "DHT.h"

# определить DHTPIN 4 // к какому цифровому контакту подключен датчик DHT
#define DHTTYPE DHT11 // модель датчика DHT11

DHT dht (DHTPIN, DHTTYPE);

AirQuality airqualitysensor;
int current_quality =-1;

const int sampleWindow =50; // Ширина окна выборки в мс (50 мс =20 Гц)
unsigned int sample;
float noise;
float temp, humid;
int airQuality;

// ---------------------------------------------- ----------------------------------------------
// НАСТРОЙКА
// ----------------------------------------- -------------------------------------------------- -
void setup ()
{

Serial.begin (115200); // Серийный номер для lora
airqualitysensor.init (14);
dht.begin ();

}

// ----- -------------------------------------------------- -------------------------------------
// ГЛАВНАЯ ПЕТЛЯ
/ / ------------------------------------------------- -------------------------------------------

void loop ()
{
noise =calculate_sound_in_db ();
airQuality =calculate_air_quality ();
calculate_temp_humid ();

String temperature =String (temp);
String влажность =String (влажный);
String sound =String (шум);
String air =String (airQuality);

String значения =String (температура) + "," + String (влажность) + "," + String (звук) + "," + String (воздух);
String cmd ="AT + SEND =0," + String (values.length ()) + "," + значения; // AT + SEND =<адрес>, <длина полезной нагрузки>, <данные>
Serial.println (cmd); // отправляется lora

delay (15000);
}

// эта функция вычисляет уровень звука в дБ
float calculate_sound_in_db () {
беззнаковый длинный startMillis =millis (); // Начало окна выборки
float peakToPeak =0; // размах

unsigned int signalMax =0; // минимальное значение
unsigned int signalMin =1024; // максимальное значение

// собираем данные за 50 мс
while (millis () - startMillis {
sample =analogRead (A1); // получаем показания с микрофона
if (sample <1024) // отбрасываем ложные показания
{
if (sample> signalMax)
{
signalMax =sample; // сохраняем только максимальные уровни
}
else if (sample {
signalMin =sample; // сохраняем только минимальные уровни
}
}
}
peakToPeak =signalMax - signalMin; // max - min =пиковая амплитуда
//Serial.println(peakToPeak); // записываем откалиброванные децибелы
float db =map (peakToPeak, 0,1000,48,120); // калибровка по децибелам
//Serial.print(db); // записываем откалиброванные децибелы
//Serial.println ("dB"); // записываем единицы
return db;
}

int calculate_air_quality () {
current_quality =airqualitysensor.slope ();
/ *
if (current_quality> =0) // если вернулись верные данные.
{
if (current_quality ==0)
Serial.println ("Высокое загрязнение! Принудительный сигнал активен");
else if (current_quality ==1)
Serial.println ("Высокое загрязнение!");
else if (current_quality ==2)
Serial.println ("Низкое загрязнение ! ");
else if (current_quality ==3)
Serial.println (" Свежий воздух ");
}
* /
return current_quality;
}

void calculate_temp_humid () {
// Считывание температуры или влажности занимает около 250 миллисекунд!
// Показания датчика также могут быть "старыми" до 2 секунд ( это очень медленный датчик)
float h =dht.readHumidity ();
// Считываем температуру в градусах Цельсия (по умолчанию)
float t =dht.readTemperature ();

// Проверяем, нет ли сбоев при чтении, и завершаем работу раньше (чтобы повторить попытку).
if (isnan (h) || isnan (t)) {
//Serial.println("Failed to read from DHT sensor! ");
return;
}

temp =t;
humid =h;
/ *
Serial.print ("Влажность:");
Serial.print (h);
Serial.print ("% \ t");
Serial.print ("Температура:");
Serial.print (t);
Serial.print ("* C");
* /
}

// прерываем процедуру обслуживания датчика качества воздуха
ISR (TIMER1_OVF_vect)
{
if (airqualitysensor.counter ==61) // устанавливаем 2 секунды как обнаруженную нагрузку
{

airqualitysensor.last_vol =airqualitysensor.first_vol;
airqualitysensor.first_vol =analogRead (A0);
airqualitysensor.counter =0;
airqualitysensor.timer_index =1;
PORTB =PORTB ^ 0x20;
}
else
{
airqualitysensor.counter ++;
}
}

Код отправляет данные датчика каждые 15 секунд. Измените время в соответствии с вашими требованиями.

Загрузить и протестировать

Теперь подключите все датчики, загрузите приведенный выше код и проверьте в последовательном мониторе. Исходный файл прикреплен в разделе кода.

Размещение компонентов внутри коробки

Теперь поместим в коробку все датчики и аккумулятор. Во-первых, распечатайте на 3D-принтере два файла STL, прикрепленных в разделе вложений. Напечатанные изображения выглядят как следующее изображение.

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

После подготовки коробки сначала прикрепили солнечную панель вверху коробки. Соединительные провода внутри коробки через верхнее отверстие.

Затем сначала поместите Arduino с прикрепленным к нему базовым экраном с помощью горячего геля или двустороннего скотча. Разместите другие датчики один за другим и прикрепите их в фиксированном месте с помощью горячего клея.

Установите аккумулятор и липо райдер про и, наконец, добавьте модуль LoRa.

Sensor Node готов к развертыванию.

Настройка Grandeur

Grandeur предоставляет серверную службу для устройства IoT, в которой создается пара виртуальное устройство-пользователь. Модель устройства описывается при создании как объект JSON, содержащий различные переменные (температура, влажность, noise_level, air_quality в нашем случае), которые можно читать и записывать. Grandeur Canvas - это веб-приложение, которое можно использовать для визуализации состояния сопряженных устройств с помощью графических виджетов.

Для использования Grandeur мы должны создать свою учетную запись и выполнить некоторые важные настройки на платформе. Посетите их веб-сайт https://grandeur.dev/ попасть в игру.

1. После входа в учетную запись root создайте новый проект . :

2. Создайте новую учетную запись пользователя . из Добавить аккаунт вариант на вкладке Главная или на вкладке учетных записей. Позже мы войдем в наше приложение, используя адрес электронной почты и пароль, которые мы создали сейчас. Это еще одна интересная функция Grandeur: несколько пользователей могут использовать ваше приложение, выполнив вход со своими адресами электронной почты и паролями . Каждый пользователь может выполнить сопряжение своих устройств, и устройство, сопряженное одним пользователем, станет недоступным для других. Аутентификация лежит в основе Grandeur. Создание пользователя показано ниже:

3. Теперь создайте новое устройство . через вкладку "Устройства". Эта операция генерирует новый уникальный идентификатор устройства, который мы будем использовать при написании кода для нашего оборудования, и этот идентификатор устройства требуется для подключения к Grandure с помощью API. Создание устройства также генерирует accessToken. Не забудьте скопировать его, и он будет использован в аппаратном коде и не будет доступен после закрытия диалогового окна . Вы должны добавить модель устройства перед добавлением устройства, используя следующую процедуру. Модель устройства используется для описания того, какие переменные могут передаваться устройством / на него.

В моделях нажмите Добавить . и дайте название модели. В схеме поместите все переменные (в нашем случае 4) в формате JSON. Сохраните значение 0 в это время. Эта переменная будет обновляться автоматически, когда мы будем отправлять данные с нашего узла устройства.

  {"temp":0, "humid":0, "air":0, "noise":0}  

После размещения схемы нажмите «Добавить».

После добавления модели устройства нажмите «Добавить с устройств» и выберите модель, которую вы только что создали, чтобы связать модель с устройством.

Укажите идентификатор устройства и нажмите «Зарегистрироваться».

Скопируйте токен доступа, и он будет использован в аппаратном коде и не будет доступен после закрытия диалогового окна.

Устройство успешно создано, также запишите ИДЕНТИФИКАТОР УСТРОЙСТВА. Это также потребуется для кодирования.

Пользователь не может взаимодействовать с устройством, если оно не сопряжено с ним. Вы можете подключить устройство двумя способами. :1) с помощью облачной панели мониторинга или 2) через веб-приложение с помощью pairDevice () функция API устройства. Этот второй способ имеет очень большое значение, если вы посмотрите на него с производственной точки зрения. Как будто теперь вы можете отправлять свои аппаратные продукты, а ваши пользователи могут войти в ваше приложение и заявить о праве собственности на оборудование, связав его. Вот как можно связать свое устройство с пользователем с помощью облачной панели управления:

Чтобы выполнить сопряжение устройства, нажмите «Сопряжение» и выберите учетную запись. Вы готовы перейти к следующему шагу.

4. Теперь создадим холст.

В левом меню на панели инструментов щелкните холст или перейдите на страницу https://canvas.grandeur.tech. Если вы впервые посещаете Canvas, нажмите Авторизоваться появится кнопка. Авторизация дает Canvas доступ к пользователям и устройствам вашего проекта. Нажатие на кнопку «Авторизовать» перенаправит вас обратно на панель управления Grandeur, где вам будет предложено выбрать проект, к которому Canvas должен привязать себя.

Выберите виджеты графика и щелкните по нему. Появится меню «Настроить», затем щелкните для настройки, чтобы задать заголовок графика и установить переменную, значение которой вы хотите отобразить на этом графике.

Нажмите, чтобы сохранить.

Следуя той же процедуре, добавьте 4 графических виджета для 4 переменных.

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

Preparing IoT LoRa Gateway

In a simple way, an IoT Gateway is like home or office network router or gateway that connects sensors, IoT modules, and smart devices to the cloud. Such a gateway facilitates communication between your devices, maintains security, and provides an admin interface where you can perform basic functions.

A true IoT gateway contains communication technologies connecting end-devices (sensors, actuators, or more complex devices) and backend platforms (data, device, and subscriber management) to the gateway. It has a computing platform allowing pre-installed or user-defined applications to manage data (for routing and computing at the edge), devices, security, communication, and other aspects of the gateway.

Raspberry Pi can be a good option for a gateway with lots of flexibility but to keep it simple I am using Node MCU as a gateway for this project. Node MCU will receive the data from the LoRa module using UART. Then using Arduino SDK we will upload the data to the Grandeur cloud platform.

Firmware for the Gateway

The following code was developed for the gateway using Arduino SDK provided by Grandeur cloud. Data is received in string form from the LoRa using the UART port. Then the received data is processed to separate the individual variable from the comma-separated string value. The values are then sent to Grandeur using WiFi. The following function was used to separate the variables.

void process_received_data(){

start_pos =inputString.indexOf(start_val);
end_pos =inputString.indexOf(end_val);
String data_string =inputString.substring(start_pos+1, end_pos-1);
//Serial.println(data_string);
//identifying commas inn the string
int firstCommaIndex =data_string.indexOf(',');
int secondCommaIndex =data_string.indexOf(',', firstCommaIndex+1);
int thirdCommaIndex =data_string.indexOf(',', secondCommaIndex+1);
//seperating comma seperated value from the data string
String temperature =data_string.substring(0, firstCommaIndex);
String humidity =data_string.substring(firstCommaIndex+1, secondCommaIndex);
String noise_level =data_string.substring(secondCommaIndex+1, thirdCommaIndex);
String air_auality =data_string.substring(thirdCommaIndex+1);

//Serial.println(temperature);
//Serial.println(humidity);
//Serial.println(noise);
//Serial.println(air_auality);

temp =temperature.toFloat();
humid =humidity.toFloat();
noise =noise_level.toFloat();
air =air_auality.toFloat();

Serial.println(temp);
Serial.println(humid);
Serial.println(noise);
Serial.println(air);

inputString ="";
stringComplete =false;
}

The complete code is attached in the code section.

Data Visualization

Code

  • Code for Sensor Node
  • Code for Gateway
Code for Sensor NodeArduino
This code is for the sensor device that collects sensors data and sent the data to the IoT gateway using LoRa.
#include "AirQuality.h" //grove air quality library#include "Arduino.h"#include "DHT.h"#define DHTPIN 4 // what digital pin DHT sensor connected to#define DHTTYPE DHT11 // model of the sensor DHT11 DHT dht(DHTPIN, DHTTYPE);AirQuality airqualitysensor;int current_quality =-1;const int sampleWindow =50; // Sample window width in mS (50 mS =20Hz)unsigned int sample;float noise;float temp, humid;int airQuality; //-------------------------------------------------------------------------------------------- // SETUP //--------------------------------------------------------------------------------------------void setup() { Serial.begin(115200); //Serial for lora airqualitysensor.init(14); dht.begin();} //--------------------------------------------------------------------------------------------// MAIN LOOP//-------------------------------------------------------------------------------------------- void loop() { noise =calculate_sound_in_db(); airQuality =calculate_air_quality(); calculate_temp_humid(); String temperature =String(temp); String humidity =String(humid); String sound =String(noise); String air =String(airQuality); String values =String(temperature)+","+ String(humidity)+","+ String(sound)+","+ String(air); String cmd ="AT+SEND=0,"+String(values.length())+","+values; //AT+SEND=
,, Serial.println(cmd); //sent to lora delay(15000);}//this function calculate sound level in dBfloat calculate_sound_in_db(){ unsigned long startMillis=millis(); // Start of sample window float peakToPeak =0; // peak-to-peak level unsigned int signalMax =0; //minimum value unsigned int signalMin =1024; //maximum value // collect data for 50 mS while (millis() - startMillis signalMax) { signalMax =sample; // save just the max levels } else if (sample =0)// if a valid data returned. { if (current_quality==0) Serial.println("High pollution! Force signal active"); else if (current_quality==1) Serial.println("High pollution!"); else if (current_quality==2) Serial.println("Low pollution!"); else if (current_quality ==3) Serial.println("Fresh air"); } */ return current_quality;}void calculate_temp_humid(){ // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h =dht.readHumidity(); // Read temperature as Celsius (the default) float t =dht.readTemperature(); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t)) { //Serial.println("Failed to read from DHT sensor!"); возвращение; } temp =t; humid =h; /* Serial.print("Humidity:"); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature:"); Serial.print(t); Serial.print(" *C "); */}//interrupt service routine for air quality sensorISR(TIMER1_OVF_vect){ if(airqualitysensor.counter==61)//set 2 seconds as a detected duty { airqualitysensor.last_vol=airqualitysensor.first_vol; airqualitysensor.first_vol=analogRead(A0); airqualitysensor.counter=0; airqualitysensor.timer_index=1; PORTB=PORTB^0x20; } else { airqualitysensor.counter++; }}
Code for GatewayArduino
Receives data from the sensor nodes, process the data and sends to Grandeur cloud
/* Including the SDK and WiFi library */#include #include #include SoftwareSerial LORA(D7, D8);/* Configurations */String deviceID ="your device id";String apiKey ="your api key";String token ="your device token";/* WiFi credentials */String ssid ="your wifi ssid";String password ="your wifi password";/* Create variable to hold project and device */Grandeur::Project project;Grandeur::Project::Device device;/* Variable to keep track of connection state and time */int connected =0;uint32_t lastUpdate =0;String inputString =""; // a string to hold incoming databoolean stringComplete =false; // whether the string is complete//:and % was set from the transmitter node for the eage of data separationchar start_val =':';char end_val ='%';int start_pos =0;int end_pos =0;float temp =0;float humid =0;float air =0;float noise =0;/* Function to check device's connection status */void onConnection(bool status) { switch(status) { case CONNECTED:Serial.println("Device is connected to the cloud."); /* Record connection state and time */ connected =1; lastUpdate =millis(); возвращение; case DISCONNECTED:Serial.println("Device is disconnected from the cloud."); connected =0; возвращение; }}/* Function to connect to WiFi */void connectWiFi() { /* Set mode to station */ WiFi.mode(WIFI_STA); /* Connect using the ssid and password */ WiFi.begin(ssid, password); /* Block till the WiFi is connected */ while (WiFi.status() !=WL_CONNECTED) { delay(500); Serial.print("."); } /* Print message */ Serial.println(""); Serial.println("WiFi connected"); /* And IP address */ Serial.println(WiFi.localIP());}/* Function to confirm that data has been updated */void dataCallback(const char* code, Var res) { /* If the update was recorded successfully */ if(code =="DEVICE-DATA-UPDATED") { //Serial.println("Updated DATA"); /* Get data */ double temp_data =(double) res["update"]["temp"]; double humid_data =(double) res["update"]["humid"]; double noise_data =(double) res["update"]["noise"]; double air_data =(double) res["update"]["air"]; /* Print */ Serial.printf("Temperature:%f Humidity:%f Noise Level:%f Air Quality:%f\n", temp_data, humid_data, noise_data, air_data); возвращение; } /* If the summary could not be updated. */ Serial.println("Failed to Update DATA"); return;}/* Function to send updated current and power readings */void sendUpdate() { Var data; //JSON data format set in Grandeur:{"temp":0, "humid":0, "air":0, "noise":0} data["temp"] =temp; data["humid"] =humid; data["noise"] =noise; data["air"] =air; /* Record update */ //device.data().set("", data, dataCallback); //send JSON device.data().set("temp", temp, dataCallback); device.data().set("humid", humid, dataCallback); device.data().set("noise", noise, dataCallback); device.data().set("air", air, dataCallback); //delay(2000);}void setup() { /* Begin the serial */ Serial.begin(9600); LORA.begin(115200); inputString.reserve(200); /* Connect to WiFi */ connectWiFi(); /* Initializes the global object "grandeur" with your configurations. */ project =grandeur.init(apiKey, token); /* Get reference to device */ device =project.device(deviceID); /* Sets connection state update handler */ project.onConnection(onConnection);}void loop() { serialEvent(); project.loop(WiFi.status() ==WL_CONNECTED); /* Send update to server */ if (stringComplete) { process_received_data(); if (connected) sendUpdate(); }}void serialEvent() { while (LORA.available()) { // get the new byte:char inChar =(char)LORA.read(); // if the incoming character is a newline, set a flag // so the main loop can do something about it:if (inChar =='\n') { stringComplete =true; } else // add it to the inputString:inputString +=inChar; }}void process_received_data(){ start_pos =inputString.indexOf(start_val); end_pos =inputString.indexOf(end_val); String data_string =inputString.substring(start_pos+1, end_pos-1); //Serial.println(data_string); //identifying commas inn the string int firstCommaIndex =data_string.indexOf(','); int secondCommaIndex =data_string.indexOf(',', firstCommaIndex+1); int thirdCommaIndex =data_string.indexOf(',', secondCommaIndex+1); //seperating comma seperated value from the data string String temperature =data_string.substring(0, firstCommaIndex); String humidity =data_string.substring(firstCommaIndex+1, secondCommaIndex); String noise_level =data_string.substring(secondCommaIndex+1, thirdCommaIndex); String air_auality =data_string.substring(thirdCommaIndex+1); //Serial.println(temperature); //Serial.println(humidity); //Serial.println(noise); //Serial.println(air_auality); temp =temperature.toFloat(); humid =humidity.toFloat(); noise =noise_level.toFloat(); air =air_auality.toFloat(); Serial.println(temp); Serial.println(humid); Serial.println(noise); Serial.println(air); inputString =""; stringComplete =false; }

Custom parts and enclosures

Schematics


Производственный процесс

  1. Передовые сенсорные технологии позволяют персонализировать мониторинг качества воздуха
  2. Датчик качества воздуха включает возможности искусственного интеллекта
  3. Платформа датчика качества воздуха получает встроенный ИИ
  4. Как измерить качество воздуха на OpenSensors
  5. Детектор загрязнения воздуха
  6. Датчик качества воздуха с гелием
  7. Улучшение мониторинга загрязнения воздуха с помощью датчиков Интернета вещей
  8. Преимущества системы мониторинга качества окружающего воздуха на основе IoT
  9. Применение промышленных систем мониторинга качества воздуха с использованием Интернета вещей
  10. Датчик качества воздуха на основе углерода