
Ce projet vise à construire une station d'énergie solaire agricole agricole indépendante pour une application agricole de précision. dongle), Farmos vous aide à gérer facilement les données de gros capteurs tout en surveillant tous les capteurs et rapports de la ferme dans une seule plate-forme, il peut également agir comme DAAS pour une autre application. Ce produit est la première de la ligne Farmtopia IOF (Internet of Farm) et elle est ouverte pour soutenir la mission Godan pour des données agricoles faciles et ouvertes, elle peut fonctionner à la fois stationnaire et mobile et peut être facile à reproduire à la maison comme décrit ici
| Données mesurées | Comment |
|---|---|
| Vitesse et fréquence du vent dans une direction à 3 dimensions | En calculant l'erreur à ultrasons |
| Température et humidité de l'air | Capteur AM2301 |
| Emplacement GPS | Dongle GBS USB |
| Humidité du sol | Capteur de sol résistif |
| Compléments facultatifs | / / |
Rendatberry Pi Set: qui est un ordinateur RP avec SD préchargé avec Raspberry OS, et un caméra Pinoir (facultatif) Anemomètre 6xultrasonic: placé dans des directions perpendiculaires face à face (XYZ) en tant que réseau avec différentes actifs ou différents déclencheurs. Dongles: Dongle GPS (en option / vous pouvez saisir les coordonnées GPS manuellement), 4G dongle (facultatif) s'il n'y a pas de système solaire de couverture WiFi: un panneau solaire de base de 30 W qui charge la batterie Super Polymer principale via le chargeur solaire MPPT qui alimente également la batterie UPS via le câble USB qui est responsable de l'usage Rambre La configuration vise à stabiliser RPI Power Supply Farmos: qui est le système de gestion des open source agricole qui agira comme une interface avec le système pour afficher et analyser les données des capteurs.
| Nombre | Appareil |
|---|---|
| 1 | Raspberry Pi 4, 8 Go de version |
| 1 | Carte SD 128 |
| 1 | Arduino mega 2560 |
| 1 | Câble USB Arduino |
| 6 | Échographie jsnr04t (placée à 40 cm d'intervalle) |
| 1 | Capteur de température et d'humidité AM2301 |
| 1 | Module de capteur d'humidité du sol arduino |
| 1 | Raspberry Pi 4 Battery Pack Ups |
| 1 | Mini-USB à USB Cable |
| 1 | Contrôleur de chargeur solaire MPPT 20A 12 / 24VDC avec sortie USB |
| 1 | 12V Super Polymer Li-ion Battery-6800 MAH |
| 1 | Panneau solaire 18V 30W |
| 1 | Cadre de la station météorologique 3D IMPRESSION OU STANLESEELET |
| Nombre | Appareil |
|---|---|
| 1 | Écran tactile |
| 1 | Caméra Raspberry Pinoir 2 |
| 1 | Dongle GPS USB framboise |
| 1 | Capteur IR MLX9046 |

| Nom de fichier | Description |
|---|---|
| Readme.md | Introduction du projet |
| Arduino_weather.ino | Application Arduino à détection du temps principal |
| Dht.cpp | Fonctionnalites DHT Driver & Class pour AM2301 |
| Dht.h | Fichier d'en-tête pour DHT Class & Function Documentation |
| Spécial_debug_functions.ino | Cas de test unitaire en tant que programme de débogage |
| Wind_auto.cpp | Fonctions de mesure météorologiques |
| Wind_auto.h | Fichier d'en-tête pour la classe de vent et la documentation de la fonction |
| agrégator.sh | Script RPI Bash pour attraper Arduino Serial et Aggregate JSON Package à Farmos Server |
-Minrst Installer RPI OS (version complète) sur la carte SD 128 Go, il est informé que le SD soit aussi rapide que possible pour améliorer les performances globales de PI. Si vous utilisez un PI sans tête, activez SSH sur le fichier de configuration, vous pouvez le trouver dans la partition de démarrage
-La la plupart de ces dépendances peuvent être préinstallées, mais c'est une bonne idée de les revérifier:
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
-Install docker avec CLI
sudo curl -sSL https://get.docker.com | sudo sh
sudo pip3 install docker-compose
sudo systemctl enable docker
-Install Farmos localement sur Docker
Farmos est une application sur le Web de gestion, de planification et de tenue de dossiers de la ferme. Il est développé par une communauté d'agriculteurs, de développeurs, de chercheurs et d'organisations dans le but de fournir une plate-forme standard pour la collecte et la gestion des données agricoles.
Nous utilisons Farmos pour interfacer rapidement avec les capteurs et analyser leurs mégadonnées
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
Vous devez vous référer à ce guide sur le site officiel de Farmos pour plus de détails
Vous pouvez vous référer à ce guide en ligne pour vous aider à configurer l'installation de Farmos
Assurez-vous d'abord que le module de capteur sur Farmos est activé, vous pouvez activer et ajouter un module via la branche de développement (vraiment un super utilisateur sur la plate-forme locale), si vous utilisez un service d'hébergement, assurez-vous de leur demander d'activer le module des capteurs.
Installez les bibliothèques suivantes avec votre gestionnaire de bibliothèque Arduino dans Sketch> Inclure la bibliothèque> Gérer les bibliothèques ...
Vous pouvez vous référer à la bibliothèque DHT Adafruit pour DHT Doucmentation, mais pour une raison quelconque, ils ne lisent pas la température et l'humidité ensemble, nous utiliserons donc la fonction DHT.Read avec des données [] tampon dans une nouvelle fonction appelée renouvellement_temp_hu (DHT, float *, float *).
Construit sur deux classes, JSNR04T qui est une classe d'interface qui fournit une instance de la puce ultrasonique JSNR04T en mode automatique , avec les fonctions nécessaires pour utiliser l'appareil comme outil de mesure du vent en utilisant la divergence dans la lecture des mesures ultrasoniques avec une vitesse sonore auto-corrigée calculée à partir de la température de l'air et de l'humidité. et la classe de vent qui préforme la logique mathématique sur les données enregistrées pour sortir les détails météorologiques nécessaires.
| Nom de la fonction | Saisir | Retour | Description |
|---|---|---|---|
| Jsnr04t (constructeur) | uint8_t enpin, uint8_t rxpin, type uint8_t, uint16_t max_range) | vide | Construit un nouvel objet de type jsnr0rt qui se comporte comme une instance de pilote ultrasonique avec enpin pour le sol enable, rxpin pour l'écho et le type pour le type d'opération. |
| Jsnr04t.begin | vide | vide | Permet (déclenche) l'ultrasonic identifie et commence une nouvelle communication série avec elle. |
| Jsnr04t.virtual_trigger | vide | vide | Réglez la goupille de sol pour l'ultrasons à faible afin qu'il commence son fonctionnement normal. |
| Jsnr04t.resettimeout | Timeout uint8_t | vide | Modifiez le délai de la milliseconde de la mesure à ultrasons pour modifier la plage. |
| JSNR04T.Ammoraliser | vide | vide | Remain la distance entre deux ultrasons dans un état de vent pour mettre à jour Nowind_Distance. |
| Jsnr04t.readjsnr04tSerial | vide | int | Lit la sortie d'écho en série de l'ultrasons et la transforme en int / nan en cas de lecture non valide. |
| Jsnr04t.get_selfecho | vide | uint16_t | Réinitialise le délai d'expiration pour changer la plage afin que le capteur ne se lit que son écho. |
| Jsnr04t.get_selfwindSpeed | vide | int | Lire le temps nécessaire pour qu'une ultrasonic puisse lire son propre écho (aller-retour) et le transforme en vide. |
| Jsnr04t.transform_read | uint16_t x | flotter | Transforme la distance mesurée avec des ultrasons de MM à la vitesse du vent (par rapport à la vitesse sonore). |
| Vent (constructeur) | Jsnr04t *, jsnr04t * | vide | Construit un objet de type éolien qui utilise une paire d'ultrasons pour mesurer la vitesse du vent entre eux. |
| Wind.update | vide | vide | Mettre à jour les valeurs de classe des vitesses du vent en prenant une nouvelle lecture, calcule également le taux de changement de vitesse du vent. |
| Wind.get_avergewind | vide | flotter | Calcule la moyenne de 4 mesures entre la paire ultrasonique selon le mode de travail. |
| Wind.get_echofromahead | vide | uint16_t | Lit l'écho du capteur de revêtement. |
| Renew_temp_hu | Dht, float * temp, float * bourdonnement | vide | met à jour la valeur de la température et de l'humidité pour un capteur DHT donné |
| get_speedofsound | float tc, flottant rh | flotter | estime la vitesse du son dans une température et une humidité de l'air donné selon |
| set_windsensor | DHT | vide | passe le pointeur du DHT à la classe de vent |
| get_echofromahead | JSNR04T U1, JSNR04T U2 | int | Une fonction Indpedandt pour également lire l'écho du capteur de revêtement (pour les tests). |
| wind_cycle | Vent * Windx, vent * vent, vent * vent | vide | Calcule et met à jour la vitesse du vent et la vitesse moyenne (50 moyens de mesure) de la vitesse du vent de 3 objets de vent représentant le vent en 3D. |
Définissez les valeurs et la configuration des broches nécessaires, construisez les objets cyclables en fonction du type de configuration et de capteurs, identifier les variables de cycle
#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;
Appelez Wind_Cycle pour mettre à jour toutes les valeurs
wind_cycle(&WindX ,&WindY, &WindZ);
ou simplement appeler wind.update pour mettre à jour la vitesse instantanée de toute dimension
Windx.update();
Imprimez les valeurs au port série en JSON.
"paramètre": "valeur",
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(" , ");
Utilisez AllMiss pour adapter le délai de cycle aux erreurs de mesure comme suivant
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);
Utilisez le spécial_debug_functions.ino pour diagnostiquer l'application avec des tests unitaires étapés.
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
Le travail Cron active le script toutes les 10 minutes, le script utilise GrabSerial pour assister à la série Arduino pendant 30 secondes et redémarrer le nombre lorsqu'il attrape le support de paquets JSON et quittez lorsque le support de fermeture est observé alors qu'il prend les 10 secondes Arduino (100 échantillons) pour enregistrer de nouvelles lectures, la limite de cycle peut être adoptée en réduisant le taux d'échantillonnage. Utilisation du script (Remplacez! Public_key &! Private_key avec votre configuration de capteur
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
Ce projet OpenSource et tous ses composants sont la seule responsabilité de son développeur, et bien que Farmtopia utilise des appareils similaires pour construire la version commerciale de cette station météorologique, il n'utilise pas nécessairement le même code sourncode ou la même logique ou les composants matériels ni responsable de la validité ou de l'application de ce projet Opensource.
Licence MIT