Innehållsförteckning:

Irrigações Automatizadas Com Web Service Utilizando Python: 5 steg (med bilder)
Irrigações Automatizadas Com Web Service Utilizando Python: 5 steg (med bilder)

Video: Irrigações Automatizadas Com Web Service Utilizando Python: 5 steg (med bilder)

Video: Irrigações Automatizadas Com Web Service Utilizando Python: 5 steg (med bilder)
Video: Manage Multi Container Apps with #dockercompose | #CloudNativeNinja PT4 2024, November
Anonim
Irrigações Automatizadas Com Web Service Utilizando Python
Irrigações Automatizadas Com Web Service Utilizando Python

Neste projeto iremos desenvolver um sistema de monitoramento para plantações, que irá obter dados de umidade relativa do ar, pressão atmosférica, temperatura do ar, incidência UV, velocidade do vento e condição da planta (seca/molhada). Alguns desses dados são obtidos localmente, enquanto outros são obtidos por meio de um Web Service conectado à uma estação meteorológica (No caso, estamos utilizando a da Faculdade de Engenharia de Sorocaba). Vi rekommenderar att du kan använda våra webbplatser på ThingSpeak.

Steg 1: Hardware Utilizado

Hårdvara Utnyttjande
Hårdvara Utnyttjande

Foi utilizado para a construção deste projeto:

1x Qualcomm Dragonboard 410c

1x Grove Seeed Sensor Mezzanine

1x vattensågad sensor

1x IMU 10OF Grove Sensor v1.0

1x Sunlight Grove Sensor v1.0

1x mus USB

1x Teclado USB

1x skärm

1x Cabo HDMI

1x adaptor HDMI-VGA

Acesso à dados da estação meteorológica FACENS

Steg 2: Montagem Do Hardware

Montagem Do Hardware
Montagem Do Hardware

Após conectar a placa Sensor Mezzanine à dragonboard, execute a ligação de acordo com o esquemático anterior, sendo:

1: Conexão direta entre o sensor Groove Sunlight v1.0.

2: +5V anslutning till Vcc till IMU-10DOF.

3: +5V e Gnd conectados aos pinos correspondentes do Vattensensor.

4: GND IMU-10DOF.

5: SDA/SCL conectado ao pino correspondente do IMU-10.

6: Pino Sig do Water sensor conectado ao pino 2.

Steg 3: Firmware Atmega328

Através da Sensors Mezzanine, é possível acessar um microcontrolador Atmega328, o mesmo utilizado em plataformas Arduíno, e programá-lo diretamente, utilizando a IDE Arduíno installation on DragonBoard. Vale ressaltar que a Mezzanine e a DragonBoard em conjunto possoem todo os periféricos needsários para a programação and gravação do firmware no microcontrolador.

O firmware embarcado é responsável por realizar as leituras dos sensores, gerenciando os protocolos de comunicação e operação dos mesmos, e após a aquisição dos dados, os encaminha via porta serial para till DragonBoard.

*Kodar nödvändigt och innehåller bibliotecas som inte har någon fast programvara. Elas podem ser encontradas em:

imu-10DOF

Solljus sensor

O firmware utilizado pode ser encontrado aqui ou aqui:

Steg 4: Programação Em Python

Programação Em Python
Programação Em Python

Para o programa criado, foram needsários os seguintes imports: 'urllib2', 'json', 'time', 'serial', 'paho.mqtt.publish', 'psutil' e 'decimal'. Foram definidos duas funções ('comJSON' e 'semJSON') que serão explicadas mais tarde.

import urllib2, json #para pegar os dados da estacaoimport time #para o time.sleep () import serial #para o Arduino import paho.mqtt.publicera som publicera #par publicar import psutil #para konfigurar o url import decimal #para converter

O primeiro passo é gravar em uma variável o endereço de onde serão obtidos os dados da Estação Meteorológica (no caso estamos gravando na variável 'url'). Em seguida, inicializamos duas variáveis ('i' e 'j'), utilizando 'i' para pegar os dados mais atuais do Array que iremos receber via JSON (como a posição mais recente da Array será a 49, inicializamos 'i' como 49) e 'j' para contar quantas vezes o código já rodou.

url = "https://www.fieldclimate.com/api/CIDIStationData/GetLast?user_name=facens&user_passw=clima&station_name=002035C0" #Define o URL da estação

i = 49 #Para pegar os dados mais atuais da estação

