Derivações da EMM

Como estudo de caso da capacidade de se modificar a EMM, vamos dar o seguinte exemplo:

Para o desenvolvimento do TDEF da estudante de engenharia física Marina, do curso da UFRGS, era necessário um sistema de aquisição e armazenamento de dados que funcionasse para 7 DHT22 e 1 LDR simultânemante. Para isso, ela apostou em hackear o sistema das EMM.
Foi necessário hackear o sistema em 2 níveis: firmware e hardware. Como neste caso não foi usado a plataforma de armazenamento de dados online, não foi necessário fazer alterações a nível de software.

Hardware

Para sorte da Marina, havia uma placa de controle "sobrando", então não foi necessário fresar uma nova. No caso de quem precisar fazer uma nova, é possível fazer as edições diretamente no KiCAD. Para quem deseja fazer edições numa placa já pronta, continue lendo a história.

A placa foi desenhada para receber 8 diferentes sensores conectados com RJ11. Caso não faça questão do uso desses conectores, pode-se usar os pinos restantes. São eles:

Sensor 1, Sensor 2 e Sensor 3

Estas três conexões foram preparadas para serem adaptadas. Possuem barramentos que, com o uso de um jumper, uma simples conexão, podem ter a alimentação do sensor alterada entre 3.3V e 5V, e ter o pino do arduino também alterado entre analógico e digital.

Conexão - Nome na placa Opção de pino no Arduino Etiqueta no esquemático Comentário
Sensor 1 A3 ou D2 Sensor 1A ou Sensor 1D/INT "INT" significa que está conectado em um pino de interrupção
Sensor 2 A2 ou D3 Sensor 2A ou Sensor 2D/INT "INT" significa que está conectado em um pino de interrupção
Sensor 3 A1 ou D5 Sensor 3A ou Sensor 3D -

Sensor 4, Sensor 5 e BMP

Estas 3 conexões estão preparadas para receber sensores I2C, comunicação usada pelo BMP085 (180). Pode estar conectado ao 5V ou ao 3.3V. Estes sensores estão conectados a separadores lógicos, transistores, e também a conexão do RTC. Caso seja necessário editar estas trilhas, é sugerido estudar mais detalhadamente o esquemático, ou entrar em contato com a desenvolvedora. A comunicação I2C permite que mais de um sensor esteja conectado ao mesmo pino, por isso estes 4 usam os mesmos pinos.

DHT e LDR

As duas conexões restantes foram nomeadas como "DHT" e "LDR", pois foram preparadas para receber os sensores do tipo DHT e LDR, respectivamente. Por isso não possuem opção de troca na alimentação ou no tipo de pino.

Conexão - Nome na placa Opção de pino no Arduino Etiqueta no esquemático Comentário
DHT D4 DHT -
LDR A0 LDR -

Tabela com a relação de pinos e conexões.

Pino Sensor Comentários
A0 LDR -
A1 Sensor 3A Opção 3.3/5V
A2 Sensor 2A Opção 3.3/5V
A3 Sensor 1A Opção 3.3/5V
A4 SDA5V/RTC Comunicação I2C
A5 SCL5V/RTC Comunicação I2C
D0 DADOS1 Comunicação com nodeMCU
D1 DADOS2 Comunicação com nodeMCU
D2 SENSOR1D/INT Opção 3.3/5V, INT = interrupção
D3 SENSOR2D/INT Opção 3.3/5V, INT = interrupção
D4 DHT -
D5 SENSOR3D Opção 3.3/5V

Firmware

Neste exemplo um mesmo tipo de sensor foi adicionado repetidamente. Caso um novo sensor seja adicionado, mais alterações devem ser feitas. Firmware é o código implementado no microcontrolador, é um intermediário entre soft, macio, e hard, duro. É o soft que vai no hard, é um firm, um firme. São um conjunto de arquivos, maior parte bibliotecas externas dos próprios sensores e escritas pelos(as) desenvolvedores(as) do CTA, que definem o funcionamento dos microprocessadores. Os arquivos do meteorolog são referentes aos firmwares do Arduino, enquanto os arquivos do esplogger são referentes ao esp.

