Layer 1 DETImótica logo DETImótica


Alt text


Microcontrolador

Dadas as suas capacidades de input/output, comutação, e memória e também o facto de existirem unidades disponíveis para requisição no armazém de componentes do DETI MakerLab, o microcontrolador escolhido para o desenvolvimento deste projeto foi o LoPy versão 1:

A release de firmware utilizada foi a ‘1.18.2’, com a versão ‘v1.8.6-849-07a52e4’.

No entanto, estudantes e docentes do departamento poderão utilizar qualquer microcontrolador para efetuar instalações em novas salas no futuro, bastando para isso seguirem a especificação contida nas secções seguintes deste documento.

Sensores instalados

Em cada montagem foram instalados os seguintes sensores:

Sensor Métrica Precisão Comunicação Alimentação  
LMV324 (SEN-12642) Som (dB) Medições Analógicas 5V  
TSL2561 Luminosidade (lux) I2C 3.3V  
BME860 Temperatura (ºC) +- 1ºC I2C 3.3V  
  Humidade (%RH) +- 3%RH      
  Pressão (hPa) +- 1hPa      
  Indoor Air Quality (Índice - Gases VOC)      

Listagem de sensores requisitados e instalados

Adicionalmente, é registado ainda o número de dispositivos BLE visíveis dentro do alcance do módulo Bluetooth integrado no LoPy.

Durante o desenvolvimento foi também instalado e programado com sucesso um sensor de temperatura e humidade DHT-11.

Foi igualmente preparado código-fonte para um sensor de concentração de gás Dióxido de Carbono MG812, que não foi possível instalar.

No entanto, a plataforma é dinâmica e não restringe os tipos de sensores que podem ser utilizados, pelo que cada montagem futura poderá possuir um conjunto distinto de sensores.

Montagem

As duas montagens exemplo preparadas ao longo do desenvolvimento do projeto foram realizadas de acordo com o seguinte diagrama:

Alt text Diagrama de montagem dos módulos de sensorização integrados

De notar a necessidade de utilização de uma pequena placa de alimentação externa para o(s) sensor(es) que necessitem de input de 5V não fornecido pelo microcontrolador. Por conseguinte, é importante que os sinais de output desses sensores sejam sujeitos a um divisor de tensão de forma a limitar a voltagem a 3.3V e proteger o LoPy.

Configuração e Utilização

O código-fonte de um módulo sensorial é dividido em duas partes lógicas:

A listagem e configuração dos sensores é realizada no ficheiro auxiliar ‘conf.json’.

Cada sensor instalado poderá disponibilizar várias métricas ao sistema, sendo que todas necessitam de ser registadas através de pedido à equipa de administração (que utiliza a plataforma de gestão para esse efeito).

Após o registo é fornecido, para cada métrica, um par ‘ID / Chave de encriptação’ que deverá ser introduzido no ficheiro supracitado conforme o exemplo seguinte.

{
    "isu_id": "cc2f8ad2-e719-4366-a157-5463c9097dfc", // UUID do módulo
    "modules": [
    {
      "name": "tsl2561",
      "active": true,
      "wait_time": 6000, // em milisegundos
      "metrics": {
        "lux": {         // nome arbitrário - denomina uma métrica
             "id": "bb60686d-614a-43af-bf51-cc41477326d9", // UUID da métrica
             "key": "ck5PZQLoy0DleIYQkoRvkw==" // Chave AES-128
          },
         // ...
      }
    }, 
    // ...
}

Exemplo de configuração do ficheiro conf.json

Após ter adicionado um novo sensor ao ficheiro de configuração, a programação da lógica de obtenção de medições do mesmo é feita através da adição de um novo ficheiro python no diretório sensors com o nome configurado no campo name.

Seguindo a configuração acima como exemplo, o código associado ao sensor é colocado em ‘sensors/tsl2561.py’.

Durante o seu processo de inicialização, o microcontrolador tenta importar todos os ficheiros associados a sensores que constem no ficheiro de configuração e executa uma vez o método setup de cada um deles. Posteriormente, o método loop será invocado repetidamente com o intervalo configurado em wait_time.

from lib.tsl2561_driver import *
lux_sensor = None

def setup(dm):
   global lux_sensor
   lux_sensor = device()
   lux_sensor.init()

def loop(dm): # Recebe 'dm' como argumento para poder publicar telemetria
   value = lux_sensor.getLux()
   print("Lux value: " + str(value))
   dm.publish("lux", value) # nome 'lux' é traduzido pelo ID no conf.json

Exemplo de programação da lógica de obtenção de dados de um sensor

A telemetria poderá ser publicada com o auxílio do objeto detimotic (dm) fornecido como argumento às funções. Para tal basta indicar o valor a enviar e o nome da métrica correspondente, já que um sensor pode dispor de várias métricas associadas. O nome é depois traduzido automaticamente pelo ID equivalente.

Resumindo, as acções necessárias para a adição de um novo sensor à lógica de execução do microcontrolador são apenas:

De forma a assegurar um elevado nível de parametrização, o ficheiro detimotic_conf.json (exemplificado em baixo) permite a configuração de várias facetas da lógica de conexão e envio de informação.

{
  "wifi": {
    "ssid": "MakerLab",
    "passw": "p4ssw0rd"
  },
  "gateway": {
    "addr": "192.168.0.2",
    "uname": "detimotic",
    "passw": "mqtt_password",
    "port": 1883,
    "telemetry_topic": "telemetry",
    "ping_freq": 10000 // em milisegundos
  },
  "watchdog": 5000 // em milisegundos
}

Exemplo de configuração do ficheiro detimotic/detimotic_conf.json

Para assegurar a recuperação do funcionamento do módulo no caso de um erro imprevisto que seja fatal à lógica do mesmo, é utilizado um watchdog timer que o reinicia e cujo limite é igualmente configurável.