Ajuda com Ethernet Shield - status não atualiza depois de 1 hora (Contador de pessoas)

Olá pessoal, sou novo aqui e estou precisando de uma ajuda.

Fiz um contador de pessoal (entrada e saída) utilizando um Arduino Mega, uma Ethernet shield e dois sensores de distância ultrassónicos. Ele está funcionando certinho só que depois de mais ou menos 1 hora ligado ele para de contar, mas se dermos um Ping no IP da ethernet ela está respondendo. Seria algum problema no código ou será que o defeito está nos sensores? Alguém poderia me ajudar? Alguém já teve esse problema? Segue código anexo...Contador_pessoas_com_rede_FINAL.ino

Desde já obrigado.

Exibições: 2024

Anexos

Responder esta

Respostas a este tópico

Sugiro que você faça a depuração usando o monitor serial, exibindo dado dos contadores, colocando prints em vários pontos do código para detectar algum eventual travamento.

Vou desativar a Ethernet e testar apenas com a serial, mas acho que o problema não esta no código do contador e sim em alguma configuração da placa de rede. Um exemplo disso foi o seu teste de ontem com o medidor de temperatura que parou de atualizar as informações depois de mais ou menos 50 minutos. Mesmo assim vou fazer as teste com a serial e tentar achar o que ta travando. Mais uma vez obrigado pelas dicas.

Sim o meu experimento travou após 50 minutos e depois continuou travando. Agora pela manhã melhorei o código colocando um watchdog  e um esquema de reconectar ao servidor em caso de falha. Esse código está funcionando desde as 8hs. Ocorreram 3 travamentos nesse periodo, o que da uma média de 1 travamento por hora, porém como tem o watchdog ele se recuperou sem precisar nenhuma ação.

Vou deixar conectado por mais algumas horas e ver como fica, depois disso vou inventar alguma coisa para dissipar a temperatura do chip e monitorar o comportamento.

Marco como que eu faço esse watchdog? Teria como você mandar seu código para que eu possa implementar no meu. Posso te falar que meu conhecimento em programação do Arduíno é de 5%, estou conseguindo fazer as coisa com base em exemplos que pego na internet, então se você puder me ajudar ficarei muito grato. Obrigado mais uma vez.

Marco preciso da sua ajuda, tentei fazer o watchdog que vc comentou e agora meu Arduíno está em loop infinito, só pica o LED do pino 13 e não deixa eu gravar mais nada nele. Como faço pra resolver isso e como que uso esse tal de watchdog?

O watchdog basicamente é um contador que gera um reset ou interrupção no controlador caso ocorra um overflow da contagem. Como acho importante entender o que estamos fazendo dei uma estudada no datasheet e implementei um código de teste para ilustrar. Registrei isso  no link:

http://drbitblog.wordpress.com/2014/04/10/watchdog-em-microcontrola...

Inseri esse recurso no meu sistema com o Shield Ethernet, foi dessa forma que consegui funcionamento constante resolvendo a questão dos travamentos.

Sim, o arduino Uno com o Shield wiznet w5100 trava continua travando aproximadamente a cada 30 minutos. Bom, tanto Arduino quanto o Shield são comprados no DX, pode ser chip de segunda linha. Gostaria de saber se os outros usuários estão tendo problemas de travamento

 

Marco a função "wdt_reset();" eu coloco no inicio do código ou no fim? No seu caso do medidor de temperatura você colocou no final depois do código da ethernet? Teria como você mostrar seu código apenas nesta parte? Como você fez pra resetar só quando travar? Sobre sua pergunta, meu arduino e ethernet também não são originais.

Assim que tiver um tempinho vou postar todo o código e a integração com o thingspeak, mas já adianto que a função wdt_reset() pode estar em qualquer ponto do loop, o importante é que o tempo de execução do loop seja menor que o configurado para o watchdog. Eu estou usando o maior valor que dá o overflow em 8 segundos.

Eu coloquei ele wdt_reset() na ultima linha do loop, onde finaliza o código e mesmo assim continua travando o contador e ele não esta dando reset. Da uma olhadinha:

{
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && currentLineIsBlank) {
client.print("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); //+++++++++++++++
client.print("<Expovale>");
client.print("<Entrada>");
client.print(Entraram);
client.print("</Entrada>");
client.print("<Saida>");
client.print(Sairam);
client.print("</Saida>");
client.print("</Expovale>");
break;
}
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
client = NULL;
}
}
rodada++;
wdt_reset();
}

Isso tá parecendo overflow da função micros().

Olá Francesco, você poderia explicar isso na língua dos leigos?

A função micros() é usada pra marcar o tempo em microssegundos. Existe um contador de microssegundos no arduino. Quando vc chama a função micros() o que vc recebe é a quantidade de microssegundos desde que o arduino foi ligado. É a mesma coisa que a função millis(), mas a millis() conta milissegundos. Esse contador é armazenado em uma variável inteira de 4 bytes. O problema é que em 4 bytes só dá pra contar mais ou menos uma hora de microssegundos. Então aproximadamente a cada hora o contador tem um overflow, ou seja, estoura sua capacidade, e aí ele volta a zero. Se tiver alguma coisa medindo tempo com a função micros, vai bagunçar as medidas.

Talvez alguma biblioteca que vc esteja usando dependa da função micros() e não funciona mais quando o contador volta a zero.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço