
Dieses Projekt zielt darauf ab, eine unabhängige landwirtschaftliche Wetterstation für die präzise landwirtschaftliche Anwendung zu errichten. Das Gerät basiert auf Raspberry PI & Arduino mit Ultraschallanemometer und Widerstands-Bodensensor und DHT22. Dongle), Farmos hilft Ihnen, große Sensordaten problemlos zu verwalten, während Sie alle landwirtschaftlichen Sensoren und Berichte auf einer Plattform überwachen. Sie können auch als DAAS für andere Anwendungen fungieren. Dieses Produkt ist das erste von Farmtopia IOF (Internet of Farm).
| Gemessene Daten | Wie |
|---|---|
| Windgeschwindigkeit und Frequenz in 3-dimentischer Richtung | Durch Berechnung des Ultraschallfehlers |
| Lufttemperatur und Luftfeuchtigkeit | AM2301 Sensor |
| GPS -Standort | USB GBS Dongle |
| Bodenfeuchtigkeit | Bestehender Bodensensor |
| Optionale Add-Ons | / |
Raspberry Pi -Set: Ein RP -Computer mit SD -vorinstalliertem mit Himbeer -Betriebssystem und einer Pinoir -Kamera (optional) 6xultrasonisches Anemometer: In senkrechte Richtungen gelegt, die sich gegenseitig (XYZ) als Netzwerk mit verschiedenen Aktivitäten oder verschiedenen Auslösern zugewandt sind. Dongles: GPS -Dongle (optional/Sie können GPS -Koordinaten manuell eingeben), 4G -Dongle (optional) Wenn es keine WiFi -Abdeckung Sonnensystem gibt: ein Basic 30W Solar Panel, das das Haupt -Super -Polymer -Akku über das MPPT -Solarladegerät lädt, das auch über USB -Kabel mit dem MPTURY -PI den UPS -Batteriepaket übernimmt. Konfiguration zielt darauf ab, die RPI-Netzteile Farmos zu stabilisieren: Das Open-Source-Managementsystem der Landwirtschaft, das als Schnittstelle zum System fungiert, um Sensoren-Daten anzusehen und zu analysieren.
| Nummer | Gerät |
|---|---|
| 1 | Raspberry Pi 4, 8 GB Version |
| 1 | SD -Karte 128 |
| 1 | Arduino Mega 2560 |
| 1 | Arduino USB -Kabel |
| 6 | JSNR04T Ultraschall (40 cm voneinander entfernt) |
| 1 | AM2301 Temperatur- und Feuchtigkeitssensor |
| 1 | Arduino Bodenfeuchtigkeitssensormodul |
| 1 | Raspberry Pi 4 Batteriepacks ups |
| 1 | Mini-USB zu USB-Kabel |
| 1 | MPPT Solar Charger Controller 20A 12/24VDC mit USB -Ausgang |
| 1 | 12V Super Polymer Li-Ion Battery-6800 mAh |
| 1 | Solarpanel 18V 30W |
| 1 | Wetterstation Rahmen 3D gedruckt oder Stanlesteel -Gehäuse |
| Nummer | Gerät |
|---|---|
| 1 | Touch-Screen |
| 1 | Raspberry Pinoir 2 Kamera |
| 1 | Raspberry USB GPS Dongle |
| 1 | MLX9046 IR -Sensor |

| Dateiname | Beschreibung |
|---|---|
| Readme.md | Projekteinführung |
| Arduino_Weather.ino | Hauptwetter -Erfassungs -Arduino -Anwendung |
| DHT.CPP | DHT -Treiber & Klasse -Funktionaliten für AM2301 |
| Dht.h | Header -Datei für DHT -Klassen- und Funktionsdokumentation |
| Special_Debug_functions.ino | Unit -Testfälle als Debug -Programm |
| Wind_auto.cpp | Wettermessfunktionen |
| Wind_auto.h | Header -Datei für Windklassen- und Funktionsdokumentation |
| Aggregator.sh | RPI -Bash -Skript zum Fangen von Arduino -Serien- und Aggregat -JSON -Paket an Farmos Server |
-Firstinstallieren Sie RPI OS (Vollversion) auf einer 128 -GB -SD -Karte. Es wird empfohlen, dass die SD so schnell wie möglich ist, um die Gesamtleistung von PI zu verbessern. Wenn Sie Headless PI verwenden, aktivieren Sie SSH in der Konfigurationsdatei, die Sie in der Startpartition finden können
-Die meisten dieser Abhängigkeiten können vorinstalliert sein, aber es ist eine gute Idee, sie erneut zu überprüfen:
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
-Talldocker mit CLI
sudo curl -sSL https://get.docker.com | sudo sh
sudo pip3 install docker-compose
sudo systemctl enable docker
-Tallieren Sie Farmos vor Ort auf Docker
Farmos ist eine webbasierte Bewerbung für landwirtschaftliche Verwaltung, Planung und Aufzeichnung. Es wurde von einer Gemeinschaft von Landwirten, Entwicklern, Forschern und Organisationen entwickelt, um eine Standardplattform für die Erfassung und das Management landwirtschaftlicher Daten bereitzustellen.
Wir verwenden Farmos, um sich schnell mit Sensoren zu verbinden und ihre Big Data zu analysieren
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
Weitere Informationen finden Sie auf diesem Leitfaden auf der offiziellen Website der Farmos Official -Website
Sie können auf diesen Online -Leitfaden verweisen, um die FARTOS -Installation zu konfigurieren
Stellen Sie zunächst sicher, dass das Sensormodul auf Farmos aktiviert ist. Sie können das Modul über die Entwicklungszweig (nur ein Superbenutzer auf der lokalen Plattform) aktivieren und hinzufügen. Wenn Sie einen Hosting -Dienst verwenden, bitten Sie sie, das Sensors -Modul zu aktivieren.
Installieren Sie die folgenden Bibliotheken mit Ihrem Arduino -Bibliotheksmanager in Sketch> inklusive Bibliothek> Bibliotheken verwalten ... SoftWareserial
Sie können sich auf die Adafruit -DHT -Bibliothek für die DHT -Doppelverbindung beziehen. Aus irgendeinem Grund lesen sie jedoch keine Temperatur und Luftfeuchtigkeit zusammen, sodass wir die DHT.Read -Funktion mit Daten [] Puffer in einer neuen Funktion namens Renew_Temp_hu (DHT, Float*, Float*) verwenden.
Baut auf zwei Klassen, JSNR04T, ist eine Schnittstellenklasse, die eine Instanz von JSNR04T-Ultraschallchip im Auto-Modus bietet, wobei die erforderlichen Funktionen das Gerät als Windmesswerkzeug verwenden, indem die Divergenz beim Lesen von Ultraschallmessungen mit selbst korrigiertem Schallgeschwindigkeit verwendet wird, die von Lufttemperatur und Luftfeuchtigkeit berechnet wurden. und Windklasse, die die mathematische Logik auf aufgezeichneten Daten vorbaut, um die benötigten Wetterdetails auszugeben.
| Funktionsname | Eingang | Zurückkehren | Beschreibung |
|---|---|---|---|
| JSNR04T (Konstruktor) | uint8_t enpin, uint8_t rxpin, uint8_t type, uint16_t max_range) | Leere | Konstruiert ein neues Objekt vom Typ JSNR0RT, das sich wie eine Instanz des Ultraschalltreibers mit ENPIN FOROR -Aktivierung verhält, RXPIN für Echo & Type für den Betriebstyp. |
| JSNR04T.BEGIN | Leere | Leere | Ermöglicht (Auslöser), dass die Ultraschall eine neue serielle Kommunikation mit ihm identifiziert und starten. |
| Jsnr04t.virtual_trigger | Leere | Leere | Stellen Sie den Bodenstift für den Ultraschall auf niedrig ein, damit er den normalen Betrieb startet. |
| JSNR04T.Resettimeout | uint8_t Timeout | Leere | Ändern Sie das Millisekunden -Zeitübergang der Ultraschallmessung, um den Bereich zu ändern. |
| JSNR04T.Normalize | Leere | Leere | Rema -Abstand zwischen zwei Ultraschall in keinem Wind. |
| Jsnr04t.readjsnr04tserial | Leere | int | liest die serielle Echoausgabe des Ultraschalls und verwandelt sie im Falle eines ungültigen Lesens in INT/NAN. |
| JSNR04T.get_Selfecho | Leere | uint16_t | Setzt die Zeitüberschreitung zurück, um den Bereich zu ändern, sodass der Sensor nur das Echo liest. |
| Jsnr04t.get_selfwindspeed | Leere | int | liest die Zeit, die für ein Ultraschall zum Lesen seines eigenen Echos benötigt wird (Hin- und Rückflug) und verwandelt es in Windgeschwindigkeit. |
| JSNR04T.TRANSFORM_READ | uint16_t x | schweben | Verwandelt den gemessenen Abstand mit Ultraschall von MM in Windgeschwindigkeit (relativ zur Schallgeschwindigkeit). |
| Wind (Konstruktor) | JSNR04T*, JSNR04T* | Leere | Konstruiert ein Objekt vom Typ Wind, das ein Ultraschallpaar verwendet, um die Windgeschwindigkeit zwischen ihnen zu messen. |
| Wind.update | Leere | Leere | Aktualisieren Sie die Klassenwerte von Windgeschwindigkeiten, indem Sie eine neue Lektüre aufnehmen, und berechnet auch die Änderungsrate der Windgeschwindigkeit. |
| Wind.get_avergewind | Leere | schweben | Berechnet den Durchschnitt von 4 Messungen zwischen dem Ultraschallpaar gemäß dem Arbeitsmodus. |
| Wind.get_echofromahead | Leere | uint16_t | Liest das Echo des Gesichtssensors. |
| erneuerung_temp_hu | DHT, Float* Temp, Float* Hum | Leere | Aktualisiert den Wert von Temperatur und Luftfeuchtigkeit für einen bestimmten DHT -Sensor |
| get_speedofsound | float tc, float rh | schweben | Schätzungen der Schallgeschwindigkeit in einer bestimmten Lufttemperatur und Feuchtigkeit nach |
| set_windsensor | DHT | Leere | übergeht den Zeiger der DHT an die Windklasse |
| get_echofromahead | JSNR04T U1, JSNR04T U2 | int | Eine Indpedandt -Funktion, um auch das Echo des Gesichtssensors zu lesen (zum Testen). |
| wind_cycle | Wind* Windx, Wind* Windy, Wind* Windz | Leere | Berechnet und aktualisiert die Windgeschwindigkeits- und Durchschnitts -Windgeschwindigkeit (50 Messdurchschnitt) von 3 Windobjekten, die den Wind in 3D darstellen. |
Definieren Sie die benötigten PIN -Werte und -konfiguration und konstruieren Sie die Zyklusobjekte gemäß Pinkonfiguration und Sensoren -Typ und identifizieren Sie Zyklusvariablen
#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;
Rufen Sie Wind_Cycle an, um alle Werte zu aktualisieren
wind_cycle(&WindX ,&WindY, &WindZ);
Oder rufen Sie einfach Wind.Update an, um die sofortige Geschwindigkeit jeder Dimension zu aktualisieren
Windx.update();
Drucken Sie die Werte in den seriellen Port als JSON aus.
"Parameter": "Wert",
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(" , ");
Verwenden Sie alle Mess, um die Zyklusverzögerung an Messfehler wie folgt anzupassen
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);
Verwenden Sie die Special_Debug_functions.ino, um die Anwendung mit Stufen -Unit -Tests zu diagnostizieren.
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
Der Cron -Job aktiviert das Skript alle 10 Minuten. Das Skript verwendet GrabSerial, um die Arduino -Serie 30 Sekunden lang zu fangen, und startet die Anzahl neu, wenn es die JSON -Paketklasse aufnimmt, und beendet, wenn die Schließklemme beobachtet wird, während der Arduino 10 Sekunden (100 Beispiele) erforderlich ist, um die Zyklusgrenze durch die Reduzierung der Sampling -Rate zu reduzieren. Skriptverwendung (Ersetzen Sie! public_key &! private_key mit Ihrer Sensorkonfiguration
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
Dieses OpenSource -Projekt und alle seine Komponenten sind die alleinige Verantwortung des Entwicklers. Obwohl Farmtopia ähnliche Geräte verwendet, um die kommerzielle Version dieser Wetterstation zu erstellen, verwendet sie nicht unbedingt dieselbe Sourcecode- oder Logik- oder Hardwarekomponenten, oder es ist für die Gültigkeit oder die Anwendung dieses OpenSource -Projekts verantwortlich.
MIT -Lizenz