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

Smart Plant IoT

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

Seeed Base Shield V2
× 1
Seeed Grove - Relay
× 1
Seeed Grove - датчик температуры
× 1
Arduino UNO
× 1
Стартовый комплект гелия (LEGACY)
× 1

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

Microsoft Azure
Microsoft Visual Studio 2015

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

Обновлено для китайско-американского конкурса молодых мастеров 2019

Введение

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

Helium IoT Hub легко подключается к Azure IoT Hub, в этой статье мы объясним, как работает весь процесс. Поскольку весь проект является бессерверным, единственный код, необходимый для работы всего процесса, - это только код функции Azure и код Arduino.

Шаг 1. Соберите компоненты

Мы создаем простой продукт, используя

  • Arduino UNO
  • Щит базы SEEED Grove
  • Атом гелия + элемент гелия с гелиевым модулем Arduino Breakout.
  • Насос
  • Датчик температуры / влажности, датчик влажности, датчик УФ-излучения
  • OLED-дисплей Grove

Шаг 2. Настройте Arduino с гелием и датчиками

В этой статье мы сосредоточимся на использовании Arduino в качестве нашего приложения. Во-первых, мы будем передавать данные из Helium Atom в Helium Hub. Сначала нам нужно зарегистрировать наш Atom на панели инструментов Helium Network.

После настройки Atom нам также нужно будет зарегистрировать Element, поскольку они являются точкой доступа (для тех, у кого есть сотовая версия, подойдет его включение).

После активации элемента мы должны увидеть его на точке доступа.

Затем нам нужно прикрепить весь датчик, а также атом гелия, когда все будет готово, он должен выглядеть примерно так, немного беспорядочно, но мы можем очистить это позже.

Мы можем запустить следующий код, чтобы узнать, что программа запущена.

  #include "Arduino.h" #include "Board.h" #include "Helium.h" #include "HeliumUtil.h" #include  #include "Arduino.h" #include "Wire.h" #include  #include  #define CHANNEL_NAME "Приложение Azure IoT" Гелий гелий (&atom_serial); Channel channel (&helium); int relay =5; void setDisplayToOriginalState () {SeeedGrayOled.init (SSD1327);} void setup () {// поместите сюда свой установочный код, чтобы запустить его один раз:Serial.begin (9600); pinMode (реле, ВЫХОД); задержка (150); / * Сброс HP20x_dev * / TH02.begin (); задержка (100); Serial.println ("TH02_dev доступен. \ N"); DBG_PRINTLN (F («Запуск»)); // Начать обмен данными с атомом гелия // Скорость передачи зависит от поддерживаемой платы // и настраивается в Board.h helium.begin (HELIUM_BAUD_RATE); // Подключаем атом к гелиевой сети helium_connect (&helium); // Начинаем общение с каналом. Это нужно // сделать только один раз. Функции HeliumUtil добавляют простую логику повтора // для воссоздания канала в случае его отключения. channel_create (&канал, CHANNEL_NAME); Wire.begin ();} void loop () {// Звуковое загрязнение int влажность =0; для (int я =0; я <32; я ++) {влажность + =analogRead (A0); } int uvlight =0; для (int я =0; я <32; я ++) {uvlight + =analogRead (A1); } float temper =TH02.ReadTemperature (); влажность поплавка =TH02.ReadHumidity (); Строка dataString ="Moisture =" + String (влажность) + "&UVLight =" + String (uvlight) + "&Temperature =" + String (temper) + "&Humidity =" + String (влажность); данные char [dataString.length ()]; dataString.toCharArray (данные, dataString.length ()); channel_send (&канал, ИМЯ КАНАЛА, данные, strlen (данные)); Serial.println (данные); setDisplayToOriginalState (); SeeedGrayOled.clearDisplay (); // Очистить дисплей. SeeedGrayOled.setNormalDisplay (); // Устанавливаем нормальный режим отображения SeeedGrayOled.setVerticalMode (); // Установите вертикальный режим для отображения текста SeeedGrayOled.setTextXY (0, 0); // Устанавливаем курсор на 0-ю строку, 0-ю строку столбца влажность ="Влажность:" + Строка (влажность); char moibuffer [влагостойкость.length ()]; влагостойкость.toCharArray (moibuffer, влагостойкость.length ()); SeeedGrayOled.putString (мойбуфер); SeeedGrayOled.setTextXY (2, 0); Строка uvstring ="UVLight:" + String (uvlight); char uvbuffer [uvstring.length ()]; uvstring.toCharArray (uvbuffer, uvstring.length ()); SeeedGrayOled.putString (uvbuffer); SeeedGrayOled.setTextXY (4, 0); Строка temperaturestring =Строка (темп) + "C"; char tempbuffer [temperaturestring.length ()]; temperaturestring.toCharArray (tempbuffer, temperaturestring.length ()); SeeedGrayOled.putString (временный буфер); SeeedGrayOled.setTextXY (6, 0); String humidstring ="Humid:" + String (влажность); char humidbuffer [temperaturestring.length ()]; humidstring.toCharArray (humidbuffer, humidstring.length ()); SeeedGrayOled.putString (увлажнитель); если (влажность <100) {digitalWrite (реле, ВЫСОКИЙ); задержка (5000); digitalWrite (реле, НИЗКИЙ); } delay (60000);}  

