Montaje Arduino UNO:
Montaje Wemos:
Ejercicio19 – Clase Contador
Hacer un programa que cuente las pulsaciones de los botones A y B usando la clase contador guardada en un fichero “Contador.h”
Solución: https://codeshare.io/5QYNeq
Hacer commit y pull del código en el repositorio “Curso Programacion Arduino 2019” que esté en una carpeta llamada Ejercicio19-Clase_Contador
Si solo usamos funciones como en el ejercicio 17, necesito dos funciones detecta flanco y no puedo usar solo una porque si llamo a una y a otra simultáneamente el valor static se mantiene entre la llamada de una y otra lo que hace que falle. Para resolver este problema, hacer una clase DetectaFlanco y entonces puedo reutilizar el código ya que cada vez que instancio una nueva clase es como una función nueva.
NOTA: la clase se puede definir en un fichero “Contador.h” o dentro del mismo fichero .ino, ver ejemplo en https://github.com/jecrespo/aprendiendoarduino-Curso_Programacion_Arduino_2019
Ejercicio20 – Clase Detecta Flanco
Hacer el programa anterior pero creando una clase llamada DetectaFlanco en un fichero “DetectaFlanco.h”
Solución: https://codeshare.io/Gb6K0M
Hacer commit y pull del código en el repositorio “Curso Programacion Arduino 2019” que esté en una carpeta llamada Ejercicio20-Clase_Detecta_Flanco
NOTA: Esta clase se puede definir en un fichero “DetectaFlanco.h” y otro “DetectaFlanco.cpp” ver ejemplo en https://github.com/jecrespo/aprendiendoarduino-Curso_Programacion_Arduino_2019
Ejercicio21: Sensor DHT
Para entender mejor las clases y objetos y antes de entrar en el apartado de librerías y cómo crearlas, vemos un ejemplo de la librería DHT22 para las sondas de temperatura y humedad, de forma que entendamos que cuando la usamos para una sonda, lo que hacemos es instanciar un objeto de tipo sonda DHT22 y cuando llamamos al método readTemperature() estamos ejecutando la función que consulta la temperatura. También vamos a ver cómo se estructura la clase en el fichero de cabecera y en el de contenido.
El código de la librería lo tenemos en https://github.com/adafruit/DHT-sensor-library y vemos que tenemos dos ficheros:
- DHT.h: https://github.com/adafruit/DHT-sensor-library/blob/master/DHT.h
- DHT.cpp: https://github.com/adafruit/DHT-sensor-library/blob/master/DHT.cpp
En el fichero de cabecera tenemos la definición de la clase:
class DHT { public: DHT(uint8_t pin, uint8_t type, uint8_t count=6); void begin(void); float readTemperature(bool S=false, bool force=false); float convertCtoF(float); float convertFtoC(float); float computeHeatIndex(float temperature, float percentHumidity, bool isFahrenheit=true); float readHumidity(bool force=false); boolean read(bool force=false); private: uint8_t data[5]; uint8_t _pin, _type; #ifdef __AVR // Use direct GPIO access on an 8-bit AVR so keep track of the port and bitmask // for the digital pin connected to the DHT. Other platforms will use digitalRead. uint8_t _bit, _port; #endif uint32_t _lastreadtime, _maxcycles; bool _lastresult; uint32_t expectPulse(bool level); };
Y en el fichero de definiciones DHT.cpp tenemos el código.
Constructor:
DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) { _pin = pin; _type = type; #ifdef __AVR _bit = digitalPinToBitMask(pin); _port = digitalPinToPort(pin); #endif _maxcycles = microsecondsToClockCycles(1000); // 1 millisecond timeout for // reading pulses from DHT sensor. // Note that count is now ignored as the DHT reading algorithm adjusts itself // basd on the speed of the processor. }
Método begin():
void DHT::begin(void) { // set up the pins! pinMode(_pin, INPUT_PULLUP); // Using this value makes sure that millis() - lastreadtime will be // >= MIN_INTERVAL right away. Note that this assignment wraps around, // but so will the subtraction. _lastreadtime = -MIN_INTERVAL; DEBUG_PRINT("Max clock cycles: "); DEBUG_PRINTLN(_maxcycles, DEC); }
Método readTemperature(), que llama a la función read() que es la que hace toda la operación de consultar a la sonda y guarda en la propiedad privada data la información leída y readTemeprature() se encarga de darle formato en función del tipo de sonda y devolver el float con la temperatura:
float DHT::readTemperature(bool S, bool force) { float f = NAN; if (read(force)) { switch (_type) { case DHT11: f = data[2]; if(S) { f = convertCtoF(f); } break; case DHT22: case DHT21: f = data[2] & 0x7F; f *= 256; f += data[3]; f *= 0.1; if (data[2] & 0x80) { f *= -1; } if(S) { f = convertCtoF(f); } break; } } return f; }
Este esquema explica como funciona este sensor y el protocolo de comunicación. La librería implementa el protocolo y facilita el uso de la sonda con Arduino.
En un ejemplo de uso de esta clase, primero hacemos un include del fichero, luego instanciamos un nuevo objeto sonda llamado dht. En el setup hacemos el begin() para iniciarlo y en el loop llamamos a los métodos de leer temperatura y humedad.
#include "DHT.h" DHT dht(DHTPIN, DHTTYPE); void setup() { dht.begin(); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); }
Partiendo del ejemplo de la librería llamado DHTtester, adaptarlo para el montaje de Arduino Uno pero usando dos sondas DHT11 en los pines 11 y 12
Solución: https://codeshare.io/arJ0nv
Hacer commit y pull del código en el repositorio “Curso Programacion Arduino 2019” que esté en una carpeta llamada Ejercicio21-DHT