Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Air Surfer

Componentes y suministros

Arduino Mega 2560
× 1
Módulo tft de 3,2 pulgadas para Mega 2560
× 1
Sonda de temperatura
× 1
Sensor de temperatura y humedad Adafruit
× 1
sensor de CO2 mh-z19
× 1
módulo RTC
× 1
regulador de voltaje ajustable
× 1
Enchufe de aviación L89 G12
× 1

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

Como ingeniero civil, soy muy consciente de cómo deberían funcionar los sistemas de ventilación en casa. Entonces, para medir la calidad del aire en mi apartamento, compré un monitor de CO2 y me gustó mucho porque no solo mostraba los niveles de CO2 sino también la temperatura ambiente.

Sin embargo, esto no fue suficiente para mí. Quería medir más parámetros, así que estaba buscando un dispositivo apropiado. Encontré algunos que eran ridículamente caros, así que decidí hacer los míos.

En ese momento ya tenía experiencia en la programación de controladores arduino para una estación de bombeo con válvulas solenoides que controlan diferentes ramales de tuberías.

Hice un proyecto en papel y luego pedí las herramientas y sensores necesarios.

Base

Quería que tuviera una pantalla enorme de 10 pulgadas como mínimo, pero me vaciaría los bolsillos muy rápido. Decidí ser realista y elegí Arduino Mega 2560 R3 con pantalla tft 3.2 420x380. Esta configuración requirió un cableado mínimo porque la pantalla se conecta directamente a la placa arduino.

Desafortunadamente, la pantalla que pedí a Aliexpress era tan barata que no funcionó muy bien. Había pequeños puntos blancos que aparecían con el tiempo y colores invertidos. Probé diferentes bibliotecas y diferentes controladores, pero no ayudó. Así que ajusté los colores en el código y agregué la actualización de la pantalla a las 12.00 p. M. Y a las 12.00 a. M.

Sensores

La parte más cara del proyecto fue el sensor de CO2 mh-z19. Es relativamente barato entre otros sensores de CO2 y, al mismo tiempo, proporciona mediciones fiables y función de calibración automática.

Y aunque otros módulos eran relativamente fáciles de instalar, este sensor no tenía mucha información en su hoja de datos, así que busqué un código en los foros y combiné toda la información. Como resultado, ahora todo funciona perfecto e incluso mejor que el sensor anterior.

Sin embargo, tardó 24 horas en calibrarse, por lo que al principio sus lecturas eran inconsistentes. La calibración automática es simple. Cuando salgo de mi apartamento no hay nadie que consuma oxígeno, por lo que el nivel de CO2 desciende al nivel exterior, que es de 400ppm. Si las lecturas están por debajo de estas cifras, el sensor se calibra.

Puede comunicarse a través de UART y PWM. Elegí el primero porque creo que es más confiable.

Luego utilicé el sensor de temperatura y humedad SI7021 para monitoreo en interiores que usa el protocolo I2C y se conecta a los pines SDA y SCL. No es caro, industrial de alta precisión. Me gusta porque no tuve ningún problema con él.

Para temperaturas exteriores utilicé ds18b20 encerrado en una cápsula de acero inoxidable. Lecturas baratas y precisas. Sin embargo, requiere una resistencia de 4,7k Ohms, así que no lo olvides. La comunicación se realiza a través de 1 cable.

Por el momento, compré el módulo DS 1307 RTC que usaba I2C.

Luego 3 LED para niveles de CO2. Para 400-800ppm es el LED verde, para 800-1200ppm el LED naranja y para 1200ppm - y arriba está el rojo.

Además, 3 botones de acero inoxidable con LED. El de la izquierda es para horas de ajuste. El del medio es para minutos y el de la derecha es para cambiar el color del texto.

Además, conecté un fotorresistor para ajustar el brillo de los LED. No quería que brillaran demasiado por las noches.

Poder

Para la fuente de alimentación, hice un agujero en la parte inferior y coloqué un conector de CC:

El problema era que no tenía ninguna fuente de alimentación adecuada. Solo tenía adaptadores de suministro de 19v y 15v, mientras que el voltaje recomendado para Arduino es de 7-12v. Sin embargo, tenía un montón de reguladores de voltaje ajustables DC-DC LM2696.

