[Solucionado] Comparar valores del sensor.

Buenas tardes compañeros. En este momento recurro a ustedes por un problema en mi programación la cual no logro entender.

Estoy realizando una medicion de corriente alterna mediante el sensor TA12-100.

La carga con la que estoy realizando la prueba es un cargador de telefono.

Deseo detectar cuando se conecta o no el celular. Y en efecto lo estoy logrando, y logro visualizarlo en el monitor serial. Adjunto codigo.

#define ELECTRICITY_SENSOR A0 // Analog input pin that sensor is attached to

float current; //amplitude current
float current_rms; //effective current
int led= 8; 
float valor;

void setup() {
  Serial.begin(9600); 
  digitalWrite(led,LOW);
  pins_init();
}

void loop() {
  int sensor_max;
  sensor_max = getMaxValue();
  valor=0.0;
  current=(float)sensor_max/1024*5/800*2000000; //Voltaje del sensor 5V
  current_rms=current/1.414; //Only for sinusoidal alternating current
  if ((float)current >= valor)
     { 
     digitalWrite(led,HIGH);   
     }
  Serial.println("sensor_max = ");
  Serial.println(sensor_max);
  Serial.println("The amplitude of the current is(in mA)");
  Serial.println(current,1);
  Serial.println("The effective value of the current is(in mA)");
  Serial.println(current_rms,1);
}

void pins_init(){
  pinMode(ELECTRICITY_SENSOR, INPUT);
  pinMode(led, OUTPUT);
}
/*Function: Sample for 1000ms and get the maximum value from the SIG pin*/
int getMaxValue(){
  int sensorValue; //value read from the sensor
  int sensorMax = 0;
  uint32_t start_time = millis();
  while((millis()-start_time) < 1000)//sample for 1000ms
  {
    sensorValue = analogRead(ELECTRICITY_SENSOR);
    if (sensorValue > sensorMax) 
    {
      /*record the maximum sensor value*/
      sensorMax = sensorValue;
    }
  }
  return sensorMax;
}

Valores obtenidos con el celular conectado:

sensor_max =
12
The amplitude of the current is(in mA)
146.5
The effective value of the current is(in mA)
103.6

sensor_max =
12
The amplitude of the current is(in mA)
146.5
The effective value of the current is(in mA)
103.6

y cuando desconecto el celular marca 0 en las tres variables.

Como pueden apreciar en la comparacion IF, estoy declarando que si el valor current es mayor a 0 prende el LED del PIN 8

 if ((float)current >= valor)
     { 
     digitalWrite(led,HIGH);   
     }

Mas el led siempre esta encendido. Asi el valor de current este en 0 o no. Que podria estar pasando ? Que solución puede haber a este problema. No comprendo como algo tan sencillo puede estar fallando.

Saludos. Gracias

Lo que has puesto es mayor o igual ( >= ) por tanto si es 0 tambien cumple la condicion.Quita el igual a ver que pasa y añade un else para poner el led en low.

 if ((float)current  >  valor) { 
   digitalWrite(led,HIGH);   
}
else {
   digitalWrite(led,LOW);
}

Hola jose.

Te comento efectivamente ese = me estaba colocando siempre el LED en HIGH pero lo puse haciendo pruebas de todas las maneras posibles.

Sin embargo al quitarlo el LED se mantiene en LOW si el celular no esta conectado al cargador. Por que la medición da cero, por ahi vamos bien.

Al conectarlo que me marca un valor de 103.6 o 146.5 dependiendo el valor que seleccione y que es un valor mayor a 0 correcto? el LED sigue en LOW, no quiere prender. La comparación quedo de esta manera.

if ((float)current > valor)
     { 
     digitalWrite(led,HIGH);   
     }
  else 
     {
     digitalWrite(led,LOW);
     }

kenny0414:
Al conectarlo que me marca un valor de 103.6 o 146.5 dependiendo el valor que seleccione y que es un valor mayor a 0 correcto? el LED sigue en LOW, no quiere prender. La comparación quedo de esta manera.

if ((float)current > valor)
     { 
     digitalWrite(led,HIGH);   
     }
  else 
     {
     digitalWrite(led,LOW);
     }

Si valor = 0 como dice tu código, se encenderá cada vez que vea corriente. aunque sea 1 mA ya que 1 > 0
No entiendo cual es tu problema. Valor lo tienes a 0 y no veo que cambie.
Si lo cambias a digamos 200, no va a prender el led con tu cargador como antes, si lo pones a 100 si.

surbyte Buenas noches. Gracias por tu respuesta.

Efectivamente si mi valor = 0 asi lea 1mA deberia encender el led.

El problema es que no lo hace.

Tengo todo bien conectado. el LED funciona perfectamente al igual que el pin 8, ya que probe el ejemplo BLINK para verificar el correcto funcionamiento.

Porque no prende el LED?, pareciera no estar haciendo la comparacion bien. no entiendo porque.

usa 0.1 para valor y funciona

Surbyte lamento informarte que no funciona aun colocando 0.1 o cualquier otro valor. Ya he probado de mil formas y manera y no doy con el problema. . Que podria suceder que no realiza la comparacion correctamente ?

No se si tendra algo que ver ,pero cuando calculas el valor de current en la operacion 8002000000 cuyo resultado momentaneo es 1600000000 podria estar rebasando la parte entera del tipo float que segun referencia es 3.4028235E+38 .
Prueba a poner un serial.print de la variable current a ver que valor esta recibiendo debajo de la linea:
current=(float)sensor_max/1024
5/800*2000000; //Voltaje del sensor 5V
serial.println(current);

A mi me funciona perfecto con 0.1, simulado y comprobado.

