Taula de continguts:

Irrigações Automatizadas Com Web Service Utilitzant Python: 5 Passos (amb imatges)
Irrigações Automatizadas Com Web Service Utilitzant Python: 5 Passos (amb imatges)

Vídeo: Irrigações Automatizadas Com Web Service Utilitzant Python: 5 Passos (amb imatges)

Vídeo: Irrigações Automatizadas Com Web Service Utilitzant Python: 5 Passos (amb imatges)
Vídeo: Become A Master Of SDXL Training With Kohya SS LoRAs - Combine Power Of Automatic1111 & SDXL LoRAs 2024, Juliol
Anonim
Irrigações Automatizadas Com Web Service Utilitzant Python
Irrigações Automatizadas Com Web Service Utilitzant Python

En aquest projecte desenvolupem un sistema de monitoratge per a plantes, que obtindrem dades d’humitat relativa a ar, premsa atmosfèrica, temperatura a l’ar, incidència UV, velocitat del vent i condició de planta (seca / molhada). Alguns desses dados são obtidos localmente, enquanto altres são obtidos por meio de um Web Service connectado à uma estação meteorològica (No cas, estem utilitzant a la Faculdade de Engenharia de Sorocaba). Após adquiridos, os dados serão disponibilised em uma apply web baseada em ThingSpeak.

Pas 1: Maquinari utilitzat

Maquinari utilitzat
Maquinari utilitzat

S'ha utilitzat per a la construcció d'aquest projecte:

1x Qualcomm Dragonboard 410c

1x entresòl de sensor de llavor Grove

1x sensor de llavor d'aigua

1x IMU 10OF Grove Sensor v1.0

1x Sunlight Grove Sensor v1.0

1x ratolí USB

1x Teclado USB

1x Monitor

1x Cabo HDMI

1x Adaptador HDMI-VGA

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

Pas 2: Montagem Do Hardware

Maquinari Montagem Do
Maquinari Montagem Do

Connecteu-vos a la placa Sensor Mezzanine à dragonboard, execute a ligação of acord com o esquemático anterior, sendo:

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

2: + 5V connectat al Vcc do IMU-10DOF.

3: + 5V e Gnd connectats als pinos corresponents a Water sensor.

4: GND IMU-10DOF.

5: SDA / SCL connectat al pin corresponent de l'IMU-10.

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

Pas 3: Firmware Atmega328

Através da Sensors Mezzanine, és possible accedir a un microcontrolador Atmega328, o fins i tot utilitzar-lo amb plataformes Arduíno, i programar-lo directament, utilitzant un IDE Arduíno instal·lat a DragonBoard. Vale ressaltar que a Mezzanine e a DragonBoard em conjunt possuem all os periféricos necessários for a programação e gravação do firmware no microcontrolador.

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

* Podeu necessitar una inclusió de les biblioteques utilitzades sense firmware. El podem ser trobades en:

imu-10DOF

Sensor de llum solar

El firmware utilitzat pot trobar-se aqui o aqui:

Pas 4: Programa Em Python

Programa Em Python
Programa Em Python

Per al programa criat, necessaris per a les següents importacions: 'urllib2', 'json', 'time', 'serial', 'paho.mqtt.publish', 'psutil' e 'decimal'. Foram definidos duas funções ('comJSON' e 'semJSON') que seran explicades més tard.

import urllib2, json #para pegar os dados da estacaoimport time #para o time.sleep () import serial #para o Arduino import paho.mqtt.publish as publish #para publicar import psutil #para configurar o url import decimal #para converter

O primer passo é gravar em uma variável o endereço on onde serão obtidos os dados da Estação Meteorológica (no case estamos gravando na variável 'url'). Em seguida, inicializamos duas variáveis ('i' e 'j'), using 'i' for pegar os dados mais atuais do Array que iremos receber via JSON (com a posició més recent de Array serà a 49, inicializamos 'i' com 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

Entrant no 'while (1)', inicialitzamos a variável 'jsonurl' com 'None'. Aquesta varietat irà a obrir un URL JSON, portant-la inicialment sense "mentre que", estem restablint-la tota vegada que es repeteixen o es repeteixen. El proper pas s'obrirà a l'URL utilitzant una funció 'urllib2.urlopen (url)', podent també afegir un argument 'timeout = X', sent X uma quantitatitat segons segons límit per a l'URL obert. Si el programa aconseguirà obrir una URL dins del temps i el temps d'espera, o el programa irà realitzant una funció 'comJSON' mencionada anteriorment. Cas no es consiga a obrir un URL sense temps estipulat, es realitza una funció 'semJSON'. Ambos as funções são muito parecidas, tendo as 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 explicar somente a 'comJSON'

while (1): jsonurl = Cap if jsonurl is not None: print 'Dados atualizados' comJSON (jsonurl) #Se conseguiu obrir o URL, mostra tots els dados except: 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 'time.sleep (1)

Na primera línia de funcions 'comJSON', recebem tots els dados da URL ja aberts numa variável 'dados'. Aquesta irá receber um objecte com duas Arrays, das quais iremos somente use 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à imprimint i 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, senzillament accedint a sensors específics dins de l'objecte 'dados' (per exemple '[' ReturnDataSet '] [' sens_aver_6_5] ') e então mostramos estes novos dados na tela também.

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) # inicialitza 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 ())