Для водяного насоса требуется 12 В, в то время как обычный Arduino будет выдавать максимум 5 В, поэтому, чтобы заставить замок работать, мы можем подключиться к источнику питания, припаяв два провода к источнику питания, как показано на рисунке ниже. Мы будем использовать красный провод в качестве 12 В и черный провод в качестве заземления.

Реле будет управлять тем, когда будет закачиваться вода.

Шаг 3. Настройте Helium Hub и Azure IoT Hub

Сначала мы создаем IoT Hub для всех сервисов, было бы разумно переместить IoT Hub в избранное, чтобы получить к нему доступ намного проще. Мы можем использовать стандартный уровень, так как пробный кредит в размере 200 долларов США покрывает его. Вы также можете выбрать уровень бесплатного пользования.

После выбора имени вы можете перейти к разделу «Размер и масштаб».

После его создания нам нужно перейти в Общие политики доступа-> Запись RegistryReadWrite-> Строка подключения - Первичный ключ . , также убедитесь, что установлены флажки «Чтение реестра» и «Запись в реестр», хотя они должны быть по умолчанию

Мы можем создать наше первое устройство для прототипа, чтобы проверить соединение

После получения этой основной строки подключения перейдите на панель инструментов Helium и создайте подключение Helium. После вставки строки подключения в поле подключения все остальное должно быть автоматически заполнено.

После настройки мы сможем получить все строки MQTT, автоматически сгенерированные в Helium Hub. Это можно легко получить через канал.

Поскольку Azure требуется устройство для публикации и подписки на фиксированную тему MQTT, это позволит Helium Atom сделать это, а также позволит Центру Интернета вещей отправлять сообщения на Helium Atom. Мы можем сделать следующее, чтобы проверить отправку в Azure.

  git clone https://github.com/helium/helium-cli.gitcd helium-climake./helium -p / dev /  

Это проверит, правильно ли установлен Helium

  ./helium -p / dev / serial0 channel создать «приложение Azure IoT» ./ helium -p / dev / serial0 channel send 1 «Hello Azure»  

Это отправит информацию из Atom в Azure напрямую, мы должны проверить это как на Helium Dashboard, так и в Azure IoT Hub Overview

И в Azure IoT Hub ниже мы должны увидеть тот же результат

Устройство аутентифицируется через X509, и платформа Helium обрабатывает все это. Сделать его простым и понятным.

Шаг 5. Настройка базы данных SQL Azure

Затем нам нужно иметь возможность хранить данные, поступающие с устройства IoT. Есть отличное руководство по этому поводу, подробно написанное на https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/01/23/working-with-azure-iot-data-in-azure-sql-database/ In В этой статье мы сосредоточимся на быстрой интеграции того, как это происходит. Сначала мы переходим к базам данных SQL, чтобы создать базу данных, как показано на рисунке ниже, мы можем выбрать базовый уровень, поскольку мы только запускаем приложение, бесплатный пробный кредит должен быть в состоянии покрыть его. Это самый дешевый вариант для создания прототипов при масштабировании вы, возможно, захотите перейти на Azure Cosmos в будущем, поскольку минимальная сумма для Cosmos составляет 25 долларов США.

После этого мы можем использовать редактор запросов, чтобы создать следующую таблицу, для начала мы просто собираемся использовать простую структуру данных Smart Plant IoT, чтобы начать работу

  СОЗДАТЬ ТАБЛИЦУ SmartPlant (id bigint IDENTITY (1,1) NOT NULL, температура int NOT NULL, влажность int NOT NULL, влажность int NOT NULL, UVLight int NOT NULL, DateCreated datetime по умолчанию CURRENT_TIMESTAMP)  

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

Шаг 4. Создайте приложение-функцию Azure