jose:
No se si tendra algo que ver ,pero cuando calculas el valor de current en la operacion 800*2000000 cuyo resultado momentaneo es 1600000000 podria estar rebasando la parte entera del tipo float que segun referencia es 3.4028235E+38 .

Jose gracias por la ayuda. Efectivamente ese era el problema. El valor del entero en la operación matemática hacia que no se hiciera la comparación correctamente. Como no necesitaba realmente los decimales cambie las variables float por unsigned int y con esta modificación he resuelto el problema. Agradecido por tu apoyo.

Surbyte de igual manera gracias.

Saludos Feliz Dia. TEMA RESUELTO.

Que raro, yo use tu código y si funcionó o debo haber cambiado algo.
Tal vez retiré el float de current porque me pareció redundante (lo tenias en la asignación y de nuevo estaba en el if).
Volveré a mirarlo.

Buenas noches a todos.

En este momento deseo establecer una comparación de los valores obtenidos del sensor. El valor actual con el valor anterior.

No estoy muy claro en como realizarlo. Tengo pensando algo asi:

int valor = 999

if (valor==999)
     { 
     valor=current; 
     }
  
  if (current < valor*0.3)
     { 
     digitalWrite(led,LOW);  
     }
 valor=current ;

Declaro un numero que no podra medir el sensor a la variable VALOR como inicial 999. Porque? porque valor siempre sera 999 únicamente al encender el arduino y luego que realice la comparación se le asigna el valor de current. De esa manera seria el primer valor del sensor colocandolo en una variable para poder compararlo con el mas reciente.

Sino lo hago de esa manera y coloco que valor == current de primero, siempre estaran las dos variables con el mismo numero, ya que primero se igualaria la variable valor con current antes de hacer la comparacion. no se si me explico ? . y cuando realice las comparaciones estare comparando dos valores iguales.

Alguna otra idea de como hacer esto?. Estoy en lo correcto ? o estoy haciendo algo mal.

Claro ejemplo de un código CAOTICO

Vamos por algunos errores

  1. las definiciones de las variables y como influye en el código
    defines a valor como entero. Ok
    Luego comparas current ??? con valor * 0.3
    que resultado crees que tendrá eso?
    current es float o entero.
    Si es float
    porque asignas valor = current?

Si es entero la comparación if (current < valor*0.3) no tiene sentido ya que es lo mismo que decir
if (current < 0)

  1. Al final, valor = current siempre
    Suponiendo que todo este dentro de un loop()
    arrancas diciendo definiendo a valor = 999
    lo comparas con 999 y le asignas current a valor
    y finalmente sin ninguna condición le asignas current a valor no importa cuanto valga valor.

Parece juego de palabras pero

int valor = 999

 if (valor==999)      { 
     valor=current; 
 }
 // codigo para encender led que ahora no importa

  valor=current ;

uno de los dos códigos esta de mas.

Lo mas sencillo seria definir otra variable ,por ejemplo old_current y almacenar en ella el resultado obtenido de la medicion (la tienes que definir fuera del loop y setup para que sea global y guarde el valor ) y en la siguiente iteracion en la variable current tienes la medicion actual y en old_current la anterior.Lo que quieras hacer segun el resultado de la comparacion lo haces antes de volver a asignar el valor actual a old_current

pero tu entiendes josé que quiere hacer?

jose:
en la siguiente iteracion en la variable current tienes la medicion actual y en old_current la anterior.Lo que quieras hacer segun el resultado de la comparacion lo haces antes de volver a asignar el valor actual a old_current

Efectivamente eso estoy haciendo y funciono perfectamente. Disculpe si el codigo que puse es muy CAOTICO como dice surbyte. y que realmente era asi porque era una prueba. Finalmente quedo asi :

  if (current < valor*0.3)
     { 
     digitalWrite(led,LOW);  
     }
 valor=current ;

La varibale no tendra valor. y esta variable equivale a "old_current" como explica Jose.

La primera comparación sera errada, porque valor esta en 0 y compara un valor con cero. Pero a partir de la segunda medicion todos funciona correctamente.

Surbyte respuediendo tu pregunta:

"Luego comparas current ??? con valor * 0.3
que resultado crees que tendrá eso?
current es float o entero.
Si es float
porque asignas valor = current?

Si es entero la comparación if (current < valor*0.3) no tiene sentido ya que es lo mismo que decir
if (current < 0)"

valor lo multiplico con el 0.3 porque de esta manera estoy sacando un porcentaje. Que si la medición actual es menor que el 30% de la medicion anterior apaga el led. Estoy trabajando todo con entero y no con float.

Hasta ahora todo funciona perfectamente. Solo me faltan unos ajustes.

Saludos y gracias a ambos.

Buenas.

En este momento me surge otra necesidad.

Deseo realizar esa medicion para 5 sensores. Es posible realizar un loop o una funcion general para todos los sensores ?y no repetirla 5 veces ? .

Sino ir variando el puerto de entrada que se leera. Quiero hacer esto con una libreria que convierte al arduino en multitasking.

Pero de no poder hacer una funcion general cual seria la alternativa a seguir para poder medir 5 sensores no necesariamente deseo que sean al mismo tiempo, pueden ser consecutivas.

Gracias

Deberias haber iniciado otro post para este tema y no haber cambiado el titulo.Piensa en quien lea ahora este post se va a encontrar al principio con algo que no tiene que ver con el titulo actual.Hay que intentar mantener un poco la coherencia y el orden en el foro.

Jose disculpa. Puedo colocar el titulo ant y mantenemos todas las dudas por un mismo post. Varios post para un mismo proyecto tampoco es orden.

Podrias ayudarme por favor con mi duda?

Para leer 5 sensores, puedes usar un bucle FOR y guardar los resulrados en un array

for (int i=0; i < 5; i++){
     sensorValue [i] = analogRead (i);
     }