j = 0 #Passo do programa

Entrando no 'while (1)', inicializamos a variável 'jsonurl' como 'None'. Esta variável irá abrir a URL JSON, portanto ao inicializarmos ela no início do 'while', estamos então resetando ela toda vez que repetirmos o loop. O próximo passo é abrir o URL usando a função 'urllib2.urlopen (url)', podendo também adicionar um argumento 'timeout = X', sendo X uma quantidade em segundos limite para o URL ser aberto. Se en programvara för att få en URL som kan användas för att göra timeout, eller för att kunna göra en funktionalitet med "comJSON" mencionada anteriormente. Caso não consiga abrir a URL no tempo estipulado, realiza-se a função 'semJSON'. Ambos as funções são muito parecidas, tendo como diferença os dados da estação ('comJSON' irá mostrar e enviar os dados da estação, enquanto 'semJSON' não). Como 'semJSON' é uma função derivada de 'comJSON'. Iremos förklarar somente en 'comJSON'

while (1): jsonurl = None #Inicializa a varivavel como None print 'Passo:', j print 'Atualizando dados' try: jsonurl = urllib2.urlopen (url, timeout = 5) #tenta abrir o url em no máximo 5 segundos om jsonurl inte är Ingen: skriv ut 'Dados atualizados' comJSON (jsonurl) #Se conseguiu abrir o URL, mostra todos os dados utom: if jsonurl is None: print 'Erro ao atualizar dados' semJSON () #Se não abriu o URL, mostra os dados obtidos localmente (do Arduino) pass j += 1 print '---------------------------------- ---------------------------------------------------------- -------------------------------------------- / n 'tid. sover (1)

Na primeira linha da função 'comJSON', recebemos todos os dados da URL já abertos numa variável 'dados'. Esta irá receber um objeto com duas Arrays, das quais iremos somente usar uma ('ReturnDataSet'). Realizada esta operação, iremos então inicializar o Serial do Arduíno e ler as linhas (readline ()) que o Arduíno está imprimindo e jogando as Strings convertidas dentro de variáveis e, então, mostrando esses dados na tela. Recebidos os dados do Arduíno, receberemos os dados da estação, simplesmente acessando os sensores específicos dentro do objeto 'dados' (exemplo '[' ReturnDataSet '] [' sens_aver_6_5] ') e então mostramos esta novos dados na.

def comJSON (jsonurl): #envia todos os dados dados = json.loads (jsonurl.read ()) #carrega os dados JSON da página já aberta #Arduino ard = serial. Serial ('/dev/tty96B0', 115200) # inicializa a variavel que receberá os dados do Arduíno #Recebe os dados do Arduíno ardAgua = int (ard.readline (). rstrip ()) ardTemp = float (ard.readline (). rstrip ()) ardPres = int (ard.readline) ().rstrip ()) ardUV = float (ard.readline (). rstrip ())

skriv ut "\ nArduino"

if ardAgua == 1: print 'Molhado' else: print 'Seco' print 'Temperatura:', ardTemp, '*C' print 'Pressao:', ardPres, 'Pa' print 'Ultra-Violeta:', ardUV, ' lx '

#Estacao

print '\ nJSON' print 'URL:', jsonurl #Recebe os dados da estação data = dados ['ReturnDataSet'] ['f_date'] vel_vento = dados ['ReturnDataSet'] ['sens_aver_6_5'] umidade = dados ['ReturnDataSet'] ['sens_aver_19_507']

print 'Data:', data

print 'Velocidade do Vento:', vel_vento, 'm/s' print 'Umidade do ar:', umidade, '%'

#Konvertera

vel_vento = decimal. Decimal (vel_vento.rstrip ()) umidade = decimal. Decimal (umidade.rstrip ())

O próximo passo é enviar todos esses dados coletados. Para isso, precisamos colocar a ID do canal, a Chave de Escrita e o Host em variáveis, além de configurar o useUnsecuredTCP, useUnsecuredWebsockets e useSSLWebsockets (usamos True, False, False). Criamos mais uma variável que irá guardar o 'caminho' para o canal, e uma outra para guardar, em String, o que será enviado para o servidor (com todas as variáveis convertidas) e então tentar publicar os dados no servidor usando 'publish. single (ämne, nyttolast = tPayload, värdnamn = mqttHost, port = tPort, tls = tTLS, transport = tTransport) '. En função então acaba e retorna para o loop huvudman.

#Envia channelID = "344243" #Canal criado para o grupo apiKey = "1PK9ELK0L4AH8CVP" #Código dado pelo ThingSpeak mqttHost = "mqtt.thingspeak.com" #configurações de comunicaçecsUnsecuredTurnsecuredTurebaserade = AnvändsUnsecuredTeckenBaseradeTeckenBetsanvändsTeckenBetsanvändsTeckenBetsBeklagadeTillsättSanvändaTeckenBetsBekanadeTeckenBetsanvända = TillsatsSäkertSäkertSäkertSäkertSäkertSäkertSäkertSäkert "tcp" tPort = 1883 tTLS = Ingen om useUnsecuredWebsockets: tTransport = "websockets" tPort = 80 tTLS = Ingen om useSSLWebsockets: import ssl tTransport = "websockets" tTLS = {'ca_certs': "/etc/ssl/certs/ca- certificates.crt ", 'tls_version': ssl. PROTOCOL_TLSv1} tPort = 443 topic =" channel/" + channelID +"/publish/" + apiKey #Cria variavel com 'caminho' para o canal tPayload =" field1 = " + str (ardAgua) + "& field2 =" + str (ardTemp) + "& field3 =" + str (ardPres) + "& field4 =" + str (ardUV) + "& field5 =" + str (data) + "& field6 =" + str (vel_vento) + "& field7 =" + str (umidade) #Organiza todas as variaveis em uma String para ser enviado print 'Enviando dados' try: publish.single (topic, payload = tPayload, hostname = mqttHost, port = tPort, tls = tTLS, transport = tTransport) #Envia os dados time.sleep (0.5) print 'Dados enviados' utom: print 'Erro ao enviar dados'

Steg 5: Configurando O Web Service

Configurando O Web Service
Configurando O Web Service

Para enviar os dados obtidos ao Web Service, utilizamos and plataforma ThingSpeak. Para tal, entramos no site thingspeak.com e criamos uma conta. Du kan logga in och fortsätta med menyerna och menyerna -> Canais -> Meus Canais e então clicamos no botão "Novo Canal". Ao clicar, escolhemos o nome do Canal, escrevemos uma descrição para ele, e então decidimos quantos dos 8 campos possíveis utilizaríamos. Inget caso, utilizamos 7.

Ao criar um canal, é gerado um ID do Canal, uma Chave de Escrita och uma Chave de Leitura. O ID do Canal se encontra abaixo do nome do canal e a Chave de Escrita na aba "Chaves". Para que o código Python envie as informações obtidas para o canal é, nödvändigt konfiguration-lo ao ID för Canal:

channelID = "Insira o ID do Canal aqui"

E também com a Chave de Escrita:

apiKey = "Insira a Chave de Escrita"

Além da conexão com o canal criado, também são needsárias outras configurações no código em Python app.py:

useUnsecuredTCP = True

useUnsecuredWebsockets = FalseuseSSLWebsockets = False mqttHost = "mqtt.thingspeak.com" if useUnsecuredTCP: tTransport = "tcp" tPort = 1883 tTLS = None if useUnsecuredWebsockets: tTransport = "websockets" tTortSlSTSSS = tSportS 80STSSS = tSportS 80STSSSTSSSSSTSSSTSSSTSSTSSSTSSSTSSTSSSTSSSTSSSTSSSSTSSTSSTSSTSSTSSTSST websockets "tTLS = {'ca_certs':"/etc/ssl/certs/ca-certificates.crt ", 'tls_version': ssl. PROTOCOL_TLSv1} tPort = 443 topic =" channel/" + channelID +"/publish/" + apiKey

Para que a aplicação web realmente receba, by exemplo, o valor Temperatura no campo 2 (campo que escolhemos para ser a Temperatura), é necessario indicar o "field2 ="+variável_temperatura, como no código a seguir:

tPayload = "field1 =" + str (ardAgua) + "& field2 =" + str (ardTemp) + "& field3 =" + str (ardPres) + "& field4 =" + str (ardUV) + "& field5 =" + str (data) + "& field6 =" + str (vel_vento) + "& field7 =" + str (umidade)

Tendo vinculado todos os dados do Canal à programação em Python, basta executor o código que todos us dados escolhidos são enviados ao Web Service. No ThingSpeak, é possível realizar todo o monitoramento através de gráficos.

Rekommenderad: