Geovanne
Published © MIT

Intelligent Room

Project Developed as an activity of the discipline of Programming Language 2 - UPE Caruaru - by Geovanne and Thomás.

IntermediateProtip1,043
Intelligent Room

Things used in this project

Hardware components

RFID reader (generic)
×1
NodeMCU ESP8266 Breakout Board
NodeMCU ESP8266 Breakout Board
×1
LED (generic)
LED (generic)
×3
Resistor 47.5 ohm
Resistor 47.5 ohm
×3
Jumper wires (generic)
Jumper wires (generic)
×11
Breadboard (generic)
Breadboard (generic)
×1

Story

Read more

Schematics

Schematics

Pins RFID :
SDA D4
SCK D5
MOSI D7
MISO D6
GND GND
RST D3
3.3v 3.3v

Pins leds:
LED_GREEN D1
LED_YELLOW D0
LED_RED D8

Code

Code

C/C++
/*****************************************************/
/********** 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");
    }
}

Credits

Geovanne
0 projects • 3 followers

Comments