Proyecto: Control TEMPERATURA DEL Sistema de Aire acondicionado y temperatura/humedad interior del vehículo Está realizado en Arduino y en aplicación AppInventor. Nombre del proyecto en Arduino V 1.8.19 y en Appinventor: “Control_Temp_Hume_AC_junio_22.ino /.apk” Autor: Joaquín Berrocal Piris Fecha : Junio 2022
PROCESO DE CONSTRUCCIÓN PROYECTO: “Control_Temp_Hume_AC_junio_22.ino”
(Realizado por Joaquín Berrocal Piris en junio 2022)
Vídeo en youtube de éste y otros proyectos míos: https://www.youtube.com/user/joaquininbp/videos?view=0&shelf_id=0&sort=dd COMETIDO Se trata de un proyecto creado en Arduino V1.8.19 y en AppInventor V2.63 Permite conocer los valores de temperatura indicados por 4 sensores de 1 Wire-DS18B20 repartidos por diversos puntos del circuito de aire acondicionado o climatizador de cualquier vehículo + 1 sensor DHT22 de Temperatura y Humedad alojado en el interior del vehículo. Los valores de temperatura y humedad se pueden ver sobre la pantalla LCDI2C 20X4 / sobre el monitor serial del PC y sobre la aplicación apk por mí creada en el teléfono móvil a través de bluetooth. Zona de confort de 20 a 28ºC y 30 a 70% de Humedad; (24ºC /50%H) S5/H5: Sensor de temperatura y humedad 1-wire DHT22 S5: Temperatura interior vehículo H5: Humedad int vehículo S1 a S4: Sensores de temperatura 1-wire DS18B20 S1: Temperatura Salida Compresor 80 a 100ºC S2: Temperatura Salida Condensador 50 a 60ºC S3: Temperatura Entrada Evaporador -10 a – 15ºC S4 Temperatura Salida Evaporador 6 a 12ºC
Nombre del programa en Arduino: “Control_Temp_Hume_AC_junio_22.ino” Nombre de la aplicación en Appinventor: “Control_Temp_Hume_AC_junio_22.apk” ELEMENTOS USADOS En este proyecto utilizo los siguientes elementos: + Caja de madera, exterior 120x120x55mm. Interior:104x104x50mm + Arduino NANO V3 + Nano expansión Board + 4 sensores 1Wire DS18B20 para colocar en el Sistema de A/C del vehículo y conocer su temperatura. (Unifico sus pines de datos conectándolos al pin 2 de la Arduino Nano y con una sola R4K7 a pull-up) + 1 Sensor de Temp/Humedad DHT22 para medir la temperatura y humedad interior del vehículo + LCD I2C 20X4 + Bluetooth HC-05 + Regulador STEP UP/DOWN XL6019 (20W / 5-32V / 1,5-35V) El XL6019 es un elevador y reductor de voltaje (Step Up y Down) que por medio de la regulación se puede obtener voltajes entre 1.3V – 35V DC + Conector Jack tipo PCB de 5x2,1mm + 2 micro interruptores, están pensado para ahorro de batería en caso de usarla, estaba previsto 9V/550mAh El de la 1rduin. Desconecta la pantalla LCD y el de la Dcha es alimentación general evitando tener que quitar la batería. Nota: No uso finalmente batería de 9V/550mAH porque se descarga rápidamente. Uso un Jack de 5mm x 2.1 mm para alimentarlo desde un cargador de móvil o de la propia batería del coche no siendo ya necesario usar los micro interruptores al no tener problemas con el consumo. Nota: El disponer de un STEP UP/DOWN XL6019 (20W / 5-32V / 1,5-35V ) ajusto y estabilizo la tensión de salida a 6V DC para alimentar a la placa Arduino por el pin VIN de forma estable y continua con independencia de la tensión de entra que la mantiene OK desde los 3,5V a los 35 V Este regulador me permite alimentarlo, por ejemplo, con un cargador de 5 V o bien con la propia batería del coche sin ningún problema. La tensión de salida ajustada a (6V) la llevo al pin VIN de la 1rduino y luego es regulada a 5V por el propio regulador de la Nano que es la tensión con la que se trabaja. “Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
1
DIRECCIONES DE AYUDA QUE HE UTILIZADO 1) Lo primero es configurar el Arduino NANO V3.0 para poder programarlo desde Arduino. Ver Video 14’ Arduino desde cero en Español – Capítulo 44 – NANO modelos FT232RL y CH340G (con enlaces a drivers) (En este vídeo se habla de la distribución de pines, puntos a favor y en contra respecto del modelo Arduino UNO y cómo instalar los drivers para las versiones FT232RL como para el CH340G del conversor. También cómo alimentar de forma externa mediante el pin VIN y los límites de los rieles de 5 y 3,3 V.)
- Controlador driver FT232RL: https://www.ftdichip.com/Drivers/VCP.htm - Este es el utilizado: Controlador driver CH340G: http://www.wch-ic.com/downloads/CH341… Desde el Arduino : Herramientas> placa > Arduino Nano. Y el procesador AtMega328P (Old Bootloader) y escoger el puerto adecuado se puede ver en administrador de dispositivos> puertos (COM y LPT)
2) Dirección de MIT appinventor para el desarrollo de la apk para el móvil:
(MIT App Inventor es una plataforma de Google Labs para crear aplicaciones de software para Android. Esta plataforma permite: Crear aplicaciones para dispositivos móviles (Tablets o Smartphones) que tengan sistema operativo Android.) https://appinventor.mit.edu/
3) Tutorial sensor digital de temperatura DS18B20:
+ Mucha información: https://programarfacil.com/blog/arduino-blog/ds18b20-sensor-temperatura-arduino/ + https://naylampmechatronics.com/blog/46_Tutorial-sensor-de-temperatura-DS18B20.html
4) Tutorial sensor de temperatura y humedad DHT 11 Y DHT 22 https://naylampmechatronics.com/blog/40_tutorial-sensor-de-temperatura-y-humedad-dht11-ydht22.html PRIMERAS PRUEBAS Y CONSTRUCCION DE LA CAJA
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
2
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
3
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
4
MONTAJE CON BATERÍA DE 9 V/550mAH (no interesa por durar poco)
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
5
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
6
EN EL MONTAJE FINAL SUSTITUYO LA BATERÍA POR REGULADOR DE TENSIÓN STEP UP/DOWN XL6019 con el cual regulo a 6V su salida para alimentar a la Arduino NANO por su pin VIN. El STEP UP/DOWN XL6019 es un elevador y reductor de voltaje (Step Up y Down) que por medio de la regulación se puede obtener voltajes entre 1.3V – 35V DC. Lo mejor de él es que mantiene la tensión regulada con independencia que la tensión de entrada varie. Así lo puedo utilizar tanto con un cargador de móvil a 5V como usando la batería del coche a 12V, manteniendo 100% OK la tensión de salida que he regulado. Su precio en aliexpress por unos 2,40€
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
7
HACIENDO PRUEBAS CON LA ESTABILIZACIÓN DE LA TENSIÓN A 6 V con independencia de la tensión que le demos en su entrada mantiene a 6 V su salida (nota como puede observarse a mayor tensión de entrada menor amperaje del circuito) ( Al darle en la entrada 12V ó 5,7V se puede ver que en la salida nos mantiene la tensión en 6V.) “A partir de los 4 V hasta los 32V nos mantendrá estable el valor ajustado en su salida”
En esta imagen se ve que la tensión en su salida hacia el pin VIN es de 6 V.
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
8
CABLES DE ALIMENTACIÓN PREPARADOS: Uno para conexión a la batería del coche (mayor comodidad) El otro es usando un cargador de 220V AC /5,7V DC.
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
9
------------------ PATILLAJE ARDUINO NANO V3.0 ------------------Y CONEXIÓN DE LOS DIFERENTES SENSORES, LCDI2C, TARJETA BLUETOOTH HC05
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
10
--------------------------ADUINO NANO V3.0 ----------------------------
PATILLAJE DE DISTINTAS PLACAS ARDUINO: https://www.luisllamas.es/esquema-de-patillaje-de-arduino-pinout/ ARDUINO NANO V3.0 https://descubrearduino.com/arduino-nano-pinout/
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
11
ESQUEMA EN FRITZING DEL PROYECTO: “Control_Temp_Hume_AC_junio_22.ino”
- Arduino Nano V3.0 - Step Up/Down XL6019 - 1 Sensor de temperatura y Humedad DHT22 - 4 Sensores de temperatura 1Wire DS18B20 - Tarjeta bluetooth HC05 - LCDI2C 20x4 - Jack PCB 5X2,1 mm - 2 microinterruptores; uno corta alimentación a la LCD y el otro corta alimentación general. los microinterruptores eran para ahorrar batería en caso de usarla. Ya no son necesario.
(Nota: en el Fritzing no he encontrado el Step Up/Dow XL6019, he puesto en su lugar un conversor parecido fisicsamente, en concreto el Step down converter LM256) CONEXIÓN a la ARDUINO NANO V3.0 Power: de 4 a 32V, estabilizada llega al pin VIN: 6V Sensores 1Wire DS18B20 Pin 2 Sensor Temp/Hume DHT22 Pin 3 LCD20x4 I2C SDA al pin A4 / SCL al pin A5 Tarjeta Bluetooth HC05 RX 10 y TX 11 (invertir con placa bluetooth) Zona de confort de 20 a 28ºC y 30 a 70% de Humedad; (24ºC /50%H) S5/H5: Sensor de temperatura y humedad 1-wire DHT22 S5: Temperatura interior vehículo H5: Humedad int vehículo S1 a S4: Sensores de temperatura 1-wire DS18B20 S1: Temperatura Salida Compresor 80 a 100ºC S2: Temperatura Salida Condensador 50 a 60ºC S3: Temperatura Entrada Evaporador -10 a - 15ºC S4 Temperatura Salida Evaporador 6 a 12ºC
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
12
PROGRAMA EN ARDUINO V1.8.19 (Realizado por Joaquín Berrocal Piris en junio del 2022) “Control_Temp_Hume_AC_junio_22.ino” /*PROYECTO realiazado por Joaquín Berrocal Piris * en junio 2022 para el control de las temperaturas * del sistema de aire acondicionado o climatizador * del vehículo. * El control se puede observar desde * - Puerto serial del PC * - Por la pantalla LCD 20x4 I2C * - Por el teléfono móvil y aplicación "Control_Temp_Hume_AC_junio_22.apk" vía bluetooth * (la aplicación del móvil también está desarrollada por mi) * * * Tengo construida una caja para la coloación de la pantalla LCD * y la conexión de los sensores a la arduino micro pro V3 y la * placa bluetooth HC05 * * Dispone de 4 sensores DS1821 unidos por un sólo cable de datos * a la placa ARDUINO UNO NANO V3. por el pin 2. * El Sensor 1: conectado a la salida del Compresor * El Sensor 2: conectado a la salida del Condensador * El Sensor 3: conectado a la entrada del Evaporarador * El Sensor 4: conectado a la salida del Evaporador * * El sensor 5 es el DHT22 unido al pin 3, controla * la Temperatura y Humedad interior del vehículo * * * ---- INFORMACIÓN LIBRERIAS----* - Librería OneWire, descarga: https://github.com/PaulStoffregen/OneWire En esta librería está implementado todo el protocolo del bus 1-wire. Y puede usarse tanto para el DS18B20 como para otros dispositivos 1-wire, para mayor información sobre la librería: http://www.pjrc.com/teensy/td_libs_OneWire.html -Librería DallasTemperature, descarga: https://github.com/milesburton/Arduino-Temperature-Control-Library En esta librería están implementadas las funciones necesarias para poder realizar las lecturas o configuraciones del DS18B20, para mayor información de la librería revisar: http://www.milesburton.com/Dallas_Temperature_Control_Library Dirección Web con mucha información sobre DS18B20: https://programarfacil.com/blog/arduino-blog/ds18b20-sensor-DHT22_temperatura-arduino/ */ /* * NOTA: Podría suprimir todas las instrucciones para comunicación con el puerto Serial * del PC, pero las dejo para poder hacer posibles ensayos de funcionamiento en caso * de hacer modificaciones al programa * */ //---------------- COMIENZO ----------------#include <OneWire.h> //librería para la LCD I2C #include <DallasTemperature.h> //librería para los sensores 1-Wire I2C DS18B20 #include <LiquidCrystal_I2C.h> //Versión LiquidCrystal_I2C-1.1.2 #include <SoftwareSerial.h> //Para manejo bluetooth HC05 //permite asignar otros puertos distintos al Serial Monitor para poder utilizarlo en conjunto //El Serial Monitor utiliza los pines 0 RX y 1 Tx pare ver sobre PC //La comunicación Serial del BLUETOOH le asigno el pin 10RX y 11Tx intercambiarlos con los de “Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
13
//la placa bluetooth 10Rx con el Tx y el 11Tx con el Rx de la placa bluetooth HC05 //--- Sensor DHT22 para control de temp. y humedad interior vehículo.---#include <DHT.h> #include <DHT_U.h> #define DHTPIN 3 //Pin 3 del Arduino o el que prefieras #define DHTTYPE DHT22 //Definir el sensor como un DHT22 DHT dht(DHTPIN, DHTTYPE); float DHT22_temperatura; float DHT22_humedad; //-------SENSORES DE Temperatura por bus1-Wire DS18B20-------// Pin donde conecto el bus 1-Wire de los sensores DS18B20 const int pinDatosDQ = 2; //(El sensor DHT22 de Temp/Humedad está conectado al pin 3) // -----Para control del LCD I2C pines A4 SDA / A5 SCL-----// 0x27 es la dirección I2C por defecto del LCD20x4 y LCD16x2 LiquidCrystal_I2C lcd(0x27,20,4); //uso la LCD20x4 //--------------------PROGRAMA----------------/* OBSERVACIÓN MUY IMPORTANTE: sobre las limitaciones de la librería "SoftwareSerial (Rx,Tx);" http://manueldelgadocrespo.blogspot.com.es/p/biblioteca.html No todos los pines en la Mega y Mega 2.560 soportan interrupciones de cambio de nivel, por lo que solamente la siguiente puede ser utilizado para RX: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 ( 63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69). No todos los pines de las placas Leonardo y Micro soportan interrupciones de cambio de nivel, así que solamente los siguientes se pueden utilizar para RX: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI). En Arduino o Genuino 101 la velocidad máxima actual de RX es de 57600bps En Arduino o Genuino 101 RX no funciona en el pin 13 */ //Utilizo la NANO V3 y al igual que en la UNO SoftwareSerial bt(10,11); // 10RX Y 11TX ; intercambiarlos con la placa //bluetooth HC05 //los pines 10RX y 11TX para el Bluetooth no hace falta configuarlos como E/S // Instancia a las clases OneWire y DallasTemperature OneWire oneWireObjeto(pinDatosDQ); //tengo el pin de Datos 2 para los DS18B20 DallasTemperature sensorDS18B20(&oneWireObjeto); // Variables con las direcciones únicas de los 4 sensores DS18B20 //Programa para descubir las direcciones únicas de cada sensor: // https://programarfacil.com/blog/arduino-blog/ds18b20-sensor-temperatura-arduino/ DeviceAddress Sensor_1 = {0x28, 0x74, 0x63, 0x19, 0x00, 0x00, 0x00, 0xAE}; DeviceAddress Sensor_2 = {0x28, 0x48, 0x51, 0x19, 0x00, 0x00, 0x00, 0x39}; DeviceAddress Sensor_3 = {0x28, 0x59, 0x80, 0x18, 0x00, 0x00, 0x00, 0x49}; DeviceAddress Sensor_4 = {0x28, 0x62, 0x35, 0x16, 0x00, 0x00, 0x00, 0xD4};
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
14
void setup() { delay(1000); // para estabilización // Iniciamos la comunicación Serial a PC pines 0-1 Serial.begin(9600); // El pinDatosDQ = 2 Pin donde conecto el bus 1-Wire de los sensores DS18B20 // Iniciamos la comunicación Serial del bus 1-Wire de los sensores DS18B20 sensorDS18B20.begin(); // Iniciamos el sensor de Temp y humedad DHT22 dht.begin(9600); //comunicación a través del pin 3 arduino // Iniciamos el bluetooth pines RX10 y TX11 para comunicación // con teléfono móvil de los valores de temperatura y humedad bt.begin(9600); // Iniciamos LCD I2C por los pines A4 SDA A5 SCL lcd.init(); // initialize the lcd //---------------------------// Buscamos los sensores conectados al bus 1-wire //(sólo están los DS18B20 conectados al pin 2) //(El sensor DHT22 está conectado al pin 3) Serial.println("Buscando dispositivos..."); Serial.println("Encontrados: "); Serial.print(sensorDS18B20.getDeviceCount()); Serial.println(" sensores"); //-------- MANEJO LCD POR I2C ------/* --- LO DEJO POR SI DESEO AÑADIR UNA PRESENTACIÓN--* lcd.backlight(); lcd.setCursor(0,0); //a la izda columna, a dcha fila, comienzan por 0 (Columna0, Fila0) lcd.print(" Control Temp A/C "); lcd.setCursor(0,1); lcd.print(" proyecto de: "); lcd.setCursor(0,2); lcd.print(" Joaquin Berrocal "); lcd.setCursor(0,3); lcd.print("Berrocal Piris 2022"); Delay(3000); */ //----------------------------------} void loop() { Serial.println("Mandando comandos a los sensores"); sensorDS18B20.requestTemperatures(); float temperatura_1 = sensorDS18B20.getTempC(Sensor_1); float temperatura_2 = sensorDS18B20.getTempC(Sensor_2); “Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
15
float temperatura_3 = sensorDS18B20.getTempC(Sensor_3); float temperatura_4 = sensorDS18B20.getTempC(Sensor_4); //--- Lectura de temperatura y humedad habitáculo, sensor DHT22 ---DHT22_temperatura = dht.readTemperature(); DHT22_humedad = dht.readHumidity(); /* ------------------------ No lo uso --------------------// ----chequea si se lee el sensor DHT---// LO SUPRIMO para evitar se quede aquí por fallo del sensor // si no se lee este sensor se queda aquí el programa //no viéndose más que la indicación en la LCD de manera intermitente if (isnan(DHT22_humedad) || isnan(DHT22_temperatura)) { Serial.println("Sensor DHT22 habitáculo NO OK!"); lcd.backlight(); lcd.clear(); //borra pantalla lcd.setCursor(0,1); //posiciona en columna 1 de la fila 2 for (int i= 0; i < 4; i++){ lcd.print(" FALLO SENS HABITAC "); delay (250); lcd.clear(); lcd.setCursor(0,1); } // fin for intermitencia return;
} //----------------- fin de no lo uso ------------------*/ //----------Para ver en el monitor serial del PC-------------Serial.print("temperatura sensor 0: "); Serial.print(temperatura_1); Serial.println(" C"); Serial.print("temperatura sensor 1: "); Serial.print(temperatura_2); Serial.println(" C"); Serial.print("temperatura sensor 2: "); Serial.print(temperatura_3); Serial.println(" C"); Serial.print("temperatura sensor 3: "); Serial.print(temperatura_4); Serial.println(" C"); Serial.print("humedad.: "); Serial.print(DHT22_humedad); Serial.println(" %"); Serial.print("temperatura: "); Serial.print(DHT22_temperatura); Serial.println(" C");
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
16
//-------- MANEJO LCD POR I2C ------// +++nuevo a enviar a LCD+++ // --- Ver en LCD20x4 en fila 0 Temp y Hume inte vehíc --lcd.backlight(); // Valores de Temp y humedad del DHT22 interior vehículo (Columna0,Fila0) lcd.setCursor(0,0);// (Columna,Fila)en fila 0 muestra DHT22_temp interior habitac lcd.print("S5: "); lcd.print(DHT22_temperatura,1);//el 1 es para indicar 1 sólo decimal.Si no, Saldrían 2 lcd.print("C"); lcd.setCursor(10, 0); //en fila 0 muestra DHT22_humedad interior habitac lcd.print("H5: "); lcd.print(DHT22_humedad,1); lcd.print("%"); // Valores de Temp de los sensores 1 y 2 DS18B20 (Columna0,Fila1) lcd.setCursor(0,1); // (Columna0, Fila1) lcd.print("S1: "); lcd.print(temperatura_1,1); //el 1 es para indicar 1 sólo decimal.Si no, Saldrían 2 lcd.print("C"); lcd.setCursor(10,1); lcd.print("S2: "); lcd.print(temperatura_2,1); lcd.print("C"); // Valores de Temp de los sensores 3 y 4 DS18B20 (Columna0,Fila2) lcd.setCursor(0,2); //(Columna0, Fila2) lcd.print("S3: "); lcd.print(temperatura_3,1); lcd.print("C"); lcd.setCursor(10,2); lcd.print("S4: "); lcd.print(temperatura_4,1); lcd.print("C"); //+++++++++++++++++++++++++++ //-----------------VALORES A VER EN EL MÓVIL "con 1 decimal"---------------------//--- SENSOR DHT22 Temp / Humedad interior Vehículo --//leemos y mostramos datos sensor temp y Humedad interior vehículo bt.print(DHT22_temperatura,1); //el 1 representa 1 decimal (indice 1) bt.print("/"); //Separador para cortar lo enviado bt.print(DHT22_humedad,1); // (indice 2) bt.print("/"); // Leemos y mostramos los datos de los sensores DS18B20 por dirección única //----- SENSOR 1 DS18B20 Salida Compresor ----bt.print(temperatura_1,1); // (indice 3) bt.print("/"); //Separador para cortar lo enviado “Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
17
//(o bien poner 10 si pongo salto de línea en el print("\n") //----- SENSOR 2 DS18B20 Salida Condensador ----bt.print(temperatura_2,1); // bt.print("/");
(indice 4)
//----- SENSOR 3 DS18B20 Entrada Evaporador ----bt.print(temperatura_3,1);// (indice 5) bt.print("/"); //----- SENSOR 4 DS18B20 Salida Evaporador ----bt.print(temperatura_4,1); // (indice 6) bt.print("\n"); //fin secuencia envío valor cambio linea "\n = 10" //INPORTANTE fin secuencia envío valor cambio linea "\n = 10" //config en AppInventor "ClienteBluetooth1 DelimiterByte poner 10" //-----------------------------------
}
delay(300); // a una resolucion de 12 bits que así vienen por defecto //tiempo máx de conversión 750 ms
//------------------- FIN PROYECTO en ARDUINO-----------------PROYECTO DESARROLLADO EN APPINVENTOR Lo primero decir que la aplicación hecha en AppInventor dispone de dos pantallas, la primera visible para recibir los datos enviados por el Arduino NANO V3.0 con los valores de temperatura y humedad de los sensores. La segunda, llamada VentanaProgramación, que no utilizo, es no visible hasta que se pulse el engranje de configuración dispuesto en la parte superior derecha, desde ahí, se podrá ver una pantalla con nueve dígitos del 1 al 9 los cuales se pueden cambiar por otros número o caracteres y ser guardados, ello me permite configurarlos para poder interactuar con cualquier placa Arduino a la que mandarle ordenes a ejecutar. (esta la utilicé en el proyecto “Coche Bluetooth por Joaquin Berrocal Piris marzo 17”)
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
18
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
19
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
20
Estas otras imágenes pertenecen a la VentanaProgramación no visible y que no utilizo en este proyecto
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
21
IMÁGENES EN LA APK EN MI MÓVIL (los valores correponden a la habitación)
Esta no la uso en el proyecto VentanaProgramación (no visible)
LOS BLOQUES EN AppInventor
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
22
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
23
LOS BLOQUES de AppInventor referidos a la VentanaProgramación que no utilizo en este proyecto, pero que dejo por si deseara interactuar con la Arduino dándole ordenes desde el móvil. Permite modificar hasta nueve caracteres o números y guardarlos. Viene del 1 al 9
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
24
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
25
---------------------------------------------------------------------------------------------------------------------------------------------------EN LAS PRÓXIMAS HOJAS UN COMPENDIO DE INFORMACION UTILIZADA PARA LA REALIZACIÓN DEL PRESENTE PROYECTO ----------------------------------------------------------------------------------------------------------------------------------------------------
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
26
Mucha información: https://programarfacil.com/blog/arduino-blog/ds18b20-sensor-temperatura-arduino/ https://naylampmechatronics.com/blog/46_Tutorial-sensor-de-temperatura-DS18B20.html Tutorial sensor digital de temperatura DS18B20
Tutorial sensor digital de temperatura DS18B20 (casi al final tengo las direcciones de los sensores usados) Posted by Tutoriales 43 Comments
Sensor DS18B20 El DS18B20 es un sensor digital de temperatura que utiliza el protocolo 1-Wire para comunicarse, este protocolo necesita solo un pin de datos para comunicarse y permite conectar más de un sensor en el mismo bus. El sensor DS18B20 es fabricado por Maxim Integrated, el encapsulado de fabrica es tipo TO-92 similar al empleado en transistores pequeños. La presentación comercial más utilizada por conveniencia y robustez es la del sensor dentro de un tubo de acero inoxidable resistente al agua, con el que trabajemos este tutorial.
Con este sensor podemos medir temperatura desde los -55°C hasta los 125°C y con una resolución programable desde 9 bits hasta 12 bits. (por defecto viene a 12 bits) Cada sensor tiene una dirección única de 64bits establecida de fábrica, esta dirección sirve para identificar al dispositivo con el que se está comunicando, puesto que en un bus 1-wire pueden existir más de un dispositivo. El sensor tiene dos métodos de alimentación: Alimentación a través del pin de datos: De esto forma, el sensor internamente obtiene energía del pin de datos cuando este se encuentra en un estado alto y almacena carga en un condensador para cuando la línea de datos esté en una estado bajo, a esta forma de obtener energía se le llama “Parasite Power” y se usa cuando el sensor debe conectarse a grandes distancias o en donde el espacio es limitado, puesto que de esta forma no se necesita la línea de VDD. El diagrama para su conexión debe ser de la siguiente forma:
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
27
Notar que el pin GND y VDD están ambos conectados a GND, esto es indispensable para que se active el Parasite Power. EL MOSFET en la imagen es necesario para cuando se realicen conversiones de temperatura o copiar datos desde la memoria de circuito de la EEPROM, en estas operaciones la corriente de operación aumenta y si solo se suministra energía a través de la resistencia pueden causar caídas de voltaje en el condensador interno. Alimentación usando una fuente externa: De esta forma el sensor se alimenta a través del pin VDD, de esta forma el voltaje es estable e independiente del tráfico del bus 1-wire. El diagrama de conexión es de la siguiente forma:
Esta forma de alimentación es la más recomendada y es la utilizada en este tutorial.
Librerías para el DS18B20 en Arduino Para poder trabajar el DS18B20 en Arduino necesitamos dos librerías: - Librería OneWire, descarga: https://github.com/PaulStoffregen/OneWire En esta librería está implementado todo el protocolo del bus 1-wire. Y puede usarse tanto para el DS18B20 como para otros dispositivos 1-wire, para mayor información sobre la librería: http://www.pjrc.com/teensy/td_libs_OneWire.html -Librería DallasTemperature, descarga: https://github.com/milesburton/Arduino-Temperature-Control-Library En esta librería están implementadas las funciones necesarias para poder realizar las lecturas o configuraciones del DS18B20, para mayor información de la librería revisar: http://www.milesburton.com/Dallas_Temperature_Control_Library Conexiones del DS18B20 con Arduino:
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
28
Notar que es necesario poner una resistencia Pull-Up de 4.7K, y pueden usar un protoboard para facilitar la conexión. Ej.1: Realizando lecturas de temperatura con el DS18B20 Después de instalar las librerías y realizar la conexión anterior podemos realizar las lecturas de temperatura, para eso usamos el siguiente sketch: #include <OneWire.h> #include <DallasTemperature.h>
OneWire ourWire(2);
//Se establece el pin 2 como bus OneWire
DallasTemperature sensors(&ourWire); //Se declara una variable u objeto para nuestro sensor
void setup() { delay(1000); // El tiempo de lectura típico es de 1ms y máximo 1,5 ms Serial.begin(9600); sensors.begin(); //Se inicia el sensor }
void loop() { sensors.requestTemperatures(); //Se envía el comando para leer la temperatura float temp= sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC
Serial.print("Temperatura= "); Serial.print(temp); Serial.println(" C"); “Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
29
delay(100); }
Como se observa medir la temperatura es simple, son necesarias solo dos líneas en el void loop() para realizar esta tarea. El resultado es el siguiente:
Conectando varios sensores de temperatura: Tenemos dos opciones o métodos que podemos usar cuando necesitamos leer más de un sensor de temperatura. El primer método es manejando cada sensor con un pin diferente del Arduino. De esta forma sí tenemos 3 sensores, necesitaremos usar 3 pines digitales del Arduino. Otra forma es usar el mismo pin para todos los sensores, en otras palabras todos los sensores se conectan al mismo bus 1-Wire, y como cualquier bus, cada elemento o dispositivo posee una identificación o dirección. En el caso del DS18B20 necesitamos averiguar su dirección que es única y viene establecida de fábrica.
Ej.2: Usando varios DS18B20 en diferentes pines del Arduino: Para este caso las conexiones son las siguientes:
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
30
Cada sensor trabaja con un pin diferente y necesita su propia resistencia Pull-Up de 4.7K. El código para realizar las lecturas es el siguiente: #include <OneWire.h> #include <DallasTemperature.h>
OneWire ourWire1(2);
//Se establece el pin 2 como bus OneWire
OneWire ourWire2(3);
//Se establece el pin 3 como bus OneWire
DallasTemperature sensors1(&ourWire1); //Se declara una variable u objeto para nuestro sensor1 DallasTemperature sensors2(&ourWire2); //Se declara una variable u objeto para nuestro sensor2
void setup() { delay(1000); Serial.begin(9600); sensors1.begin(); //Se inicia el sensor 1 sensors2.begin(); //Se inicia el sensor 2 }
void loop() { sensors1.requestTemperatures(); //Se envía el comando para leer la temperatura float temp1= sensors1.getTempCByIndex(0); //Se obtiene la temperatura en ºC del sensor 1
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
31
sensors2.requestTemperatures(); //Se envía el comando para leer la temperatura float temp2= sensors2.getTempCByIndex(0); //Se obtiene la temperatura en ºC del sensor 2
Serial.print("Temperatura 1 = "); Serial.print(temp1); Serial.print(" C"); Serial.print(" Temperatura 2 = "); Serial.print(temp2); Serial.println(" C"); delay(100); }
Esta forma de conectar dos o más sensores es fácil de entender e implementar y es útil cuando son pocos sensores o simplemente tenemos pines disponibles para conectar más DS18B20 como en un Arduino Mega. Ej.3: Usando varios DS18B20 con un solo pin del Arduino: (Este es el que utilizo en mi proyecto) En este caso conectamos todos los sensores al mismo bus 1-Wire.
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
32
En caso sea necesario es posible conectar más sensores al mismo pin de datos. La diferencia acá, es que al tratarse de un bus, necesitamos averiguar la dirección de cada sensor para poder identificarlo. El siguiente sketch solo se utiliza para obtener la dirección de los dispositivos conectados en el bus 1-wire: #include <OneWire.h>
OneWire ourWire(2);
//Se establece el pin 2 como bus OneWire
void setup(void) { Serial.begin(9600); } void loop(void) { byte addr[8]; Serial.println("Obteniendo direcciones:"); while (ourWire.search(addr)) { Serial.print("Address = "); for( int i = 0; i < 8; i++) { Serial.print(" 0x"); Serial.print(addr[i], HEX); “Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
33
} Serial.println(); }
Serial.println(); ourWire.reset_search(); delay(2000); }
El código anterior nos sirve para obtener las direcciones de los sensores, en nuestro caso hemos obtenido las direcciones de los tres sensores que tenemos conectados, pero pueden ejecutar el código anterior para cada sensor de forma individual para saber con exactitud la dirección de su sensor. ---------Una vez obtenida la dirección podemos identificar la lectura del sensor que deseemos medir.-------Para realizar las lecturas usamos el siguiente sketch: #include <OneWire.h> #include <DallasTemperature.h>
OneWire ourWire(2);
//Se establece el pin 2 como bus OneWire
DallasTemperature sensors(&ourWire); //Se declara una variable u objeto para nuestro sensor
DeviceAddress address1 = {0x28, 0xFF, 0xCA, 0x4A, 0x5, 0x16, 0x3, 0xBD};//dirección del sensor 1 DeviceAddress address2 = {0x28, 0xFF, 0x89, 0x3A, 0x1, 0x16, 0x4, 0xAF};//dirección del sensor 2 DeviceAddress address3 = {0x28, 0xFF, 0x23, 0x19, 0x1, 0x16, 0x4, 0xD9};//dirección del sensor 3
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
34
void setup() { delay(1000); Serial.begin(9600); sensors.begin(); //Se inicia el sensor }
void loop() {
sensors.requestTemperatures(); //envía el comando para obtener las temperaturas float temp1= sensors.getTempC(address1);//Se obtiene la temperatura en °C del sensor 1 float temp2= sensors.getTempC(address2);//Se obtiene la temperatura en °C del sensor 2 float temp3= sensors.getTempC(address3);//Se obtiene la temperatura en °C del sensor 3
Serial.print("Temperatura 1 = "); Serial.print(temp1); Serial.print(" C"); Serial.print(" Temperatura 2 = "); Serial.print(temp2); Serial.print(" C"); Serial.print(" Temperatura 3 = "); Serial.print(temp3); Serial.println(" C"); delay(100); delay(100); }
Se debe tener en cuenta que se deben reemplazar la direcciones en el sketch con las direcciones correspondientes a los sensores que se tenga disponibles. A continuación, mostramos nuestros resultados:
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
35
Las temperaturas sensadas son similares puesto que los sensores se encontraban en el mismo ambiente: Para cambiar la resolución del sensor a: 9, 10, 11 o 12 bits. solo se debe usar la función: sensors.setResolution(Address, 9); // resolución de 9 bits
Normalmente la resolución se configura en el void setup() después de inicializar los sensores. A menor resolución el tiempo de lectura será menor. Por defecto aparece a 12 bits (Tiempo máx de lectura 750 ms) --------------MUY BUENA INFORMACIÓN https://programarfacil.com/blog/arduino-blog/ds18b20-sensortemperatura-arduino/ ------------------------El consumo por sensor suele ser típica TYP: 1mA y MAX 1.5 mA . Y en Standby: 1000 nA = (0’001 mA)
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
36
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
37
Otras características del sensor de temperatura DS18B20 Además de medir la temperatura, el DS18B20 incorpora una memoria de 64-bit (equivalente a 8 bytes) para almacenar el identificador o dirección única de cada sensor. El primer byte identifica el tipo de componente. Por ejemplo para los DS18B20 es el número 28 en hexadecimal. Esta dirección única es necesaria dentro del bus 1-Wire para identificar cada uno de los sensores de temperatura DS18B20 conectados al bus de comunicación. Gracias a que utiliza este tipo de comunicaciones, se consiguen dos cosas. Por un lado robustez en la transmisión de los datos ya que trabaja con datos digitales, mucho menos sensibles a los efectos adversos del ruido que las señales analógicas. Por otro lado permite conectar muchos sensores de temperatura con un único pin digital. Internamente tiene otro tipo de memoria que sirve para diferentes cosas. Utiliza el sistema de verificación de redundancia cíclica CRC para la detección de errores en los datos. El código CRC se almacena en la memoria. También almacena la temperatura obtenida y dispone de dos alarmas que se disparan si la temperatura es mayor o menor que un umbral de temperatura máxima o temperatura mínima. Con todas estas características, el DS18B20 se convierte en un sensor bastante potente con unas capacidades superiores a otros en el mismo rango de precios. Estamos hablando que el precio de este sensor oscila entre 1€ y 3€, casi despreciable. --------------------------------------Funciones más importantes de la librería DallasTemperature Para terminar este extenso artículo, voy a numerar y explicar las funciones más importantes (a mi entender) de la librería DallasTemperature. Hay muchas más que puedes inspeccionar en el código de la librería en GitHub. Si quieres profundizar en el funcionamiento de GitHub entra aquí. uint8_t getDeviceCount(void) Devuelve el número de dispositivos conectados al bus 1-Wire en un entero sin signo de 8-bit. 1 // Buscamos los sensores conectados 2 Serial.println("Buscando dispositivos..."); 3 Serial.println("Encontrados: "); 4 Serial.print(sensorDS18B20.getDeviceCount()); 5 Serial.println(" sensores");
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
38
bool getAddress(uint8_t*, uint8_t) Obtiene la dirección única de un dispositivo dado un índice en el bus 1-Wire. Devuelve verdadero (true) si se encuentra el dispositivo. 1 // Tipo definido como una array de 8 bytes (uint8_t) 2 DeviceAddress sensorTemperatura; 3 // Obtenemos dirección 4 sensorDS18B20.getAddress(sensorTemperatura, 0); bool isConnected(const uint8_t*) Comprueba si un sensor está conectado al bus 1-Wire dado una dirección única. 1 // Tipo definido como una array de 8 bytes (uint8_t) 2 DeviceAddress sensorTemperatura = {0x28, 0xA8, 0xF8, 0xE7, 0x08, 0x00, 0x00, 0x91}; 3 // Obtenemos dirección 4 if(sensorDS18B20.isConnected(sensorTemperatura)){ 5 // Obtener temperatura 6 float temperatura = sensorDS18B20.getTempC(sensorTemperatura); 7} uint8_t getResolution() Obtiene la resolución global de todos los sensores. Devuelve un valor entero sin signo de 8-bit con la resolución. Recuerda que ésta puede ser de 9-bit, 10-bit, 11-bit o 12-bit. 1 // Obtenemos la resolución global 2 uint8_t resolucionGlobal = sensorDS18B20.getResolution(); void setResolution(uint8_t) Establece la resolución en todos los sensores. Debes establecer la resolución en 9, 10, 11 o 12 bits. 1 // Establecemos la resolución del sensor con índice 0 2 sensorDS18B20.setResolution(10); uint8_t getResolution(const uint8_t*) Obtiene la resolución de un sensor dado su dirección única. Devuelve el valor de la resolución. 1 // Obtenemos la resolución global 2 uint8_t resolucionGlobal = sensorDS18B20.getResolution(sensorCongelador); void requestTemperatures(void) Envía los comandos a los sensores para que hagan la lectura de la temperatura. 1 // Mandamos comandos para toma de temperatura a los sensores 2 Serial.println("Mandando comandos a los sensores");
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
39
3 sensorDS18B20.requestTemperatures(); bool requestTemperaturesByAddress(const uint8_t*) Igual que la función anterior pero este solo envía los comandos para que un solo dispositivo haga la lectura de temperatura dado una dirección única. 1 // Mandamos comandos para toma de temperatura del sensor del congelador 2 Serial.println("Mandando comandos a los sensores"); 3 sensorDS18B20.requestTemperaturesByAddress(sensorCongelador); bool requestTemperaturesByIndex(uint8_t) Igual que los dos anteriores pero dado el índice del sensor de temperatura DS18B20 dentro del bus 1-Wire. 1 // Mandamos comandos para toma de temperatura del sensor 0 2 Serial.println("Mandando comandos a los sensores"); 3 sensorDS18B20.requestTemperaturesByIndex(0); float getTempC(const uint8_t*) Obtiene la temperatura en grados Celsius dada la dirección única del sensor. Devuelve la temperatura en un tipo de dato float. 1 Serial.print("Temperatura sensor congelador: "); 2 float temperaturaCongeladorCelsius = sensorDS18B20.getTempC(sensorCongelador); 3 Serial.print(temperaturaCongeladorCelsius); 4 Serial.println(" C"); float getTempF(const uint8_t*) Obtiene la temperatura en grados Fahrenheit dada la dirección única del sensor. Devuelve la temperatura en un tipo de dato float. 1 Serial.print("Temperatura sensor congelador: "); 2 float temperaturaCongeladorFahrenheit = sensorDS18B20.getTempC(sensorCongelador); 3 Serial.print(temperaturaCongeladorFahrenheit); 4 Serial.println(" F"); float getTempCByIndex(uint8_t) Obtiene la temperatura en grados Celsius dado el índice del sensor dentro del bus 1-Wire. Devuelve la temperatura en un tipo de dato float. 1 Serial.print("Temperatura sensor 0: "); 2 float temperaturaCongeladorCelsius = sensorDS18B20.getTempCByIndex(0); 3 Serial.print(temperaturaCongeladorCelsius ); 4 Serial.println(" C"); float getTempFByIndex(uint8_t) “Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
40
Obtiene la temperatura en grados Fahrenheit dado el índice del sensor dentro del bus 1-Wire. Devuelve la temperatura en un tipo de dato float. 1 Serial.print("Temperatura sensor 0: "); 2 float temperaturaCongeladorFahrenheit = sensorDS18B20.getTempCByIndex(0); 3 Serial.print(temperaturaCongeladorFahrenheit); 4 Serial.println(" F");
--------------------------------------- 0 ---------------------------------------------- Direcciones de MIS SENSORES DS18B20 usados para mi proyecto de temp A-C son los de 3 mtrs--------------El proyecto fue hecho en julio 2022, lo llamo: Control_Temp_Hume_AC_junio_22.ino” Sensor 1: 0x28 0x74 0x63 0x19 0x0 0x0 0x0 0xAE para pegar en Arduino poner las comas: 0x28, 0x74, 0x63, 0x19, 0x0, 0x0, 0x0, 0xAE Sensor 2: 0x28 0x48 0x51 0x19 0x0 0x0 0x0 0x39 para pegar en Arduino poner las comas: 0x28, 0x48, 0x51, 0x19, 0x0, 0x0, 0x0, 0x39 Sensor 3: 0x28 0x59 0x80 0x18 0x0 0x0 0x0 0x49 para pegar en Arduino poner las comas: 0x28, 0x59, 0x80, 0x18, 0x0, 0x0, 0x0, 0x49 Sensor 4: 0x28 0x62 0x35 0x16 0x0 0x0 0x0 0xD4 para pegar en Arduino poner las comas: 0x28, 0x62, 0x35, 0x16, 0x0, 0x0, 0x0, 0xD4 ---- ESTAS SON LAS DE LOS SENSORES DS18B20 CABLE CORTO-----------------(NO LOS USO MÁS QUE PARA ENSAYO)-----------Sensor 1: 0x28, 0xFF, 0xB9, 0x9A, 0xC2, 0x15, 0x1, 0x5F Sensor 2: 0x28, 0xFF, 0x94, 0x37, 0xC2, 0x15, 0x1, 0x7F Sensor 3: 0x28, 0xFF, 0xCE, 0x9A, 0xC2, 0x15, 0x1, 0x63 “Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
41
--------------------------------------- 0 --------------------------------------+ App inventor 2 en español Cómo programar los teléfonos móviles con Android. Bluetooth, Arduino y App inventor 2 - Juan Antonio Villalpando
+ programarfacil.com aquí explica bien la función de convertir números en cadenas en Arduino. Con sprintf /dtostrf --------------------------------------------------------------------------------
“Control_Temp_Hume_AC_junio_22”. En Arduino y AppInventor por Joaquín Berrocal Piris. junio 2022
42