Tecnología y marketing Tecnología y marketing

Main Menu

  • Inicio
  • Destacados
  • Marketing
    • Diseño gráfico
      • Colores complementarios del color principal
  • Marketing digital
  • Tecnología
    • Raspberry pi
  • Gráficos
    • Humedad terrestre jardinera
    • Temperatura de la galería
Tecnología y marketing Tecnología y marketing

Tecnología y marketing

Observa, analiza, resuelve y actúa
  • Inicio
  • Destacados
  • Marketing
    • Diseño gráfico
      • Colores complementarios del color principal
  • Marketing digital
  • Tecnología
    • Raspberry pi
  • Gráficos
    • Humedad terrestre jardinera
    • Temperatura de la galería

Medidor de humedad terrestre capacitivo v1.2

Este sensor capacitivo de humedad terrestre es más resistente a la corrosión por la oxidación del mismo al estar en contacto con la humedad y de la tierra y transmitir una corriente eléctrica. Funciona en un voltaje entre  3,3 y 5,5 V. Transmite la información correspondiente a la humedad por el pin AOUT, dando una lectura analógica.

Para obtener el rango de valores sobre los que opera el sensor, he realizado un programa en C++ utlizando Platformio en el entorno de Arduino

Está pensado para ser utilziado con un ESP8266, el cual solo tiene una entrada analógica para la lectura de los datos.

Para poder utilizar más de una entrada analógica de datos he utilizado un multiplexor analógico, para el que he creado una función que mide la entrada de información de cada una de sus entradas. La función devuelve un valor entero, que es la lectura de la entrada solicitada, teniendo la siguiente nomenclatura:

int readAnalogMultiplexor(int *multiplexorControPINTable,int input).

El primer argumento nos informa de los tres pines en los que estamos controlando al multiplexor , siendo una matriz de integers de 3 números.

El segundo argumento argumento es la entrada analógica del multiplexor al que solicitamos la información.

Calibración del sensor

Para calibrar el sensor he realizado un proceso en el que se realizan 50 lecturas de cada sensor dado de alta en los pines del multiplexor. En el caso que he implementado se podrían calibrar 2 sensores a la vez, los cuales están conectados en los pines 4 y 6 del multiplexor.

Al final del loop, que se repite cada 5 minutos, se visualiza el valor más alto, el valor más bajo, la media de los valores y la covarianza de las lecturas, de cada uno de los sensores.

El código sería el siguiente


 #include <Arduino.h>

#define numTests 50

#define moistureNumSensors 2

//PINS for analog reads by multiplexor, versión 1.0

int multiplexorControPIN[3]={18,17,16};//to control analog input to read

int multiplexorAnalogReadPIN=34;//analog input read pin for multiplexor

int moistureLectureMultplexorPINS[moistureNumSensors]={4,6};//multplexor inputs to read

int moistureValues[numTests][moistureNumSensors];

int minLectures[moistureNumSensors];

int maxLectures[moistureNumSensors];

bool _DEBUG_=false;//bool data to show Serial debuging

void readMoisturePlants(int moistureLandRegisters[moistureNumSensors]);

int readAnalogMultiplexor(int *multiplexorControPINTable,int input);

void setup() {

  Serial.begin(115200);

  //configuracion del multiplexor analogico inicilializado a  alto

  for(int i=0;i<3;i++){

    pinMode(multiplexorControPIN[i],OUTPUT);

  }

  for(int i=0;i<3;i++){

    digitalWrite(multiplexorControPIN[i],HIGH);

    delay(50);

  }

  //inicialización de las variables de medición

  for(int i=0;i<moistureNumSensors;i++){

    minLectures[i]=99999;

    maxLectures[i]=0;

  }

  Serial.print("Configuración realizada. Programa inicializado.\n");

}

