IOT - Smart Lightning Application.
Para facilitar a leitura deste ficheiro, usar o vscode (ou similar) e colocar em modo "preview".
Qualquer eventual alteração/atualização deste projeto, encontrar-se-á no Github.
- Arduino MKRWAN
- LDR Sensor
- Analog Ambient Light Sensor by DFRobot's
- LED
- 10 KΩ Resistor
- 220 Ω Resistor
- Breadboard
- Breadboard Wire
LDR Specification
Ω in bright light
MΩ in darkness
Analog Ambient Light Specification
Supply Voltage: 3.3V to 5V
Illumination range : 1 Lux to 6000 Lux
Responsive time : 15us
Interface: Analog
Size:22x30mm
Este projeto tem como intuito, a criação de uma aplicação Smart Lightning em IOT.
Neste caso, iremos usar os dois sensores acima referidos, de forma a ter noção da Luminosidade
e da Tensão
a que está sujeito um espaço interior, mediante a luz solar que é incidida no mesmo, ligando ou desligando um LED. Este LED dispensa qualquer interação humana, o que permite obter um sistema inteligente e eficiente de ligar e desligar a luz, dependendo da condição exterior.
É importante salientar o uso do protocolo LoRaWAN, através do arduino MKRWAN e do The Things Network, que torna possível não só armazenamento e análise de dados mas também, uma vantajosa interação com diversas aplicações que permite uma reação aos mesmos, desde enviar um tweet quando uma condição é cumprida (abordada neste trabalho), a uma aplicação de telemóvel que permite interagir com o dispositivo, sendo possível ligar e desligar a luz do LED através da mesma.
Este projeto vai ser divido em 4 fases, cada fase encontra-se na sua respetiva pasta com uma explicação promenorizada.
Registo do dispositivo MKRWAN no The Things Network
:
Application ID: smartlighting-app
Device EUI: 009472084173A903
Application EUI: 70B3D57ED002E395
App Key: 6A21B5D4855D9595F888E6096BC2444B
Leitura de valores dos sensores e posterior envio:
// Leitura de valores
// Read values
lux = analogRead(lightSensor);
analogValue = analogRead(ldrSensor);
voltage = analogValue * (5.0 / 1023.0);
resLrd = ((10000.0 * 5.0)/voltage) - 10000.0; //Low (voltage>>>2,5) ; High (voltage<<<2.4)
if (millis() - time > 60000){
luxValue = (float)lux * 0.6 + (float)luxValue * 0.4;
lux = 0;
voltageValue = (float)voltage * 0.6 + (float)voltageValue * 0.4;
voltage = 0;
if(voltageValue <= 2){
digitalWrite(LED, HIGH);
ledValue = 1;
Serial.println("It's too dark, LED turn on!");
} else {
digitalWrite(LED, LOW);
ledValue = 0;
Serial.println("It's too bright, LED turn off!");
}
time = millis();
}
// Envio para o TTN de 10 em 10 minutos (600000ms)
// Send to TTN every 10 minutes (600000ms)
if (millis() - timeUpload > 600000){
int valLux = (int)(luxValue * 10);
txBuffer[0] = (valLux >> 8) & 0xff;
txBuffer[1] = valLux & 0xff;
int valVol = (int)(voltageValue * 10);
txBuffer[2] = (valVol >> 8) & 0xff;
txBuffer[3] = valVol & 0xff;
txBuffer[4] = ledValue & 0xff;
int err;
modem.beginPacket();
modem.write(txBuffer);
err = modem.endPacket(true);
timeUpload = millis();
}
Descodificar os dados recebidos:
function Decoder(bytes, port) {
var decoded = {};
if (port === 1){
decoded.lux = ((bytes[0] << 8) | bytes[1]);
decoded.vol = ((bytes[2] << 8) | bytes[3]);
decoded.led = bytes[4]
if(decoded.led == 1) decoded.Status = "LED ON";
if(decoded.led === 0) decoded.Status = "LED OFF";
}
return{
field1: decoded.lux / 10,
field2: decoded.vol / 10,
field3: decoded.led,
status: decoded.Status
}
}
Resultado:
Integração dos dados no The Things Speak:
React através do Twitter quando o LED está ON:
Como esperado, podemos verificar o êxito de todas as fases.
É de notar, que esta é uma simulação e não foi possível testar o equipamento devido ao ano atípico a que estivemos sujeitos (Covid-19), não permitindo analisar com precisão os resultados obtidos.
Para concluir, este projeto foi desenvolvido no âmbito da Unidade Curricular: Instrumentação e Sensores, Curso: Mestrado Integrado em Engenharia Eletrotécnica e de Computadores, Universidade: UTAD.
Renato Mendes - 65384