Go Down

Topic: novo projeto - ajuda (Read 34 times) previous topic - next topic

luiznunes

Ola pessoal.
Sou iniciante no arduino e estou a tentar executar um projeto, mas gostava da vossa ajuda para afinar aqui algumas coisas.
o objectivo é utilizar o arduino para medir a carga que uma bateria gasta num pequeno carro electrico, medir a velocidade dele, a tensão da bateria, e a distância percorrida.
para a medição da carga estou a usar um shunt resistivo, que conforme o sentido a medir, carga ou descarga da bateria, é o pino do arduino que eu uso e o sentido que faço a ligação ao shunt, visto a corrente ter sentido contrario na carga e descarga e logo troca-me os sinais da tensão.
para medir a tensão da bateria, apenas liguei a entrada analogica com um divisor de tensão aos terminais da bateria.
o problema começou a surgir quando tentei medir a velocidade e distancia. devo ter baralhado alguma coisa no codigo relativamente ao tipo de variáveis, pois o que me aparece no LCD não é muito estável. ora aparece o resultado com casas decimais, ora começa a aparecer caracteres aleatorios e estranhos ppelo LCD todo.
bem, sem mais demora vou colocar aqui o resumo do projeto e o codigo que já fiz.
-Arduino UNO
-LCD Keypad Shield for Arduino SKU:DFR0009
-sensor indutivo de 10v com divisor tensão no sinal para 5v
- A5 carga corrente
- A4 consumo corrente
- A3 tensão bateria
- D2 sinal do sensor indutivo

codigo:
"
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);        

unsigned long tepTimer ;
const int pinoA = 12 ;
const int pinoB = 11;
const int pinoC = 3;
const int pinoD = 2;
const int pinoE = 1;
int estadobotaoA = 0 ;
int estadobotaoB = 0 ;
int estadobotaoC = 0 ;
int estadobotaoD = 0 ;
int estadobotaoE = 0 ;
double dataE = 0;
double dataG = 0;
unsigned long velocidadeA = 0;
unsigned long velocidadeB = 0;
double contador_totalA = 0;

volatile int contador_total=0;
unsigned long ultima_contagem = 0;
unsigned long intervalo = 0;
unsigned long intervaloB = 0;



void setup(){ 
    lcd.begin(16, 2);                       
    pinMode(pinoA, INPUT);
    pinMode(pinoB, INPUT);
    pinMode(pinoC, INPUT);
    pinMode(pinoD, INPUT); //pino para velocidade e conta quilometros
    pinMode(pinoE, INPUT);
    
    attachInterrupt(0,contador,RISING);
}

void loop(){ 
    lcd.setCursor(0, 0);                   
    int valA;     
    int valB;
    int valC;
    double dataA;                           
    double dataB;
    double dataC;
    double dataD;
    double dataF;
    
    valA=analogRead(4);  // amperes para descarga                   
    valB=analogRead (5); // amperes para carga
    valC=analogRead (3); // tensao da bateria
    
    dataD= (double) valC * 0.00488 * 11,1; //conversao para tensao real
          
    
    dataB = (double) valB * 0.00488 * 1666 * 1.7; // conversao para watt para carga   
    dataC = (double) dataB / 3600 ;  
    dataE = (double) dataE + dataC;
    
    dataA = (double) valA * 0.00488 * 1666 * 1.7; // conversao para watt para descarga
    dataF = (double) dataA / 3600;
    dataG = (double) dataG + dataF;
    delay(1000);
    
                 
             lcd.setCursor(0,0);             
             lcd.print(dataE);        //LCD para carga     
             
                        
             lcd.setCursor(10,0);
             lcd.print(dataG);    //LCD para descarga
     
             lcd.setCursor(0,1);
             lcd.print(dataD);    //LCD para tensão
             
            // intervaloB = intervalo / 1000;
            float velocidadeA = 1 / (float)intervalo;
            velocidadeB = velocidadeA * 1000 * 60 * 1.78 / 100;
             lcd.setCursor(6,1);
             lcd.print(velocidadeB); //LCD para velocidade
            
             contador_totalA = contador_total * 1.78 ;
             lcd.setCursor(12,1);
             lcd.print(contador_totalA); // LCD para quilometros
          
          
                       
}

void contador(){
  contador_total = contador_total + 1;
  intervalo = millis() - ultima_contagem;
  ultima_contagem = millis();
  
  
}
"
alguem dá alguma dica?
obrigado.  ;)

bubulindo

Qual e a diferenca entre o pino A4 e A5?

Porque e que colocaste um divisor resistivo para medir a tensao da bateria? Isso nao te da precisao nenhuma, nao seria melhor um amplificador operacional? A bateria e de quanto?

O delay(1000) esta a mais no programa...

Os pinos estao so como INPUT, dependendo de como os ligaste, isto pode ser a explicacao dos resultados estupidos de velocidade, etc...

A variavel intervalo e igual a 0 e o seu valor nunca muda... afinal de contas a funcao contador nunca e chamada... nota tambem que a funcao contador nao e propriamente aquilo que se pretende com funcoes.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

luiznunes

#2
Oct 22, 2014, 07:05 pm Last Edit: Oct 22, 2014, 07:10 pm by luiznunes
a diferença entre o A4 e o A5 é que "imprimem" em posições diferentes do LCD, conforme se está a medir a carga da bateria ou a descarga (utilização) da bateria.
a bateria é vai de 24V até 80V. estamos a testar diferentes.
o delay(1000) foi para conseguir converter os amperes que mede. a forumula está feita de maneira que os amperes que mede a cada segundo ( daí o delay ) vão se acumulando.
por exemplo durante 25 minutos sei que a bateria recebeu 12A de carga.

os pinos estão só como INPUT? só estou a ler.. não percebi, desculpa.

a variavel intervalo = 0?
tenho no void setup : attachInterrupt(0,contador,RISING);
quando o pino 2 passa de 0 para 1 ele executa a função contador. ou não?  ???

bubulindo

O delay de 1 segundo não te dá um segundo... Dá um segundo mais o tempo de ciclo. 
Se já usas o millis porque é que não calculas tudo com millis? 
A pergunta do A4 e A5 tem a ver com que circuito tens lá ligado, já que me parece estares a medir a mesma coisa...
Se não meteres uma resistência de pullup, definires os pinos como inpu vai deixar o pino a flutuar. Se não tens pullup, define os pinos como input_pullup.
Que numeros vês no LCD? Um lcd.clear() não ficaria mal ai no programa....
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

luiznunes

estou a fazer um esquema eletrico para colocar aqui.
entretanto, não ves nenhum conflito nos tipos de definição das variaveis e o fato de terem operações de soma ou multiplicação entre elas? tipo unsigned com float ou int?
já agora o lcd.clear() não estar sempre a limpar o LCD e não deixa mostrar nada?

luiznunes

aqui está o esquema.
penso ser mais facil perceber. alguns componentes tive de improvisar. por exemplo o sensor indutivo é um da Omron, que só trabalha com pelo menos 10V, logo tive de lá por uma alimentação à parte para ele.

já agora, obrigado pela ajuda até agora dada.

luiznunes

ainda em relação ao estar a medir a mesma coisa no A4 e A5, de fato estou a medir a mesma coisa, mas como a carregar a bateria, a corrente vai em sentido contrario ao da bateria em descarga(uso) ia colocar-me tensão inversa no arduino ( do ponto de vista do shunt de corrente).

Go Up