
Этот проект направлен на создание независимой сельскохозяйственной погодной солнечной станции для применения в области точного сельскохозяйственного применения. Устройство основано на Raspberry Pi & Arduino с ультразвуковым анемометром и резистивным датчиком почвы и DHT22 для температуры воздуха и влажности, а другие дополнения, доступные в соответствии с вашим применением или конкретными потребностями погоды, или аналитические данные, посланные в качестве JSON Packages для FARMOS, которые находятся на местном хосте, или для HOSTS MOSTIONE (или для HOSTS, которые требуются в хости. Dongle), Farmos помогает вам легко управлять большими данными датчиков, когда контролируя все датчики фермы и отчеты на одной платформе, он также может выступать в качестве DAAS для другого применения. Этот продукт является первой из линии FarmTopia IOF (Интернет фермерских), и он открыт, чтобы поддержать Годанскую миссию для простых и открытых сельскохозяйственных данных, он может работать как стационарным, так и мобильным и может быть легко воспроизведено дома, как описано здесь
| Измеренные данные | Как |
|---|---|
| Скорость ветра и частота в трехмерном направлении | Расчет ультразвуковой ошибки |
| Температура и влажность воздуха | AM2301 Датчик |
| GPS местоположение | USB GBS Dongle |
| Почвенная влажность | Резистивный датчик почвы |
| Дополнительные дополнения | / |
Набор Raspberry Pi: который представляет собой RP -компьютер с SD, предварительно загруженным с малиновой ОС, и камеры Pinoir (необязательно) 6xultrasonic Anemomoter: помещается в перпендикулярные направления, обращенные друг на друга (xyz) в виде сети с различными включениями или различными триггерами. Dongles: GPS -ключ (необязательно/вы можете вводить координату GPS вручную), 4G Dongle (необязательно), если нет солнечной системы охвата Wi -Fi: базовая солнечная панель 30W, которая заряжает основную супер -полимерную батарею через солнечное зарядное устройство MPPT, которая также приводит к усилению батареи USB, который отвечает за raspberry Pi, которая, как по очереди, и, по очереди, и, по очереди, и в целом, и в целом, что в целом, и в целом, и это, в целом, в целом, и в целом, и в целом, и в целом, и это, в целом, в целом, и в целом, и это, в целом, в целом, и в целом, и в целом, это в целом, и в целом, и в целом, и в целом, что в целом, и в целом. Цель стабилизации электроэнергии RPI Farmos: которая является системой управления с открытым исходным кодом сельского хозяйства, которая будет действовать как интерфейс с системой для просмотра и анализа данных датчиков.
| Число | Устройство |
|---|---|
| 1 | Raspberry Pi 4, версия 8 ГБ |
| 1 | SD -карта 128 |
| 1 | Arduino Mega 2560 |
| 1 | Arduino USB -кабель |
| 6 | JSNR04T Ultrasonics (расположено на расстоянии 40 см друг от друга) |
| 1 | AM2301 Датчик температуры и влажности |
| 1 | Ардуно модуль датчика влажности почвы |
| 1 | Raspberry Pi 4 батарея батареи |
| 1 | Mini-USB в USB-кабель |
| 1 | Контроллер солнечного зарядного устройства MPPT 20A 12/24VDC с выходом USB |
| 1 | 12 В супер-полимерная литий-ионная батарея-6800 мАч |
| 1 | Солнечная панель 18 В 30 Вт |
| 1 | Рамка метеолетов 3D спечаток или корпус Stanlesteel |
| Число | Устройство |
|---|---|
| 1 | Сенсорный экран |
| 1 | Малиновая камера Pinoir 2 |
| 1 | Raspberry USB GPS Dongle |
| 1 | MLX9046 IR Sensor |

| Имя файла | Описание |
|---|---|
| Readme.md | Введение проекта |
| Arduino_weather.ino | Основное применение Arduino для ощущения погоды |
| DHT.CPP | DHT драйвер и класс функционалов для AM2301 |
| DHT.H | Файл заголовка для DHT Class & Function Documentation |
| Special_debug_functions.ino | Модульные тестовые примеры в качестве программы отладки |
| Wind_auto.cpp | Функции измерения погоды |
| Wind_auto.h | Файл заголовка для класса ветра и функциональной документации |
| агрегатор.sh | Скрипт RPI Bash, чтобы поймать серийный пакет Arduino и агрегат JSON для Farmos Server |
-Первая установка ОС RPI (полная версия) на SD 128 ГБ рекомендуется, чтобы SD был настолько быстрым, насколько это возможно, чтобы повысить общую производительность PI. Если вы используете PI без головы, включите SSH в файле конфигурации, вы можете найти его в загрузочном разделе
-Са эти зависимости могут быть предварительно установлены, однако это хорошая идея, чтобы перепроверить их:
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
-Неразированное Docker с CLI
sudo curl -sSL https://get.docker.com | sudo sh
sudo pip3 install docker-compose
sudo systemctl enable docker
-Наустал на местном уровне на докере
Farmos является веб-приложением для управления фермами, планирования и ведения записей. Он разрабатывается сообществом фермеров, разработчиков, исследователей и организаций с целью предоставления стандартной платформы для сбора и управления сельскохозяйственными данными.
Мы используем Farmos для быстрого взаимодействия с датчиками и анализа их больших данных
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
Вы должны обратиться к этому руководству на официальном веб -сайте Farmos для получения более подробной информации
Вы можете обратиться к этому онлайн -руководству, чтобы помочь вам настроить установку Farmos
Сначала убедитесь, что модуль датчика на Farmos включен, вы можете включить и добавить модуль через ветвь разработки (просто суперпользователь на локальной платформе), если вы используете службу хостинга, обязательно попросите их включить модуль датчиков.
Установите следующие библиотеки с вашим менеджером библиотеки Arduino в Sketch> Включите библиотеку> Управление библиотеками ... Softwareserial
Вы можете ссылаться на библиотеку Adafruit DHT для DHT Douctentation, однако по какой -то причине они не читают температуру и влажность вместе, поэтому мы будем использовать функцию DHT.Reath с буфером Data [] в новой функции, называемой revene_temp_hu (dht, float*, float*).
Построенный на двух классах, JSNR04T, который представляет собой класс интерфейса, который обеспечивает экземпляр Ultrasonic Chip JSNR04T в автоматическом режиме , с необходимыми функциями для использования устройства в качестве инструмента измерения ветра с использованием дивергенции в ультразвуковых измерениях с чтением с самокорректированной скоростью звука, рассчитанной по температуре воздуха и влажности. и класс ветра, который преобразует математическую логику на записанных данных для вывода необходимых деталей погоды.
| Имя функции | Вход | Возвращаться | Описание |
|---|---|---|---|
| JSNR04T (конструктор) | uint8_t enpin, uint8_t rxpin, uint8_t type, uint16_t max_range) | пустота | Создает новый объект типа JSNR0RT, который ведет себя как экземпляр ультразвукового драйвера с ENPIN для заземления, RXPIN для Echo & Type для типа работы. |
| Jsnr04t.begin | пустота | пустота | Включает (триггеры) ультразвук, затем идентифицирует и начать новую серийную связь с ним. |
| Jsnr04t.virtual_trigger | пустота | пустота | Установите заземленный штифт для ультразвукового до низкого уровня, чтобы он начал нормальную работу. |
| Jsnr04t.resettimeout | UINT8_T Timeout | пустота | Измените миллисекундной тайм -аут ультразвукового измерения, чтобы изменить диапазон. |
| Jsnr04t.normalize | пустота | пустота | Расстояние переживания между двумя ультразвуками в условиях отсутствия ветра для обновления nowind_distance. |
| Jsnr04t.readjsnr04tserial | пустота | инт | Прочитает серийный выход эхо -эхо -ультразвукового и преобразует его в Int/NAN в случае недопустимого чтения. |
| Jsnr04t.get_elfecho | пустота | uint16_t | Сбросит тайм -аут, чтобы изменить диапазон, чтобы датчик только читал его эхо. |
| Jsnr04t.get_elshwindspeed | пустота | инт | Прочитает время, необходимое для ультразвукового, чтобы прочитать его собственное эхо (обратное путешествие) и превращает его в Windspeed. |
| Jsnr04t.transform_read | uint16_t x | плавать | Преобразует измеренное расстояние с ультразвуковым от MM до скорости ветра (относительно звуковой скорости). |
| Ветер (конструктор) | JSNR04T*, JSNR04T* | пустота | Создает объект ветра типа, который использует пару ультразвуковых, чтобы измерить скорость ветра между ними. |
| Wind.Update | пустота | пустота | Обновите значения класса скорости ветра, взяв новое чтение, также вычисляет скорость изменения скорости ветра. |
| Wind.get_avergewind | пустота | плавать | Вычисляет среднее значение 4 измерений между ультразвуковой парой в соответствии с рабочим режимом. |
| Wind.get_echofromahead | пустота | uint16_t | Читает эхо датчика лица. |
| renew_temp_hu | DHT, Float* Temp, Float* Hum | пустота | Обновляет значение температуры и влажности для данного датчика DHT |
| get_speedofsound | Float TC, Float RH | плавать | оценивает скорость звука в данной температуре и влажности воздуха в соответствии с |
| set_windsensor | DHT | пустота | передает указатель DHT в класс ветра |
| get_echofromahead | JSNR04T U1, JSNR04T U2 | инт | Функция Indpedandt, которая также считывает эхо датчика лица (для тестирования). |
| wind_cycle | Ветер* windx, ветер* ветреный, ветер* Виндц | пустота | Рассчитывает и обновляет скорость ветра и средняя (50 средняя измерения) скорость ветра 3 ветровых объектов, представляющих ветер в 3D. |
Определите необходимые значения и конфигурацию, постройте объекты цикла в соответствии с конфигурацией PIN и типом датчиков, идентифицируйте переменные цикла
#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;
Вызовите Wind_Cycle, чтобы обновить все значения
wind_cycle(&WindX ,&WindY, &WindZ);
или просто вызовите Wind.Update для обновления мгновенной скорости любого измерения
Windx.update();
Распечатайте значения в последовательный порт как JSON.
"Параметр": "Значение",
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(" , ");
Используйте Allmiss для адаптации задержки цикла к ошибкам измерения, следующим образом
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);
Используйте special_debug_functions.ino для диагностики приложения с помощью ступенчатых модульных тестов.
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
Работа Cron активирует сценарий каждые 10 минут, сценарий использует захват, чтобы поймать сериал Arduino в течение 30 секунд, и перезагружает количество, когда он ловит кронштейн с пакетом JSON, и бросается, когда закрытый кронштейн наблюдается, когда он требует 10 секунд (100 выборки), чтобы записать новые показания, ограничение цикла может быть принят путем уменьшения скорости отбора проб. Использование сценариев (замените! public_key &! private_key с конфигурацией вашего датчика
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
Этот проект OpenSource и все его компоненты являются единственной ответственностью его разработчика, и хотя FarmTopia использует аналогичные устройства для создания коммерческой версии этой метеорологической станции, он не обязательно использует те же компоненты SourceCode или логику или оборудование, а также он несет ответственность за достоверность или применение этого проекта OpenSource.
MIT Лицензия