Rozpoczęcie inteligentnego domu - Projeto Final: 6 kroków
Rozpoczęcie inteligentnego domu - Projeto Final: 6 kroków
Anonim
Rozpoczęcie inteligentnego domu - Projeto Final
Rozpoczęcie inteligentnego domu - Projeto Final

Projeto apresentado é parte do projeto final do curso de IoT aplicado Smart Home

O projeto mostrado a seguir é parte do projeto final a ser apresentado no curso de IoT aplicada a Smart Home, que Constante de sensores e atuadores conectados na DrangonBoard + Linker Mezzanine, um aplicativo desenvolvido com o ionic (a ser incluido em as) informações/dados das „coisas” serão salvados na cloud da AWS. Para uma primeira iteração com a DragonBoard i IoT um todo, decidiu-se fazer um sistema de acendimento automático de luzes, com um sensor de luminosidade, uma chave liga/desliga para ativar um aparelho do de acordo temperatura wstępna -setada e um sensor de proximidade que será instalado no portão de uma garagem, com a intenção de informar ao proprietário da casa se o portão encontra-se aberto ou fechado.

Krok 1: Materias Necessários

Niezbędne materiały
Niezbędne materiały
Niezbędne materiały
Niezbędne materiały
  1. Umieść DragonBoard.
  2. 96Boards Linker Mezzanine
  3. Sensor de luminozidade (LDR) que acompanha a Linker Mezzanine.
  4. Sensor de temperatura que acompanha a Linker Mezzanine.
  5. Botão touch que acompanha a Linker Mezzanine.
  6. Relé acompanha a Linker Mezzanine, utlizado para ligar o systema de A/C.
  7. LED acompanha a Linker Mezzanine, que representará a iluminação a ser ativada.
  8. Instalação das bibliotecas citadas no passo 5.

Krok 2: Sensory, Atuadores E Conexões

Sensores, Atuadores E Conexões
Sensores, Atuadores E Conexões
Sensores, Atuadores E Conexões
Sensores, Atuadores E Conexões

1. Antresola linkera:

Será necessário conectar a placa Mezzanine na dragonboard. Para detalhes, link do konsultanta

2. Lunozydada czujnika (LDR)

O sensor é parte do Kit da Linker Mezzanine e deverá ser conectado na entrada ADC1. Para detalhes técnicos:

3. Czujnik temperatury

O sensor é parte do Kit da Linker Mezzanine e deverá ser conectado na entrada ADC2. Para detalhes técnicos:

4. Dotyk Botao

O sensor é parte do Kit da Linker Mezzanine e deverá ser conectado na entrada D1. Este botão irá ligar/desligar o sistema como um todo. O acesso a este botão é somente local. Para detalhes técnicos:

5. Relé

O relé é parte do Kit da Linker Mezzanine e deverá ser conectado na entrada D2. Ele será utiizado para ligar/desligar o sistema de A/C. Para detalhes técnicos:

6. LED

O LED jest częścią zestawu z Linker Mezzanine i jest połączony z wejściem D4. O LED reprezentuje system iluminacji uma casa, seja algum comodo interno da casa lub externo, como a iluminação de um jardim. Jeśli chcesz skorzystać z opornika 10k ohm, który jest seryjnie, możesz korzystać z odpowiedniego systemu, więc możesz sprawdzić wcześniejsze konfiguracje jako portas analogowych. Para detalhes técnicos:

7. Sensor de contato magnético

Este czujnik może łączyć się z częścią i nie mieć fazy części do zestawu da Linker Mezzanine. Ele será usado em uma janela ou no portão de uma garagem para informar se a janela/garagem está aberta lub fechada. O sensor é um conjunto formado por 2 pequenas peças (ver foto do Step acima), o sensor propprimamente dito e um pequeno "imã", que ao aproximar-se do sensor irá alterar o estado do sensor. O sensor utlizado neste projeto foi um N/A (normalmente aberto). Quando o imã não está próximo do sensor, o sensor reportará estado aberto. Quando o imã estiver próximo do sensor, o estado reportado será fechado.

Krok 3: Aplicativo Para Controle Remoto

Aplicativo Para Controle Remoto
Aplicativo Para Controle Remoto

O aplicativo foi desenvolvido com o Ionic Framework, https://ionicframework.com/. Será necessário fazer o pobrać e a instalação da ultima versão.

