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:
- Voltaje (3V)
- GPIO digital
- 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:
- VIN (5V)
- 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:
- Alimentación (3V)
- Tierra
- 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:
- Alimentación (5V)
- Tierra
- 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);
}