Go Down

Topic: midiendo volataje, arduino me muestra solo unidades y sus 2 decimales (Read 787 times) previous topic - next topic

germanPerez

Sep 26, 2018, 09:37 am Last Edit: Sep 26, 2018, 04:47 pm by surbyte Reason: Agregado de etiquetas de código/errores
hola, buenas...
soy nuevo en el foro, y casi nuevo con arduino.
les comento, quiero armar un amperimetro con voltimetro. estoy usando A0 para medir la tension mediante un divisor resistivo x10.
cuando la tension inyectada esta entre 0 y 9,99V, arduino me muesytrs los valores correctos.
pero cuando paso los 10V, arduino sigue mostrandome como si midiera de 0 a 9,99.
x ejemplo, inyecto 5,34V y arduino me muestra esa tension.
inyecto 27,3V y me muestra 2,73V.
como puedo solucionarlo??
dejo aca el scketch.

Code: [Select]
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x03f, 16, 2); // crea el objeto LCD I2C
int analogInput = 0; //Definimos el pin analógico A0 para la lectura del voltaje
float vout = 00.00; //Definimos la variable Vout
float vin = 00.00; //Definimos la variable Vin
float R1 = 100000.0; //  R1 (100K) Valor de la resistencia R1 del divisor de tensión
float R2 = 10000.0; //  R2 (10K) Valor de la resistencia R2 del divisor de tención
int value = 00.00;//Definimos la variable value
void setup(){
  pinMode(analogInput, INPUT);
  lcd.begin();
  lcd.print("D");lcd.print("C");lcd.print("V");lcd.print("O");lcd.print("L");lcd.print("T");
}
void loop(){
  value = analogRead(analogInput);
  vout = ((value * 5.00) / 1024);
  vin = vout / (R2/(R1+R2));
  if (vin<00.09) {
  vin=00.00;
}
lcd.setCursor(0,1);
lcd.print("V");lcd.print(":");;lcd.print(" ");
lcd.print(vin);
delay(300);
}

surbyte

En las declaraciones de tus variables insistes en asignar a una variable flot lo siguiente

Code: [Select]
float vout = 00.00;

Los 0 a la izquierda del punto decimal no tienen relevancia.

Tu código tiene algunos errores o al menos a simple vista y no soy compilador me lo parece.
Vi en la presentación del lcd cosas como esta ;;

Code: [Select]
lcd.print("V");lcd.print(":");;lcd.print(" ");

Dos ;; debería darte error.

Otra cosa.. para que calculas en cada ciclo del loop el valor del divisor resistivo.
No es mas facil usar tu calculadora o bien definirlo en el arranque sea setup o bien cuando lo declaras?

Algunos cambios a tu forma de imprimir en el LCD
Esto

Code: [Select]
lcd.print("D");lcd.print("C");lcd.print("V");lcd.print("O");lcd.print("L");lcd.print("T");
se reemplaza por esto

Code: [Select]
 lcd.print("DCVOLT");

Esto

Code: [Select]
lcd.print("V");lcd.print(":");;lcd.print(" ");

se reemplaza por

Code: [Select]
lcd.print("V: ");
Mira las alternativas

1ra Alternativa resolviendo todo al momento de defnirlos

Esto sería del tipo de lo que ya conoces, usando tus definiciones

Code: [Select]
const float R1 = 100000.0; //  R1 (100K) Valor de la resistencia R1 del divisor de tensión
const float R2 = 10000.0; //  R2 (10K) Valor de la resistencia R2 del divisor de tención
const float DivisorR = R2/(R1+R2);


pero como son valores que no van a cambiar los dejo como constantes


2da alternativa usando #define
Mas facil o igual de facil seria

Code: [Select]
#define R1         100000.0
#define R2         10000.0
#define DivisorR (R2/(R1+R2)


Todo lo que sea quitarle tiempo al microprocesador aunque no tenga nada mas que hacer es beneficioso porque te enseña a trabajar bien desde el comienzo y cuando eso sea importante ni lo vas a considerar porque ya lo haces bien.

Lo mismo con la impresion del lcd.
lcd.print puede imprimir textos de la longitud de tu LCD y por eso has definido previamente que es de X cantidad de lineas y Y columnas.

germanPerez

explico.. si yo pongo
 lcd.print("Volataje:"); por ejemplo, me aparece solo la "V" en el dislpay. y para que escriba todo el texto, tengo que escribirlo de esa manera.

lo del doble punto y coma, recien me doy cuenta, y si, compilo sin problemas.

voy a probar lo del divisor resistivo, a ver que pasa. no se me habia ocurrido. ya que no conozco mucho sobre programacion en arduino.

surbyte

Como es posible que te salga de a un caracter con  lcd.print("Volataje:");

Estas usando la librería provisata por el IDE?

germanPerez

si, estoy usando las que vienen con el IDE original... probe descargando librerias, y tambien si escribo lcd.Print("voltaje") solo me aparece la V en el display.

surbyte

No se porque te ocurre esa falla, pero en ese caso podrias simplemente podrias usar lcd.write que es específico para enviar de aun byte y crear tu propia funcion para que imprima todo de una sola vez
Ejemplo


Code: [Select]
void lcdPrint(char* str){
while (*str) {
             lcd.write(*str++);
}
}



Si lo usas asi

Code: [Select]
lcdPrint("Tension =");

eso debería funcionar.

Ahora no se porque no funciona
Code: [Select]
lcd.print("Tension =");

surbyte

Eso ya lo puse en el post#3 @ArduMyth

me refiero a esto

Code: [Select]
lcd.print("Voltaje:");
  lcd.print(valor);



Algo mas, se trata de un LCD I2C no de un paralelo

Code: [Select]
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x03f, 16, 2); // crea el objeto LCD I2C

germanPerez

perdon, ando con poco tiempo, y no estoy pudiendo hacer las pruebas que dije que iba a hacer. :(
sepan disculparme. seguro, el fin de semana, voy a poder hacerlas.

surbyte

Cierto, tampoco necesita esto

Code: [Select]
pinMode(analogInput, INPUT);

Go Up