
This project aims to build an independent agricultural weather solar powered station for precision agricultural application The device is based on raspberry pi & Arduino with ultrasonic anemometer and resistive soil sensor and DHT22 for air temperature & humidity and other add-ons available according to your application or specific weather needs, the data and analytic information are sent as JSON packages to FarmOS that is either locally hosted or on hosting service (requires 4G usb dongle), Farmos lo ayuda a administrar los datos de los sensores grandes fácilmente mientras monitorea todos los sensores e informes de la granja en una plataforma, también puede actuar como DAA para otras aplicaciones. Este producto es el primero de la línea de Farmtopia IOF (Internet de la granja) y se abre a los que se abre para apoyar la misión Godan para datos agrícolas fáciles y abiertos, puede funcionar tanto estacionario como móvil y puede ser fácil replicarse en el hogar como se describe aquí
| Datos medidos | Cómo |
|---|---|
| Velocidad y frecuencia del viento en dirección tridimensional | Calculando el error ultrasónico |
| Temperatura y humedad del aire | Sensor AM2301 |
| Ubicación GPS | GBS Dongle USB |
| Humedad del suelo | Sensor de suelo resistivo |
| Complementos opcionales | / |
Conjunto de Raspberry PI: que es una computadora RP con SD precargada con un sistema operativo Raspberry y un anemómetro 6xultrasónico de cámara Pinoir (opcional): colocado en direcciones perpendiculares frente a la otra (XYZ) como una red con diferentes habilios o diferentes desencadenantes. Dongles : GPS Dongle (Optional/you can input GPS coordinate manually) , 4G dongle (Optional) if there is no WiFi coverage Solar System : a basic 30W solar panel that Charges the Main Super polymer battery via the MPPT solar charger which also powers the UPS battery pack via usb cable which is responsible for powering the raspberry pi which in turns communicates and powers the Arduino via the USB , this configuration Su objetivo es estabilizar los FarmOS de suministro de energía RPI: que es el sistema de gestión de código abierto agrícola que actuará como una interfaz para el sistema para ver y analizar los datos de los sensores.
| Número | Dispositivo |
|---|---|
| 1 | Raspberry Pi 4, versión de 8GB |
| 1 | Tarjeta SD 128 |
| 1 | Arduino Mega 2560 |
| 1 | Cable USB Arduino |
| 6 | JSNR04T Ultrasonics (colocado a 40 cm de distancia) |
| 1 | AM2301 Sensor de temperatura y humedad |
| 1 | Módulo de sensor de humedad del suelo arduino |
| 1 | Raspberry Pi 4 Battery Hack Ups |
| 1 | Mini-USB a cable USB |
| 1 | MPPT Solar Charger Controller 20A 12/24VDC con salida USB |
| 1 | 12V Super Polymer Li-ion Battery-6800 mAh |
| 1 | Panel solar 18V 30W |
| 1 | Marco de la estación meteorológica 3D impreso o Stanlesteel Recause |
| Número | Dispositivo |
|---|---|
| 1 | Pantalla táctil |
| 1 | Raspberry Pinoir 2 Camera |
| 1 | Raspberry USB GPS dongle |
| 1 | Sensor MLX9046 IR |