Lo puse dentro de la caja y lo ajusté a 7 voltios. Descubrí que mi Arduino se calienta muy rápidamente por debajo de los 12 voltios, así que elegí el mínimo recomendado. Como resultado, ahora se puede suministrar desde varias fuentes de energía.

Para el sensor de temperatura exterior utilicé conectores de aviador y cables telefónicos.

Caja

Este fue el mayor problema para mí porque no tenía una impresora 3D. Traté de hacerlo con arcilla polimérica al principio, pero no mantuvo bien su forma. Además, los quemé en un horno.

El segundo intento fue con madera contrachapada de 6 mm. en su mayor parte estaba bien, pero era difícil de cortar. Tuve que usar una sierra eléctrica y una herramienta dremel.

El final y el más exitoso fue de madera contrachapada de 3 mm (que era difícil de encontrar) que pude cortar sin equipo eléctrico y usé solo un cuchillo cúter y un poco de papel de lija. Lo cubrí con pintura acrílica y, como resultado, se ve mucho mejor.

Costo

  • Arduino Mega 2560 R3 - 8,27 $ (480Rub)
  • Pantalla TFT 3.2 480x320 - 8 $ (400Rub)
  • Módulo RTC DS1307 - 0,55 $ (32Rub)
  • Sensor de CO2 mh-z19 - 20 $ (1160Rub)
  • Sensor de temperatura y humedad Si7021 - 2 $ (118Rub)
  • Sensor de temperatura DS18b20 en cápsula - 1,14 $ (66Rub)
  • Fotorresistor - 1 $ / 50 piezas (65Rub)
  • LED - 0,67 $ / 100 piezas (39Rub)
  • Botones pulsadores de acero inoxidable - 5,07 $ / 3 piezas (294Rub)
  • Enchufe de aviación GX12-3 pines (juego) - 1,17 $ (68Rub)
  • Conector de CC 1,25 $ / 10 piezas (73Rub)
  • Regulador de voltaje ajustable DC-DC LM2596 - 0,69 $ (40Rub)
  • Adaptador de corriente 12v - 2,14 $ (120Rub)
  • Cables:1,78 $ (100Rub)
  • Madera contrachapada de 3 mm - 1,78 $ (100Rub)

Total 55,51 $ (3155 Rub)

Código

  • Código de surfista aéreo
