Skip to content

Instantly share code, notes, and snippets.

@thales-assis
Last active May 30, 2016 14:00
Show Gist options
  • Save thales-assis/e64a4a7e5f70455b2de4 to your computer and use it in GitHub Desktop.
Save thales-assis/e64a4a7e5f70455b2de4 to your computer and use it in GitHub Desktop.
Project Automation Arduino - Part 1.ino
// VERSÃO DE TESTE E PROTÓTIPO - TEST VERSION
// --- Bibliotecas Auxiliares ---
#include <SPI.h> // Biblioteca do Arduino para Comunicação SPI ( Serial Peripheral Interface - Interface Periféricos Seriais)
#include <Wire.h> // Biblioteca do Arduino para Comunicação I2C ( Inter-Integrated Circuit - Circuito Inter-Integrado )
#include <IRremote.h> // Biblioteca para Receptopr / Emissor Infravermelho.
#include <DHT.h> // Biblioteca para Sensor de Temperatura e Umidade DHT11.
#include <MFRC522.h> // Biblioteca Para Módulo RFID RC-522
#include <LiquidCrystal_I2C.h> // Biblioteca para LCD com I2C integrado.
#include <DS3231.h> // Biblioteca para RTC ( Real Time Clock ) DS3231.
// --- Mapeamento de Hardware - Portas Analógicas ---
const int LM35 = A0; // Pino Analógico A1 do Arduino para ler o valor do Sensor de Temperatura Thermistor.
#define LDR A1 // Pino Analógico A0 do Arduino para ler o valor do Sensor LDR.
#define DHTPIN A2 // Pino Analógico A2 do Arduino para ler o valor do Senor DHT11.
#define Sensor_Alarme A3 // Pino Analógico A3 do Arduino para ler o valor do Senor de Alarme ( EDT002 - Barreira Ótica http://www.educatronica.com.br/kits.html )
#define Sensor_Chuva A4 // Pino Analógico A4 do Arduino para ler o valor do Sensor de Água.
#define Sensor_Chama A5 // Pino Analógico A5 do Arduino para ler o valor do Senor de Chama.
// --- Definindo Portas PWM para Controle de Voz com Módulo EASY VR ---
#define Sala_Vermelho 2
#define Sala_Verde 3
#define Sala_Azul 4
#define Suite_Vermelho 5
#define Suite_Verde 6
#define Suite_Azul 7
#define Quarto_Vermelho 8
#define Quarto_Verde 9
#define Quarto_Azul 10
// --- Mapeamento de Hardware - Portas Digitais ---
#define Botao_Menu_Mais 22 // Botão para selecionar menu acima no digital 12
#define Botao_Menu_Menos 23 // Botão para selecionar menu abaixo no digital 11
#define Botao_OK 24 // Botão OK
#define Botao_Liga 25 // Botão para Ligar.
#define Botao_Desliga 26 // Botão para Desligar.
#define Receptor_Infravermelho 19 // Receptor Infravermelho
#define Led_Sistema 27 // LED para indicar que sistema está ligado
#define Led_Alarme 28 // LED para indicar quando houver uma invasão detectada pelo sensor de alarme
#define Buzzer 29 // Buzzer.
#define Iluminacao_LDR 30 // Pino que irá ligar um RELÉ de 5V para acionar o circuito de ligação da Iluminação Externa da Casa.
#define Led_RFID_Liberado 31 // LED para indicar que TAG liga no Módulo RFID RC522 é válida e cadastrada.
#define Led_RFID_Negado 32 // LED para indicar que TAG liga no Módulo RFID RC522 é inválida e não cadastrada.
#define rele_RFID_Liberado 33 // Pino que irá ligar um RELÉ de 5V para acionar Fechadura Eletrônica da porta.
// --- Definindo Comando das Bibliotecas dos Módulos e Sensores do Arduino ---
IRrecv irrecv(Receptor_Infravermelho); // Comando da Biblioteca <IRremote.h>
decode_results results; // Comando da Biblioteca <IRremote.h>
#define DHTTYPE DHT11 //Comando da Biblioteca <DHT.h>
DHT dht(DHTPIN, DHTTYPE); // Comando da Biblioteca <DHT.h>
// Arduino MEGA: Pino Digital 49 - RESET(RST_RFID), Pino Digital 50 - MISO(Entrada de DADOS),
// Pino Digital 51 - MOSI(Saída de DADOS), Pino Digital 52 - SCK(Clock), Pino Digital 53 - SDA(SS_RFID).
#define RST_RFID 49 // Comando da Biblioteca <MFRC522.h>
#define SS_RFID 53 // Comando da Biblioteca <MFRC522.h>
MFRC522 mfrc522(SS_RFID, RST_RFID); // Comando da Biblioteca <MFRC522.h>
LiquidCrystal_I2C lcd(0x27,16,2); // Comando da Biblioteca <LiquidCrystal_I2C.h>
DS3231 Clock(SDA, SCL); // Comando da Biblioteca <DS3231.h>
Time tempo; // Comando da Biblioteca <DS3231.h>
// --- Protótipo das Funções Auxiliares ---
void Menu_Atual(); //Função para modificar o menu atual
void Menu_Lcd(); //Função para mostrar o menu atual
void menu1_Relogio(); // Função do menu 1, mostrar a hora e data com RTC DS3231.
void menu2_Temperatura_Umidade(); // Função do menu 2, mostrar a temperatura e umidade com DHT11.
void menu3_Alarme_Seguranca(); // Função do menu 3, mostrar o alarme de segurança.
void menu4_Temperatura_Interna(); // Função do menu 4, mostrar a temperatura interna da casa.
void menu5_Iluminacao_Externa(); // Função do menu 5, mostrar a Iluminação Externa e a luminosidade.
void menu6_Chuva(); // Função do menu 6, mostrar se está chovendo.
void Fechadura_Eletronica_RFID(); // Função para acionamento da Fechadura Eletrônica da Casa.
// --- Variáveis Globais ---
char menu = 0x01; // Variável para selecionar os menus. Inicia no menu 1.
boolean Flag_Botao_mais, Flag_Botao_menos, Flag_Botao_Ligar, Flag_Botao_Desligar,Flag_Botao_OK; // Flags para controle dos Botões do menu.
boolean Ligar_Alarme, Invasao_Detectada, Ligar_Iluminacao, Ligar_Chuva, Chuva_Detectada;
int Valor_LDR, Valor_Alarme, Valor_Chuva, Valor_Thermistor,Temp_Dht11, Umid_Dht11;
float Valor_LM35;
byte i;
unsigned int atualizacao_dados;
String tagsCadastrada[3] = {"B9 03 46 D5","26 F1 F4 48","21 5E AA 8B"};
// --- Configurações Iniciais ---
void setup()
{
Serial.begin(9600); // Inicia Taxa de Cominicação Serial de 9600 bits por segundo.
SPI.begin();
Wire.begin();
Clock.begin();
dht.begin();
lcd.init();
lcd.backlight();
// --- RFID ---
mfrc522.PCD_Init();
// --- Infravermelho ---
irrecv.enableIRIn(); // Habilita Rececptor Infravermelho.
//Clock.setDOW(MONDAY); // Comando para Setar o Dia da Semana , Segunda - 1 e Domingo - 7
//Clock.setTime(16, 10, 0); // Comando para Setar Hora/Minuto/Segundos.
//Clock.setDate(23, 5, 2016); // Comando para Setar dia, mês e Ano.
for(char a=22; a<27; a++) pinMode(a, INPUT_PULLUP); // Entrada para os botões(digitais 14 a 18)com pull-ups internos
for(char b=2; b<11; b++) pinMode(b, OUTPUT); // Define como saída todos os Pinos PWM para Easy VR
for(char c=27; c<34; c++) pinMode(c, OUTPUT); // Define como saída os pinos que irá ligar LEDs,Buzzer,Relés,etc.
// Flags para Controle dos Botões do Menu.
Flag_Botao_mais = false; Flag_Botao_menos = false; Flag_Botao_Ligar = false; Flag_Botao_Desligar = false; Flag_Botao_OK = false;
Ligar_Alarme = false; Invasao_Detectada = false; Ligar_Iluminacao = false; Ligar_Chuva = false; Chuva_Detectada = false; // Inicia Booleanos como Falsos.
digitalWrite(Iluminacao_LDR, HIGH);
digitalWrite(rele_RFID_Liberado, HIGH);
// Ligando SISTEMA ---
lcd.setCursor(0,0);
lcd.print("LIGANDO");
lcd.setCursor(0,1);
lcd.print("SISTEMA");
delay(500);
lcd.setCursor(7,1);
lcd.print(".");
delay(500);
lcd.setCursor(8,1);
lcd.print(".");
delay(500);
lcd.setCursor(9,1);
lcd.print(".");
delay(1000);
lcd.clear();
lcd.print("SISTEMA LIGADO");
digitalWrite(Led_Sistema, HIGH);
digitalWrite(Buzzer, HIGH);
delay(100);
digitalWrite(Buzzer, LOW);
delay(100);
digitalWrite(Buzzer, HIGH);
delay(100);
digitalWrite(Buzzer, LOW);
delay(1500);
lcd.clear();
} //Fim do void setup
// --- Loop Infinito ---
void loop()
{
Menu_Atual();
Menu_Lcd();
Fechadura_Eletronica_RFID();
// --- Lendo RTC DS3231 ---
tempo = Clock.getTime();
Clock.getTemp();
// --- Lendo Sensor DHT11, Temperatura e Umidade externa da Casa e Temperatura Interna da Casa a cada 2 segundos ---
if(millis() - atualizacao_dados >= 2000 )
{
Temp_Dht11 = dht.readTemperature();
Umid_Dht11 = dht.readHumidity();
Valor_LM35 = (float(analogRead(LM35))*5/(1023))/0.01;
Serial.print("Temperatura LM35: ");
Serial.println(Valor_LM35,2);
atualizacao_dados = millis();
}
// --- Lendo Valor do Alarme de Segurança ---
Valor_Alarme = analogRead(Sensor_Alarme);
if ( Valor_Alarme >= 1015 && Ligar_Alarme == true)
{
digitalWrite(Buzzer, HIGH);
digitalWrite(Led_Alarme, HIGH);
Invasao_Detectada = true;
}
//--- Lendo Luminosidade do Ambiente Externo ---
Valor_LDR = (analogRead(LDR)); // Lendo Sensor LDR
Valor_LDR = map(Valor_LDR, 0, 1023, 0, 100); // Mapeamento de 0 - 1023 bits para 0 - 100 %
if ( Valor_LDR < 35 && Ligar_Iluminacao == true )
{
digitalWrite(Iluminacao_LDR, LOW); // Módulo Relé ativos em 0 ( LOW );
}
else digitalWrite(Iluminacao_LDR, HIGH);
// --- Lendo Sensor de Chuva ---
Valor_Chuva = analogRead(Sensor_Chuva);
// Serial.print("Valor da Chuva: ");
// Serial.println(Valor_Chuva);
if( Sensor_Chuva == 1023 && Ligar_Chuva == true )
{
Chuva_Detectada = true;
}
// --- Lendo Sensor IR ---
if (irrecv.decode(&results)) {
Serial.println(results.value, DEC);
irrecv.resume(); // Receive the next value
}
} //end loop
// --- Desenvolvimento das Funções Auxiliares ---
void Menu_Atual() //Modifica o menu atual
{
if(!digitalRead(Botao_Menu_Mais) || results.value == 1086277815 ) Flag_Botao_mais = true; // Botão Botão_Menu_Mais pressionado? Seta flag
if(!digitalRead(Botao_Menu_Menos)|| results.value == 1086285465 ) Flag_Botao_menos = true; // Botão Botão_Menu_Menos pressionado? Seta flag
if(digitalRead(Botao_Menu_Mais) && results.value != 1086277815 && Flag_Botao_mais == true ) // Botão Botão_Menu_Mais solto e Flag_Botao_mais setada?
{
Flag_Botao_mais = false; // Limpa flag
lcd.clear(); // Limpa display
menu++; // Incrementa menu
if(menu > 0x06) menu = 0x01; // Se menu maior que 6, volta a ser 1
} // --- Fim do Botao_Menu_Mais ---
if(digitalRead(Botao_Menu_Menos) && results.value !=1086285465 && Flag_Botao_menos == true) // Botao_Menu_Menos solto e Flag_Botao_menos setada?
{
Flag_Botao_menos = false; // Limpa flag
lcd.clear(); // Limpa display
menu--; // Decrementa menu
if(menu < 0x01) menu = 0x06; // Se menu menor que 1, volta a ser 6
} //Fim Botao_Menu_Menos
} //Fim
void Menu_Lcd() //Mostra o menu atual
{
switch(menu) //Controle da variável menu
{
case 0x01: menu1_Relogio(); // Caso 1 - Chama a função para mostrar o relógio na tela.
break; //break
case 0x02: menu2_Temperatura_Umidade(); // Caso 2 - Chama a função para mostrar a Temperatura e Umidade externa da Casa na tela.
break; //break
case 0x03: menu3_Alarme_Seguranca(); // Caso 3 - Chama função para mostrar o Alarme de Segurança na tela.
break; //break
case 0x04: menu4_Temperatura_Interna(); // Caso 4 - Chama função para mostrar a Temperatura Interna da Casa na tela.
break; //break
case 0x05: menu5_Iluminacao_Externa(); // Caso 5- Chama função para mostrar a Luminosidade/Iluminação Externa na tela.
break; //break
case 0x06: menu6_Chuva(); // Caso 6 - Chama função função para mostrar se está chovendo na tela.
break;
} //Fim do switch menu
} // Fim do void Menu_Lcd
void menu1_Relogio(){
lcd.setCursor(0,0);
if(tempo.hour<10)
{
lcd.print("0");
}
lcd.print(tempo.hour);
lcd.print(":");
if(tempo.min <10)
{
lcd.print("0");
}
lcd.print(tempo.min);
lcd.print(":");
if(tempo.sec<10)
{
lcd.print("0");
}
lcd.print(tempo.sec);
lcd.print(" ");
lcd.print(Clock.getTemp());
lcd.write(B11011111); //Simbolo de graus celsius
lcd.print("C");
lcd.setCursor(0,1);
if(tempo.date<10)
{
lcd.print("0");
}
lcd.print(tempo.date);
lcd.print("/");
switch(tempo.mon)
{
case 1: lcd.print("01");break;
case 2: lcd.print("02");break;
case 3: lcd.print("03");break;
case 4: lcd.print("04");break;
case 5: lcd.print("05");break;
case 6: lcd.print("06");break;
case 7: lcd.print("07");break;
case 8: lcd.print("08");break;
case 9: lcd.print("09");break;
case 10: lcd.print("10");break;
case 11: lcd.print("11");break;
case 12: lcd.print("12");break;
default: lcd.print("Erro");break;
}
lcd.print("/");
lcd.print(tempo.year);
lcd.print(" ");
switch(tempo.dow)
{
case 1: lcd.print("SEG");break;
case 2: lcd.print("TER");break;
case 3: lcd.print("QUA");break;
case 4: lcd.print("QUI");break;
case 5: lcd.print("SEX");break;
case 6: lcd.print("SAB");break;
case 7: lcd.print("DOM");break;
default: lcd.print("Erro");break;
}
}
void menu2_Temperatura_Umidade(){
lcd.setCursor(0,0);
lcd.print("UMID.EXTERNA ");
lcd.print(Umid_Dht11);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print("TEMP.EXTERNA ");
lcd.print(Temp_Dht11);
lcd.write(B11011111); //Simbolo de graus celsius
}
void menu3_Alarme_Seguranca(){
if(!digitalRead(Botao_Liga) || results.value == 1086279855 ) Flag_Botao_Ligar = true;
if(!digitalRead(Botao_Desliga) || results.value == 1086302295 ) Flag_Botao_Desligar = true;
if(!digitalRead(Botao_OK) || results.value == 1086296175 ) Flag_Botao_OK = true;
if(digitalRead(Botao_Liga) && results.value != 1086279855 && Flag_Botao_Ligar == true)
{
Ligar_Alarme = true;
lcd.clear();
Flag_Botao_Ligar = false;
}
if(digitalRead(Botao_Desliga) && results.value != 1086302295 && Flag_Botao_Desligar == true)
{
Ligar_Alarme = false;
lcd.clear();
Flag_Botao_Desligar = false;
}
if(Ligar_Alarme == true && Invasao_Detectada == false)
{
lcd.setCursor(0,0);
lcd.print("ALARME DE SEGUR.");
lcd.setCursor(0,1);
lcd.print("LIGADO ");
}
else if( Ligar_Alarme == false)
{
lcd.setCursor(0,0);
lcd.print("ALARME DE SEGUR.");
lcd.setCursor(0,1);
lcd.print("DESLIGADO");
digitalWrite(Buzzer, LOW);
digitalWrite(Led_Alarme, LOW);
Invasao_Detectada = false;
}
else if(Ligar_Alarme == true && Invasao_Detectada == true)
{
lcd.setCursor(0,0);
lcd.print(" INVASAO ");
lcd.setCursor(0,1);
lcd.print(" DETECTADA !! ");
if(digitalRead(Botao_OK) && results.value != 1086296175 && Flag_Botao_OK == true)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" RESTAURANDO");
lcd.setCursor(0,1);
lcd.print(" ALARME");
delay(500);
lcd.setCursor(10,1);
lcd.print(".");
delay(500);
lcd.setCursor(11,1);
lcd.print(".");
delay(500);
lcd.setCursor(12,1);
lcd.print(".");
delay(500);
digitalWrite(Buzzer, LOW);
digitalWrite(Led_Alarme, LOW);
Flag_Botao_OK = false;
Invasao_Detectada = false;
lcd.clear();
}
}
}
void menu4_Temperatura_Interna()
{
lcd.setCursor(0,0);
lcd.print("TEMPERATURA INT.");
lcd.setCursor(0,1);
lcd.print("DA CASA ");
lcd.print(Valor_LM35);
lcd.write(B11011111); //Simbolo de graus celsius
lcd.print("C");
} // --- Fim do menu4_Temperatura_Interna ---
void menu5_Iluminacao_Externa(){
if(!digitalRead(Botao_Liga) || results.value == 1086279855 ) Flag_Botao_Ligar = true;
if(!digitalRead(Botao_Desliga) || results.value == 1086302295 ) Flag_Botao_Desligar = true;
if(digitalRead(Botao_Liga)&& results.value != 1086279855 && Flag_Botao_Ligar == true){
Ligar_Iluminacao = true;
Flag_Botao_Ligar = false;
lcd.clear();
}
if(digitalRead(Botao_Desliga)&& results.value != 1086302295 && Flag_Botao_Desligar == true){
Ligar_Iluminacao = false;
Flag_Botao_Desligar = false;
lcd.clear();
}
if ( Ligar_Iluminacao == true )
{
lcd.setCursor(0,0);
lcd.print("AUTOMATIZACAO DO");
lcd.setCursor(0,1);
lcd.print("JARDIM ");
lcd.setCursor(7,1);
lcd.print("LIGADO ");
}
else
{
lcd.setCursor(0,0);
lcd.print("AUTOMATIZACAO DO");
lcd.setCursor(0,1);
lcd.print("JARDIM ");
lcd.setCursor(7,1);
lcd.print("DESLIGADO");
}
}
void menu6_Chuva(){
if(!digitalRead(Botao_Liga) || results.value == 1086279855 ) Flag_Botao_Ligar = true;
if(!digitalRead(Botao_Desliga) || results.value == 1086302295 ) Flag_Botao_Desligar = true;
if(digitalRead(Botao_Liga)&& results.value != 1086279855 && Flag_Botao_Ligar == true){
Ligar_Chuva = true;
Flag_Botao_Ligar = false;
lcd.clear();
}
if(digitalRead(Botao_Desliga)&& results.value != 1086302295 && Flag_Botao_Desligar == true){
Ligar_Chuva = false;
Flag_Botao_Desligar = false;
lcd.clear();
}
if ( Ligar_Chuva == true )
{
lcd.setCursor(0,0);
lcd.print("SENSOR DE CHUVA ");
lcd.setCursor(0,1);
lcd.print("LIGADO ");
}
else
{
lcd.setCursor(0,0);
lcd.print("SENSOR DE CHUVA ");
lcd.setCursor(0,1);
lcd.print("DESLIGADO");
}
if ( Ligar_Chuva == true && Chuva_Detectada == true)
{
lcd.setCursor(0,0);
lcd.print("CHOVENDO,LEVE");
lcd.setCursor(0,1);
lcd.print("UM GUARDA-CHUVA ");
}
}
void Fechadura_Eletronica_RFID(){
// Aguarda proximidade do cartão/tag
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Seleciona o cartão/tag
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
// String que armazenará o UID do cartão
String Codigo_TAG = "";
// variavel que coletará os bytes lidos
byte letra;
// Dentro deste FOR, armazena byte a byte e concatena na variavel Codigo_TAG
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
Codigo_TAG.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
Codigo_TAG.concat(String(mfrc522.uid.uidByte[i], HEX));
}
// Coloca o valor da variavel Codigo_TAG toda em Maisculo
Codigo_TAG.toUpperCase();
// if (Codigo_TAG.substring(1) == tagsCadastrada[0]) //UID 1 - "B9 03 46 D5" - TAG Cartão.
// if (Codigo_TAG.substring(1) == tagsCadastrada[1]) //UID 2 - "26 F1 F4 48" - TAG Chaveiro.
// if (Codigo_TAG.substring(1) == tagsCadastrada[2]) //UID 3 - "21 5E AA 8B" - TAG Cartão BOM - Thales.
// if (Codigo_TAG.substring(1) == "B9 03 46 D5")
// if (Codigo_TAG.substring(1) == "26 F1 F4 48")
// if (Codigo_TAG.substring(1) == "21 5E AA 8B")
if (Codigo_TAG.substring(1) == "21 5E AA 8B" || Codigo_TAG.substring(1) == "26 F1 F4 48" ) // Válida TAG - Cartão BOM e TAG - Chaveiro.
{
// Se Tag aproximada é cadastrada liga Led de acesso Liberado e Relé para acionamento de trava eletrônica.
digitalWrite(Led_RFID_Liberado, HIGH);
digitalWrite(rele_RFID_Liberado, LOW);
delay(500);
digitalWrite(Led_RFID_Liberado, LOW);
digitalWrite(rele_RFID_Liberado, HIGH);
}
else
{
digitalWrite(rele_RFID_Liberado, HIGH);
digitalWrite(Led_RFID_Negado, HIGH);
delay(500);
digitalWrite(Led_RFID_Negado, LOW);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment