Lectura de datos de sensores desde conexión en ESP32 - ferestradaa/RetoIOT GitHub Wiki

En esta sección se abarcan las distintas conexiones, materiales y códigos implementados en la solución del proyecto. El objetivo del reto se resume en accionar una serie de sensores conectados a una placa ESP32 con el fin de enviar a través de WiFi información recibida a una base de datos creada en la plataforma Firebase. Se pretende que los programas sean capaces de leer y escribir información en dicha base, utilizando el IDE de Arduino y Python.

Para llevarlo a cabo, se utilizaron los siguientes materiales:

  • 1 Placa de Desarrollo ESP32 de 2.4 GHz.
  • 2 protoboard de tamaño grande.
  • 1 Sensor de temperatura y humedad DHT11
  • 1 Sensor ultrasónico HC-SR04
  • 1 Sensor de movimiento HC-SR501 PIR
  • 1 Sensor de flama IR infrared
  • 1 Display de 7 segmentos de cátodo común
  • 1 Metro de cable UTP
  • 1 Cable micro USB a USB
  • 10 jumpers machos
  • IDE Arduino istalado
  • Python

Para el caso en particular, ninguno de los sensores requiere el uso de resistencias debido a su mismo diseño. Con el fin de realizar conexiones más ordenadas, se optó por sustituir en casos posibles los jumpers por el cable de internet UTP. Recuérdese utilizar un pin digital (GPIO) una sola vez para cada sensor dentro del mismo código.

Sensores Implementados

- Sensor de Temperatura y Humedad (DHT11)


Para el primer caso base, se ha implementado la conexión de un sensor de temperatura DHT11 a una placa ESP32. El sensor DHT11 realiza la conversión de una señal de entorno real para posteriormente desplegar una señal análoga con humedad y temperatura. Cuenta con 4 pines, los cuales se conectan respectivamente a:

  1. Voltaje (3V)
  2. GPIO digital
  3. GND

A continuación se muestra el diagrama que ilustra la conexión del sistema

Diagrama de Conexión DHT11

Código de Arduino implementado:

#include "DHT.h"

#define DHTPIN 4     // Digital pin conectado al sensor DHT11

#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  Serial.println(F("DHTxx test!"));

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

- Sensor Ultrasónico HC-SR04


Ahora, el segundo sensor se trata de un ultrasónico HC-SR04 el cual utiliza 4 pines. Este sensor se encarga de calcular la distancia de un objeto. La medición se realiza por el tiempo necesario para recibir el eco de una onda de sonido ultrasónico de 40 kHz que es emitido por el sensor, reflejado por el objeto y recibido por el receptor del sensor de distancia ultrasónico. Requiere de 4 conexiones:

  1. VIN (5V)
  2. Tierra 3 y 4. Pines Digitales

Diagrama de conexión

A diferencia de la imagen, este sensor se ha conectado a los pines 5 y 18 respectivamente

Codigo Implementado

const int trigPin = 5;
const int echoPin = 18;

//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701

long duration;
float distanceCm;
float distanceInch;

void setup() {
  Serial.begin(115200); // Starts the serial communication
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
}

void loop() {
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);
  
  // Calculate the distance
  distanceCm = duration * SOUND_SPEED/2;
  
  // Convert to inches
  distanceInch = distanceCm * CM_TO_INCH;
  
  // Prints the distance in the Serial Monitor
  Serial.print("Distance (cm): ");
  Serial.println(distanceCm);
  Serial.print("Distance (inch): ");
  Serial.println(distanceInch);
  
  delay(1000);
}

- Sensor de Movimiento (HC-SR501 PIR)


El sensor requiere de 3 conexiones:

  1. Alimentación (3V)
  2. Tierra
  3. Pin Digital (GPIO 19)

Diagrama de Conexión

Código Implementado


const int PIN_TO_SENSOR = 19; // GIOP19 pin connected to OUTPUT pin of sensor
int pinStateCurrent   = LOW;  // current state of pin
//int pinStatePrevious  = LOW;  // previous state of pin

void setup() 
{
    Serial.begin(115200);               // initialize serial
    pinMode(PIN_TO_SENSOR, INPUT);      // set ESP32 pin to input mode to read value from OUTPUT pin of sensor

}

void loop() 
{
    //pinStatePrevious = pinStateCurrent;             // store old state
    pinStateCurrent = digitalRead(PIN_TO_SENSOR);   // read new state
    bool cond; 

    if(pinStateCurrent == HIGH) 
    {   
        // pin state change: LOW -> HIGH
        cond = Serial.println(true);
        delay(1000); 
        // TODO: turn on alarm, light or activate a device ... here
    }
    else if(pinStateCurrent == LOW) 
    {   
        // pin state change: HIGH -> LOW
        cond = Serial.println(false);
        delay(1000);         // TODO: turn off alarm, light or deactivate a device ... here
    }
}

- Sensor de detección de flama (IR infrared)


Este sensor requiere de 3 conexiones:

  1. Alimentación (5V)
  2. Tierra
  3. Pin Digital (13)

Diagrama de Conexión:

Ignórese la conexión alterna al LED, para esta práctica no será necesario.

Código Implementado:

const int sensor = 13; 
int pinStateCurrent   = LOW;

void setup() {
  Serial.begin(115200);  
  pinMode(sensor,INPUT);
}

void loop() {
  pinStateCurrent = digitalRead(sensor);   // read new state
  String advise; 

   if (pinStateCurrent == HIGH) {           
    advise = Serial.print("FIRE DETECTED!\n"); 
    delay(1000); 
   }
    else if (pinStateCurrent == LOW){
    advise = Serial.println("FIRE NOT DETECTED");
    delay(1000);
    }
}

- Display de 7 Segmentos


Para realizar la conexión de este componente es primeramente necesario conocer las secciones que tienen el fin de hacer coincidir los pines utilizados con el programa que debe escribirse. Esto debido a que es necesario crear un arreglo con los nombres de GPIO. Con fines de apoyo, mire la imagen siguiente que ilustra el posicionamiento de los pines destinados a cada segmento del display:

Código Implementado:

//se demuestra el manejo del display de siete segmentos

//se declaran los pines a usar

int LEDs[] = {21,23,25,26,27,14,12};    // for ESP32 microcontroller
//------------g  f  e   d  c  b a

//se declaran los arreglos que forman los dígitos
int zero[] = {0, 1, 1, 1, 1, 1, 1};   // cero
int one[] = {0, 0, 0, 0, 1, 1, 0};   // uno
int two[] = {1, 0, 1, 1, 0, 1, 1};   // dos
int three[] = {1, 0, 0, 1, 1, 1, 1};   // tres
int four[] = {1, 1, 0, 0, 1, 1, 0};   // cuatro 
int five[] = {1, 1, 0, 1, 1, 0, 1};   // cinco
int six[] = {1, 1, 1, 1, 1, 0, 1};   // seis
int seven[] = {0, 0, 0, 0, 1, 1, 1};   // siete
int eight[] = {1, 1, 1, 1, 1, 1, 1}; // ocho
int nine[] = {1, 1, 0, 1, 1, 1, 1};   // nueve
int def[] = {1, 0, 0, 0, 0, 0, 0};   // nueve

String numero; 
int num; 


//se declara contador
unsigned char contador = 0;
int numero2 = 2; 

//función que despliega del 0 al F
void segment_display(unsigned char valor){
    switch(valor)
    {
        case 0:
                    for (int i = 0; i<7; i++) digitalWrite(LEDs[i], zero[i]);
                    break;
        case 1:
                    for (int i = 0; i<7; i++) digitalWrite(LEDs[i], one[i]);
                    break;
        case 2:
                    for (int i = 0; i<7; i++) digitalWrite(LEDs[i], two[i]);
                    break;
        case 3:
                    for (int i = 0; i<7; i++) digitalWrite(LEDs[i], three[i]);
                    break;
        case 4:
                    for (int i = 0; i<7; i++) digitalWrite(LEDs[i], four[i]);
                    break;
        case 5:
                    for (int i = 0; i<7; i++) digitalWrite(LEDs[i], five[i]);
                    break;
        case 6:
                    for (int i = 0; i<7; i++) digitalWrite(LEDs[i], six[i]);
                    break;
        case 7:
                    for (int i = 0; i<7; i++) digitalWrite(LEDs[i], seven[i]);
                    break;
        case 8:
                    for (int i = 0; i<7; i++) digitalWrite(LEDs[i], eight[i]);
                    break;
        case 9:
                    for (int i = 0; i<7; i++) digitalWrite(LEDs[i], nine[i]);
                    break;
        default:
                    for (int i = 0; i<7; i++) digitalWrite(LEDs[i], def[i]);
                    break;          
    }
}

void setup() {
//---------------------------se inicializan los pines como salida
  for (int i = 0; i<7; i++) pinMode(LEDs[i], OUTPUT);
}

void loop(){
 num = fbdo.intData();    
segment_display(num);
}