Go Down

Topic: midiendo volataje, arduino me muestra solo unidades y sus 2 decimales (Read 562 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);
}

ArduMyth


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.

ArduMyth

Vi en la presentación del lcd cosas como esta ;;

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

Dos ;; debería darte error.
No, en programación el ; implica fin de instrucción ("línea").
Ciertamente es inútil y carece de sentido tener más de un punto y coma pero excederse no va a provocar ni error en el código ni al compilar ni al ser ejecutado en el Arduino porque cuando eso pasa al microcontrolador no se tiene en cuenta más que ese final.
Code: [Select]

void setup() {
  byte a = 0 ;;;;;;;;;
}
//Es absurdo pero no un error.


Ocurre lo mismo cuando vemos en el foro gente que hace:
Code: [Select]

if(((a==true) && (b==false)))
//Aquí no hay una prioridad y sobran todos los paréntesis que no sean del propio if, Absurdo, pero no da error.


Cuando se procesa el código toda esa "basura" ni se tiene en cuenta. Evidente, sobra, pero repito, eso no le marcará errores en los lenguajes.

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 =");

ArduMyth

Yo acabo de ver una cosa en tu código y a ver qué me cuentas sobre ello...

"int analogInput = 0; //Definimos el pin analógico A0 para la lectura del voltaje"

es decir que tu estás leyendo el pin 0 que no A0...

Creo recordar que si declaramos los analógicos cómo números enteros estos van así: A0-A5 => 14-19, corríganme si me equivoco.

En cuanto a lo de imprimir voltaje y la variable float no hay ningún problema:

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(2,3,4,5,6,7);

void setup() {
  float valor = 0.12;
  lcd.begin(16,2);
  lcd.setCursor(0,1);
  lcd.print("Voltaje:");
  lcd.print(valor);
}


void loop() {

}

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.

ArduMyth

Algo mas, se trata de un LCD I2C no de un paralelo
Pero el ejemplo es en tinkercad, (no hay I2C), para que viese que no hay problema imprimiendo un float. Con bus I2C o no el print es igual.

E igual a lo que iba que es lo más que me llamó la atención es que está leyendo el pin 0 que no A0 así que no entiendo los resultados que el autor comenta.

surbyte

Cierto, tampoco necesita esto

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

Go Up