midiendo voltaje

Hola a todos!

hice un codigo para medir un voltaje de un sensor de oxigeno que consta de 4 cables 2 para la alimentacion y 2 para que vaya al arduino (uno en la salida y otro a tierra), el sensor va de 0 a 1voltio y cuando hago la medida en el arduino me sale diferente que cuando lo hago con un voltimetro, nose si es el codigo o el sensor esta malogrado. les dejo mi codigo para que puedan revisarlo.

saludos!

int sensoroxigeno=5,valor_sensor=0;
void setup() 
{
Serial.begin(9600);
pinMode(sensoroxigeno,INPUT);
}
void loop(){
for(int i=1;i<=30;i++){
    valor_sensor=valor_sensor+analogRead(sensoroxigeno);
  }
  valor_sensor=valor_senor/30;
Serial.print(valor_sensor);
}

el for es para poder tener un valor mas estable.
el valor que me da el arduino(130) difiere mucho en relación con el valor del voltimetro(6mV).

Si este es el codigo que usas yo leo cosas mal como esta

valor_sensor=valor_sensor/30

debería ser

for(int i=1;i<=30;i++){
    valor_sensor=valor_sensor+analogRead(sensoroxigeno);
  }
  valor_sensor=valor_sensor/30;
Serial.print(valor_sensor);

Por otro lado si la lectura de tu sensor esta en 6mv, te recuerdo quel arduino tiene un adc de 10 bits y que su resolución en 4.8 mv de modo que estarás leyendo 1 o 2 unidades del ADC.

Muy pobre la salida de ese sensor!! es practicamente 0.

5V/1024 = 4.88mV

1 paso 4.88mv
2 paso 9.76mV

Entre estos dos valores deberia darte los resultados el arduino

no entendi la ultima parte, probe mi sensor y me daba medidas mas altas cuando quitaba oxigeno (con el voltimetro) pero cuando lo mido con el arduino me da medidas mas bajas(80), una duda mas que tengo es si la funciojn map podria ayudar?

Bueno, veo que entendí mal tu comentario.
Hablas de una diferencia de 6mV respecto del voltimetro. Ahhh pero eso no es para preocuparse.

Lo que si es para preocuparse es lo ultimo, lo de diferencias importantes entre voltimetro y Arduino. No entiendo como eso pueda pasar.

y la funcion map funcionaria?

Veamos algo.
6mv a mi no me quitarían el sueño, pero otros valores muy grandes si.

Olvida el sensor y conecta un potenciometro entre gnd y 5V y con el cursor al pin Analogico que mides.
Compara las lecturas que llegan al pin analogico con el tester/multimetro y comenta.

hola surbyte

hice las pruebas con el voltimetro y el potenciometro y lo que me dio fue lo siguiente:
en la posicion minima del potenciometro la lectura del voltimetro es de 0.005V en el arduino me da 7(no se cual sea la unidad)
en la posicion media es de 2.51V, en el arduino da 550
en la pos final es 4.47V, en arduino da 973.

es aqui donde no comprendo por que dan valores tan distintos :confused: , bueno espero que puedas ayudarme.

saludos

te dejo el codigo simple que hice para hacer la lectura

int pot=14,val_pot=0;

void setup() {
  // put your setup code here, to run once:
pinMode(pot,INPUT);
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
val_pot=analogRead(pot);
Serial.print(val_pot);
Serial.print("\n");
delay(1000);
}

Prueba con esto

int pot = 14;
int val_pot;
float tension;

