Boa galera, peço uma ajuda de vocês pois não estou achando a saída... procuro sempre futucar por ai antes de incomodar os outros, mas parece que nem o mestre das respostar tem esse resposta pra me dar... fucei o Google e nada!

então vim pedir ajuda ao que realmente entendem do babado! rsrs...

o que se passa é o seguinte: esse projeto era pra ser um contador que ao atingir 30 dias parasse de funcionar, mas parece que ele para com 8 dias e pouco, e me retorna uma mensagem que não consigo ler toda pois a IDE trava, e não consigo nem movê-la do luga...

as únicas informações que tenho são as mesmas que vocês conseguem ver...

segue o código:

*********************************************************************************************************************

byte SEG = 0; //variavel dos segundos
byte MIN = 0; //variavel dos minutos
byte H = 0; //variavel das horas
byte D = 0; //variavel dos dias
const byte opto1 = 3; //constante para o pino da saida de 250Hz
const byte LED = 13 // constante para o pino do LED indicador de funcionamento

void setup()
{
pinMode(LED, OUTPUT); // define pino 13 como pino do led indicador de funcionamente (vai ser mudado quando for para o ATtiny45)
pinMode(opto1, OUTPUT); // define a saida do opto acoplador
Serial.begin (9600); // habilita a serial para debug
}

void loop()
{
tone (opto1, 250); //me da uma frequencia de 250Hz na saida PWM 3
digitalWrite (LED, HIGH); // nivel alto na porta do LED inidcador de funcionamento
delay(500); //delay de meio segundo
digitalWrite (LED, LOW); //nivel baixo na porta do LED indicador de funcionamento
delay(500); // delay de meio segundo
(SEG = SEG++); // incrementa a variável de segundo a cada segundo (mais ou menos ta dando um pouquinho mais so da pra ver no escope, mas não interfere diretamente no funcionamento)
if (SEG >=60) {SEG=0; MIN = MIN+1;}; //incrementa a variavel de minuto e zera a de segundo reiniciando o ciclo
if (MIN>=60) {MIN=0; H=H+1;}; //incrementa a variavel de hora e zera a de minuto reiniciando o ciclo
if (H>=24) {H=0; D=D+1;}; // incrementa a variave de dia e reinicia a de hora ao somar 24
if (D==30) {parado();} // condiçao para que o programa pare de funcionar, quando a variavel D atingir 30 o programa executa parado()

Serial.print(D); // imprime o valor de D
Serial.print(" - "); // imprime o caracter -
Serial.print(H); // imprime o valor de H
Serial.print(" : "); // imprime o caracter :
Serial.print(MIN); // imprime o valor de MIN
Serial.print(" ' "); // imprime o caracter '
Serial.println(SEG); // imprime o valor de SEG e desce uma linha
}

void parado ()
{
digitalWrite (LED, LOW); //desliga o LED de funcionamento
noTone (opto1); // desliga a saida PWM que continha 250Hz
while (D==30) {} //roda uma uma instruçao vazia enquanto o valor de D for = 30
}

*********************************************************************************************************************

e ai? o que pode estar acontecendo?!

Exibições: 716

Responder esta

Respostas a este tópico

Ola amigo, boa noite!

          Amigo tente não usar a porta serial para este tipo de projeto pois sempre que seu pc desconectar da porta e reconectar ele ira reiniciar o microcontrolador, faça o teste usando um display lcd para vc visualizar o processo.

 

Esta é minha opinião.

Abraço!

 

Valeu Rodrigo, eu não reconectei, como o projeto esta programado para parar de funcionar depois de atingir um certo valor em "D" e apagar o LED eu o mantive ligado, cheguei a achar mesmo que seria um problema de comunicação apenas, mas pelo que vc viu do código, esta certo? ou tem algo que pode estar causando isso no código, sou novo em programação, mas o código é muito simples e de fácil intendimento, revisei uma penca de vezes e não vi nada de errado, mas como tenho consciência que sou novato ainda não me sinto seguro de garantir que eu não possa ter feito uma M qualquer no código...

Eu não imaginei que a comunicação poderia "expirar" vou ver no gerenciador de dispositivos se tem a opção para que o PC não desligue para economizar energia.

o que vcs acham do código? funciona, não funciona?

Obrigado Rodrigo!

Porque você não calcula através do millis()?

unsigned long tempoDecorrido = millis();

int minutos = tempoDecorrido  / 60000; // minutos
int segundos = ((tempoDecorrido  - (minutos * 60000)) % 60000) / 1000;

é só ir dividindo que você encontra todos os intervalos que precisa.

E para você testar para ver onde ele dá seu erro no seu programa você acrescentar o equivilente a 8 dias em segundos a variável tempoDecorrido