Meteorolog

Para adicionar sensores iguais, não é necessário alterar os arquivos abrigomet.ino, utils.h, utils.cpp, boardcommands.cpp, boardcommands.h nem as bibliotecas próprias de cada sensor E MÓDULO. Apenas as bibliotecas mysensors.h e mysensors.cpp serão alteradas.

mysensors.cpp

Nesta biblioteca é onde é feita a configuração de todos os sensores. Segue o exemplo das alterações feitas para o caso de adicionar mais sensores DHT22.

1. Na seção "DHT 22 Setup":
  • Foi adicionado a inicialização dos sensores:

#define DHTTYPE DHT22
#define DHTPINA 2
DHT dhta(DHTPINA, DHTTYPE);

2. Foi adicionado a chamada para as funções (no caso de adicionar sensores diferentes aos já existentes na EMM, aqui seria o local onde suas funções seriam chamadas):

String read_DHT22_TEMP() {
return FloatToString(dht.readTemperature());
}
String read_DHT22_AH() {
return FloatToString(dht.readHumidity());
}

3. Em "void mysensors_setup()", foi adiciounado o "dhta.begin()" para todos os DHTs adicionais.
  • No caso de sensores novos, a inicialização da comunicação.

mysensors.h

Aqui são definidos os apelidos dos sensores, ou seja, as letras que serão enviadas pela serial e que irão retornar os valores medidos. Aqui é onde deve ser adicionado o apelido do novo sensor, ou retirado a parte de sensores que não serão usados.
Importante para as seguintes alterações é que o DHT é 1 sensor que faz 2 tipos de medida (umidade relativa e temperatura), os apelidos adicionados a seguir são referentes a cada tipo de medida realizada.

  1. Logo no início do código as variáveis de apelido devem ser definidas como string. Por isso deve ser adicionado "String read_APELIDO()". Exemplo: read_DHT22_AH(), onde "DHT22_AH" é o apelido da medida.
  2. Em "_SENSOR_COUNT", adicionar o número de apelidos (medidas) adicionadas .
  3. Em __SENSOR_NICKNAMES, adicionar o apelido do apelido, a letra pela qual cada medida será invocada na serial. O de luminosidade é "l", de temperatura do DHT é "t", o de umidade relativo do ar do DHT é "ah", etc.
  4. Em __SENSOR_NAMES adicionar cada apelido na íntegra (que serão os mesmos chamados nas funções), por exemplo "DHT22_AH", ou "DHT22_TEMP".
  5. Em __FP_READ_SENSOR adicionar "&read_APELIDO".
    • Importante nestas 3 últimas medidas é adicionar os apelidos na mesma ordem, pois "SENSOR_NICKNAMES", "SENSOR_NAMES" e "FP_READ_SENSOR" são vetores e a posição de cada apelido no vetor importa.

Replicar estas alterações para cada novo sensor adicionado.

Esplogger

(As seguintes dicas carecem de testes mais profundos)

Estes arquivos se referem a comunicação entre o ESP, o nodeMCU, e o Arduino. É necessário fazer alterações apenas no meteorologger.cpp

meteorologger.cpp
  1. Adicionar os novos apelidos e os apelidos dos apelidos a partir da linha 312, dentro do "else if". No exemplo os apelidos são "DHT22_TEMP" e "DHT22_AH" e os apelidos dos apelidos são "t" e "ah", respectivamente:

else if (sensor_name == " t ") {
root_sensors[" DHT22_TEMP" ] = value;
}
else if (sensor_name == " ah ") {
root_sensors[" DHT22_AH "] = value;
}

Esta história se baseia em fatos reais. Mais detalhes nesta tarefa.