Cuprins:

Irrigações Automatizadas Com Web Service Utilizând Python: 5 pași (cu imagini)
Irrigações Automatizadas Com Web Service Utilizând Python: 5 pași (cu imagini)

Video: Irrigações Automatizadas Com Web Service Utilizând Python: 5 pași (cu imagini)

Video: Irrigações Automatizadas Com Web Service Utilizând Python: 5 pași (cu imagini)
Video: Manage Multi Container Apps with #dockercompose | #CloudNativeNinja PT4 2024, Iulie
Anonim
Irrigações Automatizadas Com Web Service Utilizando Python
Irrigações Automatizadas Com Web Service Utilizando Python

În acest proiect dezvoltăm un sistem de monitorizare pentru plante, care va obține date de umiditate relativă ar, presiune atmosferică, temperatură ar, incidență UV, viteză a vântului și condiție da plantă (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 using a da Faculdade de Engenharia de Sorocaba). Após dobândiți, vor fi disponibilizați pe uma aplicație web bazată pe ThingSpeak.

Pasul 1: Utilizare hardware

Hardware Utilizat
Hardware Utilizat

A fost folosit pentru o construcție a acestui proiect:

1x Qualcomm Dragonboard 410c

1x Senzor de semințe Grove Mezanin

1x senzor de semințe de apă

1x IMU 10OF Grove Sensor v1.0

1x Sunlight Grove Sensor v1.0

1x mouse USB

1x Teclado USB

1x Monitor

1x Cabo HDMI

1x adaptor HDMI-VGA

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

Pasul 2: Montagem Do Hardware

Montagem Do Hardware
Montagem Do Hardware

Apoi conectează o placă Sensor Mezzanine à dragonboard, execute a ligação de acord com o esquemático anterior, sendo:

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

2: + 5V conectat ao Vcc do IMU-10DOF.

3: + 5V e Gnd conectați la pinii corespondenți ai senzorului de apă.

4: GND IMU-10DOF.

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

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

Pasul 3: Firmware Atmega328

Através da Sensors Mezzanine, este posibil să acceseze un microcontrolator Atmega328, sau chiar folosit cu platforme Arduíno, și program-direct, folosind un IDE Arduíno instalat pe DragonBoard. Vale ressaltar that a Mezzanine e a DragonBoard em conjunto possuem all os periféricos necessários for a programation and gravação do firmware no microcontrolador.

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

* Puteți fi necesar să includeți bibliotecile folosite fără firmware. Elas putem fi găsite în:

imu-10DOF

Senzor de lumină solară

Firmware-ul folosit poate fi găsit acviu sau acviu:

Pasul 4: Programarea Em Python

Programarea Em Python
Programarea Em Python

Pentru programul creat, pentru necesitățile următoarelor importuri: 'urllib2', 'json', 'time', 'serial', 'paho.mqtt.publish', 'psutil' e 'decimal'. Foram definidos duas funções ('comJSON' e 'semJSON') that 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.publish as publish #para publicar import psutil #para configurar o url import decimal #para converter

O primul pas este gravar em uma variável o endereço de unde serão obtidos os dados da Estação Meteorológica (no caso estamos gravando na variável 'url'). Am urmărit, inițializăm două variante ('i' e 'j'), folosind 'i' pentru a-ți da mai multe atuuri de Array care sunt receber via JSON (ca o poziție mai recentă de Array va fi 49, inițializați 'i' ca 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 program

Intrând nu 'while (1)', inițializăm o varietate 'jsonurl' ca 'None'. Această variabilă va deschide un URL JSON, portant al inițializării ei fără inițiativa de a face 'while', suntem reinițializați de fiecare dată când repetăm o buclă. Următorul pas se deschide o URL folosind o funcție 'urllib2.urlopen (url)', putând adăuga și un argument 'timeout = X', fiind X uma cantitate după doi limite pentru URL-ul deschis. Dacă programul va putea deschide o adresă URL în timp și timp de expirare, programul va realiza o funcție „comJSON” menționată anterior. Caso não consiga pentru a deschide o adresă URL fără un timp estipulat, realizează-se o funcție '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 explica somente a '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 maximum 5 segundos if jsonurl is not None: print 'Dados atualizados' comJSON (jsonurl) #Se conseguiu deschide URL, show all os 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 prima linie da funcția 'comJSON', recebemos all os dados da URL já abertos numa variável 'dados'. Aceasta este receber um obiect cu com Arrays, das quais iremos somente use uma ('ReturnDataSet'). Realizada esta operação, iremos então initializar o Serial do Arduíno e ler as linhas (readline ()) that 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 accessando os sensores específicos dentro do object 'dados' (de exemplu '[' ReturnDataSet '] [' sens_aver_6_5] ') e então mostramos these novos dados na tela toom.

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) # inițializa o variabilă care recebă 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 ())

tipăriți „\ 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']

tipăriți „Date:”, date

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

#Convertește

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

Următorul pas este trimis tuturor esențelor coletate. Pentru a fi, precisamos colocar a ID do canal, a Chave de Escrita e o Host em variáveis, alem 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 altă pentru guardar, em String, o care va fi trimis pentru server (cu toate ca variabile convertite) și pentru tentativ publicar os dados no server using 'publish. single (topic, payload = tPayload, hostname = mqttHost, port = tPort, tls = tTLS, transport = tTransport) '. A função então acaba e retorna for o loop principal.

#Envia channelID = "344243" #Canal criado para o grupo apiKey = "1PK9ELK0L4AH8CVP" # Código dado pelo ThingSpeak mqttHost = "mqtt.thingspeak.com" # configurações de comunicação useUnsecuredTCP = True useUsecseWebsSets "tcp" tPort = 1883 tTLS = Niciuna dacă useUnsecuredWebsockets: tTransport = "websockets" tPort = 80 tTLS = Niciuna dacă useSSLWebsockets: import ssl tTransport = "websockets" tTLS = {'ca_certs': "/ etc / ssl / certs / ca- certificate.crt ", 'tls_version': ssl. PROTOCOL_TLSv1} tPort = 443 topic =" channels / "+ channelID +" / publish / "+ apiKey #Cria variavel com o '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 toate as variaveis em uma String for 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' cu excepția: print 'Erro ao enviar dados'

Pasul 5: Configurarea serviciului web O

Configurarea serviciului web O
Configurarea serviciului web O

Pentru a trimite date obținute la serviciul web, utilizăm o platformă ThingSpeak. Pentru 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, escrevemos uma descrição para ele, e então decidimos quantos dos 8 campos possíveis utilizaíamos. Nu este cazul, utilizăm 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". Pentru codul Python, ca informație obținută pentru canal, este necesar configurarea ID-ului Canalului:

channelID = "Insira o ID do Canal aqui"

De asemenea, com cu Chave de Escrita:

apiKey = "Insira a Chave de Escrita"

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

useUnsecuredTCP = Adevărat

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

Pentru a aplica aplicația web cu adevărat receba, de exemplu, o valoare Temperatura nu câmpul 2 (câmpul care trebuie să fie pentru a Temperatura), este necesar indicarea o "câmp2 =" + variável_temperatura, ca și codul următor:

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 to programation in Python, basta executare sau cod care toți os dados scolhidos são enviados ao Web Service. No ThingSpeak, este posibil să realizeze totul sau să monitorizeze graficele.

Recomandat: