/*****************************************************/
/********** Created by geovanne and thomas ***********/
/*****************************************************/
/*************Contributors Blog FILIPEFLOP************/
#include <ESP8266WiFi.h> // Importa a Biblioteca ESP8266WiFi
#include <PubSubClient.h> // Importa a Biblioteca PubSubClient
#include <LiquidCrystal_I2C.h>
#include <string.h>
#include <SPI.h>
#include <MFRC522.h>
//defines de id mqtt e tpicos para publicao e subscribe
#define TOPICO_SUBSCRIBE "salaintel/" //tpico MQTT de escuta
#define ID_MQTT "salaintel" //id mqtt (para identificao de sesso)
//defines para o Bluemix
#define ORG "rr2oz1"
#define DEVICE_TYPE "arduino_type"
#define DEVICE_ID "arduino_Id"
#define TOKEN "arduino_Token"
#define LED_PORTA D1
#define LED_DATA D0
#define LED_AR D8
#define AR 0
#define DW 1
#define RST_PIN D3
#define SS_PIN D4
// WIFI
const char* SSID = "lp2"; // SSID / nome da rede WI-FI que deseja se conectar
const char* PASSWORD = "12345678"; // Senha da rede WI-FI que deseja se conectar
// MQTT
const char* BROKER_MQTT = "test.mosquitto.org"; //URL do broker MQTT que se deseja utilizar
int BROKER_PORT = 1883; // Porta do Broker MQTT
//Bluemix
char server[] = ORG ".messaging.internetofthings.ibmcloud.com";
char topicin[] = "iot-2/evt/status/fmt/json";
char authMethod[] = "use-token-auth";
char token[] = TOKEN;
char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;
// --- Inicializao dos Dispositivos ---
// --- LCD ---
LiquidCrystal_I2C lcd(0x3F, 16, 2);
MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
//Variveis e objetos globais
WiFiClient espClient;
WiFiClient bluclient; // Cria o objeto espClient
PubSubClient MQTT(espClient); // Instancia o Cliente MQTT passando o objeto espClient
PubSubClient client(server, 1883, NULL, bluclient); //Bluemix
String json = ""; //Variavel para enviar para o Bluemix
String msg = ""; //Variavel para receber do Publish
String teste_Validacao = "";
String code_UID = "";
String code_UID_exit = "";
int s_ArCondicionado = 0;
int s_DataShow = 0;
char Id_nome[16];
int condicao_AR = 0;
int condicao_DW = 0;
int temp_AR = 18;
//Funes
void initWiFi();
void initMQTT();
void initBluemix();
void reconectWiFi();
void reconectBluemix();
void mqtt_callback(char* topic, byte* payload, unsigned int length);
void VerificaConexoesWiFIEMQTT(void);
void nome_lcd();
void atributos_lcd();
void transform_json();
void ler_subscribe();
void start_system();
void shutdown_system();
void Temperatura (int temperatura_ar);
void OnOff (int condicao, int aparelho);
void modo_leitura();
bool function_exit();
void reset_all();
void reconnectMQTT();
void sendbluemix();
void setup(){ //inicializaes
Serial.begin(9600);
initWiFi();
initMQTT();
initBluemix();
SPI.begin();
mfrc522.PCD_Init();
lcd.begin(16, 2);
lcd.clear();
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF; //Prepara chave - padrao de fabrica = FFFFFFFFFFFFh
pinMode(LED_PORTA,OUTPUT); // Led da porta
pinMode(LED_AR,OUTPUT); // Led do ar
pinMode(LED_DATA,OUTPUT); // Led do data-show
analogWrite(LED_PORTA,LOW);
digitalWrite(LED_AR,LOW);
digitalWrite(LED_DATA,LOW);
}
void loop(){
VerificaConexoesWiFIEMQTTEBluemix();
Serial.println("Sistema em Funcionamento");
modo_leitura();
Serial.println(teste_Validacao);
Serial.println(code_UID);
Serial.println(s_ArCondicionado);
Serial.println(s_DataShow);
Serial.println(Id_nome[0]);
Serial.println("Leirura Realizada");
if(teste_Validacao == "858069"){ //UPE
Serial.println("Carto Valido!");
digitalWrite(LED_PORTA,HIGH);
start_system();
nome_lcd();
atributos_lcd();
transform_json();
sendbluemix();
String temp_Subscribe = "";
while(function_exit() == false) {
MQTT.subscribe(TOPICO_SUBSCRIBE);
delay(50);
Serial.println("Received " + msg);
if(temp_Subscribe != msg){
temp_Subscribe = msg;
ler_subscribe();
}
VerificaConexoesWiFIEMQTTEBluemix();
MQTT.loop();
}
shutdown_system();
}
else { Serial.println("Carto Invalido!");}
digitalWrite(LED_PORTA,LOW);
reset_all();
delay(1000);
}
//Funo: reseta as variveis globais
void reset_all(){
json = "";
msg = "";
teste_Validacao = "";
code_UID = "";
code_UID_exit = "";
s_ArCondicionado = 0;
s_DataShow = 0;
strcpy(Id_nome,"FECHADO");
condicao_AR = 0;
condicao_DW = 0;
temp_AR = 18;
transform_json();
sendbluemix();
}
bool function_exit(){
// -- Aguarda um carto --
if( ! mfrc522.PICC_IsNewCardPresent()) { return false;}
if ( ! mfrc522.PICC_ReadCardSerial()) { return false;}
//Mostra UID na serial
Serial.print("UID da tag EXIT : ");
String conteudo = "";
byte letra;
for (byte i = 0; i < mfrc522.uid.size; i++){
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
conteudo.concat(String(mfrc522.uid.uidByte[i]<0x10 ? " 0" : " "));
conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));
}
code_UID_exit = conteudo;
Serial.println();
if (code_UID == code_UID_exit) {return true;}
else { return false;}
}
void OnOff (int condicao, int aparelho){
//int khz = 32;
int len_DW = 67;
int len_AR = 59;
//unsigned int irSignalAR[len_AR];
//unsigned int irSignalDW[len_DW];
if (condicao == 1){
if (aparelho == 0){
digitalWrite(LED_AR,HIGH);
}
else if (aparelho == 1){ //datashow
digitalWrite(LED_DATA,HIGH);
}
}
else { //Desligar aparelho
if (aparelho == 0){ //ar condicionado
digitalWrite(LED_AR,LOW);
}
else if (aparelho == 1){ //Datashow
digitalWrite(LED_DATA,LOW);
}
}
}
void modo_leitura(){
// -- Aguarda um carto --
while (!mfrc522.PICC_IsNewCardPresent()){
delay(1000);
}
if (!mfrc522.PICC_ReadCardSerial()){
return;
}
//Mostra UID na serial
Serial.print("UID da tag : ");
String conteudo = "";
byte letra;
for (byte i = 0; i < mfrc522.uid.size; i++){
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
conteudo.concat(String(mfrc522.uid.uidByte[i]<0x10 ? " 0" : " "));
conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));
}
code_UID = conteudo;
Serial.println();
//Obtem os dados do setor 1, bloco 4 = CODE_VALIDACAO e nome
byte sector = 1;
byte blockAddr = 4;
byte trailerBlock = 7;
byte status;
byte buffer[18];
byte size = sizeof(buffer);
//Autenticacao usando chave A
status=mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A,trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
// Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Read() failed: "));
// Serial.println(mfrc522.GetStatusCodeName(status));
}
// Extrair o CODE_VALIDACAO e nome no Serial Monitor
String temp_validacao = "";
int j = 0;
for (byte i = 0; i < 16; i++){
if(i < 3){
teste_Validacao.concat(int(buffer[i]));
}
else{
Id_nome[j++] = (char(buffer[i]));
}
}
//Obtem os dados do setor 0, bloco 1 = Status Pr-definido
sector = 0;
blockAddr = 1;
trailerBlock = 3;
//Autenticacao usando chave A
status=mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A,trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK){
Serial.print(F("PCD_Authenticate() failed: "));
// Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK){
Serial.print(F("MIFARE_Read() failed: "));
// Serial.println(mfrc522.GetStatusCodeName(status));
}
// extrai os dados do staus Pr-definido
String temp_s_ArCondicionado = "";
String temp_s_DataShow = "";
for (byte i = 0; i < 3; i++){
if(i < 2){
temp_s_ArCondicionado.concat(char(buffer[i]));
}else{
temp_s_DataShow.concat(char(buffer[i]));
}
}
s_ArCondicionado = temp_s_ArCondicionado.toInt();
s_DataShow = temp_s_DataShow.toInt();
Serial.println();
// Halt PICC
mfrc522.PICC_HaltA();
// Stop encryption on PCD
mfrc522.PCD_StopCrypto1();
delay(3000);
}
void shutdown_system(){
if (condicao_AR == 0){ }
else
{
condicao_AR = 0;
OnOff(condicao_AR,AR);
}
if (condicao_DW == 0){}
else
{
condicao_DW = 0;
OnOff(condicao_DW,DW);
}
}
void start_system(){
if (s_ArCondicionado == 00){ }
else
{
condicao_AR = 1;
temp_AR = s_ArCondicionado;
OnOff(condicao_AR,AR);
}
if (s_DataShow == 0){}
else
{
condicao_DW = 1;
OnOff(condicao_DW,DW);
}
}
/*Funo que vai executar dependendo do a Node mandar do subscribe*/
void ler_subscribe(){
String comando = msg;
Serial.print("O comando e:");
Serial.println(comando);
if (comando == "00"){
if (condicao_AR == 0){}
else {condicao_AR = 0;}
}
else if (comando == "18"){
if (condicao_AR == 1){}
else { condicao_AR = 1;}
temp_AR = 18;
}
else if (comando == "19"){
if (condicao_AR == 1){}
else { condicao_AR = 1;}
temp_AR = 19;
}
else if (comando == "20"){
if (condicao_AR == 1){}
else { condicao_AR = 1;}
temp_AR = 20;
}
else if (comando == "21"){
if (condicao_AR == 1){}
else { condicao_AR = 1;}
temp_AR = 21;
}
else if (comando == "22"){
if (condicao_AR == 1){}
else { condicao_AR = 1;}
temp_AR = 22;
}
else if (comando == "23"){
if (condicao_AR == 1){}
else { condicao_AR = 1;}
temp_AR = 23;
}
else if (comando == "24"){
if (condicao_AR == 1){}
else { condicao_AR = 1;}
temp_AR = 24;
}
else if (comando == "25"){
if (condicao_AR == 1){}
else { condicao_AR = 1;}
temp_AR = 25;
}
else if (comando == "26"){
if (condicao_AR == 1){}
else { condicao_AR = 1;}
temp_AR = 26;
}
else if (comando == "0"){
if (condicao_DW == 0){}
else {condicao_DW = 0;}
}
else if (comando == "1"){
if (condicao_DW == 1){}
else {condicao_DW = 1;}
}
OnOff(condicao_AR,AR);
OnOff(condicao_DW,DW);
lcd.clear();
nome_lcd();
atributos_lcd();
transform_json();
sendbluemix();
}
void transform_json (){
int i;
String msg_name = "";
msg_name.concat("{\"d\":{\"professor\":\"");
for (i = 0; i < 15; i++){
if(Id_nome[i] != ' ' && Id_nome[i] >= 'A' && Id_nome[i] <= 'Z'){
msg_name.concat(Id_nome[i]);
}
}
msg_name.concat("\",\"temp_AR\":");
msg_name.concat(temp_AR);
msg_name.concat(",\"condicao_AR\":");
if(condicao_AR == 1){ msg_name.concat("\"LIGADO\"");}
else{msg_name.concat("\"DESLIGADO\"");}
msg_name.concat(",\"condicao_DW\":");
if(condicao_DW == 1){ msg_name.concat("\"LIGADO\"");}
else{msg_name.concat("\"DESLIGADO\"");}
msg_name.concat("}}");
json = msg_name;
Serial.println("construido o json : " + json);
}
void atributos_lcd(){
lcd.setCursor(1,1);
lcd.print("AR ");
lcd.setCursor(4,1);
if (condicao_AR == 0){
lcd.print("OFF");
}
else {
lcd.print(temp_AR);
}
lcd.setCursor(10,1);
lcd.print("DW ");
lcd.setCursor(13,1);
if (condicao_DW == 0){
lcd.print("OFF");
}
else {
lcd.print("ON");
}
}
void nome_lcd(){
String var;
int len = 0;
for( int i = 0; i< strlen(Id_nome);i++){
if(!(Id_nome[i] == ' ')){
var.concat(String(Id_nome[i]));
len++;
}
}
lcd.setCursor((16 - len)/2,0);
lcd.print(var);
}
//Funo: inicializa e conecta-se na rede WI-FI desejada
void initWiFi() {
delay(10);
Serial.println("------Conexao WI-FI------");
Serial.print("Conectando-se na rede: ");
Serial.println(SSID);
Serial.println("Aguarde");
reconectWiFi();
}
//Funo: inicializa parmetros de conexo MQTT(endereo do broker, porta e seta funo de callback)
void initMQTT() {
MQTT.setServer(BROKER_MQTT, BROKER_PORT); //informa qual broker e porta deve ser conectado
MQTT.setCallback(mqtt_callback); //atribui funo de callback (funo chamada quando qualquer informao de um dos tpicos subescritos chega)
}
//Funo: Inicializa o Bluemix
void initBluemix(){
//client.setServer(server, 1883);
if (!client.connected()) reconectBluemix();
}
//Funo: funo de callback
void mqtt_callback(char* topic, byte* payload, unsigned int length) {
msg = "";
//obtem a string do payload recebido
for(int i = 0; i < length; i++)
{
char c = (char)payload[i];
msg += c;
}
Serial.println(msg);
}
//Funo: reconecta-se ao broker MQTT (caso ainda no esteja conectado ou em caso de a conexo cair)
void reconnectMQTT() {
while (!MQTT.connected()) {
Serial.print("* Tentando se conectar ao Broker MQTT: ");
Serial.println(BROKER_MQTT);
if (MQTT.connect(ID_MQTT)) {
Serial.println("Conectado com sucesso ao broker MQTT!");
}else {
Serial.println("Falha ao reconectar no broker.");
Serial.println("Havera nova tentatica de conexao em 2s");
delay(2000);
}
}
}
//Funo: reconnecta-se ao Bluemix
void reconectBluemix(){
if (!client.connected()) {
Serial.print("Reconnecting client to ");
Serial.println(server);
while (!!!client.connect(clientId, authMethod, token)) {
Serial.print(".");
delay(500);
}
return;
}
}
//Funo: reconecta-se ao WiFi
void reconectWiFi() {
if (WiFi.status() == WL_CONNECTED) {return;} //Caso j esteja conectado, ela encerra a funo
WiFi.begin(SSID, PASSWORD); // Conecta na rede WI-FI
while (WiFi.status() != WL_CONNECTED){
delay(100);
Serial.print(".");
}
Serial.println();
Serial.print("Conectado com sucesso na rede ");
Serial.print(SSID);
Serial.println("IP obtido: ");
Serial.println(WiFi.localIP());
}
//Funo: verifica o estado das conexes WiFI e ao broker MQTT.
void VerificaConexoesWiFIEMQTTEBluemix(void) {
if (!MQTT.connected()) {
reconnectMQTT(); //se no h conexo com o Broker, a conexo refeita
reconectWiFi(); //se no h conexo com o WiFI, a conexo refeita
}
}
//Funo para Publicar no Bluemix
void sendbluemix(){
reconectBluemix();
delay(50);
Serial.print("Sending payload: ");
Serial.println(json);
if (client.publish(topicin, (char*) json.c_str())) {
Serial.println("Publish ok");
} else {
Serial.println("Publish failed");
}
}
Comments