Mi Río
Componentes y suministros
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 |
Herramientas y máquinas necesarias
| ||||
|
Aplicaciones y servicios en línea
| ||||
| ||||
|
Acerca de este proyecto
Descripción general
Un río o un lago pueden ser una gran fuente de diversión y relajación. Pero si el río se ensucia y se contamina, toda la diversión se acaba. Muchas personas dependen del agua del río para alimentar a su ganado y no pueden permitirse darles agua sucia.
Imagínese viviendo justo al lado de un río (si no lo está), no querría despertarse en medio de la noche con su casa inundada por el río. O si tu vecino decide tirar gasolina al río, no querrás que tus animales se enfermen.
MyRiver resuelve todos esos problemas, puede operar en áreas aisladas gracias a Sigfox para que todos tengan acceso al dispositivo. El dispositivo leerá el pH del agua, su nivel de contaminación mediante un método innovador y su nivel de agua. Podrás monitorear el río en vivo en tu teléfono o computadora en cualquier lugar gracias a Wia. De esta manera, puede saber si hay un problema con la transmisión y le permite actuar antes de que sea demasiado tarde. Le notificará si hay un problema con el río de inmediato.
Video
Imagen
Funcionalidad
El dispositivo está basado en el Arduino MKR FOX, está diseñado para uso remoto, el usuario puede colocar el dispositivo en un río o lago y monitorearlo desde cualquier lugar. Gracias al modo de bajo consumo de SAM D, el dispositivo puede funcionar durante un período de tiempo prolongado con baterías 2AA.
El dispositivo toma lecturas cada 30 minutos, luego se va a dormir, el período de sueño se puede restablecer, aunque el tiempo mínimo de sueño debe ser de 20 minutos.
El MKR FOX lee el pH del río usando un sensor de pH, también obtiene su nivel de agua, usando un sensor de nivel de agua, y detecta si está contaminado por sustancias insolubles al encender un LED en un fotorresistor, si la lectura del fotoresistor es bajo, significa que hay una sustancia sólida (aceite, gasolina, mercurio, etc.) en el río. Luego, el dispositivo envía todos los datos a Sigfox, donde se transmite a Wia, se procesa y se visualiza. Se notifica al usuario sobre el estado del río. A continuación se muestra una imagen de la descripción general de la funcionalidad.
El búfer se enviará a Sigfox codificado como HEX, Sigfox transmitirá los datos a Wia, los datos luego pasarán a través de un flujo, los datos se convertirán nuevamente en una cadena y luego en los valores del sensor. Luego se procesarán y se notificará al usuario si los valores están fuera de los límites.
A continuación se muestra otra imagen que ilustra la descripción general del código del proyecto, que se describe a continuación.
-
Leer sensores
leerá los valores del sensor de pH, nivel de agua y fotorresistencia y los almacenará en variables. -
Buffer de formato
fusionará todos los valores en un búfer de 12 bytes que se puede enviar a Sigfox. -
Analizar datos
analizará el búfer en Sigfox.
El MKR FOX solo puede enviar 12 bytes a través de Sigfox, esto significa que todos los valores del sensor deben fusionarse en los 12 bytes, el valor bruto máximo de cada sensor es 1024 (ya que todos son analógicos), por lo que cada sensor representa un tercio del búfer (4 bytes). El Arduino tiene que fusionar los valores y agregar ceros al inicio de cada valor hasta que el valor tenga 4 bytes. La siguiente imagen ilustra este proceso.
El Arduino recibe los valores del sensor como números enteros, luego convierte los números enteros en cadenas y agrega ceros al inicio de cada valor hasta que tenga 4 bytes, por ejemplo, si el valor del fotoresistor es 620, se agregará un cero, 0 620. Pero si el sensor de nivel de agua es igual a 24, se agregan dos ceros, 00 24. El dispositivo luego fusiona los valores en un búfer de 12 bytes y envía los datos a SigFox.
El dispositivo en acción
A continuación se muestran una serie de fotos que muestran la funcionalidad del proyecto; para verlas mejor, consulte el video de arriba.
Beneficios
El usuario en funcionamiento esto proyecto lo hará beneficio en:
- Monitorear fácilmente el nivel del agua, el pH y el nivel de contaminación de un río desde cualquier lugar y en cualquier momento
- Recibir una notificación si el río está contaminado con sustancias solubles o insolubles o si se está inundando
- Facilidad de uso y montaje
- Funciona en cualquier país cubierto por Sigfox
Construyendo el Proyecto
Paso 1:Aparato requerido
Este proyecto requiere que todos los componentes estén soldados juntos, no hay demasiadas cosas aparte de los sensores. La lista de materiales se indica a continuación.
- 1, Arduino MKR FOX 1200
- 1, sensor de pH
- 1, sensor de nivel de agua
- 1, fotorresistencia
- 1, LED blanco
- 2, resistencias (220Ω)
- Cables de puente
Paso 2:conexión del circuito
El diagrama de circuito del proyecto puede ser un poco confuso ya que los componentes no están colocados en una placa de prueba, si tiene alguna dificultad con él, intente descargar el archivo Fritzing a continuación y mover los cables en su computadora.
- Descripción general del circuito
Las imágenes a continuación ilustrarán cómo debería verse el circuito una vez completado.
- Preparando el MKR ZORRO
Las imágenes a continuación lo guiarán a través de la conexión de la caja de la batería y la antena al MKR FOX. Tenga en cuenta que la caja de la batería debe conectarse después de conectar los sensores. Otros cables y configuraciones se encuentran en Construcción del proyecto / Final.
Paso 3:reconocimiento del código
Hay 3 partes principales del código:
- Leer sensores
- Formato de búfer
- Analizar datos
Estas secciones se explican a continuación.
- Leer sensores
struct GetValue // Estructuras creadas para facilitar los bucles {int riverLevel () // obtener el nivel del río {const int val =analogRead (A2); if (proDebug) {Serial.print ("Nivel del río"); Serial.println (val); } return val; } int riverPh () // obtener el ph del río {const int val =(analogRead (A1) / 5 * 3.3); if (proDebug) {Serial.print ("River Ph"); Serial.println (val); } return val; } int riverPol () // obtener el nivel de contaminación del río {const int val =analogRead (A3); if (proDebug) {Serial.print ("Contaminación del río"); Serial.println (val); } return val; }};
La estructura anterior contiene bucles que leen cada valor de sensor, hay un bucle separado para cada valor.
- Formatear búfer
String data (int level, int ph, int pol) // fusiona los valores del sensor en el búfer {int values [3] ={level, ph, pol}; String newValues; for (int i =0; i <3; i ++) // recorrerá todos los valores, agregando 0 al inicio {if (valores [i] <10) {newValues + ="000"; Serial.println ("Opción 1"); } else if (valores [i] <100) {newValues + ="00"; Serial.println ("Opción 2"); } else if (valores [i] <1000) {newValues + ="0"; Serial.println ("Opción 3"); } demás {}; newValues + =valores [i]; Serial.print ("Ejecutar"); Serial.print (i); Serial.print ("/ 3"); Serial.println (nuevosValores); } return newValues; }
El bucle de arriba toma los 3 valores del sensor y luego los coloca en una matriz. Luego recorre cada valor, agregando ceros al comienzo de cada valor hasta que el valor tiene un tamaño de 4 bytes, luego agrega cada valor a una cadena que luego se devuelve.
- Analizar datos
void parseData (String data) // enviar búfer a SigFox {SigFox.beginPacket (); SigFox.print (datos); int ret =SigFox.endPacket (); }
Esta sección toma la cadena para analizar y luego envía el valor a Sigfox.
Paso 4:Configuración de la integración de Wia Sigfox
Este paso ilustrará cómo configurar Wia para recibir mensajes de Sigfox, Wia es una plataforma de IoT profesional que le permite al usuario visualizar datos usando widgets en la web o en la aplicación móvil, también le permite al usuario crear un código de bloque llamado un flujo, que permite al usuario procesar los datos. Los datos están representados por un evento.
Para comenzar, asegúrese de tener una cuenta Sigfox y una cuenta Wia. También descargue la aplicación Wia en iOS o Android para que pueda recibir notificaciones. Las imágenes a continuación ilustrarán la conexión de Sigfox y Wia.
- Establezca el Tipo a
Enlace ascendente de datos
- Establezca el canal a
URL
- No es necesario completar la Configuración de carga útil personalizada
- Establezca la URL Patrón para "https://api.wia.io/v1/events"
- Configure el HTTPMethod a
POST
- Cree un encabezado llamado
Autorización
con el valorBearer
(este valor se editará más adelante) - Establecer ContentType a
aplicación / json
- Copie el código de este enlace en el cuerpo del webhook.
- Por último, haga clic en Aceptar y listo.
Paso 5:Configuración de Wia Flow
Esta sección tardará un poco más en completarse, el flujo convertirá los datos recibidos de HEX a String, luego analizará la cadena en los 3 valores del sensor y luego los convertirá en números enteros, luego convertirá el valor de la contaminación del río y nivel del río a un descriptor Alto u Ok y el valor de ph sin procesar al valor de ph real, luego notificará al usuario si el valor está fuera de los límites.
La siguiente guía ilustra este proceso paso a paso. Se le indicará que inserte ciertos fragmentos de código en las funciones de Wia, estos fragmentos de código se insertan a continuación, simplemente copie y pegue el código en la función. Los datos a incluir en los correos electrónicos también se insertan a continuación, trabaje con ellos como con las funciones.
Funciones de Wia
- processPayload
if (input.body) {output.body.name ="value"; output.body.data =toByteArrayStr (input.body.data.sigfoxData);} función toByteArrayStr (sigfoxData) {dejar resultado =Buffer (sigfoxData, 'hex'); return result.toString ('utf8');}
- procesoPolución
if (input.body.data) {let data =input.body.data; if (data =="CONTAMINADO") {output.body.name ="waterLevel"; salida.cuerpo.datos =datos; } else {mientras (1); }}
- processPh
let minVal =6.5; let maxVal =8.5; if (input.body.data) {let data =input.body.data; if (datos> maxVal || datos
- processLevel
if (input.body.data) {let data =input.body.data; if (data =="HIGH") {output.body.name ="waterLevel"; salida.cuerpo.datos =datos; } else {mientras (1); }}
- Contaminación del río
let minVal =200; let maxVal =0; if (input.body.data.sigfoxData) {let data =input.body.data.sigfoxData; let ProcessData =toByteArrayStr (datos); dejar newData =cutString (ProcessingData); output.body.name ="waterPollution"; output.body.data =processData (newData);} función toByteArrayStr (sigfoxData) {dejar resultado =Buffer (sigfoxData, 'hex'); return result.toString ('utf8');} function cutString (data) {let newVal =data [8]; newVal + =datos [9]; newVal + =datos [10]; newVal + =datos [11]; let finalVal =parseInt (newVal); return finalVal;} function processData (data) {if (data
- riverPh
let minVal =300; let maxVal =600; if (input.body.data.sigfoxData) {let data =input.body.data.sigfoxData; let ProcessData =toByteArrayStr (datos); dejar newData =cutString (ProcessingData); let finalVal =(newData / 73.1428571); let valueToSend =finalVal.toFixed (2); output.body.name ="waterPh"; output.body.data =valueToSend;} función toByteArrayStr (sigfoxData) {dejar resultado =Buffer (sigfoxData, 'hex'); return result.toString ('utf8');} function cutString (data) {let newVal =data [4]; newVal + =datos [5]; newVal + =datos [6]; newVal + =datos [7]; let finalVal =parseInt (newVal); return newVal;}
- riverLevel
let minVal =0; let maxVal =200; if (input.body.data.sigfoxData) {let data =input.body.data.sigfoxData; let ProcessData =toByteArrayStr (datos); dejar newData =cutString (ProcessingData); output.body.name ="waterLevel"; output.body.data =processData (newData);} función cutString (data) {let newVal =data [0]; newVal + =datos [1]; newVal + =datos [2]; newVal + =datos [3]; let finalVal =parseInt (newVal); return finalVal;} función toByteArrayStr (sigfoxData) {dejar resultado =Buffer (sigfoxData, 'hex'); return result.toString ('utf8');} function processData (data) {if (data> maxVal) {return "HIGH"; } else {return "OK"; }}
Correos electrónicos de Wia
- riverPollutionEmail
Automatic Messaging SystemDataWarning:el dispositivo myWater $ {trigger.source.device.id} detectó un problema en la corriente. Advertencia:el agua está contaminada por sustancias insolubles.InformationDevice $ {trigger.source.device.id} Raw Datos $ {input.body.data}
- riverPhEmail
Automatic Messaging SystemDataWarning:el dispositivo myWater $ {trigger.source.device.id} detectó un problema en la transmisión. Advertencia:el pH del agua no es apropiado. El agua está contaminada. Dispositivo de información $ {trigger.source.device.id} Datos brutos $ {input.body.data}
- riverLevelEmail
Automatic Messaging SystemDataWarning:el dispositivo myWater $ {trigger.source.device.id} detectó un problema en el arroyo. Advertencia:el nivel del agua es demasiado alto, el río puede estar inundado.InformationDevice $ {trigger.source.device .id} Datos brutos $ {input.body.data}
Configuración de las variables
Cuando los datos son recibidos por Wia, deben procesarse, si los datos están entre un valor mínimo y máximo, el valor es seguro, los límites del sensor de nivel de agua y pH se han establecido, pero el usuario debe configurar manualmente el fotorresistor. límite, se debe realizar una prueba para determinar este valor; los pasos a continuación le indicarán cómo hacerlo.
void setup () {pinMode (1, SALIDA); Serial.begin (9600); while (! Serial) {}; escritura digital (1, ALTA);} bucle vacío () {constante int val =analogRead (A3); Serial.println (val); retraso (5000);}
Hay otra variable que el usuario debe configurar, proDebug
, si está habilitado, el Arduino requiere conexión a través de USB a una computadora y el Monitor Serial debe estar abierto, el Arduino imprime al Monitor Serial en este modo, es ideal para la resolución de problemas. proDebug por defecto es false
para operar en el campo.
Bibliotecas
- Sigfox - copyright (c) 2016 Arduino LLC Licencia pública general reducida GNU esta biblioteca es de dominio público
- ArduinoLowPower (c) 2016 Arduino LLC Licencia pública general reducida GNU esta biblioteca es de dominio público
Final
El último paso es conectar su Arduino a una PC / Mac y cargar el boceto, asegúrese de que la caja de la batería esté conectada al Arduino y que el circuito esté bien. Los siguientes pasos lo guiarán a través de la realización de un recinto para el proyecto.
He decidido crear mi recinto con una botella de agua, creo que es una forma excelente y ecológica de adoptar el proyecto. El dispositivo se parece a la imagen de abajo.
Si le gusta la idea del recinto, puede desplazarse por las imágenes a continuación, que ilustran cómo se hizo el recinto, siéntase libre de hacer uno usted mismo.
Lo último que debe hacer es colocar el dispositivo en el río. 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.
Código
MyRiver
The Full CodeEsquemas
schematics_lXO5SiusZO.fzzProceso de manufactura
- ¿Qué es un sensor de O2?
- Sensor de temperatura Raspberry Pi
- Sensor de emoción / EEG
- Dispositivo de medición de flujo de aire a presión con sensor analógico
- Sensor DHT11 con LED y altavoz piezoeléctrico
- UnifiedWater v1
- Arduclock 3D RGB
- Sensor de obstáculos simple con Arduino
- Juego de joystick
- Encuéntrame
- Pequeño vagabundo