void setup() {
  // put your setup code here, to run once:
  pinMode(pot,INPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  val_pot = analogRead(pot);
  tension = val_pot * 5.0 /1023.0; 
  Serial.print("Adc =");
  Serial.print(val_pot);
  Serial.print(" Tension=");
  Serial.println(tension);
  delay(1000);
}

El adc del arduino es de 10 bits o sea 2^10 = 1024 pasos
Tiene una referencia por defecto de 5V quiere decir que cuando lea lo máximo que es 1023 corresonderá a 5V y 0 obviamente será 0 V.

Entonces para convertir el valor del adc a tensión hay que multiplicar x 5 y dividir x 1023

En el código, te agrego la conversión a tensión para que compares con el voltímetro.

traduciendo
007 => 0.034V contra 0.005V error = 0,029V
550 => 2.688V contra 2.51V error = 0,178V
973 => 4.755V contra 4.47V error = 0,285V

Pongamos las cosas en claro, el ADC no es la gran cosa, pero no es malo. Sin embargo estas lecturas no son nada buenas. El error se debería mantener puede aumentar pero no incrementarse del modo que se lee.

hice las lecturas y los valores son :

pos minima: adc = 8 tension = 0.04
pos media: adc = 550 tension = 2.69
pos final: adc = 962 tension = 4.70

el error esta por ahi no varia mucho, ahora lo que quiero saber es como he de leer los datos que deseo con el sensor de oxigeno, tengo que hacer ese producto (multiplicar por 5 y dividir)?
arduino siempre me dara medidas diferentes cuando intente leer voltages? acaso mi placa esta fallada... es arduino mega.

gracias!

Bueno ahora viene un tema delicado.
En sensor de O2 cual es? tenemos que saber su curva de transferencia para saber que debemos leer.

hola, aqui hay una información general del sensor que estoy usando, pero está la gráfica que pides:
http://www.autodaewoospark.com/sonda-lambda.php

Bien de ser así vamos a usar la referencia interna del Arduino UNO de 1.1V para que se pueda leer mejor la salida del sensor.

int pot = 14;
int val_pot;
float tension;

void setup() {
  analogReference(INTERNAL); // ATMEGA328P con 1.1V de referencia para el AD
  // put your setup code here, to run once:
  pinMode(pot,INPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  val_pot = analogRead(pot);
  tension = val_pot * 1.1 /1023.0; // deberías leer la tensión de referencia
  Serial.print("Adc =");
  Serial.print(val_pot);
  Serial.print(" Tension=");
  Serial.println(tension);
  delay(1000);
}

he puesto 1.1 pero no necesariamente la referencia tiene ese valor. La manera correcta es hacer una medición para ver que tensión tiene tu referencia interna.
Este es el procedimiento, usando el arduino sin nada mas conectado de esta manera.

Determine the internal reference voltage...

  1. Upload an empty Sketch
  2. Disconnect power from the board
  3. Connect a 0.1 uF capacitor from AREF to ground
  4. Connect power to the board
  5. Upload the following Sketch...

Como determinar la referncia interna de tensión

  1. Subir un sketch vacío o sea simple setup y loop
  2. Desconectar la alimentación de la placa
  3. Conectar un capacitor de 0.1uF entre AREF y GND.
  4. Conectar la alimentación a la placa.
  5. Subir el siguiente sketch
onst uint8_t PinLED = 13;

void setup( void )
{
 Serial.begin( 38400 );
 Serial.println( "\r\n\r\n" );

 pinMode( PinLED, OUTPUT );
 digitalWrite( PinLED, LOW );
 delay( 1000 );

 analogReference( INTERNAL );
}

void loop( void )
{
 Serial.println( analogRead( 0 ) );
 digitalWrite( PinLED, HIGH );
 delay( 1000 );
}
  1. Wait for a few readings to be displayed in Serial Monitor
  2. Measure and record the voltage across the AREF capacitor. In my case the voltage is 1.083.
  1. Esperar algunas algunas lecturas en el monitor Serie.
  2. Medir y registrar las tensiones en bornes del capacitor AREF. En mi caso la tensión es 1.083.

Dejo el hilo porque el procedimiento permite medir la tensión USB. link

el mismo procedimiento para arduino mega?

El procedimiento revelará que tensión interna tienes.

El Mega tiene dos tensiones internas disponibles

INTERNAL1V1: a built-in 1.1V reference (Arduino Mega only)

INTERNAL2V56: a built-in 2.56V reference (Arduino Mega only)

que diga 1.1 o 2.56 no significa que ese sea el valor.
El procedimiento te permite determinar exactamente que Aref tienes.

Entiendes que el sketch para tu MEGA será

const uint8_t PinLED = 13;

void setup( void )
{
 Serial.begin( 38400 );
 Serial.println( "\r\n\r\n" );

 pinMode( PinLED, OUTPUT );
 digitalWrite( PinLED, LOW );
 delay( 1000 );

 analogReference( INTERNAL1V1);
}

void loop( void )
{
 Serial.println( analogRead( 0 ) );
 digitalWrite( PinLED, HIGH );
 delay( 1000 );
}

hola ! hice el procedimiento y el valor de la tension fue 1.068v, coloque ese valor en la formula que me diste, volvi a medir (girar) el potenciometro y fue lo siguiente:

pos inicial: adc=15 tension=0.02
pos media: adc=554 tension=0.58
pos final: adc=974 tension=1.02

estan correctos estos datos o como debo proseguir ?, gracias por la ayuda!

Y esos valores como se corresponden con el voltímetro o la segunda lectura es la del voltímetro.

Te di todo para que puedas leer usando la corrección y asi traducir el MEGA para que entregue valores directamente en Voltios.

Este es el código

const long InternalReferenceVoltage = 1068L;  // <<<<<<<<<< Change this to the reading from your internal voltage reference

void setup( void )
{
 Serial.begin( 38400 );
 Serial.println( "\r\n\r\n" );

 // REFS1 REFS0          --> 0 0 AREF, Internal Vref turned off
 // MUX3 MUX2 MUX1 MUX0  --> 1110 1.1V (VBG)
 ADMUX = (0<<REFS1) | (0<<REFS0) | (0<<ADLAR) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (0<<MUX0);
}

void loop( void )
{
 int value;

 // Start a conversion  
 ADCSRA |= _BV( ADSC );
 
 // Wait for it to complete
 while( ( (ADCSRA & (1<<ADSC)) != 0 ) );

 // Scale the value
 value = (((InternalReferenceVoltage * 1024L) / ADC) + 5L) / 10L;

 Serial.println( value );
 delay( 1000 );
}

hola yo habia colocado el valor de 1.068 en la formula que diste tension=val_pot*1.068/1023 ahora el sketch que me das, para empezar no me daba valores solo me daba simbolos extraños como si fuera un signo de interrogacion (????) ... luego modifique el serial.begin (38400) por serial.begin(9600) y serial.println por serial.print y me da un valor de 214, este valor es correcto ?

estoy confundido con respecto a los sketch, pense que el sketch servia solo para medir el voltaje de referencia, es asi o erre en algo?

Perdona IIOzII estas cosas no son fáciles. Requieren de cierto procedimiento de tu parte.
Un sketch te da un valor y el otro es para usarlo con regularidad.

Si tienes caracteres raros es porque estas con los BAUDIOS incorrectos. Eso no tiene mucha ciencia.
Terminal y programa a los mismos BAUDIOS.

Si te haces tanto problema olvida la calibración y usa 1.1Voltios y listo. Adelante y luego si quieres ajustarlo vuelve a esto.

Tal vez te llevé por un lado que exige demasiado.
Simplifica las cosas para probar que tu sensor funciona bien, y luego si requieres mejor precisión de lectura vuelve a este tema.

Hola, bueno si la verdad que el primer sketch lo entiendo es para "calibrar" el arduino verdad? pero el segundo sketch ?

lo que veo en el segundo sketch es que tomas el valor de "calibración" del arduino lo reemplazas en el valor (value) y luego multiplicas y ya... lo que no entiendo es para que sirve ese valor, a mi me sale 214, pero revise todo esas lineas y no veo en que parte haces la lectura de la tensión del sensor, lo cual necesito.

es verdad que parece complicado pero si me dices algunas cosas del ultimo sktech que mandaste me ayudaría mucho a entenderlo mejor.

saludos!