Eu tinha pensado em fazer baseado em mills, so que eu depois descobri que nao sabia fazer, rsrs....

Tem um outro problema também, preciso testar o programa para ver se está rodando cerinho, e com a função millis() não tem como eu acelerar o programa, pois preciso que ele rode o equivalente a 30 dias em pelo menos 1 ou 2 dias...

foi o que falei, onde está 

unsigned long tempoDecorrido = millis();

você muda para 

unsigned long tempoDecorrido = millis() + 864000; 

864000 = 1 dia em millisegundos

ja fiz... so que vou colocar logo um mês direto. 2628000000 milis.

achei um site que facilitou minha vida na conta:

recomendo!

http://letconversion.com/conversao-de-tempo

Você ira precisar de um RTC (real time clock), a contagem de tempo utilizando esse método começa a se perder depois de um tempo;

 

LINK REMOVIDO POR DESCUMPRIR OS TERMOS DE USO

Ricardo, o que vc quer dizer com "se perder"? vc fala da precisão? ou ele trava? 

na verdade, não estou tão preocupado com a precisão do timer, até por que ainda vou passar ele no osciloscópio pra medir o clock e ver se condiz com o de um RTC, isso é possível sabendo-se a constante. 

minha maior preocupação era o que eu havia falado antes, quando estava debugando o programa rodava muito bem e do nada parou! resetei e travou denovo! o programa esta certo...

e quanto ao milis tenho um problema único com ele, não consigo acelerar e ver se o programa vai ser executado como deve ao atingir o final... minha briga com o mills é so essa... rsrsrs... não tenho como correr um mês em 24 com o mills.

Será que não é apenas a parte da "Serial" que dá problema?

Tenta por para ele enviar uma vez por dia e remove os delays.

Olá, fiz um código aqui, testei ele e parece estar funcional, é utilizando a função millis; 

A baixo o código fonte:

 


byte SEG = 0; //variavel dos segundos
byte MIN = 0; //variavel dos minutos
byte H = 0; //variavel das horas
byte D = 0; //variavel dos dias
const byte opto1 = 3; //constante para o pino da saida de 250Hz
const byte LED = 13; // constante para o pino do LED indicador de funcionamento
unsigned long tempoDecorrido = 0;
unsigned long tempo = 0;
void setup() {
pinMode(LED, OUTPUT); // define pino 13 como pino do led indicador de funcionamente (vai ser mudado quando for para o ATtiny45)
pinMode(opto1, OUTPUT); // define a saida do opto acoplador
Serial.begin (9600); // habilita a serial para debug
}
void loop(){
tone (opto1, 250); //me da uma frequencia de 250Hz na saida PWM 3
digitalWrite (LED, HIGH); // nivel alto na porta do LED inidcador de funcionamento
delay(500); //delay de meio segundo
digitalWrite (LED, LOW); //nivel baixo na porta do LED indicador de funcionamento
delay(500); // delay de meio segundo
tempoDecorrido = millis(); //recebe o valor da função millis();
if(tempoDecorrido - tempo >= 1000) { //valor do millis - valor da variável tempo (quando o resultado da subração
// for maior ou igual a 1000
tempo = tempoDecorrido; //variável tempo recebe o valor atual de millis armazenado na variável tempoDecorrido

SEG++; //incrementa 1 na variável SEG
}
if(SEG>=60) { //Se o valor da variável SEG for maior ou igual a 60
SEG = 0; //Atribui o valor 0 a variável
MIN++; //Incrementa 1 na variável MIN
}
if(MIN>=60) { //Se o valor da variável MIN for maior ou igual a 60
MIN = 0; //Atribui o valor 0 a variável
H++; //Incrementa 1 na variável H
}
if(H>=24) { //Se o valor da variável H for maior ou igual a 24
H=0; //Atribui o valor 0 a variável
D++; //Incrementa 1 na variável D
}
if(D >= 30){
parado();
}
Serial.print(D); // imprime o valor de D
Serial.print(" - "); // imprime o caracter -
Serial.print(H); // imprime o valor de H
Serial.print(" : "); // imprime o caracter :
Serial.print(MIN); // imprime o valor de MIN
Serial.print(" ' "); // imprime o caracter '
Serial.println(SEG); // imprime o valor de SEG e desce uma linha
}
void parado ()
{
digitalWrite (LED, LOW); //desliga o LED de funcionamento
noTone (opto1); // desliga a saida PWM que continha 250Hz
while (D==30) {} //roda uma uma instruçao vazia enquanto o valor de D for = 30
}

Valeu Alian, vou testar aqui... obrigado!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço