Table des matières:
- Étape 1: Utilisation du matériel
- Étape 2: Montagem Do Hardware
- Étape 3: Micrologiciel Atmega328
- Étape 4: Programmation en Python
- Étape 5: Configurando O Web Service
Vidéo: Irrigações Automatizadas Com Web Service Utilizando Python : 5 étapes (avec images)
2024 Auteur: John Day | [email protected]. Dernière modifié: 2024-01-30 09:09
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 to uma estação weatherológica (No caso, estamos utilizando a da Faculdade de Engenharia de Sorocaba). Após adquiridos, os dados serão disponibilizados em uma aplicação web baseada em ThingSpeak.
Étape 1: Utilisation du matériel
Foi utilizado para a construção deste projeto:
1x Qualcomm Dragonboard 410c
1x mezzanine de capteur de graines Grove
1x capteur de graines d'eau
1x capteur Grove IMU 10OF v1.0
1x capteur de lumière du soleil v1.0
1x souris USB
1x USB Teclado
1x moniteur
1x Cabo HDMI
1x adaptateur HDMI-VGA
Accès aux données de l'estação météorologique FACENS
Étape 2: Montagem Do Hardware
Após conectar a placa Sensor Mezzanine à dragonboard, execute a ligação de acordo com o esquemático anterior, sendo:
1: Connexion directe entre le capteur Groove Sunlight v1.0.
2: +5V connecté à Vcc avec IMU-10DOF.
3: +5V e Gnd conectados aos pinos correspondantes do Water sensor.
4: GND IMU-10DOF.
5: SDA/SCL conectado ao pino correspondante do IMU-10.
6: Pino Sig do Capteur d'eau connecté à un pino 2.
Étape 3: Micrologiciel Atmega328
Através da Sensors Mezzanine, é possível acessar um microcontrolador Atmega328, o mesmo utilizado em plateformas Arduíno, e programá-lo diretamente, utilizando a IDE Arduíno instalada na DragonBoard. Vale ressaltar que a Mezzanine e a DragonBoard em conjunto possuem todo os periféricos necessários para 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 e operação dos mesmos, e após a aquisição dos dados, os encaminha via porta serial para a DragonBoard.
*Pode ser necessario a inclusão das bibliotecas utilizadas no firmware. Elas podem ser encontradas em:
imu-10DOF
Capteur de lumière solaire
O firmware utilizado pode ser encontrado aqui ou aqui:
Étape 4: Programmation en Python
Para o programa criado, foram necessários os seguintes imports: 'urllib2', 'json', 'time', 'serial', 'paho.mqtt.publish', 'psutil' et 'decimal'. Foram definidos duas funções ('comJSON' et 'semJSON') que serão explicadas mais tarde.
importer 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 (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 plus 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 #Passez au programme
Entrando no 'while(1)', inicializamos a variável 'jsonurl' como 'None'. Esta variável irá ouvrir une 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 é ouvrir o URL usando a função 'urllib2.urlopen(url)', podendo também adicionar um argumento 'timeout=X', sendo X uma quantidade em segundos limit para o URL ser aberto. Se o programa conseguir ouvrir une URL dentro do tempo do timeout, o programa irá realizar a função 'comJSON' mencionada anteriormente. Caso não consiga ouvrir une URL sans 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' est une fonction dérivée de '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 segundos si jsonurl n'est pas None: print 'Dados atualizados' comJSON(jsonurl) #Se conseguiu abrir o URL, mostra todos 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' temps.sommeil (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' (por exemplo '['ReturnDataSet']['sens_aver_6_5]') e então mostramos dados estes no.
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())
imprimer "\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']
imprimer 'Données:', données
print 'Velocidade do Vento:', vel_vento, 'm/s' print 'Umidade do ar:', umidade, '%'
#Convertir
vel_vento = decimal. Decimal(vel_vento.rstrip()) umidade = decimal. Decimal(umidade.rstrip())
O próximo passo é enviar todos esses dados coletados. Par ailleurs, précisez un ID do canal, un 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(sujet, payload=tPayload, hostname=mqttHost, port=tPort, tls=tTLS, transport=tTransport)'. Un função então acaba e 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 useUnsecuredWebsTransportsP =Fockets =UnsecuredWebspeaksP "tcp" tPort = 1883 tTLS = Aucun si useUnsecuredWebsockets: tTransport = "websockets" tPort = 80 tTLS = Aucun si 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) #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' sauf: print 'Erro ao enviar dados'
Étape 5: Configurando O Web Service
Pour obtenir des informations sur le service Web, en utilisant une plate-forme ThingSpeak. Para tal, entramos pas de site Thingspeak.com e criamos uma conta. Após a criação e login na conta, no dirigimos ao cabeçalho of 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 utilizaríamos. Pas de cas, 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 envie as informações obtidas para o canal é, necessário configurá-lo ao ID do Canal:
channelID = "Insira o ID do Canal aqui"
Et 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 necessárias outras configurações no código em Python app.py:
useUnsecuredTCP = True
useUnsecuredWebsockets = FalseuseSSLWebsockets = False mqttHost = "mqtt.thingspeak.com" si useUnsecuredTCP: tTransport = "tcp" tPort = 1883 tTLS = Aucun si useUnsecuredWebsockets: tTransport = "websockets" utilise "websockets" tSLPort = Aucun ifets Web websockets" tTLS = {'ca_certs':"/etc/ssl/certs/ca-certificates.crt", 'tls_version':ssl. PROTOCOL_TLSv1} tPort = 443 topic = "channels/" + channelID + "/publish/" + clé API
Para que a aplicação web realmente receba, por 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 executar o codigo que todos os dados escolhidos são enviados ao Web Service. No ThingSpeak, c'est possible de réaliser des suivis de graphiques.
Conseillé:
Howto: Installation de Raspberry PI 4 Headless (VNC) avec Rpi-imager et images: 7 étapes (avec images)
Howto: Installation de Raspberry PI 4 Headless (VNC) avec Rpi-imager et Pictures: Je prévois d'utiliser ce Rapsberry PI dans un tas de projets amusants sur mon blog. N'hésitez pas à y jeter un œil. Je voulais recommencer à utiliser mon Raspberry PI mais je n'avais pas de clavier ou de souris à mon nouvel emplacement. Cela faisait un moment que je n'avais pas installé de Raspberry
Intelligence artificielle et reconnaissance d'images à l'aide de HuskyLens : 6 étapes (avec images)
Intelligence artificielle et reconnaissance d'images à l'aide de HuskyLens : quoi de neuf, les gars ! Akarsh ici de CETech. Dans ce projet, nous allons jeter un œil au HuskyLens de DFRobot. Il s'agit d'un module de caméra alimenté par l'IA qui est capable d'effectuer plusieurs opérations d'intelligence artificielle telles que la reconnaissance faciale
Gesture Hawk : Robot contrôlé par gestes manuels utilisant une interface basée sur le traitement d'images : 13 étapes (avec images)
Gesture Hawk : Robot contrôlé par les gestes de la main utilisant une interface basée sur le traitement d'images : Gesture Hawk a été présenté dans TechEvince 4.0 comme une simple interface homme-machine basée sur le traitement d'images. Son utilité réside dans le fait qu'aucun capteur supplémentaire ou portable, à l'exception d'un gant, n'est requis pour contrôler la voiture robotique qui fonctionne sur différents
Comment démonter un ordinateur avec des étapes et des images faciles : 13 étapes (avec des images)
Comment démonter un ordinateur avec des étapes et des images faciles : Il s'agit d'instructions sur la façon de démonter un PC. La plupart des composants de base sont modulaires et facilement démontables. Cependant, il est important que vous soyez organisé à ce sujet. Cela vous aidera à éviter de perdre des pièces, et aussi à faire le remontage ea
Horloge d'animation SMART LED connectée au Web avec panneau de commande Web, synchronisation du serveur de temps : 11 étapes (avec images)
Horloge d'animation SMART LED connectée au Web avec panneau de commande Web, synchronisation du serveur de temps : l'histoire de cette horloge remonte à plus de 30 ans. Mon père a lancé cette idée quand j'avais à peine 10 ans, bien avant la révolution des LED - à l'époque où les LED atteignaient 1/1000 de la luminosité de leur éclat aveuglant actuel. Une véritable