O dispositivo deve:
Ser alimentado por carregador USB;
Ter uma ou duas baterias CR2477 que suporte sua atividade durante um mínimo de 24 horas caso falte energia elétrica, e que a bateria seja sempre mantida com carga;
Obter o nível médido de ruído durante 10 segundos;
Obter a temperatura;
Obter a luminosidade;
Enviar as leituras para uma API;
Ter conexão com a API via WebSocket, para enviar e receber dados instantaneamente;
O envio das leituras será feito neste formato: (
https://arduinojson.org/)
[
{
"guid": "<guid>",
"light": 36,
"noise": 85,
"temperature": 23,
"when": "<event datetime in ticks format>"
},
{
"guid": "<guid>",
"light": 36,
"noise": 85,
"temperature": 23,
"when": "<event datetime in ticks format>"
}
]
Guid é um identificador colocado numa varíável do momento da gravação da firmware para que a API saiba qual dispositivo está enviando a informação.
When é a data e hora da leitura.
Se um envio falhar, esta leitura será mantida em variável para que seja enviado na próxima tentativa como mais uma posição no array.
A API poderá enviar estes dados ao dispositivo:
{
"NoisyTimes":
[
{
"from": "06:00",
"to": "08:30",
"noise": 78
},
{
"from": "08:30",
"to": "22:30",
"noise": 85
},
{
"from": "22:30",
"to": "00:00",
"noise": 77
},
{
"from": "00:00",
"to": "06:00",
"noise": 73
}
]
}
Estes dados definem os intervalos de horários que o dispositivo irá ter como limite de ruído para enviar para as leituras para a API, caso ultrapasse o nível de ruído de cada horário.
Para manter um controle do relógio interno, a API sempre irá responder qualquer comando com o datetime atualizado no header de qualquer resposta.
Também pode vir esta mensagem:
{
"WorkingTime":
{
"from": "24/10/2020 13:00",
"to": "26/10/2020 12:00"
}
}
Esta propriedade define o dia e hora que o dispositivo começa a monitorar os ruídos. Fora deste horário, o dispositivo dorme e acorda a cada 2 minutos para medir o ruído
E, por fim, também pode vir esta mensagem:
{
"Durations":
{
"sleep": 60,
"eco": 120,
"interval": 1800,
"wait": 10,
"average": 5
}
}
Sleep é o período que o dispositivo dorme quando está fora do WorkingTime.
Eco é o período que o dispositivo dorme quando está em modo de bateria.
Interval é o período que o dispositivo irá automaticamente enviar os dados, havendo ou não ruídos.
Wait é o período que o dispositivo espera em cada loop (antes efetuar cada medição de ruído).
Average é o período que o dispositivo monitora o ruído para tirar a média de decibeis.
Para tal, deve-se utilizar um ESP 12, adicionando um demultiplexador na analógica para ler os 3 sensores, conforme mostrado neste link:
https://internetofhomethings.com/homethings/?p=530
https://diyi0t.com/increase-the-number-of-analog-inputs-with-an-analog-multiplexer/
Segue também um exemplo da conexão com a API:
https://github.com/gilmaimon/ArduinoWebsockets
Coloquei em anexo um diagrama de como é a lógica de execução.
Prazo de Entrega: Não estabelecido