imprimeix "\ 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']

imprimeix 'Dades:', dades

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

#Converteix

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

El proper pas s’enviarà tots els esmentats coletats. Per a això, precisem col·locar un identificador de canal, una Xarxa d’Escrita i un Host en diverses versions, també de configuració o d’úsUnsecuredTCP, useUnsecuredWebsockets e useSSLWebsockets (usamos True, False, False). Criamos mais uma variável que irá guardar o 'caminho' para o canal, e uma altra para guardar, em String, o que serà enviat per al servidor (com totes com variàveis convertides) e então tentar publicar os dados no servidor using 'publish. single (tema, càrrega útil = tCàrrega, nom de l’amfitrió = mqttHost, port = tPort, tls = tTLS, transport = tTransport) '. A função então acaba e retorna para o loop principal.

#Envia channelID = "344243" #Canal criat per al grup apiKey = "1PK9ELK0L4AH8CVP" # Codi dado pelo ThingSpeak mqttHost = "mqtt.thingspeak.com" # configurações de comunicação useUnsecuredTCP = True useUsecseWebsSockets "tcp" tPort = 1883 tTLS = Cap si useUnsecuredWebsockets: tTransport = "websockets" tPort = 80 tTLS = Cap si useSSLWebsockets: import ssl tTransport = "websockets" tTLS = {'ca_certs': "/ etc / ssl / certs / ca- certificats.crt ", 'tls_version': ssl. PROTOCOL_TLSv1} tPort = 443 topic =" channels / "+ channelID +" / publish / "+ apiKey #Cria variavel com o 'caminho' for 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 all as variaveis em uma String per 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' except: print 'Erro ao enviar dados'

Pas 5: Configuració del servei web O

Configurant el servei web O
Configurant el servei web O

Per enviar-los als nostres serveis obtinguts al servei web, utilitzem una plataforma ThingSpeak. Per tal, entramos no site thingspeak.com e criamos uma conta. Após a criação e login na conta, nos dirigimos ao cabeçalho de menus -> Canais -> Meus Canais e então clicamos no botão "Novo Canal". Ao clicar, escolhemos o nome do Canal, escrivim uma descripció per a ele, e então decidimos quantos dos 8 campos possíveis utilitzaríamos. No cas, utilitzeu-nos 7.

Ao criar um canal, é gerado um ID do Canal, uma Chave de Escrita e uma Chave de Leitura. O ID do Canal se encontra abaixo do nome do canal e a Chave de Escrita na aba "Chaves". Per al codi Python enviat com a informació obtinguda per al canal, és necessari configurar-lo fins a l'ID del canal:

channelID = "Insira o ID do Canal aqui"

E também com a Chave de Escrita:

apiKey = "Insira a Chave de Escrita"

Alem da conexão com o canal criado, alsom são necessárias altres configurações no code in Python app.py:

useUnsecuredTCP = Verdader

useUnsecuredWebsockets = FalseuseSSLWebsockets = Fals mqttHost = "mqtt.thingspeak.com" si useUnsecuredTCP: tTransport = "tcp" tPort = 1883 tTLS = Cap si useUnsecuredWebsockets: tTransport = "websockets" tPort = tSport = 80 tTL websockets "tTLS = {'ca_certs':" / etc / ssl / certs / ca-certificats.crt ", 'tls_version': ssl. PROTOCOL_TLSv1} tPort = 443 topic =" channels / "+ channelID +" / publish / "+ apiKey

Per a una aplicació web realment recebada, per exemple, o valor Temperatura no camp 2 (camp que escollim per ser a Temperatura), és necessari indicar o "field2 =" + variável_temperatura, com no codi 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)

Tingut vinculat tots els dados del Canal a programação en Python, basta executar o codi que tots els dados escolhidos são enviados al Web Service. No ThingSpeak, es pot realitzar tot o monitoritzar els gràfics.

Recomanat: