Sorry for the delay in posting the code, I’ve been traveling these days.
The following are the codes:
First, The Master Controller (Spark Photon):
// This #include statement was automatically added by the Particle IDE.
#define BLYNK_PRINT Serial
#include "blynk/BlynkSimpleParticle.h"
#include "blynk/blynk.h"
SYSTEM_MODE(SEMI_AUTOMATIC);
SYSTEM_THREAD(ENABLED);
STARTUP(WiFi.selectAntenna(ANT_AUTO));
STARTUP(System.enableFeature(FEATURE_RETAINED_MEMORY));
// Variáveis utilizadas no equipamento
retained char alarmeStatus = '1';
retained char cercaStatus = '7';
char auth[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
const char ALARME_DESCONECTADO = '0';
const char ALARME_DESATIVADO = '1';
const char ALARME_ATIVADO = '2';
const char ALARME_DISPARADO = '3';
const char CERCA_DESCONECTADA = '6';
const char CERCA_DESLIGADA = '7';
const char CERCA_LIGADA = '8';
// Define nome para entradas e saídas:
//Saidas:
int S_Alarme = D6; // Saída Controle Alarme
int S_Cerca = D5; // Saída Controle Cerca
int St_Alarme = D4; // Saída Controle Led Alarme
int St_Cerca = D3; // Saída Controle Led Cerca
int LStatus = D7; // Saída Led Status do Equipamento
int LPortao = D2; // Saída Led do Portão
int LLuz = A5; // Saída Led Luz Externa
//Entradas:
int E_Sirene = D0; // Sinal de Entrada Sirene
int Bot = D1; // Sinal de Entrada Botão
int StatusE_Sirene; // Estado da Entrada 1
int UltimoStatusE_Sirene = LOW; // Estado anterior da Entrada 1
int ContadorE_Sirene = 0; // Verificador de quantas vezes a Entrada 1 foi acionada
int EnvioStatus = LOW; // Estado dos comandos
int StatusEnvio; // Estado da Entrada 1
int UltimoStatusEnvio = LOW; // Estado anterior da Entrada 1
int LeStatus; // Estado atual da ntrada 1
int SaidaStatus1 = LOW;
int SaidaStatus2 = LOW;
int SaidaStatus3 = LOW;
int SaidaStatus4 = LOW;
int BloqSaida = 0;
int SinalStatus = LOW;
// Definições do Status do Alarme:
unsigned int ControleAlarme = 0;
unsigned int ControleCerca = 0;
unsigned long TempoE_Sirene = 0; // Tempo da Entrada 1
unsigned long UltimoTempoE_Sirene = 0; // Último momento em que o Entrada 1 foi atualizado
unsigned long DebounceE_Sirene = 150; // Tempo do filtro Entrada 1, aumentar se ocorrer irregularidades
unsigned long TempoEnvio = 0; // Tempo da Entrada 1
unsigned long UltimoTempoEnvio = 0; // Último momento em que o Entrada 1 foi atualizado
unsigned long DebounceEnvio = 5000; // Tempo do filtro Entrada 1, aumentar se ocorrer irregularidades
unsigned long IntervaloNormal = 1000;
unsigned long IntervaloDisparado = 1500;
unsigned long PrevioMillis = 0;
unsigned long TempoSinalAtual = 0;
unsigned long MillisAtual = millis();
unsigned long ContDisparo = 0;
unsigned long ContSinal = 0;
unsigned long ContIni = 0;
double temp = 0.0;
double humd = 0.0;
double tempFundo = 0.0;
double humdSolo = 0.0;
double tempC = 0.0;
bool inicio = true;
bool BtTrava = false;
bool PLed = false;
bool Primeira = false;
bool PrimeiraBlynk = false;
Timer timer1(2000, Atualiza); // Tempo e Rotina do Temporizador
Timer timer2(60000, Alerta); // Tempo e Rotina do Temporizador
Timer timer3(100, AlertaLed); // Tempo e Rotina do Temporizador
ApplicationWatchdog wd(60000, System.reset);
//Canais Virtuais do Blynk
WidgetBridge bridge1(V3); // Canal Virtual da Ponte
WidgetBridge bridge2(V14); // Canal Virtual da Ponte
WidgetLCD lcd(V0); // Canal Virtual do LCD Virtual
WidgetLED LedAlarme(V5); //LED Virtual no APP
WidgetLED LedCerca(V6); //LED Virtual no APP
WidgetLED LedDisparo1(V7); //LED Virtual no APP
WidgetLED LedDisparo2(V8); //LED Virtual no APP
void setup() {
Serial.begin(115200); // Inicia a Serial
delay(50);
WiFi.on(); // Liga a Módulo WiFi com as credenciais pré definidas
delay(50);
WiFi.connect(); // Conecta à Rede WiFi
pinMode(E_Sirene, INPUT_PULLUP); // Indica que é entrada
pinMode(Bot, INPUT_PULLUP); // Indica que é entrada
pinMode(S_Alarme, OUTPUT); // Indica que é saída
pinMode(S_Cerca, OUTPUT); // Indica que é saída
pinMode(St_Alarme, OUTPUT); // Indica que é saída
pinMode(St_Cerca, OUTPUT); // Indica que é saída
pinMode(LStatus, OUTPUT); // Indica que é saída
pinMode(LPortao, OUTPUT); // Indica que é saída
pinMode(LPortao, OUTPUT); // Indica que é saída
pinMode(LLuz, OUTPUT); // Indica que é saída
digitalWrite(S_Alarme, LOW); // Desliga Saída ao Iniciar
digitalWrite(S_Cerca, LOW); // Desliga Saída ao Iniciar
digitalWrite(St_Alarme, LOW); // Desliga Saída ao Iniciar
digitalWrite(St_Cerca, LOW); // Desliga Saída ao Iniciar
digitalWrite(LPortao, LOW); // Desliga Saída ao Iniciar
digitalWrite(LLuz, LOW); // Desliga Saída ao Iniciar
pinMode(A1, OUTPUT); // Indica que é saída
pinMode(A2, OUTPUT); // Indica que é saída
pinMode(A3, OUTPUT); // Indica que é saída
pinMode(A4, OUTPUT); // Indica que é saída
pinMode(DAC, OUTPUT); // Indica que é saída
pinMode(WKP, OUTPUT); // Indica que é saída
digitalWrite(A1, LOW); // Desliga Saída
digitalWrite(A2, LOW); // Desliga Saída
digitalWrite(A3, LOW); // Desliga Saída
digitalWrite(A4, LOW); // Desliga Saída
digitalWrite(DAC, LOW); // Desliga Saída
digitalWrite(WKP, LOW); // Desliga Saída
digitalWrite(LStatus, HIGH); // Liga Saída
waitUntil(WiFi.ready); // Agaurda conectar a WiFi
Blynk.begin(auth); // Faz Autenticação no Servidor Blynk
digitalWrite(LStatus, LOW); // Desliga Saída
waitUntil(Blynk.connect); // Agaurda Conectar no Servidor Blink
timer1.start(); // Inicia Rotina Temporizador
timer2.start(); // Inicia Rotina Temporizador
timer3.start(); // Inicia Rotina Temporizador
PrimeiraBlynk = true;
delay(250); // Tempo
}
// Rotinas do Blynk
BLYNK_CONNECTED()
{
bridge1.setAuthToken("YYYYYYYYYYYYYYYYYYYYYYY");
bridge2.setAuthToken("ZZZZZZZZZZZZZZZZZZZZZZZZZZ");
if (PrimeiraBlynk)
{
Blynk.syncAll();
digitalWrite(LStatus, HIGH); // Desliga Saída
PrimeiraBlynk = false;
}
}
//Verifica Botão Virtual do Alarme
BLYNK_WRITE(V1)
{
if(param.asInt() != 0)
{
if( LeStatus == LOW )
{
ContadorE_Sirene = 0;
ControleAlarme = 1;
SinalStatus = LOW;
UltimoTempoEnvio = millis();
LeStatus = HIGH;
}
}
}
// Verifica Botão Virtual da Cerca
BLYNK_WRITE(V2)
{
//Enviado pelo Cliente Liga Cerca
if(param.asInt() != 0)
{
if( LeStatus == LOW )
{
ContadorE_Sirene = 0;
ControleCerca = 1;
SinalStatus = LOW;
UltimoTempoEnvio = millis();
LeStatus = HIGH;
}
}
}
// Verifica Cera
BLYNK_WRITE(V4)
{
if(param.asInt() > 0)
{
BtTrava = true;
bridge1.digitalWrite(14, HIGH);
digitalWrite(LPortao, HIGH);
}
else
{
bridge1.digitalWrite(14, LOW);
digitalWrite(LPortao, LOW);
BtTrava = false;
}
}
BLYNK_READ(V9)
{
Blynk.virtualWrite(V9, temp);
bridge1.virtualWrite(V8, 1);
}
BLYNK_READ(V10)
{
Blynk.virtualWrite(V10, humd);
bridge1.virtualWrite(V9, 1);
}
//Luz Externa
BLYNK_WRITE(V11)
{
if(param.asInt() > 0)
{
bridge1.digitalWrite(12, HIGH);
digitalWrite(LLuz, HIGH);
}
else
{
bridge1.digitalWrite(12, LOW);
digitalWrite(LLuz, LOW);
}
}
BLYNK_WRITE(V12)
{
if(param.asDouble() != 0)
{
temp = param.asDouble();
}
}
BLYNK_WRITE(V13)
{
if(param.asDouble() != 0)
{
humd = param.asDouble();
}
}
BLYNK_READ(V15)
{
Blynk.virtualWrite(V15, tempFundo);
bridge2.virtualWrite(V1, 1);
}
BLYNK_READ(V16)
{
Blynk.virtualWrite(V16, humdSolo);
bridge2.virtualWrite(V2, 1);
}
BLYNK_WRITE(V17)
{
if(param.asInt() != 0)
{
Particle.connect();
}
}
BLYNK_WRITE(V18)
{
if(param.asInt() != 0)
{
Particle.disconnect();
}
}
BLYNK_WRITE(V19)
{
if(param.asDouble() != 0)
{
tempFundo = param.asDouble();
}
}
BLYNK_WRITE(V20)
{
if(param.asDouble() != 0)
{
humdSolo = param.asDouble();
}
}
BLYNK_READ(V21)
{
tempC = ((analogRead(A0) * 2.5)/4095.0) * 100.0;
Blynk.virtualWrite(V21, tempC);
}
void Inicial()
{
if(ContIni <= 50)
{
if(ContIni <= 1)lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 0, "Home Automotion "); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
lcd.print(0, 1, "Particle Photon "); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
}
if(ContIni > 50 && ContIni <= 100)
{
if(ContIni <= 51)lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 0, " By Haltech "); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
lcd.print(0, 1, " Blynk-V2.0 "); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
}
if(ContIni > 100)
{
lcd.clear(); //Use it to clear the LCD Widget
ContIni = 0;
inicio = false;
Atualiza();
}
}
// Temporizadores de algumas funções
void Atualiza()
{
Particle.publish("Principal -> Ciclos/ms:", String (System.ticksPerMicrosecond()));
if(inicio == false)
{
if(alarmeStatus != ALARME_DISPARADO)
{
if(alarmeStatus == ALARME_ATIVADO)
{
lcd.print(0, 0, "Alarme Ligado");
LedAlarme.on();
}
if(alarmeStatus != ALARME_ATIVADO)
{
lcd.print(0, 0, "Alarme Desligado");
LedAlarme.off();
}
if(cercaStatus == CERCA_LIGADA)
{
lcd.print(0, 1, "Cerca Ligada");
LedCerca.on();
}
if(cercaStatus != CERCA_LIGADA)
{
lcd.print(0, 1, "Cerca Desligada");
LedCerca.off();
}
}
else
{
lcd.print(0, 0, "ALARME DISPARADO");
lcd.print(0, 1, "Verificar Camera");
LedDisparo1.on();
LedDisparo2.on();
}
}
}
void Alerta()
{
if(alarmeStatus == ALARME_DISPARADO)
{
Blynk.notify("Alarme Disparado!");
}
}
void AlertaLed()
{
if(alarmeStatus == ALARME_DISPARADO)
{
PLed = !PLed;
digitalWrite(LStatus, PLed);
}
if(inicio == true)
{
ContIni ++;
PLed = !PLed;
digitalWrite(LStatus, PLed);
}
}
// Loop Principal do Programa
void loop()
{
//if(Particle.connected)Particle.publish("Ciclos/ms:", String (System.ticksPerMicrosecond()), 30);
Blynk.run();
if(inicio == true)Inicial();
Geral();
wd.checkin();
if(!WiFi.ready())
{
digitalWrite(LStatus, LOW); // Desliga Saída
delay(250);
WiFi.connect();
}
if(WiFi.ready() && !Blynk.connected())
{
PrimeiraBlynk = true;
digitalWrite(LStatus, LOW); // Desliga Saída
delay(250);
Blynk.connect();
}
}
//Rotina Geral do Equipamento
void Geral()
{
if(alarmeStatus != ALARME_DISPARADO && inicio == false) digitalWrite(LStatus, HIGH);
// Tempo de Retorno da Sirene antes de limpar o status
if (LeStatus == HIGH)
{
if ((millis() - UltimoTempoEnvio) > DebounceEnvio)
{
ContadorE_Sirene = 0;
lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 0, "Sirene nao resp."); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
lcd.print(0, 1, "Comando. Verific"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
Serial.println("Sirene nao respondeu ao comando.");
Serial.println("Limpando Contador e Status");
SinalStatus = LOW;
ControleAlarme = 0;
ControleCerca = 0;
UltimoTempoEnvio = 0;
BloqSaida = 0;
LeStatus = LOW;
}
}
// Leitura da Porta de Entrada da Sirene
//Verifica se veio o Pulso do Navegador para pulsar o controle do alarme
if (digitalRead(E_Sirene)!= UltimoStatusE_Sirene)
{
UltimoTempoE_Sirene = millis();
}
if ((millis() - UltimoTempoE_Sirene) > DebounceE_Sirene)
{
if (digitalRead(E_Sirene) != StatusE_Sirene)
{
StatusE_Sirene = digitalRead(E_Sirene);
if(StatusE_Sirene == LOW)
{
ContadorE_Sirene++;
Serial.print("Pulso da Sirene:");
lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 0, "Pulso da Sirene:"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
lcd.print(0, 1, ContadorE_Sirene); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
Serial.println(ContadorE_Sirene, DEC);
SinalStatus = HIGH;
TempoSinalAtual = millis();
}
}
}
// Trata Sinal de Entrada, para saber o Status do Alarme
if(SinalStatus == HIGH)
{
if(((millis() - TempoSinalAtual)>= 1000) && ((millis() - TempoSinalAtual)<= 1500)&& (StatusE_Sirene == HIGH))
{
if(ContadorE_Sirene == 1)
{
if(ControleAlarme >= 1)
{
alarmeStatus = ALARME_ATIVADO;
lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 0, "Alarme Ligado"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
if(cercaStatus == CERCA_LIGADA) lcd.print(0, 1, "Cerca Ligada");
if(cercaStatus != CERCA_LIGADA) lcd.print(0, 1, "Cerca Desligada");
Serial.println("Alarme Ativado!");
LedAlarme.on();
ControleAlarme = 0;
BloqSaida = 0;
LeStatus = LOW;
}
if(ControleCerca >= 1)
{
cercaStatus = CERCA_LIGADA;
lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 1, "Cerca Ligada"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
if(alarmeStatus == ALARME_ATIVADO) lcd.print(0, 0, "Alarme Ligado");
if(alarmeStatus != ALARME_ATIVADO) lcd.print(0, 0, "Alarme Desligado");
Serial.println("Cerca Ligada ");
LedCerca.on();
ControleCerca = 0;
BloqSaida = 0;
LeStatus = LOW;
}
}
if(ContadorE_Sirene == 2)
{
if(ControleAlarme >= 1)
{
alarmeStatus = ALARME_DESATIVADO;
Serial.println("Alarme Desativado!");
lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 0, "Alarme Desligado"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
if(cercaStatus == CERCA_LIGADA) lcd.print(0, 1, "Cerca Ligada");
if(cercaStatus != CERCA_LIGADA) lcd.print(0, 1, "Cerca Desligada");
LedDisparo1.off();
LedDisparo2.off();
LedAlarme.off();
ControleAlarme = 0;
BloqSaida = 0;
LeStatus = LOW;
}
if(ControleCerca >= 1)
{
cercaStatus = CERCA_DESLIGADA;
Serial.println("Cerca Desligada!");
lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 1, "Cerca Desligada"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
if(alarmeStatus == ALARME_ATIVADO) lcd.print(0, 0, "Alarme Ligado");
if(alarmeStatus != ALARME_ATIVADO) lcd.print(0, 0, "Alarme Desligado");
LedCerca.off(); //LED Virtual no APP
ControleCerca = 0;
BloqSaida = 0;
LeStatus = LOW;
}
}
ContadorE_Sirene = 0;
SinalStatus = LOW;
}
if(((millis() - TempoSinalAtual)> 1500) && ((millis() - TempoSinalAtual)< 5000)&& (StatusE_Sirene == HIGH))
{
ContadorE_Sirene = 0;
BloqSaida = 0;
LeStatus = LOW;
SinalStatus = LOW;
}
if(((millis() - TempoSinalAtual)>= 5000) && (StatusE_Sirene == LOW))
{
Serial.println("Disparado o Alarme");
lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 0, "ALARME DISPARADO"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
lcd.print(0, 1, "Verificar Camera"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
Blynk.notify("Alarme Disparado!");
LedAlarme.off();
LedCerca.off();
LedDisparo1.on();
LedDisparo2.on();
alarmeStatus = ALARME_DISPARADO;
cercaStatus = CERCA_DESLIGADA;
ContadorE_Sirene = 0;
SinalStatus = LOW;
BloqSaida = 0;
LeStatus = LOW;
}
}
// Verifica e Trata Controles do Alarme:
if(ControleAlarme == 1 && BloqSaida == 0)
{
MillisAtual = millis();
if(alarmeStatus != ALARME_ATIVADO && alarmeStatus != ALARME_DISPARADO)
{
if(MillisAtual - PrevioMillis > IntervaloNormal)
{
PrevioMillis = MillisAtual;
if (SaidaStatus1 == LOW)
{
Serial.println("Comando Enviado para Ativar Alarme.");
lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 0, "COMANDO PARA: "); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
lcd.print(0, 1, "ATIVAR ALARME "); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
digitalWrite(S_Alarme, HIGH);
SaidaStatus1 = HIGH;
}
else
{
digitalWrite(S_Alarme, LOW);
SaidaStatus1 = LOW;
BloqSaida = 1;
}
}
}
if(alarmeStatus != ALARME_DESATIVADO && alarmeStatus != ALARME_DISPARADO)
{
if(MillisAtual - PrevioMillis > IntervaloNormal)
{
PrevioMillis = MillisAtual;
if (SaidaStatus2 == LOW)
{
Serial.println("Comando Enviado para Desativar Alarme.");
lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 0, "COMANDO PARA: "); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
lcd.print(0, 1, "DESATIVAR ALARME"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
digitalWrite(S_Alarme, HIGH);
SaidaStatus2 = HIGH;
}
else
{
digitalWrite(S_Alarme, LOW);
SaidaStatus2 = LOW;
BloqSaida = 1;
}
}
}
if(alarmeStatus != ALARME_DESATIVADO && alarmeStatus == ALARME_DISPARADO)
{
if(MillisAtual - PrevioMillis > IntervaloDisparado)
{
PrevioMillis = MillisAtual;
if (SaidaStatus2 == LOW)
{
Serial.println("Comando Enviado para Desativar Alarme.");
lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 0, "COMANDO PARA: "); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
lcd.print(0, 1, "DESATIVAR GERAL "); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
digitalWrite(S_Alarme, HIGH);
SaidaStatus2 = HIGH;
}
else
{
digitalWrite(S_Alarme, LOW);
SaidaStatus2 = LOW;
BloqSaida = 1;
}
}
}
}
if(ControleCerca == 1 && BloqSaida == 0)
{
MillisAtual = millis();
if(cercaStatus != CERCA_LIGADA)
{
if(MillisAtual - PrevioMillis > IntervaloNormal)
{
PrevioMillis = MillisAtual;
if (SaidaStatus3 == LOW)
{
lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 0, "COMANDO PARA: "); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
lcd.print(0, 1, "ATIVAR CERCA ELE"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
Serial.println("Comando Enviado para Ativar Cerca.");
digitalWrite(S_Cerca, HIGH);
SaidaStatus3 = HIGH;
}
else
{
digitalWrite(S_Cerca, LOW);
SaidaStatus3 = LOW;
BloqSaida = 1;
}
}
}
if(cercaStatus != CERCA_DESLIGADA)
{
if(MillisAtual - PrevioMillis > IntervaloNormal)
{
PrevioMillis = MillisAtual;
if (SaidaStatus4 == LOW)
{
lcd.clear(); //Use it to clear the LCD Widget
lcd.print(0, 0, "COMANDO PARA: "); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
lcd.print(0, 1, "DESATIVAR CERCA "); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
Serial.println("Comando Enviado para Desativar Cerca.");
digitalWrite(S_Cerca, HIGH);
SaidaStatus4 = HIGH;
}
else
{
digitalWrite(S_Cerca, LOW);
SaidaStatus4 = LOW;
BloqSaida = 1;
}
}
}
}
//Verifica Status da Entrada da Sirene
UltimoStatusE_Sirene = digitalRead(E_Sirene);
//Indica o Estado nos Leds
if (alarmeStatus == ALARME_ATIVADO)
{
digitalWrite(St_Alarme, HIGH);
}
else
{
digitalWrite(St_Alarme, LOW);
}
if (cercaStatus == CERCA_LIGADA)
{
digitalWrite(St_Cerca, HIGH);
}
else
{
digitalWrite(St_Cerca, LOW);
}
// Verfica Botão que abre portão
if(BtTrava == false)
{
if(digitalRead(Bot) == LOW)
{
if(digitalRead(LPortao) == LOW)
{
bridge1.virtualWrite(V10, 1);
digitalWrite(LPortao, HIGH);
}
}
else
{
if(digitalRead(LPortao) == HIGH)
{
//bridge1.virtualWrite(V10, 0);
digitalWrite(LPortao, LOW);
}
}
}
}
Second, First Slave Controller(SparkPhoton):
// This #include statement was automatically added by the Particle IDE.
#define BLYNK_PRINT Serial
#include "blynk/BlynkSimpleParticle.h"
#include "blynk/blynk.h"
#include "PietteTech_DHT/PietteTech_DHT.h"
SYSTEM_MODE(SEMI_AUTOMATIC);
SYSTEM_THREAD(ENABLED);
STARTUP(WiFi.selectAntenna(ANT_AUTO));
// system defines
#define DHTTYPE DHT22 // Sensor type DHT11/21/22/AM2301/AM2302
#define DHTPIN 1 // Digital pin for communications
char auth[] = "YYYYYYYYYYYYYYYYYYYYYYY";
int UmidadePin = A0;
long int UmidadeValor = 0;
long int h1 = 0;
float h2 = 0.00;
int LStatus = D7; // Saída Led Status do Equipamento
int result = 0;
bool PrimeiraBlynk = true;
//declaration
void dht_wrapper(); // must be declared before the lib initialization
// Lib instantiate
PietteTech_DHT DHT(DHTPIN, DHTTYPE, dht_wrapper);
Timer timer1(2000, Atualiza); // Tempo e Rotina do Temporizador
ApplicationWatchdog wd(60000, System.reset);
//Canais Virtuais do Blynk
WidgetBridge bridge1(V0); // Canal Virtual da Ponte
void setup()
{
Serial.begin(115200); // Inicia a Serial
delay(50);
WiFi.on(); // Liga a Módulo WiFi com as credenciais pré definidas
delay(50);
WiFi.connect(); // Conecta à Rede WiFi
pinMode(LStatus, OUTPUT); // Indica que é saída
pinMode(D0, OUTPUT); // Indica que é saída
pinMode(D2, OUTPUT); // Indica que é saída
pinMode(D3, OUTPUT); // Indica que é saída
pinMode(D4, OUTPUT); // Indica que é saída
pinMode(D5, OUTPUT); // Indica que é saída
pinMode(D6, OUTPUT); // Indica que é saída
pinMode(A1, OUTPUT); // Indica que é saída
pinMode(A2, OUTPUT); // Indica que é saída
pinMode(A3, OUTPUT); // Indica que é saída
pinMode(A4, OUTPUT); // Indica que é saída
pinMode(A5, OUTPUT); // Indica que é saída
pinMode(DAC, OUTPUT); // Indica que é saída
pinMode(WKP, OUTPUT); // Indica que é saída
digitalWrite(D0, LOW); // Desliga Saída
digitalWrite(D2, LOW); // Desliga Saída
digitalWrite(D3, LOW); // Desliga Saída
digitalWrite(D4, LOW); // Desliga Saída
digitalWrite(D5, LOW); // Desliga Saída
digitalWrite(D6, LOW); // Desliga Saída
digitalWrite(A1, LOW); // Desliga Saída
digitalWrite(A2, LOW); // Desliga Saída
digitalWrite(A3, LOW); // Desliga Saída
digitalWrite(A4, LOW); // Desliga Saída
digitalWrite(A5, LOW); // Desliga Saída
digitalWrite(DAC, LOW); // Desliga Saída
digitalWrite(WKP, LOW); // Desliga Saída
digitalWrite(LStatus, HIGH); // Liga Saída
waitUntil(WiFi.ready); // Agaurda conectar a WiFi
digitalWrite(LStatus, LOW); // Liga Saída
Blynk.begin(auth); // Faz Autenticação no Servidor Blynk
digitalWrite(LStatus, LOW); // Desliga Saída
waitUntil(Blynk.connect); // Agaurda Conectar no Servidor Blink
timer1.start(); // Inicia Rotina Temporizador
delay(50);
}
// This wrapper is in charge of calling
// must be defined like this for the lib work
void dht_wrapper()
{
DHT.isrCallback();
}
// Rotinas do Blynk
BLYNK_CONNECTED()
{
bridge1.setAuthToken("XXXXXXXXXXXXXXXXXXXXXXXXX");
if (PrimeiraBlynk)
{
Blynk.syncAll();
digitalWrite(LStatus, HIGH); // Liga Saída
PrimeiraBlynk = false;
}
}
BLYNK_WRITE(V1)
{
if(param.asInt() > 0)
{
result = DHT.acquireAndWait();
bridge1.virtualWrite(V19, DHT.getCelsius());
Blynk.virtualWrite(V1, 0);
}
}
BLYNK_WRITE(V2)
{
if(param.asInt() > 0)
{
h1 = (map(analogRead(UmidadePin), 4095, 1900, 0, 10000));
h2 = h1;
h2 = h2 / 100;
bridge1.virtualWrite(V20, h2);
Blynk.virtualWrite(V2, 0);
}
}
BLYNK_READ(V3)
{
result = DHT.acquireAndWait();
Blynk.virtualWrite(V3, DHT.getCelsius());
}
BLYNK_READ(V4)
{
h1 = (map(analogRead(UmidadePin), 4095, 1900, 0, 10000));
h2 = h1;
h2 = h2 / 100;
Blynk.virtualWrite(V4, h2);
}
BLYNK_READ(V5)
{
Blynk.virtualWrite(V5, analogRead(UmidadePin));
}
BLYNK_WRITE(V6)
{
if(param.asInt() != 0)
{
Particle.connect();
}
}
BLYNK_WRITE(V7)
{
if(param.asInt() != 0)
{
Particle.disconnect();
digitalWrite(LStatus, LOW); // Desliga Saída
//System.reset();
Blynk.disconnect();
WiFi.disconnect();
}
}
// Temporizadores de algumas funções
void Atualiza()
{
Particle.publish("Edicula -> Ciclos/ms:", String (System.ticksPerMicrosecond()));
}
void loop()
{
// if(Particle.connected)Particle.publish("Ciclos/ms:", String (System.ticksPerMicrosecond()), 30);
Blynk.run();
wd.checkin();
if(!WiFi.ready())
{
digitalWrite(LStatus, LOW); // Desliga Saída
delay(250);
WiFi.connect();
delay(500);
}
if(WiFi.ready() && !Blynk.connected())
{
PrimeiraBlynk = true;
digitalWrite(LStatus, LOW); // Desliga Saída
delay(250);
Blynk.connect();
delay(1000);
}
}
Below is the last code…