O aplicativo irá se comunicar (ler e atualizar os dados) com a cloud da AWS (AWS IoT- https://aws.amazon.com/iot/), que posteriormente será acessada pela placa dragonboard para atualização dos status dos sensores e atuadores.

- Sistema de Iluminação mostra o estado do sitema de iluminação, ligado ou desligado. Quando o nível de luminosidade baixar do valor configurado, jako luzes se acenderão automaticamente. Quando a intensidade de luz aumentar alem do valor definido, jako luzes se apagarão.

- O botão A/C acionará o relé, que por sua vez acionará o sistema de A/C da casa. Também é possível definir o valor desejado da temperatura. Assim que a temperatura da casa estiver maior do que a temperatura de acionamento, o A/C será ligado e permanecerá ligado até a temperatura abaixar em 2 graus da tempreatura definida. Por exemplo, iremos thoughtar que a temperatura é de 23 graus. Quando a temperatura interior chegar a 24 graus, o A/C será ligado e permanecerá ligado até a temperatura chegar a 20 graus, desligando então. Depois o ciclo se repetirá.

- Garagem informará a atual posição da garagem, se aberta ou fechada.

- Temperatura é apenas informativa e mostra a temperatura do interior da casa.

- Luminosidade é apesas informativa e mostra o valor da luminosidade atual.

Segue em anexo os arquivos home.html i home.ts treści o kody do komunikacji z chmurą AWS i atualização do aplikacji.

Krok 4: Criando Uma „coisa” Na AWS IoT

Criando Uma
Criando Uma

Para fazer o setup do IoT na AWS, os seguintes passos deverão ser seguidos:

1) Criar um projeto no AWS IoT atravé do link:

2) Clique „stwórz rzecz” e então, „Stwórz jedną rzecz”. Dê o nome do projeto e clique em Dalej.

3) Na tela seguinte, clique em "Stwórz rzecz bez certyfikatu". Nesse tutorial não iremos utilizar os certificados por questões práticas, porém não é recomendado fazer lub uso de IoT sem certificados.

4) Nesse momento, sua „coisa” já estará criada. Clique no botão da „coisa” que foi criado para brir a tela com as opções. Nessa tela podemos ver os tópicosMQTT que podem ser usados para fazer atualizão dos dados serem enviados para a Could, assim como é uma ótima ferramenta para rozwiązywania problemów. No código em Python que será apresentado em breve, foram utlizados alguns destes tópicos. Nas opções também podemos ver a "shadow", que nada mais é que informação que está na dragonboard refletida na AWS Cloud.

Krok 5: Programowanie Em Pythona

Jako seguintes bibliotecas serão necessárias para a execução do programa:

import spidevimport czas import logowanie import json import argparse

z libsoc importuj gpio

od czasu import uśpienia z datetime import date, datetime z gpio_96boards import GPIO z AWSIoTPythonSDK. MQTTLib import AWSIoTMQTTClient z AWSIoTPythonSDK. MQTTLib

Segue abaixo código completo do programa:

import spidevimport czas import logowanie import json import argparse

z libsoc importuj gpio

od czasu import uśpienia z datetime import date, datetime z gpio_96boards import GPIO z AWSIoTPythonSDK. MQTTLib import AWSIoTMQTTClient z AWSIoTPythonSDK. MQTTLib import AWSIoTMQTTShadowClient

GPIO_CS = GPIO.gpio_id('GPIO_CS') #Port analogowy

PRZYCISK = GPIO.gpio_id('GPIO_A') RELE = GPIO.gpio_id('GPIO_C') LED = GPIO.gpio_id('GPIO_G')

szpilki = ((GPIO_CS, 'out'), (PRZYCISK, 'in'), (RELE, 'out'), (LED, 'out'),)

def setdevices(deltaMessagePython):

System_Status = deltaMessagePython['SystemStatus'] Rele_Status = deltaMessagePython['AC'] Led_Status = deltaMessagePython['SisIlumi']

##### AC

if Rele_Status == 1: gpio.digital_write(RELE, GPIO. HIGH)

jeśli Rele_Status == 0:

gpio.digital_write(RELE, GPIO. LOW)

##### System Iluminacji

if Led_Status == 1: gpio.digital_write(LED, GPIO. HIGH) if Led_Status == 0: gpio.digital_write(LED, GPIO. LOW)

def readadc(gpio):

gpio.digital_write(GPIO_CS, GPIO. HIGH)

time.sleep(0.0002) gpio.digital_write(GPIO_CS, GPIO. LOW) r = spi.xfer2([0x01, 0xA0, 0x00])#ADC2 - Temperatura gpio.digital_write(GPIO_CS, GPIO. HIGH) adcout = (r[1] << 8) & 0b1100000000 ogłoszenie = ogłoszenie | (r[2] & 0xff) adc_temp = (adcout *5,0/1023-0,5)*100

gpio.digital_write(GPIO_CS, GPIO. HIGH)

time.sleep(0.0002) gpio.digital_write(GPIO_CS, GPIO. LOW) r = spi.xfer2([0x01, 0x80, 0x00])#ADC1 - Jasność gpio.digital_write(GPIO_CS, GPIO. HIGH) adcoutldr = (r[1] << 8) & 0b1100000000 adcoutldr = adcoutldr | (r[2] & 0xff) adcoutldr = str(adcoutldr) now = datetime.utcnow() now_str = now.strftime('%Y-%m-%dT%H:%M:%SZ') temperatura = "{:.2f}".format(adc_temp) payload_temp = '{"state":{"desired": {"Luminosidade": ' + adcoutldr + ', "Temperatura": ' + temperatura + '}}}' myMQTTClient.publish ("$aws/things/DBpyAWS1116/shadow/update", payload_temp, 0) return r

def desliga():

gpio.digital_write(RELE, GPIO. LOW) gpio.digital_write(LED, GPIO. LOW)

def run(gpio):

stan_systemu = 1

podczas gdy prawda:

time.sleep(2) wartość_przycisku = gpio.digital_read(BUTTON) print ("----") time.sleep(0.25) if wartość_przycisku == 1: if system_status == 0: system_status = 1 else: system_status = 0 desliga () if system_status == 1: wartość = readadc(gpio) print "SYSTEM_STATUS %d" %system_status time.sleep(3)

class shadowCallbackContainer:

def _init_(self, deviceShadowInstance): self.deviceShadowInstance = deviceShadowInstance

# Niestandardowe wywołanie zwrotne w tle

def customShadowCallback_Delta(self, payload, responseStatus, token): print("Otrzymałem komunikat delta:") ### skrypt aktualizacji ładunku payloadDict = json.loads(payload) deltaMessage = json.dumps(payloadDict["stan"]) print "DELTA MESSAGE %s" %deltaMessage ### Żądanie aktualizacji zgłoszonego stanu newPayload = '{"state":{"reported":' + deltaMessage + '}}' deltaMessagePython = json.loads(deltaMessage) setdevices(deltaMessagePython)

spi = spidev. SpiDev()

spi.open(0, 0) spi.max_speed_hz = 10000 spi.mode = 0b00 spi.bits_per_word = 8

####### Definicja rzeczy

# Połączenie oparte na certyfikacie AWS IoT

myMQTTClient = AWSIOTMQTTClient("DBpyAWS1116") myMQTTClient.configureEndpoint("a28rqf8gnpw7g.iot.us-west-2.amazonaws.com", 8883) myMQTTClient.configureCredentials("/home/linaro/shareot-CAAWS/", "/home/linaro/shared/AWS/"SUA CHAVE"-private.pem.key", "/home/linaro/shared/AWS/"SEU CERTIFICADO"-certificate.pem.crt") myMQTTClient.configureOfflinePublishQueueing(- 1) # Nieskończone kolejkowanie publikowania w trybie offline myMQTTClient.configureDrainingFrequency(2) # Opróżnianie: 2 Hz myMQTTClient.configureConnectDisconnectTimeout(10) # 10 sek. myMQTTClient.configureMQTTOperationTimeout(5) # 5 sek #podłącz i opublikuj myMQTTClient.connect(). myMQTT"(myMQTT" coisajsb", "podłączony", 0)

########################

####### Definicja cieni

# Rozpocznij AWSIoTMQTTShadowClient

myAWSIoTMQTTShadowClient = Brak myAWSIoTMQTTShadowClient = AWSIoTMQTTShadowClient("DBpyAWS1116") myAWSIoTMQTTShadowClient.configureEndpoint("SEU END-POINT.us-west-2.amazonaws.com", 8883) myAWSIoTMQTTShadowClient.configureEndpoint("SEU END-POINT.us-west-2.amazonaws.com", 8883) myAWTShadowTMQ CA.crt", "/home/linaro/shared/AWS/"SUA CHAVE"-private.pem.key", "/home/linaro/shared/AWS/"SEU CERTIFICADO-certificate.pem.crt")

# Konfiguracja AWSIoTMQTTShadowClientmyAWSIoTMQTTShadowClient.configureAutoReconnectBackoffTime(1, 32, 20) myAWSIoTMQTTShadowClient.configureConnectDisconnectTimeout(10) # 10 sek myAWSIoTMQTTShadowClient.configureMQTTOperationTimeout(5) # 5 sek

# Połącz się z AWS IoT

myAWSIoTMQTTShadowClient.connect()

# Utwórz deviceShadow z trwałą subskrypcją

deviceShadowHandler = myAWSIoTMQTTShadowClient.createShadowHandlerWithName("DBpyAWS1116", True) shadowCallbackContainer_Bot = shadowCallbackContainer(deviceShadowHandler)

# Słuchaj na deltach

deviceShadowHandler.shadowRegisterDeltaCallback(shadowCallbackContainer_Bot.customShadowCallback_Delta)

#########################

myMQTTClient.publish("$aws/things/DBpyAWS1116/shadow/update", '{"state":{"desired": {"SystemStatus":1, "SisIlumi":0, "AC":0, "Garage": "Fechada", "Temperatura": 25, "Luminosidade": 123}}}', 0)

if _name_ == "_main_":

z GPIO(pinami) jako gpio: run(gpio)

Krok 6: Finalizacja

Finalizacão
Finalizacão

Após ter concluido os passos anteriores, deve-se inicializar o sistema executando o código fornecido no passo 5 e inicializar o app através do Ionic, usando o comando Ionic serve.

Aby móc rozwiązywać problemy, zalecamy korzystanie z funkcji TEST klienta MQTT do AWS, można ją zweryfikować jako wiadomość wysłaną przez smoka, który jest aktualizowany w formie zgodnej z AWS Cloud: