Sommario:
- Passaggio 1: utilizzo dell'hardware
- Passaggio 2: montaggio dell'hardware
- Passaggio 3: firmware Atmega328
- Passaggio 4: Programmazione in Python
- Passaggio 5: configurazione del servizio Web
Video: Irrigações Automatizadas Com Web Service Utilizando Python: 5 passaggi (con immagini)
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:04
Neste projeto iremos desenvolver um sistema de monitoramento para plantações, que irá obter dados de umiditàde relativa do ar, pressão atmosférica, temperature 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 per meio de um Web Service conectado à una stação meteorológica (Nessun caso, stamos utilizando a da Faculdade de Engenharia de Sorocaba). Ulteriori informazioni, altri dati disponibili sono disponibili in un'altra applicazione basata sul web in ThingSpeak.
Passaggio 1: utilizzo dell'hardware
Foi utilizado para a construção deste projeto:
1x Qualcomm Dragonboard 410c
1x soppalco con sensore di semi boschetto
1x sensore di semi d'acqua
1x sensore IMU 10OF Grove v1.0
1x sensore di luce solare v1.0
1x mouse USB
1x Teclado USB
1x monitor
1x cavo HDMI
1x adattatore HDMI-VGA
Acesso à dados da stação meteorológica FACENS
Passaggio 2: montaggio dell'hardware
Após conectar a placa Sensor Mezzanine à dragonboard, esegui una legatura di acordo com o esquemático anterior, sendo:
1: collegamento diretto al sensore Groove Sunlight v1.0.
2: +5V collegato a Vcc con IMU-10DOF.
3: +5V e Gnd conectados aos pinos corrispondenti al sensore dell'acqua.
4: GND IMU-10DOF.
5: SDA/SCL collegato a un pino corrispondente a IMU-10.
6: Pino Sig do Sensore dell'acqua collegato ao pino 2.
Passaggio 3: firmware Atmega328
Oltre a Sensors Mezzanine, è possibile accedere al microcontrollore Atmega328, o mesmo utilizza le piattaforme Arduíno, e programma direttamente, utilizzando un IDE Arduíno installato su DragonBoard. Vale la ressaltar di un Mezzanine e di un DragonBoard in combinazione con le periferiche necessarie per la programmazione e la gravità del firmware senza microcontrollore.
Il firmware embarcado è responsabile della realizzazione delle impostazioni dei sensori, della gestione dei protocolli di comunicazione e dell'operatività dei mesmos, e dell'acquisizione di dati, encaminha tramite porta seriale per DragonBoard.
*Pode ser necessario a inclusão das bibliotecas utilizadas no firmware. Elas podem ser encontradas em:
imu-10DOF
Sensore di luce solare
O firmware utilizado pode ser encontrado aqui ou aqui:
Passaggio 4: Programmazione in Python
Para o programa criado, foram necessá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.publish as publish #para publicar import psutil #para configurar 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 (nessun caso estamos gravando na variável 'url'). Segueda, 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' comeo 49) e 'j' para contar 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 stação
i = 49 #Para pegar os dados mais atuais da stação
j = 0 #Passo al programma
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 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', send X uma quantidade em segundos limit para o URL ser aberto. Se o programa conseguir abrir a URL dentro do tempo do timeout, o programa irá realizar a função '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 come diferença os dados da estação ('comJSON' irá mostrar e enviar os dados da estação, enquanto 'semJSON' não). Como 'semJSON' é una funzione derivata da 'comJSON'. Iremos explicar 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 máximo 5 secondi se jsonurl non è Nessuno: print 'Dados atualizados' comJSON(jsonurl) #Se conseguiu abrir o URL, mostra tutti i dati eccetto: se jsonurl è 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' ora.sonno (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 sta operação, iremos então inicializar o Serial do Arduíno e ler as linhas (readline()) que o Arduíno sta imprimindo e jogando as Strings convertiti in variáveis e, então, mostrando i dati sulla tela. Ricevere i dati di Arduíno, ricevere i dati della stazione, semplicemente accedendo ai sensori specifici all'interno dell'oggetto 'dati' (per esempio '['ReturnDataSet']['sens_aver_6_5]') e mostrati come nuovi dati.
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 dodos do Arduíno #Recebe os dodos do Arduíno ardAgua = int(ard.readline().rstrip()) ardTemp = float(ard.readline().rstrip()) ardPres = int(ard.readline ().rstrip()) ardUV = float(ard.readline().rstrip())
stampa "\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 stação data = dados['ReturnDataSet']['f_date'] vel_vento = dados['ReturnDataSet']['sens_aver_6_5'] umidode = dados['ReturnDataSet']['sens_aver_19_507']
stampa 'Dati:', dati
print 'Velocidade do Vento:', vel_vento, 'm/s' print 'Umidade do ar:', umidode, '%'
#Converti
vel_vento = decimal. Decimal(vel_vento.rstrip()) umidode = 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). Non è più possibile modificare se si guarda o 'caminho' per il canale, e se si desidera salvare per salvare, em String, o se si desidera per o servidor (comunque come variáveis convertidas) e si tenta di pubblicare tutti i dati senza servidor usando 'publish. single(topic, payload=tPayload, hostname=mqttHost, port=tPort, tls=tTLS, transport=tTransport)'. A função então acaba and retorna para 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 useUnsecuredWebsecuredPsockets = False use =Use falso "tcp" tPort = 1883 tTLS = Nessuno se useUnsecuredWebsockets: tTransport = "websockets" tPort = 80 tTLS = Nessuno se useSSLWebsockets: import ssl tTransport = "websockets" tTLS = {'ca_certs':"/etc/ssl/certs certificates.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) #Organizza tutto come varia in base all'ordine String per l'ambiente print 'Invia i dati' prova: publish.single(topic, payload=tPayload, hostname=mqttHost, port=tPort, tls=tTLS, transport=tTransport) #Envia os dados time.sleep(0.5) print 'Dados enviados' tranne: print 'Erro ao enviar dados'
Passaggio 5: configurazione del servizio Web
Per cercare di ottenere dati da un servizio Web, utilizzare una piattaforma ThingSpeak. Para tal, entramos no site thingspeak.com e criamos uma conta. Se si desidera effettuare il login e si accede a un contatto, non è necessario modificare i menu -> Canais -> Meus Canais e non è possibile fare clic su "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. Nessun caso, utilizamos 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". Para que o código Python invidia come informações obtidas para o canal é, necessário configurá-lo ao ID do 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 necessarias outras configurações no code in Python app.py:
useUnsecuredTCP = True
useUnsecuredWebsockets = FalseuseSSLWebsockets = False mqttHost = "mqtt.thingspeak.com" if useUnsecuredTCP: tTransport = "tcp" tPort = 1883 tTLS = Nessuno se useUnsecuredWebsockets: tTransport = "SLSLsockets" tPort = 80 use tSTLSTransport = Nessuno websockets" tTLS = {'ca_certs':"/etc/ssl/certs/ca-certificates.crt", 'tls_version':ssl. PROTOCOL_TLSv1} tPort = 443 topic = "channels/" + channelID + "/publish/" + apiKey
Per quanto riguarda l'applicazione al web, è necessario che la temperatura non sia del campo 2 (campo que escolhemos para ser a Temperatura), è necessario indicare "field2="+variável_temperatura, come non sapere se segui:
tPayload = "field1=" + str(ardAgua) + "&field2=" + str(ardTemp) + "&field3=" + str(ardPres) + "&field4=" + str(ardUV) + "&field5=" + str(data) + "&field6=" + str(vel_vento) + "&field7=" + str(umidade)
Tenete a bada tutti i dati del canale in programmazione in Python, basta eseguire il codice di tutti i dati riservati agli utenti e ai servizi Web. No ThingSpeak, è possibile realizzare tutto o monitorare i grafici.
Consigliato:
ESP8266 POV Fan con aggiornamento del testo dell'orologio e della pagina Web: 8 passaggi (con immagini)
ESP8266 POV Fan con aggiornamento del testo dell'orologio e della pagina Web: si tratta di una velocità variabile, POV (Persistence Of Vision), Fan che visualizza a intermittenza l'ora e due messaggi di testo che possono essere aggiornati "al volo". è anche un web server a pagina singola che ti permette di cambiare i due messaggi di testo
Striscia LED controllata da sito Web/WiFi con Raspberry Pi: 9 passaggi (con immagini)
Striscia LED controllata da sito Web/WiFi con Raspberry Pi: Background: Sono un adolescente e negli ultimi anni ho progettato e programmato piccoli progetti di elettronica, oltre a partecipare a concorsi di robotica. Di recente stavo lavorando all'aggiornamento della configurazione della mia scrivania e ho deciso che una bella aggiunta
Come smontare un computer con semplici passaggi e immagini: 13 passaggi (con immagini)
Come smontare un computer con semplici passaggi e immagini: questa è un'istruzione su come smontare un PC. La maggior parte dei componenti di base sono modulari e facilmente smontabili. Tuttavia è importante che tu sia organizzato al riguardo. Questo ti aiuterà a non perdere parti e anche a rendere più facile il rimontaggio
Smart Lock magnetico con colpo segreto, sensore IR e app Web: 7 passaggi (con immagini)
Serratura magnetica intelligente con tocco segreto, sensore IR e app Web: se ti piace questo progetto seguimi su Instagram e YouTube. In questo progetto costruirò una serratura magnetica per il mio ufficio a casa, che si apre se conosci il bussare segreto. Oh… e avrà anche qualche altro asso nella manica. Magnete
Orologio con animazione LED SMART connesso al Web con pannello di controllo basato sul Web, server dell'ora sincronizzato: 11 passaggi (con immagini)
Orologio con animazione LED SMART connesso al Web con pannello di controllo basato sul Web, server dell'ora sincronizzato: la storia di questo orologio risale a molto tempo fa, più di 30 anni. Mio padre è stato il pioniere di questa idea quando avevo solo 10 anni, molto prima della rivoluzione dei LED, quando i LED erano 1/1000 della luminosità della loro attuale brillantezza accecante. Un vero