
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), o Farmos ajuda a gerenciar facilmente os grandes dados do sensor, monitorando todos os sensores e relatórios agrícolas em uma plataforma, também pode atuar como DAAS para outra aplicação. Este produto é o primeiro da linha Farmtopia IOF (Internet da Fazenda) e é o OpenSurced para apoiar a missão Godan para dados agrícolas fáceis e abertos, pode funcionar estacionário e móvel e pode ser fácil replicado em casa, conforme descrito aqui
| Dados medidos | Como |
|---|---|
| Velocidade do vento e frequência na direção três dimensionais | Calculando o erro ultrassônico |
| Temperatura e umidade do ar | Sensor AM2301 |
| Localização do GPS | DONGLE USB GBS |
| Umidade do solo | Sensor de solo resistivo |
| Complementos opcionais | / |
Conjunto de Raspberry Pi: que é um computador RP com SD pré -carregado com o sistema operacional de framboesa e uma câmera pinoir (opcional) 6xultrassonic Anemometer: colocado em direções perpendiculares voltadas para o outro (XYZ) como uma rede com diferentes atividades ou desencadeadores diferentes. 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 , Essa configuração visa estabilizar o RPI Power Supply Farmos: que é o sistema de gerenciamento de código aberto agrícola que atuará como uma interface para o sistema para visualizar e analisar os dados dos sensores.
| Número | Dispositivo |
|---|---|
| 1 | Raspberry Pi 4, versão de 8 GB |
| 1 | Cartão SD 128 |
| 1 | Arduino Mega 2560 |
| 1 | Cabo USB Arduino |
| 6 | JSNR04T Ultrasonics (colocado 40 cm de distância) |
| 1 | AM2301 Sensor de temperatura e umidade |
| 1 | Módulo de sensor de umidade do solo Arduino |
| 1 | Raspberry Pi 4 Battery Ups |
| 1 | Mini-USB para cabo USB |
| 1 | Controlador de carregador solar MPPT 20A 12/24VDC com saída USB |
| 1 | 12V Super Polymer Li-Ion Battery-6800 Mah |
| 1 | Painel solar 18V 30W |
| 1 | Estação meteorológica quadro 3D Impresso ou gabinete Stanlesteel |
| Número | Dispositivo |
|---|---|
| 1 | Tela de toque |
| 1 | Câmera de Raspberry Pinoir 2 |
| 1 | DONGLE DE GPS USB RASPBLOMARY |
| 1 | MLX9046 Sensor IR |

| Nome do arquivo | Descrição |
|---|---|
| Readme.md | Introdução ao projeto |
| Arduino_weather.ino | Aplicação Arduino de detecção climática principal |
| Dht.cpp | Driver DHT e Funcionalitas de classe para AM2301 |
| Dht.h | Arquivo de cabeçalho para documentação da classe DHT e função |
| Special_debug_functions.ino | Casos de teste de unidade como um programa de depuração |
| Wind_auto.cpp | Funções de medição climática |
| Wind_auto.h | Arquivo de cabeçalho para documentação de classe e função do vento |
| agregador.sh | RPI Bash Script para capturar o pacote JSON de serial e agregação do Arduino para o Farmos Server |
-Prist Instale o RPI OS (versão completa) no cartão SD de 128 GB, é aconselhável que o SD seja o mais rápido possível para melhorar o desempenho geral do PI. Se você estiver usando o PI sem cabeça, ative o arquivo de configuração SSH, poderá encontrá -lo na partição de inicialização
-A maioria dessas dependências pode ser pré -instalada, no entanto, é uma boa ideia verificá -las:
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
-Instale Docker com CLI
sudo curl -sSL https://get.docker.com | sudo sh
sudo pip3 install docker-compose
sudo systemctl enable docker
-Instale Farmos localmente no Docker
Farmos é um aplicativo baseado na Web para gerenciamento, planejamento e manutenção de registros da fazenda. É desenvolvido por uma comunidade de agricultores, desenvolvedores, pesquisadores e organizações com o objetivo de fornecer uma plataforma padrão para coleta e gerenciamento de dados agrícolas.
Usamos o Farmos para interface rapidamente os sensores e analisar seus 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
Você deve consultar este guia no site oficial do Farmos para obter mais detalhes
Você pode consultar este guia online para ajudá -lo a configurar a instalação do Farmos
Primeiro, verifique se o módulo do sensor no Farmos está ativado, você pode ativar e adicionar módulo através da filial de desenvolvimento (apenas um super usuário na plataforma local), se você estiver usando um serviço de hospedagem, peça que eles possam ativar o módulo sensores.
Instale as seguintes bibliotecas com seu gerente de biblioteca Arduino no Sketch> Incluir Biblioteca> Gerenciar Bibliotecas ... Softwareserial
Você pode se referir à Biblioteca Adafruit DHT para duplicação DHT, no entanto, por algum motivo, eles não lêem a temperatura e a umidade juntos, por isso usaremos a função dht.read com o buffer de dados [] em uma nova função chamada renew_temp_hu (dht, flutuar*, float*).
Construído em duas classes, o JSNR04T, que é uma classe de interface que fornece uma instância do chip ultrassônico JSNR04T no modo automático , com as funções necessárias para usar o dispositivo como ferramenta de medição de vento usando a divergência na leitura de medições ultrassônicas com velocidade sonora autocrissora calculada a partir da temperatura e horteridade. e a classe de vento, que pré -forma a lógica matemática nos dados gravados para gerar os detalhes do clima necessário.
| Nome da função | Entrada | Retornar | Descrição |
|---|---|---|---|
| JSNR04T (construtor) | uint8_t enpin, uint8_t rxpin, uint8_t tipo, uint16_t max_range) | vazio | Construa um novo objeto do tipo JSNR0RT que se comporta como uma instância de driver ultrassônico com enpin para ativa no solo, rxpin para echo & tipo para o tipo de operação. |
| JSNR04T.BEGIN | vazio | vazio | Ativa (desencadeia) o ultrassônico identifica e inicia uma nova comunicação serial com ele. |
| Jsnr04t.virtual_trigger | vazio | vazio | Defina o pino de solo para o ultrassônico para baixo para que ele inicie sua operação normal. |
| Jsnr04t.resetTimeout | UINT8_T Timeout | vazio | Altere o tempo limite de milissegundos da medição ultrassônica para alterar o intervalo. |
| Jsnr04t.Normalize | vazio | vazio | Distância do Remesasure entre dois ultrassônicos em nenhuma condição de vento para atualizar Nowind_distance. |
| Jsnr04t.readjsnr04tserial | vazio | int | lê a saída de eco em série do ultrassom e a transforma em Int/nan em caso de leitura inválida. |
| Jsnr04t.get_selfecho | vazio | uint16_t | Redefina o tempo limite para alterar o intervalo para que o sensor lê apenas seu eco. |
| Jsnr04t.get_selfwindspeed | vazio | int | lê o tempo necessário para um ultrassônico ler seu próprio eco (ida e volta) e o transforma em velocidade do vento. |
| Jsnr04t.transform_read | uint16_t x | flutuador | Transforma a distância medida com ultrassônico de MM para a velocidade do vento (em relação à velocidade de som). |
| Vento (construtor) | Jsnr04t*, jsnr04t* | vazio | Construa um objeto de vento do tipo que usa um par de ultrassônicos para medir a velocidade do vento entre eles. |
| Wind.update | vazio | vazio | Atualizar os valores da classe das velocidades do vento, tomando uma nova leitura, também calcula a taxa de mudança na velocidade do vento. |
| Wind.get_avergewind | vazio | flutuador | Calcula a média de 4 medições entre o par ultrassônico de acordo com o modo de trabalho. |
| Wind.get_echofromaHead | vazio | uint16_t | Lê o eco do sensor de frente. |
| renow_temp_hu | Dht, flutuação* temp, flutuação* hum | vazio | Atualiza o valor da temperatura e umidade para um determinado sensor DHT |
| get_speedOfSound | FLOAT TC, FLOAT RH | flutuador | estima a velocidade do som em uma determinada temperatura do ar e umidade de acordo com |
| set_windsensor | Dht | vazio | passa o ponteiro da classe DHT para o vento |
| get_echofromahead | JSNR04T U1, JSNR04T U2 | int | Uma função indpedandt para também ler o eco do sensor de face (para teste). |
| wind_cycle | Vento* windx, vento* vento, vento* windz | vazio | Calcula e atualiza a velocidade do vento e a média do vento da média (média de 50 medidas) de 3 objetos de vento que representam o vento em 3D. |
Defina os valores e configuração dos pinos necessários, construa os objetos do ciclo de acordo com o tipo de configuração e sensores de pinos, identifique variáveis 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;
Ligue para Wind_Cycle para atualizar todos os valores
wind_cycle(&WindX ,&WindY, &WindZ);
ou basta ligar para o vento.Update para atualizar a velocidade instantânea de qualquer dimensão
Windx.update();
Imprima os valores na porta serial 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 o Allmiss para adaptar o atraso do ciclo aos erros de medição conforme o seguinte
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 o Special_debug_functions.ino para diagnosticar o aplicativo com testes de unidade escalonados.
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
O trabalho do CRON ativa o script a cada 10 minutos, o uso do script Grabserial para capturar a série Arduino por 30 segundos e reinicia a contagem quando pega o suporte do pacote JSON e desiste quando o suporte próximo é visto enquanto o limite de leitura é realizado por 10 segundos (100 da amostra), que o limite de leitura pode ser visto. Uso do script (substitua! public_key &! private_key com a configuração do 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 projeto OpenSource e todos os seus componentes são de responsabilidade exclusiva de seu desenvolvedor e, embora a Farmtopia use dispositivos semelhantes para construir a versão comercial desta estação meteorológica, não usa necessariamente o mesmo focecode ou componentes lógicos ou de hardware, nem é responsável pela validade ou aplicação deste projeto de abertura.
MIT Licença