# Arduino y AD620

**URL:** <https://forum.arduino.cc/t/arduino-y-ad620/979015>\
**Category:** Hardware\
**Created:** [April 9, 2022, 2:37am UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015 "2022-04-09T02:37:19Z")\
**Posts on this page:** 20\
**Page:** 4

<div class="post-metadata">

**Author:** ![anon90500195](https://avatars.discourse-cdn.com/v4/letter/a/a587f6/32.png) [@anon90500195](https://forum.arduino.cc/u/anon90500195)\
**Post date:** [May 2, 2022, 9:22pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/62 "2022-05-02T21:22:44Z")

</div>

No entiendo...  
¿No estás usando el circuito de #45?  
De ser así te falta unir las masas, el esquema es claro.

Lo que te dije de separar las masas aplicaba para la configuración que mostraste en #25 que era un amplificador no inversor.

---

<div class="post-metadata">

**Author:** ![hubertd14](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hubertd14/32/1099953_2.png) [@hubertd14](https://forum.arduino.cc/u/hubertd14)\
**Post date:** [May 2, 2022, 9:28pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/63 "2022-05-02T21:28:59Z")

</div>

Claro, pero esa configuración del #45 la estoy tomando como si fuera un conjunto, así que, va a la misma masa, que en este caso sería la masa del Arduino y se alimenta con el 5V del Arduino, y el Arduino lo alimento con el cable USB, el sensor lo alimento con 12V de una fuente separada, y su masa está separada del Arduino (intenté que tuvieran las masas unidas (Arduino y sensor), pero no amplifica, se satura).

Me hago entender?e.e

---

<div class="post-metadata">

**Author:** ![anon90500195](https://avatars.discourse-cdn.com/v4/letter/a/a587f6/32.png) [@anon90500195](https://forum.arduino.cc/u/anon90500195)\
**Post date:** [May 2, 2022, 9:37pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/64 "2022-05-02T21:37:34Z")

</div>

Si estás usando exactamente la misma configuración y circuitería del esquema en #45 tienes que unir la masa de la fuente del sensor con la del resto.  
Sino muestra cual es el circuito que estás usando porque ya estoy perdido.

---

<div class="post-metadata">

**Author:** ![hubertd14](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hubertd14/32/1099953_2.png) [@hubertd14](https://forum.arduino.cc/u/hubertd14)\
**Post date:** [May 2, 2022, 9:42pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/65 "2022-05-02T21:42:54Z")

</div>

El circuito del gráfico #45, es el que estoy usando actualmente y me funciona, el que tiene un ad620, dos lm358, etc, eso lo tengo conectado a una masa diferente a la del sensor, podría intentar conectarlos a la misma masa, pero creo que lo intente así la primera vez y el sensor no me entregaba datos. Voy a intentarlo ahorita que tenga disponible todo y te comento

---

<div class="post-metadata">

**Author:** ![anon90500195](https://avatars.discourse-cdn.com/v4/letter/a/a587f6/32.png) [@anon90500195](https://forum.arduino.cc/u/anon90500195)\
**Post date:** [May 2, 2022, 9:55pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/66 "2022-05-02T21:55:33Z")

</div>

Mirá, tendrías que obtener algo así (línea roja)

 ![Captura de pantalla 2022-05-02 185127](https://europe1.discourse-cdn.com/arduino/original/4X/c/c/5/cc5358a1d251b65aa5126b39bd3817474e773e5f.png)  
Claramente tu captura (que es la azul) se debe a que el circuito está oscilando o que se está metiendo ruido por falta de alguna masa.  
Me inclino más por lo segundo.

---

<div class="post-metadata">

**Author:** ![hubertd14](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hubertd14/32/1099953_2.png) [@hubertd14](https://forum.arduino.cc/u/hubertd14)\
**Post date:** [May 3, 2022, 1:40am UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/67 "2022-05-03T01:40:05Z")

</div>

Hola gatul, te actualizo,

Alimente mi circuito #45 con 12[V], con la misma fuente y tierra que alimento el sensor MPX, conecte la salida y la tierra al arduino, y se fue la oscilacion, por ahora todo va viento en popa, mañana hare algunas pruebas pero por lo que vi hoy, funciona de maravilla 🙂

Muchisimas gracias gatul, surbyte y los demas que apoyaron, si vuelvo a tener algun inconveniente me veran de nuevo por aca.

---

<div class="post-metadata">

**Author:** ![silvia96](https://avatars.discourse-cdn.com/v4/letter/s/7feea3/32.png) [@silvia96](https://forum.arduino.cc/u/silvia96)\
**Post date:** [May 3, 2022, 6:12pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/68 "2022-05-03T18:12:37Z")

</div>

Les comparto un código para medir nivel de liquidos el codigo original lo encontre en el foro en español hace unos años lo busque para incluir la referncia pero no di con el  
saludos.

```cpp
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <Relay.h>
#include<Wire.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const float NIVEL_INFERIOR = 8061.0;
const float NIVEL_SUPERIOR = 49603.0;

const byte RELE_NIVEL_INFERIOR = 8;
const byte RELE_NIVEL_SUPERIOR = 9;
const unsigned long TIEMPO_MPXPIN = 2500UL;
const unsigned long TIEMPO_PRESENTACIO = 5000UL;
float nivel;
float litros;
float centimetros;
int ESTADOS;
const byte mpxpin = A0;
unsigned long tiempompxpin = 0 ;
unsigned long tiempopresentacion = 0 ;
enum estados_l {
  ESTADO_MPXPIN,
  ESTADO_LITROS,
  ESTADO_CENTIMETROS,
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
} estado = mpxpin;

void setup() {
  Wire.begin();
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  Serial.begin(9600);
  lcd.print("D. Marmo Servicios");
  lcd.setCursor(0, 2);
  lcd.print(" cisterna 50 000 ");

  tiempopresentacion = millis();

  pinMode(A0, INPUT);
  pinMode(RELE_NIVEL_INFERIOR, OUTPUT);
  pinMode(RELE_NIVEL_SUPERIOR, OUTPUT);
  digitalWrite (RELE_NIVEL_INFERIOR, HIGH);
  digitalWrite (RELE_NIVEL_SUPERIOR, HIGH);
  tiempompxpin = millis();
  delay (10);
}

void loop() {
  
  if (millis() - tiempompxpin > 2500UL) {
    nivel = analogRead (mpxpin);
    tiempompxpin = millis();
    float mv = (nivel / 1023.0) * 5000.0;
    float centimetros = mv / 10.960;
    float litros (centimetros * 116.1);

    Serial.print("litros ");
    Serial.println(litros);
    Serial.print(" ctm: ");
    Serial.println(centimetros);
    Serial.print(" mv: ");
    Serial.println(mv);
    lcd.setCursor(0, 0);
    lcd.print("litros ");
    lcd.print(litros);
    lcd.setCursor(0, 2);
    lcd.print("centimetros ");
    lcd.print(centimetros);

    //if (NIVEL_INFERIOR) {
    if ( litros < NIVEL_INFERIOR ) {
      digitalWrite (RELE_NIVEL_INFERIOR, LOW);
    } else {

      digitalWrite (RELE_NIVEL_INFERIOR, HIGH);
    }
    //if (NIVEL_SUPERIOR) {
    if (litros > NIVEL_SUPERIOR ) {

      digitalWrite (RELE_NIVEL_SUPERIOR, LOW);
    } else {

      digitalWrite (RELE_NIVEL_SUPERIOR, HIGH);
    }
  }
}

```

Cualquier pregunta o sugerencia son bienvenidas

---

<div class="post-metadata">

**Author:** ![anon90500195](https://avatars.discourse-cdn.com/v4/letter/a/a587f6/32.png) [@anon90500195](https://forum.arduino.cc/u/anon90500195)\
**Post date:** [May 3, 2022, 6:34pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/69 "2022-05-03T18:34:23Z")

</div>

Sugerencias...  
Si defines, por ej.

```cpp
const byte relepinA = 8;

```

luego no hagas

```cpp
pinMode(8, OUTPUT);

```

o

```cpp
digitalWrite (8, LOW);

```

es más fácil de entender lo que estás haciendo si lo escribes

```cpp
pinMode(relepinA, OUTPUT);

```

y

```cpp
digitalWrite (relepinA, LOW);

```

¿Qué pretendes que haga esto?

```cpp
if (NIVEL_INFERIOR) {

```

Porque te cuento que salvo que _NIVEL\_INFERIOR_ alguna vez sea 0, siempre va a rjecutar el _if()_ porque cualquier valor distinto de 0 se considera _true_.  
Lo mismo pasa con

```cpp
if (NIVEL_SUPERIOR) {

```

Seguramente hay más detalles (como la variable _estado_ que defines pero no usas).

Saludos

---

<div class="post-metadata">

**Author:** ![silvia96](https://avatars.discourse-cdn.com/v4/letter/s/7feea3/32.png) [@silvia96](https://forum.arduino.cc/u/silvia96)\
**Post date:** [May 6, 2022, 2:03pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/70 "2022-05-06T14:03:16Z")

</div>

Hola Gatul tu sugerencia de relepinA en lugar de (8, LOW); me parece perfecta, (lo modificare) lo de nivel inferior y superior, son los limites de las alarmas si es menor de 8061.0 se activa, la alarma de nivel bajo y si rebasa los 49603.0 se activa la alarma de nivel alto.  
si seguro y me falta alguna variable que no e definido, tienes alguna sugerencia.  
Saludos

---

<div class="post-metadata">

**Author:** ![silvia96](https://avatars.discourse-cdn.com/v4/letter/s/7feea3/32.png) [@silvia96](https://forum.arduino.cc/u/silvia96)\
**Post date:** [May 6, 2022, 2:23pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/71 "2022-05-06T14:23:28Z")

</div>

Ya edite, quite esto ( 8, LOW); y puse esto (relepinA, LOW);, en post #68  
cambiando de tema, en el hilo de Seguidor Solar hice un borrador en maquina de estados, le puedes revisar

---

<div class="post-metadata">

**Author:** ![anon90500195](https://avatars.discourse-cdn.com/v4/letter/a/a587f6/32.png) [@anon90500195](https://forum.arduino.cc/u/anon90500195)\
**Post date:** [May 6, 2022, 4:44pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/72 "2022-05-06T16:44:08Z")

</div>

> [@silvia96](#):
>
> lo de nivel inferior y superior, son los limites de las alarmas si es menor de 8061.0 se activa, la alarma de nivel bajo y si rebasa los 49603.0 se activa la alarma de nivel alto.

Ya se para que son los límites, yo te expliqué otra cosa

> [@anon90500195](#):
>
> ¿Qué pretendes que haga esto?
> 
> ```arduino
> if (NIVEL_INFERIOR) {
> 
> ```
> 
> Porque te cuento que salvo que _NIVEL\_INFERIOR_ alguna vez sea 0, siempre va a ejecutar el _if()_ porque cualquier valor distinto de 0 se considera _true_.  
> Lo mismo pasa con
> 
> ```arduino
> if (NIVEL_SUPERIOR) {
> 
> ```

---

<div class="post-metadata">

**Author:** ![silvia96](https://avatars.discourse-cdn.com/v4/letter/s/7feea3/32.png) [@silvia96](https://forum.arduino.cc/u/silvia96)\
**Post date:** [May 11, 2022, 7:43pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/73 "2022-05-11T19:43:38Z")

</div>

Hola Gatul, después de mucho investigar llegue a la conclusión, de que if (NIVEL\_INFERIOR) no cumple ninguna función así que lo elimine lo mismo para NIVEL\_SUPERIOR. Lo que mas me tiene pensando es porque en esta maquina no me da ningún error, el IDE de Arduino es portable, en una SD eso es lo de menos, intente float mpxpin=A0; const byte mpxpin = A0; en realidad no se como sea correcto a ti te envia error? en tu compu (mpxpin),  
el programa funciona bien, eso no quiere decir que este bien programa

```cpp
E:\arduino-1.8.19\portable\sketchbook\cisterna_machie_state\cisterna_machie_state.ino:28:12: advertencia: conversión no válida de 'int' a 'estados_l' [-fpermissive]
  } estado = mpxpin;
             ^ ~~~~~

```

---

<div class="post-metadata">

**Author:** ![Surbyte](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/surbyte/32/217404_2.png) [@Surbyte](https://forum.arduino.cc/u/Surbyte)\
**Post date:** [May 12, 2022, 12:12am UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/74 "2022-05-12T00:12:41Z")

</div>

> [@silvia96](#):
>
> if (NIVEL\_INFERIOR)

@silvia96 creo que no entiendes que no tiene sentido esto

```arduino
 if (NIVEL_INFERIOR)

```

debería ser algo como

```arduino
if (valor > NIVEL_INFERIOR) {
  // hago algo
}

```

No has entendido lo que @anon90500195 se viene rompiendo la cabeza para explicarte.

```arduino
const float NIVEL_INFERIOR = 8061.0;

```

Es una constante, para que preguntas si (contante) que sentido tiene?

---

<div class="post-metadata">

**Author:** ![silvia96](https://avatars.discourse-cdn.com/v4/letter/s/7feea3/32.png) [@silvia96](https://forum.arduino.cc/u/silvia96)\
**Post date:** [May 12, 2022, 10:40am UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/75 "2022-05-12T10:40:56Z")

</div>

Hola @Surbyte, el post #68 lo edite y elimine el if (NIVEL\_SUPERIOR); y el if (NIVEL\_INFERIOR); y al parecer ni falta le hace al código, (según yo) siguiendo su sugerencia, if (valor \< NIVEL\_SUPERIOR); solo cambie "valor\<, por nivel\<. y en ambos post, #68 y #75 funciono el código sin ningún problema, hace un rato solucione el error permisivo, y cambie esto para que no diese error Arduino.  
} estado = mpxpin; por esto, } estado = ESTADO\_MPXPIN; y ya no dio error permisivo, adjunto como quedo hasta hora.  
Quiero modificarlo para que las ordenes a los reles sean en "switch case" espero lograrlo pronto.

```cpp
//https://forum.arduino.cc/t/arduino-y-ad620/979015/74
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <Relay.h>
#include<Wire.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const float NIVEL_INFERIOR = 8061.0;
const float NIVEL_SUPERIOR = 49603.0;

const byte RELE_NIVEL_INFERIOR = 8;
const byte RELE_NIVEL_SUPERIOR = 9;
const unsigned long TIEMPO_MPXPIN = 2500UL;
const unsigned long TIEMPO_PRESENTACIO = 5000UL;

float nivel;
float litros;
float centimetros;
int ESTADOS;
const byte mpxpin = A0;
unsigned long tiempompxpin = 0 ;
unsigned long tiempopresentacion = 0 ;

enum estados_l {
  ESTADO_MPXPIN,
  ESTADO_LITROS,
  ESTADO_CENTIMETROS,
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
} estado = ESTADO_MPXPIN;

void setup() {
  Wire.begin();
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  Serial.begin(9600);
  lcd.print("D. Marmo Servicios");
  lcd.setCursor(0, 2);
  lcd.print(" cisterna 50 000 ");

  tiempopresentacion = millis();

  pinMode(A0, INPUT);
  pinMode(RELE_NIVEL_INFERIOR, OUTPUT);
  pinMode(RELE_NIVEL_SUPERIOR, OUTPUT);
  digitalWrite (RELE_NIVEL_INFERIOR, HIGH);
  digitalWrite (RELE_NIVEL_SUPERIOR, HIGH);
  tiempompxpin = millis();
  delay (10);
}

void loop() {

  if (millis() - tiempompxpin > 2500UL) {
    nivel = analogRead (mpxpin);
    tiempompxpin = millis();
    float mv = (nivel / 1023.0) * 5000.0;
    float centimetros = mv / 10.960;
    float litros (centimetros * 116.1);

    Serial.print("litros ");
    Serial.println(litros);
    Serial.print(" ctm: ");
    Serial.println(centimetros);
    Serial.print(" mv: ");
    Serial.println(mv);
    lcd.setCursor(0, 0);
    lcd.print("litros ");
    lcd.print(litros);
    lcd.setCursor(0, 2);
    lcd.print("centimetros ");
    lcd.print(centimetros);

    if (nivel < NIVEL_INFERIOR) {
      if ( litros < NIVEL_INFERIOR ) {
        digitalWrite (RELE_NIVEL_INFERIOR, LOW);
      } else {

        digitalWrite (RELE_NIVEL_INFERIOR, HIGH);
      }
      if (nivel > NIVEL_SUPERIOR) {
        if (litros > NIVEL_SUPERIOR ) {

          digitalWrite (RELE_NIVEL_SUPERIOR, LOW);
        } else {

          digitalWrite (RELE_NIVEL_SUPERIOR, HIGH);
        }
      }
    }
  }
}

```

Le quedo una cola de llaves al final, al rato intento ponerlas en su lugar, ahora hay que dormir un rato.  
saludos

---

<div class="post-metadata">

**Author:** ![silvia96](https://avatars.discourse-cdn.com/v4/letter/s/7feea3/32.png) [@silvia96](https://forum.arduino.cc/u/silvia96)\
**Post date:** [May 25, 2022, 6:00am UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/76 "2022-05-25T06:00:54Z")

</div>

hola @Surbyte, encontré en el foro en español, en la siguiente liga, ([Lectura inestable en las entradas analogicas Arduino Mega 2560 - #4 by Surbyte](https://forum.arduino.cc/t/lectura-inestable-en-las-entradas-analogicas-arduino-mega-2560/327624/4)) donde aconsejas esta especie de ciclo for con millis (no se como se llame ) yo lo subí al código del sensor de presión y funciona con estabilidad (con fluctuaciones mínimas )

```cpp
// rutina promediacion 

unsigned long sumaADC = 0;
unsigned long start;
unsigned int contador;

void setup() {
	Serial.begin(9600);
   start = millis();
   contador = 0;
}

void loop() {

	sumaADC += analogRead(A0); // modifica A0 para que coincida con el pin Analogico que estes usando
    contador++;

	if (millis()-start > 1000UL){ // 1000 milisegundos = 1seg
		float promedio = (float) (sumaADC/contador)* 5.0/1023.0;
		Serial.print("AD = ");
		Serial.println(promedio);
		sumaADC = 0;
		contador = 0;
		start = millis(); // preparo para proxima presentación
	}
}

```

Mi pregunta es: (sumaADC = 10000;), así lo suma 10 mil veces, y así lo divide 10 mil veces (contador = 10000;) , el promedio es lo que imprime en monitor serial, ? o unsigned long sumaADC = 10000;

---

<div class="post-metadata">

**Author:** ![Surbyte](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/surbyte/32/217404_2.png) [@Surbyte](https://forum.arduino.cc/u/Surbyte)\
**Post date:** [May 25, 2022, 5:44pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/77 "2022-05-25T17:44:17Z")

</div>

Donde ves ?

```cpp
sumaADC = 10000;

```

Ahi dice, cada 10000 mseg lo que tenga sumaADC (acumulado del ADC y por eso uso unsigned long) será dividido por contador (que se incrementa con cada lectura del ADC) mostrando un promedio.

---

<div class="post-metadata">

**Author:** ![silvia96](https://avatars.discourse-cdn.com/v4/letter/s/7feea3/32.png) [@silvia96](https://forum.arduino.cc/u/silvia96)\
**Post date:** [May 25, 2022, 6:29pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/78 "2022-05-25T18:29:58Z")

</div>

En que parte del código le pongo que lo sume 10000 veces, para que promedio lo divida y me de el promedio ?, no alcanzo a comprender en que parte se ajusta las veces que quiera que se sumen.  
Saludos.

---

<div class="post-metadata">

**Author:** ![anon90500195](https://avatars.discourse-cdn.com/v4/letter/a/a587f6/32.png) [@anon90500195](https://forum.arduino.cc/u/anon90500195)\
**Post date:** [May 25, 2022, 6:54pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/79 "2022-05-25T18:54:47Z")

</div>

El código lee el puerto analógico _contador_ veces durante 1 segundo y lo acumula en _sumaACD_, luego calcula el promedio

```cpp
sumaADC / contador

```

Para que haga X cantidad de lecturas y luego calcule el promedio tienes que cambiar el código ya que tu ventana de muestreo ya no será por tiempo sino por número de muestras.

Saludos

---

<div class="post-metadata">

**Author:** ![silvia96](https://avatars.discourse-cdn.com/v4/letter/s/7feea3/32.png) [@silvia96](https://forum.arduino.cc/u/silvia96)\
**Post date:** [May 25, 2022, 9:41pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/80 "2022-05-25T21:41:00Z")

</div>

Hola @anon90500195, entonces tendría que hacerlo en un ciclo for, y hay determinar X cantidad de veces, para que en la ventana de muestreo salga el total de las sumas promediadas?

---

<div class="post-metadata">

**Author:** ![Surbyte](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/surbyte/32/217404_2.png) [@Surbyte](https://forum.arduino.cc/u/Surbyte)\
**Post date:** [May 25, 2022, 10:03pm UTC](https://forum.arduino.cc/t/arduino-y-ad620/979015/82 "2022-05-25T22:03:50Z")

</div>

> [@Surbyte](#):
>
> Ahi dice, cada 10000 mseg lo que tenga sumaADC (acumulado del ADC y por eso uso unsigned long) será dividido por contador (que se incrementa con cada lectura del ADC) mostrando un promedio.

Vaya otro error de mi parte. Me confundió el 10000.  
La ventana de tiempo es de 1000 mseg = 1 segundo.  
Toma las muestras del ADC y las acumula durante 1 segundo. Finalmente las promedia gracias a contador y la suma acumulada.  
El for sería bloqueante, es decir, si pones eso dentro de un for, el micro acumula valores fijos y finalmente hace la misma operación. O sea el promedio por esa suma fija de iteracciones de tu ciclo for.

[Previous page](https://forum.arduino.cc/t/arduino-y-ad620/979015.md?page=3)

[Next page](https://forum.arduino.cc/t/arduino-y-ad620/979015.md?page=5)
