tion 'void loop()':
C:\Users\Usuário\Downloads\Rele Serial Ethernet v.1.0\rele-serial-ethernet\rele-serial-ethernet.ino:137:49: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
O sketch usa 23.208 bytes (71%) de espaço de armazenamento para programas. O máximo são 32.256 bytes.Variáveis globais usam 1.514 bytes (73%) de memória dinâmica, deixando 534 bytes para variáveis locais. O máximo são 2.048 bytes.
#include <SPI.h>#include <SD.h>#include <Ethernet_v2.h>#include <SerialRelay.h>
//Define o Mac Address da placa de rede. Essa informação pode ser encontrada em uma etiqueta colada embaixo da mesma.byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0x04, 0x75 };//Define o IP da placa. Caso necessário altere o mesmo para se adequar a sua rede.IPAddress ip(192, 168, 0, 90);
EthernetServer server(80);File webFile;
//na linha de baixo está sendo definido as portas em que o módulo relé serial está conectado.SerialRelay relays(8, 9, 10); // (pino de data, pino de clock, quantidade de módulos)
#define REQ_BUF_SZ 60char HTTP_req[REQ_BUF_SZ] = {0};char req_index = 0;
int estado_botao[41];
char * pch;
void setup(){ //ESTADO INICIAL DOS BOTOES 0 -> desligado, 1 -> ligado: estado_botao[1] = 0; estado_botao[2] = 0; estado_botao[3] = 0; estado_botao[4] = 0; estado_botao[5] = 0; estado_botao[6] = 0; estado_botao[7] = 0; estado_botao[8] = 0; estado_botao[9] = 0; estado_botao[10] = 0; estado_botao[11] = 0; estado_botao[12] = 0; estado_botao[13] = 0; estado_botao[14] = 0; estado_botao[15] = 0; estado_botao[16] = 0; estado_botao[17] = 0; estado_botao[18] = 0; estado_botao[19] = 0; estado_botao[20] = 0; estado_botao[21] = 0; estado_botao[22] = 0; estado_botao[23] = 0; estado_botao[24] = 0; estado_botao[25] = 0; estado_botao[26] = 0; estado_botao[27] = 0; estado_botao[28] = 0; estado_botao[29] = 0; estado_botao[30] = 0; estado_botao[31] = 0; estado_botao[32] = 0; estado_botao[33] = 0; estado_botao[34] = 0; estado_botao[35] = 0; estado_botao[36] = 0; estado_botao[37] = 0; estado_botao[38] = 0; estado_botao[39] = 0; estado_botao[40] = 0;
Serial.begin(9600);
Serial.println("Inicializando cartao microSD..."); if (!SD.begin(4)) { Serial.println("ERRO - inicializacao do cartao falhou!"); return; } Serial.println("SUCESSO - cartao microSD inicializado.");
if (!SD.exists("index.htm")) { Serial.println("ERRO - index.htm nao foi encontrado!"); return; } Serial.println("SUCESSO - Encontrado arquivo index.htm.");
Ethernet.begin(mac, ip); server.begin();}
void loop(){ EthernetClient client = server.available(); //verifica se existe alguém querendo se conectar
if (client) { // existe cliente? boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { // Existe informacao vinda do cliente char c = client.read(); // Le cada byte enviado pelo cliente, ou seja, cada caracter. // Por padrao, o ultimo caracter enviado pelo cliente (nosso navegador) é em branco e termina com \n // Dessa forma conseguimos saber se o cliente acabou de enviar informacoes para o servidor (Arduino) if (req_index < (REQ_BUF_SZ - 1)) { HTTP_req[req_index] = c; // salva os caracteres das solicitacoes do browser req_index++; } if (c == '\n' && currentLineIsBlank) { // envia para o cliente o protocolo padrao de sucesso HTTP client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println();
//caso a request seja pela ação de um botão: if (StrContains(HTTP_req, "ajax_botao")) { for (int i = 1 ; i <= 40 ; i++) { //Serial.println(HTTP_req); char botao[] = "botaoxx"; if (i < 10) { botao[5] = '0'; botao[6] = '0' + i; } else { botao[5] = '0' + (i / 10); botao[6] = '0' + (i % 10); }
//Serial.println(botao); if (StrContains(HTTP_req, botao)) { SetBotao(i, client); } } } else { // grava no arquivo webFile a página que temos no microSD webFile = SD.open("index.htm"); if (webFile) { while (webFile.available()) { client.write(webFile.read()); // envia para o cliente a página - nessa linha de fato o Arduino imprime no browser a página } webFile.close(); } } Serial.println(HTTP_req); //para debug, verifica no monitor serial a requisição req_index = 0; //reseta o index do buffer e a variável que armazena as requisições StrClear(HTTP_req, REQ_BUF_SZ); break; } // toda linha de texto recebida do cliente termina com \r\n if (c == '\n') { //verifica se acabou a linha, já que \n é o ultimo caracter currentLineIsBlank = true; } else if (c != '\r') { // o cliente ainda está enviando informações currentLineIsBlank = false; } } } delay(1); // dá um tempo para o browser receber os dados client.stop(); // fecha a conexão }}
void SetBotao(int botao, EthernetClient client) {
int modulo = (botao - 1) / 4 + 1; int rele = botao % 4; if (rele == 0) { rele = 4; }
Serial.print("modulo:"); Serial.print(modulo); Serial.print(" rele:"); Serial.print(rele); Serial.print(" - ");
if (estado_botao[botao] == 0) { relays.SetRelay(rele, SERIAL_RELAY_ON, modulo); estado_botao[botao] = 1; //client.print("1"); Serial.println("1"); } else { relays.SetRelay(rele, SERIAL_RELAY_OFF, modulo); estado_botao[botao] = 0; //client.print("0"); Serial.println("0"); } client.print("0|"); for (int i = 1 ; i <= 40 ; i++) { client.print(estado_botao[i]); client.print("|"); }
}
// funcao para limpar arrays (no nosso caso, as variaveis que armazenam requests)void StrClear(char *str, char length){ for (int i = 0; i < length; i++) { str[i] = 0; }}
// funcao que procura pela string SFIND em STR// retorna 1 se a string for encontrada// retorna 0 se a setring não for encontradachar StrContains(char *str, char* sfind){ char found = 0; char index = 0; char len;
len = strlen(str);
if (strlen(sfind) > len) { return 0; } while (index < len) { if (str[index] == sfind[found]) { found++; if (strlen(sfind) == found) { return 1; } } else { found = 0; } index++; } return 0;}…
lt;SPI.h>#include <SD.h>#include <Ethernet_v2.h>#include <SerialRelay.h>
//Define o Mac Address da placa de rede. Essa informação pode ser encontrada em uma etiqueta colada embaixo da mesma.byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0xC6, 0x65 };//Define o IP da placa. Caso necessário altere o mesmo para se adequar a sua rede.IPAddress ip(192, 168, 0, 99);
EthernetServer server(8484);File webFile;
//na linha de baixo está sendo definido as portas em que o módulo relé serial está conectado.SerialRelay relays(8, 9, 10); // (pino de data, pino de clock, quantidade de módulos)
#define REQ_BUF_SZ 60char HTTP_req[REQ_BUF_SZ] = {0};char req_index = 0;
int estado_botao[41];
char * pch;
void setup(){ //ESTADO INICIAL DOS BOTOES 0 -> desligado, 1 -> ligado: estado_botao[1] = 0; estado_botao[2] = 0; estado_botao[3] = 0; estado_botao[4] = 0; estado_botao[5] = 0; estado_botao[6] = 0; estado_botao[7] = 0; estado_botao[8] = 0; estado_botao[9] = 0; estado_botao[10] = 0; estado_botao[11] = 0; estado_botao[12] = 0; estado_botao[13] = 0; estado_botao[14] = 0; estado_botao[15] = 0; estado_botao[16] = 0; estado_botao[17] = 0; estado_botao[18] = 0; estado_botao[19] = 0; estado_botao[20] = 0; estado_botao[21] = 0; estado_botao[22] = 0; estado_botao[23] = 0; estado_botao[24] = 0; estado_botao[25] = 0; estado_botao[26] = 0; estado_botao[27] = 0; estado_botao[28] = 0; estado_botao[29] = 0; estado_botao[30] = 0; estado_botao[31] = 0; estado_botao[32] = 0; estado_botao[33] = 0; estado_botao[34] = 0; estado_botao[35] = 0; estado_botao[36] = 0; estado_botao[37] = 0; estado_botao[38] = 0; estado_botao[39] = 0; estado_botao[40] = 0;
Serial.begin(9600);
Serial.println("Inicializando cartao microSD..."); if (!SD.begin(4)) { Serial.println("ERRO - inicializacao do cartao falhou!"); return; } Serial.println("SUCESSO - cartao microSD inicializado.");
if (!SD.exists("index.htm")) { Serial.println("ERRO - index.htm nao foi encontrado!"); return; } Serial.println("SUCESSO - Encontrado arquivo index.htm.");
Ethernet.begin(mac, ip); server.begin();}
void loop(){ EthernetClient client = server.available(); //verifica se existe alguém querendo se conectar
if (client) { // existe cliente? boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { // Existe informacao vinda do cliente char c = client.read(); // Le cada byte enviado pelo cliente, ou seja, cada caracter. // Por padrao, o ultimo caracter enviado pelo cliente (nosso navegador) é em branco e termina com \n // Dessa forma conseguimos saber se o cliente acabou de enviar informacoes para o servidor (Arduino) if (req_index < (REQ_BUF_SZ - 1)) { HTTP_req[req_index] = c; // salva os caracteres das solicitacoes do browser req_index++; } if (c == '\n' && currentLineIsBlank) { // envia para o cliente o protocolo padrao de sucesso HTTP client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println();
//caso a request seja pela ação de um botão: if (StrContains(HTTP_req, "ajax_botao")) { for (int i = 1 ; i <= 40 ; i++) { //Serial.println(HTTP_req); char botao[] = "botaoxx"; if (i < 10) { botao[5] = '0'; botao[6] = '0' + i; } else { botao[5] = '0' + (i / 10); botao[6] = '0' + (i % 10); }
//Serial.println(botao); if (StrContains(HTTP_req, botao)) { SetBotao(i, client); } } } else { // grava no arquivo webFile a página que temos no microSD webFile = SD.open("index.htm"); if (webFile) { while (webFile.available()) { client.write(webFile.read()); // envia para o cliente a página - nessa linha de fato o Arduino imprime no browser a página } webFile.close(); } } Serial.println(HTTP_req); //para debug, verifica no monitor serial a requisição req_index = 0; //reseta o index do buffer e a variável que armazena as requisições StrClear(HTTP_req, REQ_BUF_SZ); break; } // toda linha de texto recebida do cliente termina com \r\n if (c == '\n') { //verifica se acabou a linha, já que \n é o ultimo caracter currentLineIsBlank = true; } else if (c != '\r') { // o cliente ainda está enviando informações currentLineIsBlank = false; } } } delay(1); // dá um tempo para o browser receber os dados client.stop(); // fecha a conexão }}
void SetBotao(int botao, EthernetClient client) {
int modulo = (botao - 1) / 4 + 1; int rele = botao % 4; if (rele == 0) { rele = 4; }
Serial.print("modulo:"); Serial.print(modulo); Serial.print(" rele:"); Serial.print(rele); Serial.print(" - ");
if (estado_botao[botao] == 0) { relays.SetRelay(rele, SERIAL_RELAY_ON, modulo); delay(500); estado_botao[botao] = 1; //client.print("1"); Serial.println("1"); relays.SetRelay(rele, SERIAL_RELAY_OFF, modulo); delay(500); estado_botao[botao] = 0; //client.print("0"); Serial.println("0"); } else { } client.print("0|"); for (int i = 1 ; i <= 40 ; i++) { client.print(estado_botao[i]); client.print("|"); }
}
// funcao para limpar arrays (no nosso caso, as variaveis que armazenam requests)void StrClear(char *str, char length){ for (int i = 0; i < length; i++) { str[i] = 0; }}
// funcao que procura pela string SFIND em STR// retorna 1 se a string for encontrada// retorna 0 se a setring não for encontradachar StrContains(char *str, char* sfind){ char found = 0; char index = 0; char len;
len = strlen(str);
if (strlen(sfind) > len) { return 0; } while (index < len) { if (str[index] == sfind[found]) { found++; if (strlen(sfind) == found) { return 1; } } else { found = 0; } index++; } return 0;}…
Bm ou menos
1 -111 dBm
2...30 -110...-54 dBm
31 -52 dBm ou maior
99 não detectou sinal
Portanto, depois de enviar o comando corretamente para o sim900 você deverá ler a resposta do sim900, e em seguida tratar a string recebida, retirando o valor desejado do rssi, salvando-o em uma variavel para então enviar ao lcd...
Segue um sketch que faz a leitura do rssi do sim900 e imprime o mesmo no serial monitor do arduino, estude-o, entenda como é que funciona, pois com certeza deverá ser necessário algumas modificações principalmente na instance da porta serial... dificilmente o nome da porta serial usada no sketch do exemplo ( no caso mySerial ) coincidirá com a que que foi usada no seu sketch, para verificar isso você deverá abrir a library do sim900 e verificar qual o nome usado...
O sketch:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
// AUX GSM Leitura de dados
String linhaAtual = "";
String db = "";
boolean lendoDB = false;
void setup()
{
mySerial.begin(19200); // inicia conexao SIM900
Serial.begin(9600); // inicia conexao PC
}
void loop()
{
delay(500); // delay de envio de dados
mySerial.println("AT+CSQ"); // envia comando ao SIM900
while(mySerial.available()>0) // se existem dados na porta serial
{
char dados = mySerial.read(); // variavel dados recebe informacoes
linhaAtual += dados; // variavel linha recebe dados
if (dados == '\n') // se tiver um ENTER em dados
{
linhaAtual = ""; // apaga dados da linha
}
if (linhaAtual.endsWith(" ")) // se a linha terminar com espaco em branco
{
lendoDB = true; // estamos lendo dados
db = ""; // limpo variavel que vai receber dados em DB
}
if (lendoDB) // se estamos lendo os dados
{
if (dados != ',') // faz leitura ate encontrar virgula
{
db += dados; // adiciona info a variavel db
}
else // se nao estamos lendo
{
lendoDB = false; // sem leitura
Serial.println(db); // enviamos os dados para o computador pela porta serial
}
}
}
}
fonte: http://microembarcado.blogspot.com.br/2013/11/sim900-labview-fazendo-leitura-de-sinal.html
Espero que isto possa lhe ajudar a conseguir ver a indicação do sinal no seu display lcd.
Abraço.…
Adicionado por Wiechert ao 4:35 em 6 setembro 2014
define polling 10 // the scan rate
// If the packets internal retry register matches// the set retry count then communication is stopped// on that packet. To re-enable the packet you must// set the "connection" variable to true.#define retry_count 10
// used to toggle the receive/transmit pin on the driver#define TxEnablePin 20
#define LED 9
// This is the easiest way to create new packets// Add as many as you want. TOTAL_NO_OF_PACKETS// is automatically updated.enum{ PACKET1, PACKET2, PACKET3, PACKET4, PACKET5, PACKET6, PACKET7, PACKET8, PACKET9, PACKET10, PACKET11, PACKET12, PACKET13, PACKET14, PACKET15, PACKET16, PACKET17, TOTAL_NO_OF_PACKETS // leave this last entry};
// Create an array of Packets to be configuredPacket packets[TOTAL_NO_OF_PACKETS];
// Create a packetPointer to access each packet// individually. This is not required you can access// the array explicitly. E.g. packets[PACKET1].id = 2;// This does become tedious though...//////////////////////////HMI READS/////////////////////////////packetPointer enableDisableHMI = &packets[PACKET1];packetPointer runFwdHMI = &packets[PACKET2];packetPointer runRevHMI = &packets[PACKET3];packetPointer resetHMI = &packets[PACKET4];packetPointer eStopHMI = &packets[PACKET5];packetPointer userSetSpeedHMI = &packets[PACKET6];
//////////////////////////HMI WRITES////////////////////////////packetPointer runLedHMI = &packets[PACKET7];packetPointer stopLedHMI = &packets[PACKET8];packetPointer errorLedHMI = &packets[PACKET9];packetPointer actualSpeedHMI = &packets[PACKET10];packetPointer motorCurrentHMI = &packets[PACKET11];
/////////////////////////VSD READS//////////////////////////////packetPointer statusWordVSD = &packets[PACKET12];packetPointer actualSpeedVSD = &packets[PACKET13];packetPointer motorCurrentVSD = &packets[PACKET14];
/////////////////////////VSD WRITES/////////////////////////////packetPointer commandWordVSD = &packets[PACKET15];packetPointer userSetSpeedVSD = &packets[PACKET16];packetPointer clearFaultsVSD = &packets[PACKET17];
////////HMI READ VARIABLES////////////unsigned int readEnableDisableHMI[1];unsigned int readRunFwdHMI[1];unsigned int readRunRevHMI[1];unsigned int readResetHMI[1];unsigned int readEstopHMI[1];unsigned int readUserSetSpeedHMI[1];
////////HMI WRITE VARIABLES//////////unsigned int writeRunLedHMI[1];unsigned int writeStopLedHMI[1];unsigned int writeErrorLedHMI[1];unsigned int writeActualSpeedHMI[1];unsigned int writeMotorCurrentHMI[1];
////////VSD READ VARIABLES///////////unsigned int readStatusWordVSD[1];unsigned int readActualSpeedVSD[1];unsigned int readMotorCurrentVSD[1];
////////VSD WRITE VARIABLES//////////unsigned int writeControlWordVSD[1];unsigned int writeUserSetSpeedVSD[1]={0};unsigned int writeClearFaultsVSD[1];
// High or Low variables as arraysunsigned int writeHigh[1]={1};unsigned int writeLow[1]={0};
const int vccPin = 17;const int gndPin = 21;
unsigned int BUTTONSTATE;unsigned int PREVBUTTONSTATE;
void setup(){ Serial.begin(19200); // Set modes of some pins for LED outputs pinMode(vccPin, OUTPUT); pinMode(gndPin, OUTPUT); digitalWrite(vccPin, HIGH); digitalWrite(gndPin, LOW); // Read all values from HMI modbus_construct(enableDisableHMI, 3, READ_HOLDING_REGISTERS, 50, 1, readEnableDisableHMI); modbus_construct(runFwdHMI, 3, READ_HOLDING_REGISTERS, 60, 1, readRunFwdHMI); modbus_construct(runRevHMI, 3, READ_HOLDING_REGISTERS, 70, 1, readRunRevHMI); modbus_construct(resetHMI, 3, READ_HOLDING_REGISTERS, 80, 1, readResetHMI); modbus_construct(eStopHMI, 3, READ_HOLDING_REGISTERS, 90, 1, readEstopHMI); modbus_construct(userSetSpeedHMI, 3, READ_HOLDING_REGISTERS, 10, 1, readUserSetSpeedHMI); // Write required values to HMI modbus_construct(runLedHMI, 3, PRESET_MULTIPLE_REGISTERS, 100, 1, writeRunLedHMI); modbus_construct(stopLedHMI, 3, PRESET_MULTIPLE_REGISTERS, 110, 1, writeStopLedHMI); modbus_construct(errorLedHMI, 3, PRESET_MULTIPLE_REGISTERS, 120, 1, writeErrorLedHMI); modbus_construct(actualSpeedHMI, 3, PRESET_MULTIPLE_REGISTERS, 0, 1, readActualSpeedVSD); modbus_construct(motorCurrentHMI, 3, PRESET_MULTIPLE_REGISTERS, 20, 1, readMotorCurrentVSD); // Read all values from VSD modbus_construct(statusWordVSD, 2, READ_HOLDING_REGISTERS, 8603, 1, readStatusWordVSD); modbus_construct(actualSpeedVSD, 2, READ_HOLDING_REGISTERS, 8604, 1, readActualSpeedVSD); modbus_construct(motorCurrentVSD, 2, READ_HOLDING_REGISTERS, 3204, 1, readMotorCurrentVSD); // Write required values to VSD modbus_construct(commandWordVSD, 2, PRESET_MULTIPLE_REGISTERS, 8601, 1, writeControlWordVSD); modbus_construct(userSetSpeedVSD, 2, PRESET_MULTIPLE_REGISTERS, 8602, 1, readUserSetSpeedHMI); modbus_construct(clearFaultsVSD, 2, PRESET_MULTIPLE_REGISTERS, 8501, 1, writeClearFaultsVSD); // Configure the MODBUS connection modbus_configure(baud, SERIAL_8E1, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS); pinMode(LED, OUTPUT); pinMode(6,OUTPUT); pinMode(5,OUTPUT); digitalWrite(5,LOW); pinMode(3,OUTPUT); pinMode(2,OUTPUT); digitalWrite(2,LOW); pinMode(11,OUTPUT); pinMode(10,OUTPUT); digitalWrite(10,LOW);}
void loop(){ modbus_update(); // Get the latest register values for the buttons and screen elements... checkState(); // Convert the button register states into a single integer value for use in switch|case statement... switch(BUTTONSTATE){ case 0: while(BUTTONSTATE==0) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 1: while(BUTTONSTATE==1) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 2: while(BUTTONSTATE==2) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 3: while(BUTTONSTATE==3) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 4: while(BUTTONSTATE==4) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 5: while(BUTTONSTATE==5) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 6: while(BUTTONSTATE==6) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 7: while(BUTTONSTATE==7) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 8: while(BUTTONSTATE==8) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 9: while(BUTTONSTATE==9) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 10: while(BUTTONSTATE==10) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 16: while(BUTTONSTATE==16) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; default: break; } }
void checkState() // This function simply reads whether each button is active("1") or inactive ("0") and bitshifts each button to create a unique BUTTONSTATE value for each combination of button presses...{ PREVBUTTONSTATE=BUTTONSTATE; BUTTONSTATE = (readEnableDisableHMI[0])+(readRunFwdHMI[0]<<1)+(readRunRevHMI[0]<<2)+(readResetHMI[0]<<3)+(readEstopHMI[0]<<4); // Example: Drive enabled, and run forward... 0b00011 = dec "3"... so BUTTONSTATE = 3. if(BUTTONSTATE==11||BUTTONSTATE==12||BUTTONSTATE==13||BUTTONSTATE==14||BUTTONSTATE==15) // For our implementation these button press combinations are not valid... so just make them = to state 10... { BUTTONSTATE=10; } // As above... These are all the possible BUTTONSTATE values when the E-stop button is pressed... but if E-Stop is pressed we want to kill all buttons anyway... if(BUTTONSTATE==17||BUTTONSTATE==18||BUTTONSTATE==19||BUTTONSTATE==20||BUTTONSTATE==21||BUTTONSTATE==22||BUTTONSTATE==23||BUTTONSTATE==24||BUTTONSTATE==25||BUTTONSTATE==26||BUTTONSTATE==27||BUTTONSTATE==28||BUTTONSTATE==29||BUTTONSTATE==30||BUTTONSTATE==31) { BUTTONSTATE=16; } }…
Adicionado por Rodrigo Sutto ao 10:36 em 27 outubro 2016