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

MyRiver

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

Arduino MKR1000
× 1
Датчик уровня воды
× 1
Датчик Ph
× 1
LED (общий)
Белый, если возможно
× 1
Резистор 221 Ом
× 2
Фоторезистор
× 1
Перемычки (общие)
× 1

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

Паяльник (общий)
Ножовка по металлу

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

Веб-редактор Arduino
Sigfox
Wia

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

Обзор

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

Представьте, что вы живете прямо у реки (если это не так), вам не захочется просыпаться посреди ночи, когда ваш дом затоплен из-за реки. Или что, если ваш сосед решит вылить немного бензина в реку, вы не захотите, чтобы ваши животные заболели.

MyRiver решает все эти проблемы, он может работать в изолированных областях благодаря Sigfox, так что каждый имеет доступ к устройству. Устройство будет считывать pH воды, уровень ее загрязнения, используя инновационный метод, и ее уровень воды. Благодаря Wia вы сможете следить за рекой в ​​прямом эфире на своем телефоне или компьютере в любом месте. Таким образом вы можете узнать, есть ли проблема с потоком, и сможете действовать, пока не стало слишком поздно. Он немедленно уведомит вас, если возникнут проблемы с рекой.

Видео

Изображение

<рисунок>

Функциональность

Устройство построено на базе Arduino MKR FOX, предназначено для удаленного использования, пользователь может разместить устройство в реке или озере и контролировать его из любого места. Благодаря режиму низкого энергопотребления SAM D устройство может работать в течение длительного периода времени от батареек 2AA.

Устройство снимает показания каждые 30 минут, после чего переходит в режим сна, время сна можно сбросить, хотя минимальное время сна должно составлять 20 минут.

MKR FOX считывает pH реки с помощью датчика pH, он также определяет уровень воды с помощью датчика уровня воды и определяет, загрязнена ли вода нерастворимыми веществами, светя светодиодом на фоторезисторе, если показания фоторезистора равны низкий - означает, что в реке присутствует твердое вещество (нефть, бензин, ртуть и т. д.). Затем устройство отправляет все данные в Sigfox, где они передаются в Wia, обрабатываются и визуализируются. Пользователь уведомляется о состоянии реки. Ниже представлено изображение обзора функциональности.

<рисунок>

Буфер будет отправлен в Sigfox в кодировке HEX, Sigfox будет передавать данные в Wia, затем данные будут проходить через поток, данные будут преобразованы обратно в строку, а затем в значения датчика. Затем они будут обработаны, и пользователь получит уведомление, если значения выходят за допустимые пределы.

Ниже приведено еще одно изображение, иллюстрирующее обзор кода проекта, описанный ниже.

<рисунок>
  • Датчики чтения считывает значения pH, уровня воды и датчика фоторезистора и сохраняет их в переменных.
  • Форматный буфер объединит все значения в 12-байтовый буфер, который можно отправить в Sigfox.
  • Анализировать данные проанализирует буфер в Sigfox.

MKR FOX может отправлять только 12 байтов через Sigfox, это означает, что все значения датчиков должны быть объединены в 12 байтов, максимальное исходное значение каждого датчика составляет 1024 (поскольку все они аналоговые), поэтому каждый датчик представляет одну треть буфер (4 байта). Arduino должен объединить значения и добавить нули в начало каждого значения, пока значение не будет иметь 4 байта. Изображение ниже иллюстрирует этот процесс.

<рисунок>

Arduino получает значения датчика как целые числа, затем он преобразует целые числа в строки и добавляет нули в начало каждого значения, пока оно не будет иметь 4 байта, например, если значение фоторезистора равно 620, будет добавлен один ноль, 0 620. Но если датчик уровня воды равен 24, добавляются два нуля, 00 24. Затем устройство объединяет значения в 12-байтовый буфер и отправляет данные в SigFox.

Устройство в действии

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

<рисунок> <рисунок> <рисунок> <рисунок>

Преимущества

пользователь работает это проект будет выгода in:

  • Простой мониторинг уровня воды в реке, pH и уровня загрязнения из любого места в любое время.
  • Получение уведомления, если река загрязнена растворимыми или нерастворимыми веществами или разливается.
  • Простота использования и монтажа
  • Работает в любой стране, в которой действует Sigfox.

Создание проекта

Шаг 1. Необходимое оборудование

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

  • 1, Arduino MKR FOX 1200
  • 1, датчик pH
  • 1, датчик уровня воды
  • 1, Фоторезистор
  • 1, белый светодиод
  • 2 резистора (220 Ом)
  • Проволочные перемычки
<рисунок>

Шаг 2. Подключение цепи

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

<рисунок>
  • Обзор схемы

На изображениях ниже показано, как схема должна выглядеть после завершения.

<рисунок> <рисунок>
  • Подготовка the MKR FOX

На изображениях ниже показано, как подключить батарейный отсек и антенну к MKR FOX. Обратите внимание, что батарейный отсек необходимо подключить после подключения датчиков. Прочие подключения и настройки находятся в разделе создание проекта / финал.

<рисунок> <рисунок> <рисунок> <рисунок> <рисунок>

Шаг 3. Подтверждение кода

Код состоит из трех основных частей:

  • Чтение датчиков
  • Форматный буфер
  • Анализировать данные

Эти разделы описаны ниже.

  • Датчики чтения
  struct GetValue // созданы структуры для облегчения циклов {int riverLevel () // получить уровень реки {const int val =analogRead (A2); if (proDebug) {Serial.print ("Уровень реки"); Serial.println (val); } return val; } int riverPh () // получаем ph реки {const int val =(analogRead (A1) / 5 * 3.3); if (proDebug) {Serial.print ("Река Ф"); Serial.println (val); } return val; } int riverPol () // получить уровень загрязнения реки {const int val =analogRead (A3); if (proDebug) {Serial.print («Загрязнение реки»); Serial.println (val); } return val; }};  

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

  • Форматный буфер
  String data (int level, int ph, int pol) // объединить значения датчиков в буфер {int values ​​[3] ={level, ph, pol}; String newValues; for (int i =0; i <3; i ++) // пройдется по всем значениям, добавляя 0 к началу {if (values ​​[i] <10) {newValues ​​+ ="000"; Serial.println («Вариант 1»); } иначе, если (значения [я] <100) {newValues ​​+ ="00"; Serial.println («Вариант 2»); } иначе, если (значения [я] <1000) {newValues ​​+ ="0"; Serial.println («Вариант 3»); } еще {}; newValues ​​+ =значения [i]; Serial.print («Выполнить»); Serial.print (i); Serial.print ("/ 3"); Serial.println (новые значения); } return newValues; }  

Цикл выше принимает значения 3 датчиков и затем помещает их в массив. Затем он перебирает каждое значение, добавляя нули в начало каждого значения, пока значение не достигнет размера 4 байта, а затем добавляет каждое значение в строку, которая затем возвращается.

  • Анализировать данные
  void parseData (String data) // отправляем буфер в SigFox {SigFox.beginPacket (); SigFox.print (данные); int ret =SigFox.endPacket (); }  

В этом разделе вводится строка для синтаксического анализа, а затем значение отправляется в Sigfox.

Шаг 4. Настройка интеграции с Wia Sigfox

На этом шаге будет показано, как настроить Wia для получения сообщений от Sigfox. Wia - это профессиональная платформа IoT, которая позволяет пользователю визуализировать данные с помощью виджетов в Интернете или в мобильном приложении, а также позволяет пользователю создавать код блока, называемый поток, который позволяет пользователю обрабатывать данные. Данные представлены событием.

Для начала убедитесь, что у вас есть учетная запись Sigfox и учетная запись Wia. Также загрузите приложение Wia на iOS или Android, чтобы получать уведомления. На изображениях ниже показано подключение Sigfox и Wia.

<рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок>
  • Установите Тип на восходящую ссылку данных
  • Установите канал на URL
  • Нет необходимости заполнять Пользовательскую конфигурацию полезной нагрузки .
  • Установите URL Шаблон для «https://api.wia.io/v1/events»
  • Установите HTTPMethod в POST
  • Создайте заголовок с именем Authorization . со значением Bearer (это значение будет отредактировано позже)
  • Установить ContentType в application / json
  • Скопируйте код из этой ссылки в тело веб-перехватчика.
  • Наконец, нажмите "ОК", и все готово.