Для подключения к функции мы будем использовать Event Hub. Сначала нам нужно создать приложение-функцию Azure, которое позволяет использовать бессерверную структуру, что отлично подходит для приложений Интернета вещей, поскольку нам больше не нужно поддерживать. Для начала нам сначала нужно создать приложение-функцию при вычислении.

Мы можем создать функцию с этими настройками

Просто уделите пару минут, и это будет в наших уведомлениях.

Приложение-функция развернуто

Теперь, когда у нас есть функции, мы создадим функцию под триггером IoT Hub (Event Hub), чтобы мы могли запустить концентратор событий. Зайдите в функцию-> функции платформы-> Настройки приложения

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

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

Измените функцию на следующую:вставка данных непосредственно в базу данных SQL Azure.

  using System.Configuration; using System.Data.SqlClient; using System.Threading.Tasks; общедоступная статическая асинхронная задача Run (строка myIoTHubMessage, журнал TraceWriter) {var map =myIoTHubMessage.Split ('&'). Выберите (x => x.Split ('=')). ToDictionary (x => x [0], x => x [1]); Строка Temperature =map ["Температура"]; String H String Moisture =map ["Влажность"]; String UVLight =map ["UVLight"]; var str =ConfigurationManager.ConnectionStrings ["sqldb_connection"]. ConnectionString; using (SqlConnection conn =new SqlConnection (str)) {conn.Open (); var text ="INSERT INTO dbo. SmartPlant (Temperature, using (SqlCommand cmd =new SqlCommand (text, conn)) {// Выполняем команду и регистрируем # затронутых строк. Var rows =await cmd.ExecuteNonQueryAsync (); log.Info ($ "{rows} rows были обновлены ");}} log.Info ($" Функция триггера C # IoT Hub обработала сообщение:{myIoTHubMessage} ");}  

В случае успеха вы должны увидеть

На данный момент у нас есть полная передача данных из Helium в Azure SQL через Azure IoT Hub. Затем нам нужно получить данные, которые нам нужны для создания триггера HTTP через API функций Azure.

Мы изменим несколько значений, маршрутизацию на / data, чтобы мы могли получить доступ к / api / smartplant, и уровень авторизации, чтобы он был анонимным, и метод HTTP только для GET

Что касается кода, мы можем проверить его, перейдя по адресу

http:// .azurewebsites.net / api / smartplant? name =foobar &code =

Это проверит результат и вернет «hello foobar». Когда это будет завершено, мы можем использовать следующий код для возврата фактических данных. Затем мы можем использовать следующий код для тестирования всего приложения. Это простейший запрос, дополнительную информацию по которому можно собрать, написав более сложные запросы, но для прототипа мы сосредоточимся только на получении одной записи.

  #r "System.Configuration" #r "System.Data" #r "Newtonsoft.Json" с использованием System; с использованием System.Net; с использованием System.Configuration; с использованием System.Data.SqlClient; с использованием System. Threading.Tasks; using System.Text; using Newtonsoft.Json; общедоступная статическая асинхронная задача  Выполнить (HttpRequestMessage req, журнал TraceWriter) {log.Info («Функция триггера C # HTTP обработала запрос.»); Var str =ConfigurationManager .ConnectionStrings ["sqldb_connection"]. ConnectionString; using (SqlConnection conn =new SqlConnection (str)) {conn.Open (); var text ="SELECT Top 100 Temperature, Moisture, UVLight SmartPlant ret =new SmartPlant (); using ( SqlCommand cmd =new SqlCommand (text, conn)) {SqlDataReader reader =await cmd.ExecuteReaderAsync (); попробуйте {while (reader.Read ()) {ret.Temperature =(int) reader [0]; ret.Moisture =( int) reader [1]; ret.UVLight =(int) reader [2]; ret.Humidity =(int) reader [3];}} finally {// Всегда вызываем Close по окончании чтения reader.Close (); } var json =JsonConvert.SerializeObject (ret, Form atting.Indented); вернуть новое сообщение HttpResponseMessage (HttpStatusCode.OK) {Content =new StringContent (json, Encoding.UTF8, "application / json")}; }}} открытый класс SmartPlant {public float Temperature {get; набор; } public float Moisture {get; набор; } public float UVLight {получить; набор; } public float Humidity {get; набор; }}  

Когда все будет сделано, он должен дать результат для последней записи.

Шаг 5. Пользовательский интерфейс для вывода

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

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

Мы можем легко смоделировать его собственную накачку.

Дополнительно:интеграция с Alexa

Код

  • Запрос GET функции Azure
  • Вставка данных функции Azure из Центра Интернета вещей
  • Ярлык функции Azure
  • Код Arduino
Запрос GET функции Azure C #
Успешный вызов от вызова / api / smartplant
 #r "System.Configuration" #r "System.Data" #r "Newtonsoft.Json" с использованием System; с использованием System.Net; с использованием System.Configuration; с использованием System.Data. SqlClient; using System.Threading.Tasks; using System.Text; using Newtonsoft.Json; общедоступная статическая асинхронная задача  Run (HttpRequestMessage req, TraceWriter log) {log.Info («Функция триггера C # HTTP обработала запрос.»); var str =ConfigurationManager.ConnectionStrings ["sqldb_connection"]. ConnectionString; using (SqlConnection conn =new SqlConnection (str)) {conn.Open (); var text ="SELECT Top 100 Temperature, Moisture, UVLight from dbo.IoTData Order по DateCreated DESC "; EventData ret =new EventData (); using (SqlCommand cmd =new SqlCommand (text, conn)) {SqlDataReader reader =await cmd.ExecuteReaderAsync (); попробуйте {while (reader.Read ()) {ret.Temperature =(int) читатель [0]; ret.Moisture =(int) reader [1]; ret.UVLight =(int) reader [1]; }} finally {// Всегда вызываем Close по окончании чтения. reader.Close (); } var json =JsonConvert.SerializeObject (ret, Formatting.Indented); вернуть новый HttpResponseMessage (HttpStatusCode.OK) {Content =new StringContent (json, Encoding.UTF8, "application / json")}; }}} открытый класс SmartPlant {public float Temperature {get; набор; } public float Moisture {get; набор; } public float UVLight {получить; набор; }} 
Вставка данных функции Azure из Центра Интернета вещей C #
Вставка данных с помощью функции Azure
 с использованием System.Configuration; с использованием System.Data.SqlClient; с использованием System.Threading.Tasks; запуск общедоступной статической асинхронной задачи (строка myIoTHubMessage, журнал TraceWriter) {var map =myIoTHubMessage.Split ('&' ) .Select (x => x.Split ('=')). ToDictionary (x => x [0], x => x [1]); Строка Тип =карта ["Тип"]; String Confidence =map ["Доверие"]; log.Info (Тип); log.Info (Уверенность); var str =ConfigurationManager.ConnectionStrings ["sqldb_connection"]. ConnectionString; используя (SqlConnection conn =new SqlConnection (str)) {conn.Open (); var text ="INSERT INTO dbo.IoTData (Type, Confidence) VALUES ('" + Type + "'," + Confidence + ");"; using (SqlCommand cmd =new SqlCommand (text, conn)) {// Выполняем команду и регистрируем # затронутых строк. var rows =await cmd.ExecuteNonQueryAsync (); log.Info ($ "обновлено {строк} строк"); }} log.Info ($ "Функция триггера C # IoT Hub обработала сообщение:{myIoTHubMessage}");} 
Ярлык функции Azure C #
прямая вставка в AzureSQL
 #r "System.Configuration" #r "System.Data" с использованием System; с использованием System.Configuration; с использованием System.Data.SqlClient; с использованием System.Threading.Tasks; с использованием System.Net; общедоступные статические async Task  Run (HttpRequestMessage req, TraceWriter log) {string Temperature =req.GetQueryNameValuePairs () .FirstOrDefault (q => string.Compare (q.Key, "Temperature", true) ==0) .Value; string Moisture =req.GetQueryNameValuePairs () .FirstOrDefault (q => string.Compare (q.Key, "Moisture", true) ==0) .Value; строка UVLight =req.GetQueryNameValuePairs () .FirstOrDefault (q => string.Compare (q.Key, "UVLight", true) ==0) .Value; if (Temperature ==null || Moisture ==null || UVLight ==null) {// Получить тело запроса return req.CreateResponse (HttpStatusCode.BadRequest, "Пожалуйста, передайте имя в строке запроса или в теле запроса"); } var str =ConfigurationManager.ConnectionStrings ["sqldb_connection"]. ConnectionString; используя (SqlConnection conn =new SqlConnection (str)) {conn.Open (); var text ="ВСТАВИТЬ В dbo.SmartPlant (Temperature, Moisture, UVLight) VALUES (" + Temperature + "," + Moisture + "," + UVLight + ");"; using (SqlCommand cmd =new SqlCommand (text, conn)) {// Выполняем команду и регистрируем # затронутых строк. var rows =await cmd.ExecuteNonQueryAsync (); log.Info ($ "обновлено {строк} строк"); }} return req.CreateResponse (HttpStatusCode.OK, "Success");} 
Код Arduino Arduino
Код Arduino для загрузки данных, а также для автоматического полива растений
 #include "Arduino.h" #include "Board.h" #include "Helium.h" #include "HeliumUtil.h" #include  #include "Arduino.h" #include "Wire.h" #include  #include  #define CHANNEL_NAME "Приложение Azure IoT" Гелий гелий (&atom_serial); Канальный канал (&гелий); int relay =5; void setDisplayToOriginalState () {SeeedGrayOled.init (SSD1327);} void setup () {// поместите здесь свой установочный код, чтобы запустить его один раз:Serial.begin (9600); pinMode (реле, ВЫХОД); задержка (150); / * Сброс HP20x_dev * / TH02.begin (); задержка (100); Serial.println ("TH02_dev доступен. \ N"); DBG_PRINTLN (F («Запуск»)); // Начать обмен данными с атомом гелия // Скорость передачи зависит от поддерживаемой платы // и настраивается в Board.h helium.begin (HELIUM_BAUD_RATE); // Подключаем атом к гелиевой сети helium_connect (&helium); // Начинаем общение с каналом. Это нужно // сделать только один раз. Функции HeliumUtil добавляют простую логику повтора // для воссоздания канала в случае его отключения. channel_create (&канал, CHANNEL_NAME); Wire.begin ();} void loop () {// Звуковое загрязнение int влажность =0; для (int я =0; я <32; я ++) {влажность + =analogRead (A0); } int uvlight =0; для (int я =0; я <32; я ++) {uvlight + =analogRead (A1); } float temper =TH02.ReadTemperature (); влажность поплавка =TH02.ReadHumidity (); Строка dataString ="Moisture =" + String (влажность) + "&UVLight =" + String (uvlight) + "&Temperature =" + String (temper) + "&Humidity =" + String (влажность); данные char [dataString.length ()]; dataString.toCharArray (данные, dataString.length ()); channel_send (&канал, ИМЯ КАНАЛА, данные, strlen (данные)); Serial.println (данные); setDisplayToOriginalState (); SeeedGrayOled.clearDisplay (); // Очистить дисплей. SeeedGrayOled.setNormalDisplay (); // Устанавливаем нормальный режим отображения SeeedGrayOled.setVerticalMode (); // Установите вертикальный режим для отображения текста SeeedGrayOled.setTextXY (0, 0); // Устанавливаем курсор на 0-ю строку, 0-ю строку столбца влажность ="Влажность:" + Строка (влажность); char moibuffer [влагостойкость.length ()]; влагостойкость.toCharArray (moibuffer, влагостойкость.length ()); SeeedGrayOled.putString (мойбуфер); SeeedGrayOled.setTextXY (2, 0); Строка uvstring ="UVLight:" + String (uvlight); char uvbuffer [uvstring.length ()]; uvstring.toCharArray (uvbuffer, uvstring.length ()); SeeedGrayOled.putString (uvbuffer); SeeedGrayOled.setTextXY (4, 0); Строка temperaturestring =Строка (темп) + "C"; char tempbuffer [temperaturestring.length ()]; temperaturestring.toCharArray (tempbuffer, temperaturestring.length ()); SeeedGrayOled.putString (временный буфер); SeeedGrayOled.setTextXY (6, 0); String humidstring ="Humid:" + String (влажность); char humidbuffer [temperaturestring.length ()]; humidstring.toCharArray (humidbuffer, humidstring.length ()); SeeedGrayOled.putString (увлажнитель); если (влажность <100) {digitalWrite (реле, ВЫСОКИЙ); задержка (5000); digitalWrite (реле, НИЗКИЙ); } delay (60000);} 
Репо проекта
Репо проекта для умного плана netduino https://github.com/Nyceane/smart-plant-iot

Схема

Архитектура Helium подключает IoT-устройство напрямую к Azure IoT Hub.

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

  1. Интеллектуальные данные:следующий рубеж в Интернете вещей
  2. Сотовый Интернет вещей:умный мусорный бак
  3. Умный бармен
  4. GE открывает интеллектуальный завод в Алабаме
  5. Умные больницы завтрашнего дня нуждаются в более умном программном обеспечении
  6. Секреты инфраструктуры Интернета вещей с умным городом
  7. Рационально расходуйте свой доллар Интернета вещей
  8. Экосистема Интернета вещей создает оптимизированное интеллектуальное хранилище
  9. Безопасность с помощью смарт-устройств и Интернета вещей
  10. Последние достижения и приложения в технологии Интернета вещей