Go Down

Topic: Fazer Reset a uma função ou a variáveis através de um botão (Read 7134 times) previous topic - next topic

wilsonalves

Pessoal estou com um problema tenho o meu projecto dividido em void(....) e preciso de fazer reset aos valores que os sensores me medem  de vez em quando.
Então queria incorporar um botão para que quando o primisse ficasse tudo a zero e começasse a contar novamente e assim sucessivamente.

Cumprimentos 

bubulindo

Projecto muito interessante...

Aproveito para deixar aqui o meu último projecto, eu estou a projectar um sistema tipo bola de cristal que me permite adivinhar tudo o que quiser. Assim, quando pessoas como tu colocarem coisas destas no fórum, eu saco do meu projecto e ele diz-me qual é a tua dúvida ao certo e o que já fizeste para eu poder ajudar.
This... is a hobby.

wilsonalves

Tinha os meus sensores de corrente a fazer medição constante e  a acumular valores segundo a segundo e quero incorporar um botão de forma a que faça reset a esses valores no lcd para que fique tudo a zeros e volte a começar a contar novamente.
Mas já resolvi o problema deixo o código caso alguém possa vir a ter uma duvida semelhante ou igual

Code: [Select]
if (digitalRead(SWR) == HIGH){                                                 //Botão SWR para pôr as variáveis do Vh zero
correnteTotal100 = 0;                                                                     //Valor da correnteTotal100 a zero
Ph100 = 0;                                                                                    //Valor de Ph100 a zero
correnteTotal235 = 0;                                                                     //Valor da correnteTotal235 a zero
Ph235 = 0;                                                                                    //Valor da Ph235 a zero
}

wilsonalves

Estou com outro problema tenho uma função que quero que esteja sempre a contar independentemente de estar na tela do LCD onde ela está a mostrar os valores ou não pois eu quero contar os valores da corrente segundo a segundo quero ir acumulando, eu consigo com que por exemplo estou na tela onde mostro os valores da corrente acumulada e tem vamos supor 3A mudo para outra tela e volto e continuam lá os 3A mas não é isso que quero o que quero é que os valores estejam mais elevados no caso de ter algo a consumir e a passar pelo sensor vou por dois pedaços de código um da função Valorhora que quero que esteja sempre a contar e outro do meu void loop().

Code: [Select]
void Valorhora()
{
unsigned long tempoFinal = millis() + 1000;                  //especifica o tempo de espera para prenter o codigo para executar as leituras e calculos
byte estadoAnteriorBotao = digitalRead(SWR);                   // primeira leitura do botao


while(tempoFinal > millis())
{                                                              //laço q q permaneçe por 1 seguindo lendo e colculando, para evitar q o sensor perca algun dado



//---------------------------------------Sensor 45A----------------------------------------------------------------------
/* valor45 = analogRead(A5);                                       // Valor do pino Analógico 3
  //Sinal entre 1V e 3V
  //5V=1024 1V = (1.02*1024)/5 = 208.896 ~ 209                    // 1.96-(0.045*4.5)=1.02   
  //5V=1024 3V = (2.9*1024)/5 = 593.92 ~ 594                      // 1.96+(0.045*9.4)=2.9
  minimo45=((1.96-(0.045*12))*1024/5);                            // Calculo do valor minimo
  maximo45=((1.96+(0.045*12))*1024/5);                            // Calculo do valor máximo
  corrente45 = map(valor45, minimo45, maximo45, -45, 45);         // Calculo corrente

correnteTotal45 = correnteTotal45 + (corrente45 * 3.6);      //calculo por segundo ... e somatoria total
lcd.setCursor(1, 1);
lcd.print(correnteTotal45);

Ph45 = Ph45 +(correnteTotal45 / 3.6);
lcd.setCursor(1, 2);
lcd.print(Pac45);*/
//---------------------------------------------------------------------------------------------------------------------


valor100 = analogRead(A4);                                     // Valor do pino Analógico 4
                                                               //Sinal entre 1V e 3V
       //5V=1024 1V = (0.97*1023)/5 = 198.656 ~ 199            // 1.95-(0.1*9.4)=0.97
       //5V=1024 3V = (2.85*1023)/5 = 583.68 ~ 584             // 1.95+(0.1*9.4)=2.85
minimo100=((1.8965-(0.1*9.7515))*1024/5);                      // Calculo do valor minimo
maximo100=((1.8965+(0.1*9.7515))*1024/5);                      // Calculo do valor máximo
corrente100 = map(valor100, minimo100, maximo100, -10000, 10000);// Calculo da corrente
corrente100 = corrente100/100;
lcd.setCursor(14, 1);
lcd.print(corrente100);
correnteTotal100 = correnteTotal100 + (corrente100 / 3600);      //calculo por segundo ... e somatoria total
lcd.setCursor(14, 2);
lcd.print(correnteTotal100);

Ph100 = Ph100 +(corrente100*12/(3600));
lcd.setCursor(14, 3);
lcd.print(Ph100);

//---------------------------------------------------------------------------------------------------------------------
  valor235 = analogRead(A3);                                      // Valor do pino Analógico 5
                                                                  //Sinal entre 1V e 3V
  //5V=1024 1.47mV = (0.8085*1024)/5 = 165.5808                   // 1.96-(0.235*4.9)=0.8085   
  //5V=1024 2.45mV = (3.115*1024)/5 = 638,952 ~639                // 1.96+(0.235*4.9)=3.115
minimo235=((1.9460-(0.235*4.8265))*1024/5);                      // Calculo do valor minimo
maximo235=((1.9460+(0.235*4.8265))*1024/5);                      // Calculo do valor máximo
corrente235 = map(valor235, minimo235, maximo235, -23500, 23500);// Calculo da corrente
corrente235 = corrente235/100;
lcd.setCursor(3, 1);
lcd.print(corrente235);

correnteTotal235 = correnteTotal235 + (corrente235 /3600);         //calculo por segundo ... e somatoria total
lcd.setCursor(3, 2);
lcd.print(correnteTotal235);

Ph235 = Ph235 +(corrente235*12 /(3600));
lcd.setCursor(3, 3);
lcd.print(Ph235);
}
  }




