Has you can see, the entire code is a little bit bigger than the sketch I show you previously, but the for the issue I am having, (not doing timeout on specified time) I think is no different…
//The main board of this tower is a ARDUINO UNO
//with a YUN Shield
#define BLYNK_PRINT Console
#include <Bridge.h>
#include <BlynkSimpleYun.h>
#include <Motor_Torre_1.h>
#include <ADXL335_V3_Torre_1.h>
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <LCD03.h>
#include <SeguimentoSolar.h>
#include <SPI.h>
#include <SimpleTimer.h>
#include "TMP102.h" //TMP102 library
#include <math.h>
#include <Console.h>
using namespace std;
// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
WidgetLCD lcd1(V2);
WidgetLCD lcd2(V7);
//Condiçoes iniciais do filtro passa baixo. Factor de rapidez do filtro no ADXL335.h
float xFilter = 0;
float yFilter = 0;
float zFilter = 0;
int dAno=0;
int modoManual=0;
int botaoDormir=0;
int dormir=0;
float AzimuthRef=180;
float ElevationRef=85;
float tempC=23;
int Hour=0;
int Minute=0;
int Second=0;
float SunRise=0;
float SunSet=0;
float pitchAngle=180; //Convém colocar um valor apróximado por causa do factor relaxação do filtro
float rollAngle=180; //Convém colocar um valor apróximado por causa do factor relaxação do filtro
int mLST=0;
int hLST=0;
int LimitXXmin=160;
int LimitXXmax=200;
int LimitYYmin=45;
int LimitYYmax=80;
bool BlynkConnected = false; //inicialização da função connected para teste se está ligado ao servidor Blynk;
SimpleTimer timer;
SimpleTimer timerConsola;
char auth[] = "My Token";
IPAddress server_ip (192, 168, 51, 209);
void leds()
{
WidgetLED led1(V4); //register to virtual pin 4
if (modoManual==0)
{
led1.on();
}
else
led1.off();
WidgetLED led2(V6); //register to virtual pin 6
if (modoManual==1)
{
led2.on();
}
else
led2.off();
WidgetLED led3(V1); //register to virtual pin V1
if (botaoDormir==1)
led3.on();
else
led3.off();
WidgetLED led4(V9); //register to virtual pin 1
if (digitalRead(2)==1||digitalRead(3)==1||digitalRead(5)==1||digitalRead(6)==1)
led4.on();
else if(digitalRead(2)==0 && digitalRead(3)==0 && digitalRead(5)==0 && digitalRead(6)==0)
led4.off();
}
void blynkClockMinutesSeconds() //Funcao que manda para o Blynk todos os dados
{
Blynk.virtualWrite(28,Hour);
Blynk.virtualWrite(27,Minute);
Blynk.virtualWrite(26,Second);
}
void blynkClockHours() //Funcao que manda para o Blynk todos os dados
{
Blynk.virtualWrite(28,Hour);
}
void blynkInstantAngles() //Funcao que manda para o Blynk todos os dados
{
Blynk.virtualWrite(2,round(pitchAngle));
Blynk.virtualWrite(5,round(rollAngle));
}
void blynkReferencesAngles() //Funcao que manda para o Blynk todos os dados
{
Blynk.virtualWrite(1,ElevationRef);
Blynk.virtualWrite(3,AzimuthRef);
}
void blynkTemperature() //Funcao que manda para o Blynk todos os dados
{
Blynk.virtualWrite(31,tempC);
}
BLYNK_WRITE(V0) //COLOCAÇÃO EM MODO MANUAL
{
int x = param.asInt();
if(x==1)
{
modoManual=1;
botaoDormir=0;
digitalWrite(6, LOW);
digitalWrite(5, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
}
}
BLYNK_WRITE(V15) //COLOCAÇAO EM MODO AUTOMÁTICO
{
int abc = param.asInt();
if(abc==1)
{
modoManual=0;
botaoDormir=0;
}
}
BLYNK_WRITE(V16) //Colocação em modo Dormir
{
int abcd = param.asInt();
if(abcd==1)
{
botaoDormir=1;
modoManual=0;
}
}
BLYNK_WRITE(V30) //Joystick
{
// modoManual=digitalRead(7);
if (modoManual==1&&botaoDormir==0) //Se o modo manual estiver ligado na plataforma Blynk...
{
//Colocar todas as saidas dos motores a OFF
digitalWrite(6, LOW);
digitalWrite(5, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
int x = param[0].asInt();
int y = param[1].asInt();
int joystick=0;
joystick=mexerJoystick(x,y); //Ver qual o output do joystick na app do Blynk;
switch (mexerMotorManual(joystick,round(rollAngle),round(pitchAngle)))
{
case 0: //meter todos os outputs dos motores a zero
digitalWrite(6, LOW);
digitalWrite(5, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
break;
case 1: //apenas move para esquerda
digitalWrite(2, LOW);
digitalWrite(3, HIGH); //
break;
case 2: //apenas move para a direita
digitalWrite(3, LOW);
digitalWrite(2, HIGH); //
break;
case 3: //apenas move para cima
digitalWrite(5, LOW);
digitalWrite(6, HIGH); //
break;
case 4: //apenas move para baixo
digitalWrite(6, LOW);
digitalWrite(5, HIGH); //
break;
case 5: // move para a esquerda e para cima
digitalWrite(2, LOW);
digitalWrite(5, LOW);
digitalWrite(3, HIGH); //
digitalWrite(6, HIGH);
break;
case 6: // move para a esquerda e para baixo
digitalWrite(2, LOW);
digitalWrite(6, LOW);
digitalWrite(3, HIGH); //
digitalWrite(5, HIGH);
break;
case 7: // move para a direita e para cima
digitalWrite(3, LOW);
digitalWrite(5, LOW);
digitalWrite(2, HIGH); //
digitalWrite(6, HIGH);
break;
case 8: // move para a direita e para baixo
digitalWrite(3, LOW);
digitalWrite(6, LOW);
digitalWrite(2, HIGH); //
digitalWrite(5, HIGH);
break;
} //Fim do joystick
} //Fim do if do modo manual
else if(digitalRead(8)==1) //Botão de dormir na app blynk, vai ler esse botão
{
digitalWrite(7,LOW);
modoManual=digitalRead(7);
AzimuthRef=180;
ElevationRef=85;
}
} //Fim da funcao BlynkWrite
void displayTopo1()
{
lcd1.print(0, 0, "Rxx"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
lcd1.print(4, 0,"Ryy");
lcd1.print(0, 1, (int) AzimuthRef);
lcd1.print(4, 1, (int) ElevationRef);
lcd1.print(8,0,"LT:");
lcd1.print(11,0,Hour);
lcd1.print(13,0,":");
lcd1.print(14,0,Minute);
lcd1.print(8,1,"ST:");
lcd1.print(11,1,hLST);
lcd1.print(13,1,":");
lcd1.print(14,1,mLST);
}
void displayTopo2()
{
lcd2.print(1, 0, "XX"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
lcd2.print(0, 1, (int) rollAngle);
lcd2.print(4, 0, "YY"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
lcd2.print(4, 1, (int) pitchAngle);
lcd2.print(7,0,"SR:");
lcd2.print(11,0,(int)SunRise);
lcd2.print(12,0,":");
lcd2.print(13,0,(int)((SunRise-(int)SunRise)*60.0));
lcd2.print(7,1,"SS:");
lcd2.print(10,1,(int)SunSet);
lcd2.print(12,1,":");
lcd2.print(13,1,(int)((SunSet-(int)SunSet)*60.0));
}
void testBlynkConnection()
{
// if(Blynk.connected()==true)
// Console.println("Conectado ao servidor local Blynk");
if(!BlynkConnected)
{
colocarMotoresOFF();
Console.println("Trying to connect to local Blynk server...");
Blynk.connect(1000);
// Blynk.begin(auth, server_ip, 8442);
if(Blynk.connected()==false)
{
Blynk.disconnect();
Console.println("Failed to Reconnect!");
}
}
}
/*
void statusConnected()
{
if(BlynkConnected)
Console.println("Conectado ao servidor local Blynk");
if(!BlynkConnected)
Console.println("Não connectado ao servidor local Blynk");
}
*/
void mandarInfoConsola()
{
if(BlynkConnected)
Console.println("Connected to Blynk local Blynk server");
Console.print(" angulo XX: ");
Console.print(rollAngle);
Console.print(" angulo YY: ");
Console.print(pitchAngle);
Console.print(" Air Temperature: ");
Console.println(tempC);
if(!BlynkConnected)
Console.println("Not connected to local Blynk");
/*
// Console.print(AzimuthRef);
// Console.print(" ");
// Console.println(ElevationRef);
// Console.print("Vcc: ");
// Console.print(Vcc);
// Console.print(" xFilter: ");
// Console.print(xFilter);
// Console.print(" ");
*/
/*
Console.print(" AcceXX: ");
Console.print(AcceXX);
Console.print(" AcceYY: ");
Console.print(AcceYY);
Console.print(" AcceZZ: ");
Console.println(AcceZZ);
*/
}
void setup()
{
Bridge.begin();
Console.begin(); //??????comentar ou não ??????
// while(!Console);
Blynk.config(auth, server_ip, 8442);
Console.println(" First Conection......");
Blynk.connect(1000);
BlynkConnected=Blynk.connected();
if(BlynkConnected)
{
Console.println("Successfully CONNECTED!");
Blynk.syncAll(); //Sincroniza todos os Vpins para os valores anteriores
}
if(!BlynkConnected)
{
Blynk.disconnect();
Console.println("Disconnected!");
}
lcd1.clear();
lcd2.clear();
//Configuracao para arduino UNO, PINOS!
pinMode(2,OUTPUT); //Saída para relé Azimuth
pinMode(3,OUTPUT); //Saída para relé Azimuth
pinMode(6,OUTPUT); //Saída para relé Elevation
pinMode(5,OUTPUT); //Saída para relé Elevation
colocarMotoresOFF(); //Turn off all motors
// timer.setInterval(1000, blynkInstantAngles);
// timer.setInterval(60000, blynkReferencesAngles);
timer.setInterval(60000L, blynkTemperature);
// timer.setInterval(30000, blynkClockHours);
// timer.setInterval(1000, blynkClockMinutesSeconds);
timer.setInterval(2000L, leds);
timer.setInterval(30000L, displayTopo1); //Display Cima
timer.setInterval(2000L, displayTopo2); //Display Baixo
timer.setInterval(3600000L, testBlynkConnection);
// timer.setInterval(5000, statusConnected);
timerConsola.setInterval(2000L, mandarInfoConsola);
}
void loop()
{
BlynkConnected=Blynk.connected(); //NÃO POSSO COLOCAR isto assim sem simpletimer...faz reboot ao YUN
if (BlynkConnected)
{
Blynk.run();
}
else if (!BlynkConnected)
{
Blynk.disconnect();
}
int x,y,z,Month,Day,sLST,luz,AzimuthRefMan,ElevationRefMan,botaoTeste;
tmElements_t tm;
float X,Y,Z,AcceXX,AcceYY,AcceZZ,AngleXX,AngleYY,AngleZZ,oxc,oyc,LSTM,HRA,Declination,Latitude,Longitude,EoT,LST,TC;
RTC.read(tm);
timer.run(); // Initiates SimpleTimer
timerConsola.run();
TMP102 tmp102;
tmp102.setup();
tempC = tmp102.getTemperatureCelsius();
Latitude=38.71667;
Longitude=-9.13333;
LSTM=0; //Desfazamento em graus da multiplicação de 15ºx Diferença GMT do local... está feito de momento para portugal.
dAno=diaAno(tmYearToCalendar(tm.Year),tm.Month,tm.Day);
EoT=getEoT(dAno);
TC=getTC(Longitude,LSTM,EoT);
Hour=tm.Hour;
Minute=tm.Minute;
Second=tm.Second;
LST=getLST(Hour,Minute,Second,TC); //LST em horas??
HRA=getHRA(LST);
Declination=getDeclination(dAno);
ElevationRef=getElevation(Declination,Latitude,HRA);
AzimuthRef=getAnzimuth(Declination,Latitude,HRA,ElevationRef,LST);
hLST=gethHOUR(LST);
mLST=getmHOUR(LST);
sLST=getsHOUR(LST);
SunRise=getSunRise(Latitude,Declination,TC);
SunSet=getSunSet(Latitude,Declination,TC);
long Vcc=readVcc(); //Mede automáticamente o valor da tensão que está a receber...e ajusta para as leituras anaógicas serem decentes comparando com a referencia interna
X=getXCorrigido(Vcc);
Y=getYCorrigido(Vcc);
Z=getZCorrigido(Vcc);
//Aplicar filtro "passa baixo" directamente nas leituras do acelerometro, para eliminar os picos
xFilter=((X*alpha)+(xFilter*(1.0-alpha)));
yFilter=(Y*alpha)+(yFilter*(1.0-alpha));
zFilter=(Z*alpha)+(zFilter*(1.0-alpha));
//Aplicar leituras para calculos já com o filtro aplicado
AcceXX=getAcceXX(xFilter,Vcc);
AcceYY=getAcceYY(yFilter,Vcc);
AcceZZ=getAcceZZ(zFilter,Vcc);
pitchAngle=pitch(AcceXX,AcceYY,AcceZZ);
rollAngle=roll(AcceXX,AcceYY,AcceZZ);
//pitchAngle=90-pitchAngle;
rollAngle=180+rollAngle;
if(modoManual==0)
digitalWrite(7,LOW);
else if(modoManual==1)
digitalWrite(7,HIGH);
dormir=modoDescanso(SunSet,SunRise,LST,botaoDormir); //Basta uma das 3 condições de entrada nesta função se verificarem para se tornar 1!
if(dormir==1)
{
AzimuthRef=180;
ElevationRef=85;
}
if(AzimuthRef>LimitXXmax)
{
AzimuthRef=LimitXXmax;
}
if(AzimuthRef<LimitXXmin)
{
AzimuthRef=LimitXXmin;
}
if(ElevationRef>LimitYYmax)
{
ElevationRef=LimitYYmax;
}
if(ElevationRef<LimitYYmin)
{
ElevationRef=LimitYYmin;
}
if (modoManual==0&&dormir==1&&millis()>120000||modoManual==0&&dormir==0&&millis()>120000) //MODO AUTOMÁTICO com delay de 120s no primeiro arranque para os motores estabilizarem
{
switch (mexerMotorAzimuth(round(AzimuthRef),round(rollAngle),modoManual))
{
case 1:
digitalWrite(3, LOW);
digitalWrite(2, HIGH); //
break;
case 2:
digitalWrite(2, LOW);
digitalWrite(3, HIGH); //
break;
case 0:
// colocarMotoresOFF(); //Desligar TODOS os motores
digitalWrite(2, LOW);
digitalWrite(3, LOW);
break;
} //Fim do switch dos XX
switch (mexerMotorElevation(round(ElevationRef),round(pitchAngle),modoManual))
{
case 3:
digitalWrite(5, LOW);
digitalWrite(6, HIGH); //
break;
case 4:
digitalWrite(6, LOW);
digitalWrite(5, HIGH); //
break;
case 0:
digitalWrite(6, LOW);
digitalWrite(5, LOW);
break;
} //Fim do switch da elevacao
} //Fim do modo Automatico
}