void loop() {

  int totalForAverage[moistureNumSensors];

  //inicialización de las variables de medición

  for(int i=0;i<moistureNumSensors;i++)

    totalForAverage[i]=0;

  for(int i=0;i<moistureNumSensors;i++){

    minLectures[i]=99999;

    maxLectures[i]=0;

  }

  Serial.println("Realizando lecturas");

  for(int i=0;i<numTests;i++){

    if(_DEBUG_) Serial.print("=============================================Realizando lectura "+(String)(i+1)+"=============================================\n");

    readMoisturePlants(moistureValues[i]);

    if(_DEBUG_) Serial.print("Valores totales = [ ");

    for(int j=0;j<moistureNumSensors;j++){

      if(moistureValues[i][j]>maxLectures[j])

        maxLectures[j]=moistureValues[i][j];

      if(moistureValues[i][j]<minLectures[j])

        minLectures[j]=moistureValues[i][j];

      totalForAverage[j]=totalForAverage[j]+moistureValues[i][j];

      if(_DEBUG_) Serial.print((String) totalForAverage[j]);

      if(_DEBUG_) if(j<moistureNumSensors) Serial.print(" ");

    }

    if(_DEBUG_) Serial.print("]\n");

    Serial.print(".");

    delay(500);

  }

  Serial.print("\n=============================================Resultados=============================================\n");

  Serial.print("Valores máximos: [");

  for(int i=0;i<moistureNumSensors;i++){

    Serial.print(maxLectures[i]);

    if(i<moistureNumSensors-1) Serial.print(" ");

  }

  Serial.println("]");

  Serial.print("Valores mínimos: [");

  for(int i=0;i<moistureNumSensors;i++){

    Serial.print(minLectures[i]);

    if(i<moistureNumSensors-1) Serial.print(" ");

  }

  Serial.println("]");

  Serial.print("Valor medio = [");

  int media[moistureNumSensors];

  for(int i=0;i<moistureNumSensors;i++){    

    media[i]=totalForAverage[i]/numTests;

    Serial.print(media[i]);

    if(i<moistureNumSensors-1) Serial.print(" ");

  }

  Serial.println("]");

  //Cálculo de la varianza

  int sumaDiferenciaMediaCuadrado[moistureNumSensors];

  for(int i=0;i<moistureNumSensors;i++)

    sumaDiferenciaMediaCuadrado[i]=0;

  for(int i=0;i<moistureNumSensors;i++){    

    for(int j=0;j<numTests;j++){      

       sumaDiferenciaMediaCuadrado[i]=sumaDiferenciaMediaCuadrado[i]+(((moistureValues[j][i]-media[i])*(moistureValues[j][i]-media[i])));

    }

  }

  Serial.print("Varianza = [");

  for(int i=0;i<moistureNumSensors;i++){

    Serial.print((String) (sumaDiferenciaMediaCuadrado[i]/numTests));

    if(i<moistureNumSensors-1) Serial.print(" ");    

  }

  Serial.print("]\n");

  Serial.print("=============================================Esperando =============================================\n");

  delay(300000);//paro 5 minutos hasta repetir la prueba

}

void readMoisturePlants(int moistureLandRegisters[moistureNumSensors])

{

  //Lecturas de la humedad terrestre

  if(_DEBUG_) Serial.println("=============================================================");

  if(_DEBUG_) Serial.println("Leyendo lecturas de humedad terrestre (son "+ (String) moistureNumSensors +")");

  for(int i=0;i<moistureNumSensors;i++){

    moistureLandRegisters[i]=readAnalogMultiplexor(multiplexorControPIN,moistureLectureMultplexorPINS[i]);

    if(_DEBUG_) Serial.println("Lectura en "+ (String) i+ " situada en la entrada del multiplexor "+ (String) moistureLectureMultplexorPINS[i] +" es "+ (String) moistureLandRegisters[i]);

    delay(5);

    if(_DEBUG_) Serial.println("=============================================================");

   }

}

int readAnalogMultiplexor(int *multiplexorControPINTable,int input)

{

  //selecciono la entrada con el bit menos significativo tutorial en:

  //https://www.youtube.com/watch?v=OsY3hs06h2M

  if(input<0||input>7){

    Serial.println("Input selected out of range");

    return -1;

  }

  //Serial.println("Asking input"+ (String) input+" value");

  digitalWrite(multiplexorControPINTable[0], HIGH && (input & B00000001));  

  digitalWrite(multiplexorControPINTable[1], HIGH && (input & B00000010));

  digitalWrite(multiplexorControPINTable[2], HIGH && (input & B00000100));

  delay(25);//cambiado de 25 a 50 para que tenga más tiempo de actuar

  return analogRead(multiplexorAnalogReadPIN);

}




AM312 PIR sensor

El sensor AM312 es un sensor PIR de bajo coste que detecta presencia a través del campo de infrarojos que tiene alrededor.

Su diagrama de conexiones es el siguiente

mini pir pinout

Especificaciones técnicas

Input Voltage: 3.3 ~ 5V, 6V Maximum
Working Current: 15uA
Working Temperature: -20 ~ 85 ℃
Output Voltage: High 3V, low 0V
Output Delay Time (High Level): About 2.3 to 3 Seconds
Detection angle: 100 °
Detection distance: 7 meters
Output Indicator LED (When output HIGH, it will be ON)
Pin limit current: 100mA
Size: 30*20mm
Weight: 4g

Inicialmente había pensado en este sensor para hacer un iluminador de una estancia (proyecto luciérnaga) que se encendiese solo cuando fuese necesario

Tras crear el esquema me ha dado problemas al no detectar a la persona hasta que está muy cerca de él, por lo que lo hace prácticamente inútil al tener que moverte por casi toda la estancia a oscuras.

Estoy reconfigurando el circuito para darle otra oportunidad, pero no pina bien

Artículo con tutorial buenoArtículo con tutorial bueno

 

Mostrar
  • ¿Recordar usuario?
  • ¿Olvidó su contraseña?

Novedades

  • Flasheo de Higrómetro bluetooth THB1 clon de Xiaomi (sobre 2€ en Aliexpress)
  • Compilar Leptonica para usarlo con Tesseract
  • Compilar Marlin para una Ender 3 actualizada con la placa silenciosa 4.2.7
  • Compilar OpenCV con Mingw64 bits
  • Instalar Tesseract en Raspberry Pi para el reconocimiento de texto de un fichero de imagen

Anuncios