E agora o Void loop()
Code: [Select]
void loop()
{

 
Valorhora;   

if (digitalRead(SWR) == HIGH){                                                                      //Botão para pôr as variáveis do Vh zero
correnteTotal100 = 0;
Ph100 = 0;
correnteTotal235 = 0;
Ph235 = 0;
}


if (digitalRead(SWITCH) == HIGH && encrava == 0){                                                 //Botão para pôr as variáveis do Mudança de tela
var_menus++;
lcd.clear();
encrava = 1;
}
if (digitalRead(SWITCH) == LOW) encrava = 0;
//refresca o LCD de segundo a segundo.
if (millis() - refresh >= 100) {
trata_lcd();
refresh = millis(); //actualiza a contagem.
                                                                                 
}

bubulindo

Não percebi puto do que queres...

Além do mais não entendeste o que disse anteriormente. Tu fazes UMA medicão por segundo, não todas as medicões possíveis num segundo, e assumes que durante esse segundo a corrente se manteve nesse valor.

Vê o blink without delay para perceberes o que estou a dizer.

This... is a hobby.

wilsonalves

Vou tentar voltar a explicar.
Eu tenho o meu programa dividido em Void(), cada void que tenho demonstro numa tela no meu LCD 20x4 um dos meus void() domonstra a corrente hora ou seja está sempre a medir a corrente segundo a segundo e vai acumulando o meu problema é que quando estou a demonstrar no LCD a a corrente hora ele está a contar e acumular mas se mudar de tela ele deixa de contar e neste caso nunca pode deixar de contar chame eu a função que chamar depois quando volto á tela onde mostra os valores hora ele continua a contar mas estagnou no momento em que mudei da tela dos valores hora para outra qualquer.
Tenho tentado resolver este problema mas não consigo nem ninguém me tem conseguido ajudar.

Cumprimentos

LegendBR

Sem querer ofender, mas você precisa aprender a colocar pontuação nas suas frases. Sempre me perco nos seus textos e quase nunca entendo o que você quer dizer / perguntar.

Faz o seguinte: explica como você gostaria que funcionasse, com esquemático e etc.

Por exemplo: quando a corrente for x, o LCD vai mostar "Corrente: x A", e depois de 1 segundo, se a corrente aumentar para y, o LCD vai mostrar "Corrente: y A".

bubulindo


Vou tentar voltar a explicar.
Eu tenho o meu programa dividido em Void(), cada void que tenho demonstro numa tela no meu LCD 20x4 um dos meus void() domonstra a corrente hora ou seja está sempre a medir a corrente segundo a segundo e vai acumulando o meu problema é que quando estou a demonstrar no LCD a a corrente hora ele está a contar e acumular mas se mudar de tela ele deixa de contar e neste caso nunca pode deixar de contar chame eu a função que chamar depois quando volto á tela onde mostra os valores hora ele continua a contar mas estagnou no momento em que mudei da tela dos valores hora para outra qualquer.
Tenho tentado resolver este problema mas não consigo nem ninguém me tem conseguido ajudar.

Cumprimentos


Porquê essa obsessão com Void? O que queres dizer com void?
This... is a hobby.

wilsonalves

É o seguinte o meu projecto está dividido por Void(), cada void corresponde a uma tela no LCD que mudo para ver diferentes resultados do tipo valores de corrente instantâneos, valores de corrente hora, temperaturas etc.
No void da corrente hora como o próprio nome diz meço a corrente e a potencia hora ou seja os sensores tem de estar sempre a medir para conseguir ter os valores certos.
O problema é que por exemplo estou na tela dos valores hora e tenho corrente a passar nos sensores. A partir do momento em que mudo de tela para a temperatura por exemplo os valores hora deixam de ser contados. Como é obvio isto não pode acontecer pois assim nunca vou ter os valores certos.
Agora o que tenho de fazer para conseguir estar a ver a temperatura ou os valores instantâneos e os valores hora estarem sempre a ser calculados???
Como já devem ter visto estão alguns tópicos acima os bocados de código tanto do void Valorhora () e o void loop(). Pois porque acho que tenho de estar sempre a repetir o void Valorhora() para que mesmo que mude de função ou chame outra tela ele esteja sempre a contar.
Falaram-me em utilizar a função interrupt mas já me disseram tambem que não dá.
Gostava que me dessem a vossa opinião de como resolver esta situação pois não faço ideia.

Entendes agora???
Cumpts

LegendBR

A solução é simples: calcule tudo e depois escolha o que mostrar na tela.

Algo assim:

Code: [Select]

void loop()
{
  Calcula valor hora
  Calcula valor corrente
  Calcula o que mais tem que calcular
 
  Decide o que vai mostrar na tela
}

O que você chama de "void" na verdade é uma função. "void" é o tipo que a função retorna, nesse caso, nada (daí o void).


bubulindo

E voltamos ao mesmo... Sabes o que quer dizer void? O que significa em termos de programacão? Se não sabes, ou julgas que sabes, não o uses e usa linguagem corrente para que não fiquemos todos confusos.

O teu código está dividido por funcões. void quer dizer "nada", então quando as funcões têm void no início significa que retornam nada. Logo, void apenas indica que uma funcão não tem retorno. Não indica, nem significa, mais nada como tu pareces crer. Eu há umas semanas atrás deixei a dica que devias estudar um pouco de C para poderes avancar com isto... seguiste o conselho?

Eu já te respondi à tua pergunta aqui:
Quote
Tu fazes UMA medicão por segundo, não todas as medicões possíveis num segundo, e assumes que durante esse segundo a corrente se manteve nesse valor.


Se fizeres uma medicão por segundo ficas com imenso tempo para fazer outras coisas... como por exemplo, apresentar valores na tela.

No entanto, tu estás sempre a medir durante um segundo. Assim não te indica nada... apenas a corrente que estava a ser consumida durante esse segundo.

Se o teu programa tiver um formato como este:

Code: [Select]


unsigned long tempo = 0;

void loop() {

//mede a corrente e calcula a potência de segundo a segundo.
  if (millis() - tempo >= 1000) {
     tempo = millis();
     executa_medicao();
     actualiza_potencia();
  }

//refresca os valores para o LCD
  refresca_lcd();
}


em que executas uma medicão de segundo a segundo, o processador depois corre o código do LCD e tudo funciona em conjunto.

As interrupcões servem para garantires a temporizacão da aquisicão dos dados, mas tendo em conta as tuas capacidades, não me parece que seja uma boa ideia ires por aí. Pelo menos para já.

Nas threads que já colocaste sobre isto já demos mais do que ajuda suficiente para reallizares isto, mas continuas a não perceber o que te dizemos, ou a não querer perceber. Eu deixei-te o cálculo num dos posts e era quase só copiar para a IDE e nem isso conseguiste fazer.
This... is a hobby.

wilsonalves

Entendi e tem toda a lógica fazer o código dessa forma bubulindo eu não tenho o código  de como fazer o refresh do lcd e gostava que me dissesse se possível como se faz.
Desculpe não conseguir fazer estas coisas básicas, mas também não tenho tenho tempo para conseguir estudar programação quando acabar o estágio quero aí sim estudar programação em C e dedicar-me  e arduino de forma a conseguir ter sucesso.

bubulindo

Não devias ter aprendido programação antes de começar o estágio?
This... is a hobby.

wilsonalves


Go Up