| Nombre del archivo | Descripción |
|---|---|
| Readme.md | Introducción del proyecto |
| Arduino_weather.ino | Solicitud del clima principal de la aplicación Arduino |
| Dht.cpp | DHT Driver & Class Funcionalites para AM2301 |
| Dht.h | Archivo de encabezado para documentación de clase y función DHT |
| Especial_debug_functions.ino | Casos de prueba unitaria como programa de depuración |
| Wind_auto.cpp | Funciones de medición del clima |
| Wind_auto.h | Archivo de encabezado para la documentación de la clase y la función de viento |
| agregador.sh | RPI Bash Script para atrapar el paquete JSON en serie y agregado de Arduino al servidor Farmos |
-Me First Instalar RPI OS (versión completa) en la tarjeta SD de 128 GB, se recomienda que el SD sea lo más rápido posible para mejorar el rendimiento general de PI. Si está utilizando PI sin cabeza, habilite SSH en el archivo de configuración, puede encontrarlo en la partición de arranque
-La mayoría de estas dependencias pueden preinstalarse, sin embargo, es una buena idea volver a verificarlas:
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install libffi-dev libssl-dev
sudo apt install python3-dev
sudo apt-get install -y python3 python3-pip
sudo apt-get install php5 -y
sudo apt install php-gd php-xml php-xmlrpc
sudo apt install mariadb-server
sudo apt-get install apache2 -y
sudo apt-get install gpsd gpsd-clients python-gps
sudo apt-get install arduino
git clone https://github.com/tbird20d/grabserial
-Enstala Docker con CLI
sudo curl -sSL https://get.docker.com | sudo sh
sudo pip3 install docker-compose
sudo systemctl enable docker
-Lain Farmos localmente en Docker
Farmo es una aplicación basada en la web para gestión de la granja, planificación y mantenimiento de registros. Está desarrollada por una comunidad de agricultores, desarrolladores, investigadores y organizaciones con el objetivo de proporcionar una plataforma estándar para la recopilación y gestión de datos agrícolas.
Utilizamos FarmOS para interactuar rápidamente con los sensores y analizar sus big data
git clone https://github.com/farmOS/farmOS.git
cd farmOS
sudo docker build -t farmos .
sudo docker run -p 80:80 -v ${PWD}/.data/www:/var/www/html farmos
Debe consultar esta guía en el sitio web oficial de Farmo para obtener más detalles.
Puede consultar esta guía en línea para ayudarlo a configurar la instalación de FarmOS.
Primero asegúrese de que el módulo de sensor en FarmOS esté habilitado, puede habilitar y agregar módulo a través de la rama de desarrollo (simplemente un súper usuario en la plataforma local), si está utilizando un servicio de alojamiento, asegúrese de pedirles que habilite el módulo de sensores.
Instale las siguientes bibliotecas con su Arduino Library Manager en Sketch> Incluya Biblioteca> Administrar bibliotecas ... SoftWareserial
Puede consultar la biblioteca Adafruit DHT para la duplicación de DHT, sin embargo, por alguna razón no leen la temperatura y la humedad juntas, por lo que utilizaremos la función DHT.Read con el búfer de datos [] en una nueva función llamada Renew_temp_hu (DHT, Float*, Float*).
Construido en dos clases, JSNR04T, que es una clase de interfaz que proporciona una instancia de chip ultrasónico JSNR04T en modo automático , con las funciones necesarias para usar el dispositivo como herramienta de medición del viento utilizando la divergencia en la lectura de mediciones ultrasónicas con velocidad de sonido autocorrectada calculada a partir de la temperatura y humedad del aire. y la clase de viento que preforma la lógica matemática sobre los datos registrados para generar los detalles meteorológicos necesarios.
| Nombre de función | Aporte | Devolver | Descripción |
|---|---|---|---|
| JSNR04T (constructor) | uint8_t enpin, uint8_t rxpin, uint8_t tipo, uint16_t max_range) | vacío | Construye un nuevo objeto de tipo JSNR0RT que se comporta como una instancia del controlador ultrasónico con Enpin para habilitar tierra, RXPIN para ECHO y Tipo para el tipo de operación. |
| JSNR04T.BEGIN | vacío | vacío | Habilita (desencadenantes) el ultrasónico luego identifica y comienza una nueva comunicación en serie con ella. |
| Jsnr04t.virtual_trigger | vacío | vacío | Establezca el pasador de tierra para el ultrasónico a bajo para que comience su funcionamiento normal. |
| Jsnr04t.resettimeut | timeout uint8_t | vacío | Cambie el tiempo de espera del milisegundo de la medición ultrasónica para cambiar el rango. |
| Jsnr04t.normaly | vacío | vacío | La distancia de referencia entre dos ultrasónicos en condiciones de viento para actualizar nowind_distance. |
| Jsnr04t.readjsnr04tserial | vacío | intencionalmente | Lee la salida de eco en serie del ultrasónico y la transforma en int/nan en caso de lectura inválida. |
| Jsnr04t.get_selfecho | vacío | uint16_t | Restablece el tiempo de espera para cambiar el rango de modo que el sensor solo lea su eco. |
| Jsnr04t.get_selfwindspeed | vacío | intencionalmente | Lee el tiempo necesario para que un ultrasónico lea su propio Echo (ida y vuelta) y lo transforma a Windspeed. |
| Jsnr04t.transform_read | uint16_t x | flotar | Transforma la distancia medida con ultrasónico de mm a velocidad del viento (en relación con la velocidad del sonido). |
| Viento (constructor) | JSNR04T*, JSNR04T* | vacío | Construye un objeto de tipo de viento que usa un par de ultrasónicos para medir la velocidad del viento entre ellos. |
| Viento. | vacío | vacío | Actualizar los valores de la clase de las velocidades del viento tomando una nueva lectura, también calcula la tasa de cambio en la velocidad del viento. |
| Viento.get_avergewind | vacío | flotar | Calcula el promedio de 4 mediciones entre el par ultrasónico de acuerdo con el modo de trabajo. |
| Viento.get_eCofromahead | vacío | uint16_t | Lee el eco del sensor de cara. |
| renovar_temp_hu | Dht, float* temp, flotante* zumbido | vacío | actualiza el valor de la temperatura y la humedad para un sensor DHT dado |
| get_speedofsound | flotante tc, flotante rh | flotar | estima la velocidad del sonido en una temperatura y humedad del aire determinado según |
| set_windsensor | DHT | vacío | pasa el puntero del DHT a la clase de viento |
| Get_ecofromahead | JSNR04T U1, JSNR04T U2 | intencionalmente | Una función de Indpedandt para leer también el eco del sensor de cara (para las pruebas). |
| ciclo de viento | Viento* viento, viento* viento, viento* Windz | vacío | Calcula y actualiza la velocidad del viento y la velocidad promedio (50 medición del viento) de 3 objetos de viento que representan el viento en 3D. |
Defina los valores y configuración de PIN necesarios, construya los objetos de ciclo de acuerdo con la configuración del PIN y el tipo de sensores, identifique las variables de ciclo
#define DHTPIN 53
#define mutual 0
#define soil_analog A0
#define soil_max 550
#define soil_min 10
#define Cycle_offset 10
#define DHTTYPE DHT21
DHT dht(DHTPIN, DHTTYPE);
JSNR04T Ux1(45,10,mutual,2000) ,Ux2(37,13,mutual,2000),Uy1(47,50,mutual,2000),Uy2(31,10,mutual,2000) ,Uz1(41,12,mutual,2000),Uz2(39,11,mutual,2000);
Wind WindX(&Ux1,&Ux2), WindY(&Uy1,&Uy2) ,WindZ(&Uz1,&Uz2);
float CycTemp , CycHum , _CSS=340 , winspeed;
Llame a Wind_Cycle para actualizar todos los valores
wind_cycle(&WindX ,&WindY, &WindZ);
o simplemente llame a Wind. Update para actualizar la velocidad instantánea de cualquier dimensión
Windx.update();
Imprima los valores al puerto serie como JSON.
"Parámetro": "valor",
Serial.print(""Wind_Speed_x": ");Serial.print(""");Serial.print(WindX.avgwind);Serial.print(""");Serial.print(" , ");
Serial.print(""Maximum_Speed_x": ");Serial.print(""");Serial.print(WindX.maxwind);Serial.print(" , ");
Serial.print(""Minmimum_Speed_x": ");Serial.print(""");Serial.print(WindX.minwind);Serial.print(""");Serial.print(" , ");
Serial.print(""Wind_frequencyofchange_x": ");Serial.print(""");Serial.print(WindX.gust);Serial.print(""");Serial.print(" , ");
Use Allmiss para adaptar el retraso del ciclo a los errores de medición como lo siguiente
cycledelay=19000; // or as you preferred settings depending on power consumption
allmiss=(WindX._selfmiss+WindY._selfmiss+WindZ._selfmiss)*selfecho_timeout; // adobt self cycle delay into main delay
allmiss+=(WindX._aheadmiss+WindY._aheadmiss+WindZ._aheadmiss)*headecho_timeout;
allmiss+= _tempmiss;
_tempmiss=0;
cycledelay-=allmiss;
delay(cycledelay);
Use el especial_debug_functions.ino para diagnosticar la aplicación con pruebas unitarias escalonadas.
if(dht.working) //doesn't update before 2 seconds
delay(10);
ultradis=Uz1.get_selfecho();
Serial.print("ultrasonic z1 is ");Serial.println(ultradis);
winspeed=Uz1.transform_read(ultradis);
Serial.print("ultrasonic z1 windspeed "); Serial.println(winspeed);
ultradis=Uz2.get_selfecho();
Serial.print("ultrasonic z2 is ");Serial.println(ultradis);
winspeed=Uz2.transform_read(ultradis);
Serial.print("average is");Serial.println(winspeed);
delay(1000);
winspeed=WindZ.get_avergewind();
Serial.print("average wind is ");Serial.println(winspeed);
wind_cycle(&WindX ,&WindY, &WindZ);
allmiss=(WindX._selfmiss+WindY._selfmiss+WindZ._selfmiss)*selfecho_timeout;
allmiss+=(WindX._aheadmiss+WindY._aheadmiss+WindZ._aheadmiss)*headecho_timeout;
allmiss+= _tempmiss;
//build the diagnostic or unit test according to your needs
El trabajo de Cron activa el script cada 10 minutos, el script usa GrabSerial para atrapar la serie Arduino durante 30 segundos y reinicia el recuento cuando atrapa el soporte del paquete JSON y renuncia cuando se ve el soporte cerrado mientras se lleva a Arduino 10 segundos (100 muestras promedio) registrar nuevas lecturas, el límite del ciclo se puede adoptar al reducir la tasa de muestras. Uso de script (reemplazar! public_key &! private_key con la configuración de su sensor
python3 /home/pi/grabserial/grabserial -d /dev/ttyACM0 -b 9600 -o /home/pi/serialtest.json -e 30 -m "^{.*" -q "}"
curl -H "Content-Type: application/json" -X POST -d "@/home/pi/serialtest.json" https://farmtopia.farmos.net/farm/sensor/listener/!public_key?private_key=!private_key --verbose
Este proyecto OpenSource y todos sus componentes son responsabilidad exclusiva de su desarrollador, y aunque Farmtopia utiliza dispositivos similares para construir la versión comercial de esta estación meteorológica, no necesariamente usa el mismo componente Sourcecode o Logic o Hardware ni es responsable de la validez o la aplicación de este proyecto OpenSource.
Licencia de MIT