Шаг 5. Настройка Wia Flow

Для завершения этого раздела потребуется немного больше времени, поток преобразует данные, полученные из HEX в String, затем проанализирует строку в 3 значения датчика, а затем преобразует их в целые числа, затем он преобразует значение загрязнения реки и уровень реки до дескриптора High или Ok, а необработанное значение ph - до фактического значения ph, он затем уведомит пользователя, если значение выходит за допустимые пределы.

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

<рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок> <рисунок>

Функции Wia

  • processPayload
  if (input.body) {output.body.name ="значение"; output.body.data =toByteArrayStr (input.body.data.sigfoxData);} функция toByteArrayStr (sigfoxData) {let result =Buffer (sigfoxData, 'hex'); return result.toString ('utf8');}  
  • processPollution
  if (input.body.data) {let data =input.body.data; если (данные =="ЗАГРЯЗНЕННЫЕ") {output.body.name ="waterLevel"; output.body.data =данные; } else {while (1); }}  
  • processPh
  let minVal =6.5; let maxVal =8.5; if (input.body.data) {let data =input.body.data; если (данные> maxVal || данные  
  • processLevel
  if (input.body.data) {let data =input.body.data; если (данные =="ВЫСОКИЙ") {output.body.name ="waterLevel"; output.body.data =данные; } else {while (1); }}  
  • загрязнение реки
  let minVal =200; let maxVal =0; if (input.body.data.sigfoxData) {let data =input.body.data.sigfoxData; пусть ProcessingData =toByteArrayStr (данные); пусть newData =cutString (processingData); output.body.name ="waterPollution"; output.body.data =processData (newData);} функция toByteArrayStr (sigfoxData) {let result =Buffer (sigfoxData, 'hex'); return result.toString ('utf8');} функция cutString (data) {let newVal =data [8]; newVal + =данные [9]; newVal + =данные [10]; newVal + =данные [11]; пусть finalVal =parseInt (newVal); return finalVal;} функция processData (data) {if (data  
  • riverPh
  let minVal =300; let maxVal =600; if (input.body.data.sigfoxData) {let data =input.body.data.sigfoxData; пусть ProcessingData =toByteArrayStr (данные); пусть newData =cutString (ProcessingData); пусть finalVal =(newData / 73.1428571); пусть valueToSend =finalVal.toFixed (2); output.body.name ="waterPh"; output.body.data =valueToSend;} функция toByteArrayStr (sigfoxData) {let result =Buffer (sigfoxData, 'hex'); return result.toString ('utf8');} функция cutString (data) {let newVal =data [4]; newVal + =данные [5]; newVal + =данные [6]; newVal + =данные [7]; пусть finalVal =parseInt (newVal); return newVal;}  
  • riverLevel
  let minVal =0; let maxVal =200; if (input.body.data.sigfoxData) {let data =input.body.data.sigfoxData; пусть ProcessingData =toByteArrayStr (данные); пусть newData =cutString (ProcessingData); output.body.name ="waterLevel"; output.body.data =processData (newData);} функция cutString (data) {let newVal =data [0]; newVal + =данные [1]; newVal + =данные [2]; newVal + =данные [3]; пусть finalVal =parseInt (newVal); return finalVal;} функция toByteArrayStr (sigfoxData) {let result =Buffer (sigfoxData, 'hex'); return result.toString ('utf8');} функция processData (data) {if (data> maxVal) {return "HIGH"; } else {вернуть "ОК"; }}  

Электронные письма Wia

  • riverPollutionEmail
  SystemDataWarning автоматического обмена сообщениями - устройство myWater $ {trigger.source.device.id} обнаружило проблему в потоке. Предупреждение - вода загрязнена нерастворимыми веществами.InformationDevice $ {trigger.source.device.id} Raw Данные $ {input.body.data}  
  • riverPhEmail
  SystemDataWarning автоматического обмена сообщениями - устройство myWater $ {trigger.source.device.id} обнаружило проблему в потоке. Предупреждение - pH воды не подходит. Вода загрязнена. Информационное устройство $ {trigger.source.device.id} Исходные данные $ {input.body.data}  
  • riverLevelEmail
  SystemDataWarning автоматического обмена сообщениями - устройство myWater $ {trigger.source.device.id} обнаружило проблему в ручье. Предупреждение - уровень воды слишком высок, река может быть затоплена. Информационное устройство $ {trigger.source.device .id} Необработанные данные $ {input.body.data}  

Настройка переменных

Когда данные получены Wia, они должны быть обработаны, если данные находятся между минимальным и максимальным значением, значение является безопасным, пределы датчика pH и уровня воды были установлены, но пользователь должен вручную настроить фоторезистор. limit, необходимо провести тест, чтобы определить это значение; приведенные ниже шаги научат вас, как это сделать.

  void setup () {pinMode (1, ВЫХОД); Serial.begin (9600); while (! Serial) {}; digitalWrite (1, HIGH);} цикл void () {const int val =analogRead (A3); Serial.println (val); задержка (5000);}  
<рисунок> <рисунок> <рисунок> <рисунок> <рисунок>

Есть еще одна переменная, которую пользователь должен установить, proDebug , если он включен, Arduino требует подключения через USB к компьютеру и должен быть открыт Serial Monitor, Arduino печатает на Serial Monitor в этом режиме, он идеально подходит для устранения неполадок. proDebug по умолчанию имеет значение false для работы на поле.

Библиотеки

  • Sigfox - copyright (c) 2016 Arduino LLC GNU Lesser General Public Licence this library is in the public domain
  • ArduinoLowPower (c) 2016 Arduino LLC GNU Lesser General Public Licence this library is in the public domain

Final

The last step is to connect your Arduino to a PC/Mac and upload the sketch, make sure that the battery box is connected to the Arduino and the circuit is ok. The next steps will guide you through making an enclosure for the project.

I have decided to create my enclosure out of a bottle of water, I think it is a great and ecological way to embrace the project in. The device looks like the picture below.

If you like the idea of the enclosure, you can scroll through the images below, illustrating how the enclosure was made, feel free to make one yourself.

The last thing to do is place the device in the river. To do this, go to the river you wish to implement MyRiver on during High Tide , this is essential to ensure that the device is not alerting that the river is flooding when it is actually just the tide.

Place some tape on the top of the water bottle to prevent water from seeping into the bottle and destroying everything.

We went to a local, dirty river to test the project out, all the alarms went off correctly.

When placing the probe in the water, ensure that the water is at the bottom of the water level sensor but is covering the photoresistor entirely. Secure the project to the shore using tape or a hammer and screws, and it should look like this (or better).

Background

Relaxing in your house, looking out the window at the once beautiful and delightful river rushing in front of you. But instead of the beautiful fresh river, you see a green slimy one, you might want to move house in that case.

And if the river decides to flood into your house in the middle of the night while you are sleeping, you will certainly decide to move.

I thought of these problems and how to solve them all in one device, and I came up with MyRiver.

If you are in the city and living beside a river, it will warn you in time if the river decides to ruin your day in any way or if your neighbour is dumping oil in the river. Or if you are on a farm, MyRiver will warn you that the river is dirty before you give the water to your animals, and will give you time to bring the animals in before the river floods.

But just reading the pH of the river was not enough, as insoluble substances like mercury or other metals do not effect the Ph of the water. So we came up with a new method to detect those substances, unique to this project, a photoresistor reading the amount of light from an LED penetrating the water. This way any water impurity can be detected.

Код

MyRiver
The Full Code

Схема

schematics_lXO5SiusZO.fzz

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

  1. Что такое датчик O2?
  2. Датчик температуры Raspberry Pi
  3. Датчик эмоций / ЭЭГ
  4. Устройство измерения расхода воздуха под давлением с аналоговым датчиком
  5. Датчик DHT11 со светодиодами и пьезо-динамиком
  6. UnifiedWater v1
  7. 3D RGB Arduclock
  8. Простой датчик препятствий с Arduino
  9. Игра с джойстиком
  10. Найди меня