Código de Air Surfer Arduino
 #include  #include "RTClib.h" // #include  #include  #include  #include  #include  #include  #include  #define ONE_WIRE_BUS 9 # define GREENLED 5 # define YELLOWLED 7 # define REDLED 8 # define BUTTONLED 11OneWire oneWire (ONE_WIRE_BUS); DallasTemperatire) sensores (&oneWIRE_BUS); myGLCD (CTE32HR, 38, 39, 40, 41); HTU21D myHumidity; RTC_DS1307 rtc; extern uint8_t Ubuntu []; byte cmd [9] ={0xFF, 0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; unsigned char respuesta [9]; unsigned int ppm; unsigned long time; int photocellReading; int hourupg; int minupg; float humd; float temp; int tcolor; int Z; // LED brillo booleano Reset =falso; // para restablecer la pantalla; lámparas de vacío (void) {// CO2if (ppm <800) {myGLCD.setColor (255,140,255); // verde myGLCD.fillCircle (450, 87, 12); analogWrite (VERDE, Z); analogWrite (AMARILLO, 0); analogWrite (REDLED, 0); } si (ppm> 800 &ppm <1200) {myGLCD.setColor (70,70,255); // Amarillo myGLCD.fillCircle (450, 87, 12); analogWrite (VERDE, 0); analogWrite (AMARILLO, Z); analogWrite (REDLED, 0);} si (ppm> 1200) {myGLCD.setColor (VGA_AQUA); myGLCD.fillCircle (450, 87, 12); analogWrite (VERDE, 0); analogWrite (AMARILLO, 0); analogWrite (REDLED, Z); } // Hum if (humd> 30 &humd <50) {myGLCD.setColor (255,140,255); // verde myGLCD.fillCircle (450, 149, 12); } if (humd> 20 &humd <30) {myGLCD.setColor (70,70,255); // Amarillo myGLCD.fillCircle (450, 149, 12); } if (humd <20) {myGLCD.setColor (70,70,255); // Amarillo myGLCD.fillCircle (450, 149, 12); } if (humd> 50 &humd <60) {myGLCD.setColor (70,70,255); // Amarillo myGLCD.fillCircle (450, 149, 12); } si (humd> 60) {myGLCD.setColor (VGA_AQUA); myGLCD.fillCircle (450, 149, 12); } // Temp ins if (temp>
 20 &temp <27) {myGLCD.setColor (255,140,255); // verde myGLCD.fillCircle (450, 213, 12); } else {myGLCD.setColor (70,70,255); //YellowmyGLCD.fillCircle(450, 213, 12); } // Tempouts if (sensores.getTempCByIndex (0) <10) {myGLCD.setColor (70,70,255); //YellowmyGLCD.fillCircle(450, 278, 12);} else {myGLCD.setColor (255,140,255); // green myGLCD.fillCircle (450, 278, 12);}} void drawmain (void) {myGLCD.setFont (Ubuntu); if (tcolor ==0) myGLCD.setColor (VGA_BLACK); if (tcolor ==1) myGLCD.setColor (VGA_SILVER); if (tcolor ==2) myGLCD.setColor (250,10,250); if (tcolor ==3) myGLCD.setColor (200,100,200); if (tcolor ==4) myGLCD.setColor (100,200,200); if (tcolor ==5) myGLCD.setColor (10,200,200); if (tcolor ==6) myGLCD.setColor (200,200,100); if (tcolor ==7) myGLCD.setColor (250,250,10); if (tcolor ==8) myGLCD.setColor (10,10,250); if (tcolor ==9) myGLCD.setColor (10,250,10); if (tcolor ==10) myGLCD.setColor (250,10,10); if (tcolor ==11) myGLCD.setColor (VGA_TEAL); if (tcolor ==12) myGLCD.setColor (VGA_AQUA); DateTime ahora =rtc.now (); // Timeif (ahora.hora () <10) {myGLCD.print ("0", 190, 7); myGLCD.printNumI (ahora.hora (), 215, 7); } else {myGLCD.printNumI (ahora.hora (), 190, 7); } myGLCD.print (":", 240, 5); if (ahora.minuto () <10) {myGLCD.print ("0", 265, 7); myGLCD.printNumI (ahora.minuto (), 290, 7); } else {myGLCD.printNumI (ahora.minuto (), 265, 7); } // myGLCD.setColor (VGA_BLACK); myGLCD.print ("CO2", 18, 74); if (ppm> 999) {myGLCD.printNumI (ppm, 250, 74);} else {myGLCD.print ("", 250, 74); myGLCD.printNumI (ppm, 275, 74);} myGLCD.print (" ppm ", 348, 74); myGLCD.print (" Humedad ", 18, 136); myGLCD.printNumI (humd, 343, 136); //humdmyGLCD.print("% ", 398, 136); myGLCD.print (" Temp (in) ", 18, 200); if (temp>
 =0) {if (temp <10) {myGLCD.print ( "", 275, 200); myGLCD.print ("+", 300, 200); //tempmyGLCD.printNumF(temp,1, 325, 200);} else {myGLCD.print ("+", 275, 200); //tempmyGLCD.printNumF(temp,1, 300, 200);}} if (temp <0) {if (temp>
 -10) {myGLCD.print ("", 275, 200); myGLCD.printNumF (temp, 1, 300, 200);} else {myGLCD.printNumF (temp, 1, 275, 200);}} myGLCD.print ("C", 398, 200); myGLCD.print ("Temp (out)", 18 , 265); if (sensores.getTempCByIndex (0) <- 100) {myGLCD.print ("Vacío", 300, 265);} else {if (sensores.getTempCByIndex (0)> =0) {if (sensores. getTempCByIndex (0) <10) {myGLCD.print ("", 275, 200); myGLCD.print ("+", 300, 265); myGLCD.printNumF (sensores.getTempCByIndex (0), 1, 325, 265);} else {myGLCD.print ("+", 275, 265); myGLCD.printNumF (sensores.getTempCByIndex (0), 1, 300, 265);}} si (sensores.getTempCByIndex (0) <0) {si (sensores.getTempCByIndex (0)> - 10) {myGLCD.print ("", 275, 200); myGLCD.printNumF (sensores.getTempCByIndex (0), 1, 300, 265);} else {myGLCD.printNumF (sensores .getTempCByIndex (0), 1, 275, 265);}} myGLCD.print ("C", 398, 265);}} void dateandtime (void) {DateTime now =rtc.now (); hourupg =now.hour (); minupg =ahora.minuto (); // ajuste de tiempo if (digitalRead (3) ==LOW) {if (minupg ==59) {minupg =0; } else {minupg =minupg + 1; } rtc.adjust (DateTime (0,0,0, hourupg, minupg, 0)); } if (digitalRead (2) ==LOW) {if (hourupg ==23) {hourupg =0; } else {hourupg =hourupg + 1; } rtc.adjust (DateTime (0,0,0, hourupg, minupg, 0)); }} void co2 (void) {Serial3.write (cmd, 9); memset (respuesta, 0, 9); Serial3.readBytes (respuesta, 9); int i; byte crc =0; para (i =1; i <8; i ++) crc + =respuesta [i]; crc =255 - crc; crc ++; if (! (response [0] ==0xFF &&response [1] ==0x86 &&response [8] ==crc)) {} else {unsigned int responseHigh =(unsigned int) response [2]; unsigned int responseLow =(unsigned int) respuesta [3]; ppm =(256 * respuesta alta) + respuesta baja; }} void th (void) {humd =myHumidity.readHumidity (); temp =myHumidity.readTemperature (); sensores.requestTemperaturas (); // Envía el comando para obtener lecturas de temperatura} void photosensor (void) {photocellReading =analogRead (12); if (photocellReading <150) {// Serial.println ("- Oscuro"); analogWrite (BOTONES, 5); Z =25; } else if (photocellReading <300) {// Serial.println ("- Dim"); analogWrite (BOTONES, 50); Z =80; } else if (photocellReading <700) {// Serial.println ("- Light"); analogWrite (BOTONES, 100); Z =120; } else if (photocellReading <900) {// Serial.println ("- Brillante"); analogWrite (BOTONES, 150); Z =150; } else {// Serial.println ("- Muy brillante"); analogWrite (BOTONES, 200); Z =200; } // Serial.print (photocellReading);} void screenreset (void) {if (((hourupg ==0 &&minupg ==0) || (hourupg ==12 &&minupg ==0)) &&Reset ==false ) {myGLCD.clrScr (); myGLCD.fillScr (VGA_WHITE); // debido a colores invertidos en mi displaymyGLCD.setBackColor (VGA_WHITE); // debido a colores invertidos en mi displayReset =true;} if ((hourupg ==0 || hourupg ==12) &&minupg> 0) {Reset =false; }} configuración vacía (void) {myGLCD.InitLCD (); myGLCD.clrScr (); myGLCD.fillScr (VGA_WHITE); // debido a colores invertidos en mi displaymyGLCD.setBackColor (VGA_WHITE); // debido a colores invertidos en mi displaySerial3.begin (9600); // Serial.begin (9600); sensores.begin (); myHumidity.begin (); tcolor =0; rtc.begin (); pinMode (VERDE, SALIDA); pinMode (AMARILLO, SALIDA); pinMode (ROJO, SALIDA); pinMode (BOTONES, SALIDA); pinMode (2, INPUT_PULLUP); pinMode (3, INPUT_PULLUP) ); pinMode (4, INPUT_PULLUP); Z =0;} bucle vacío (vacío) {co2 (); fotosensor (); fecha y hora (); th (); if (digitalRead (4) ==BAJO) {tcolor =tcolor + 1; } if (tcolor> =13) tcolor =0; drawmain (); lámparas (); screenreset ();} 

Esquemas


Proceso de manufactura

  1. Cómo medir la calidad del aire en OpenSensors
  2. Detector de contaminación del aire
  3. Preparación para el invierno de un compresor de aire
  4. Una introducción al actuador de cilindro de aire
  5. Guía de selección de los mejores compresores de aire
  6. Comprender el supercargador en motores de automóviles
  7. Comprender el sistema de aire acondicionado del automóvil
  8. Comprender el sistema de suspensión neumática
  9. Comprender el sistema de inyección de aire
  10. Aire =Dinero
  11. ¿Dónde está el aire comprimido?