Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Air Surfer

Composants et fournitures

Arduino Mega 2560
× 1
Module tft 3,2 pouces pour Mega 2560
× 1
Sonde de température
× 1
Capteur d'humidité et de température Adafruit
× 1
capteur de CO2 mh-z19
× 1
Module RTC
× 1
régulateur de tension réglable
× 1
Prise aviation L89 G12
× 1

Applications et services en ligne

Arduino IDE

À propos de ce projet

En tant qu'ingénieur civil, je sais très bien comment les systèmes de ventilation doivent fonctionner à la maison. Donc, pour mesurer la qualité de l'air dans mon appartement, j'ai acheté un moniteur de CO2 et je l'ai vraiment aimé car il montrait non seulement les niveaux de CO2 mais aussi la température ambiante.

Cependant, cela ne me suffisait pas. Je voulais mesurer plus de paramètres, donc je cherchais un appareil approprié. J'en ai trouvé qui étaient ridiculement chères, alors j'ai décidé de faire les miennes.

À cette époque, j'avais déjà de l'expérience dans la programmation de contrôleurs Arduino pour une station de pompage avec des électrovannes contrôlant différentes branches de canalisation.

J'ai fait un projet sur papier et j'ai commandé les outils et capteurs nécessaires.

Base

Je voulais qu'il ait un écran géant de 10 pouces minimum, mais il me viderait les poches très rapidement. J'ai décidé d'être réaliste et j'ai choisi Arduino Mega 2560 R3 avec un écran tft 3.2 420x380. Cette configuration nécessitait un câblage minimum car l'écran se connecte directement à la carte arduino.

Malheureusement, l'affichage que j'ai commandé chez Aliexpress était si bon marché qu'il ne fonctionnait pas très bien. Il y avait des petits points blancs apparaissant avec le temps et des couleurs inversées. J'ai essayé différentes bibliothèques et différents contrôleurs, mais cela n'a pas aidé. J'ai donc ajusté les couleurs dans le code et ajouté un rafraîchissement d'écran à 12h00 et à 12h00.

Capteurs

La partie la plus chère du projet était le capteur de CO2 mh-z19. Il est relativement bon marché parmi les autres capteurs de CO2 tout en fournissant des mesures fiables et une fonction d'étalonnage automatique.

Et tandis que d'autres modules étaient relativement faciles à installer, ce capteur n'avait pas beaucoup d'informations dans sa fiche technique, j'ai donc cherché un code sur les forums et combiné toutes les informations. En conséquence, maintenant tout fonctionne parfaitement et encore mieux que le capteur précédent.

Cependant, il lui a fallu 24h pour se calibrer, donc au début ses lectures étaient incohérentes. L'étalonnage automatique est simple. Lorsque je quitte mon appartement, il n'y a personne qui consomme de l'oxygène, donc le niveau de CO2 tombe au niveau extérieur, qui est de 400 ppm. Si les lectures sont quelque part en dessous de ces chiffres, le capteur s'étalonne.

Il peut communiquer via UART et PWM. J'ai choisi le premier car je pense qu'il est plus fiable.

Ensuite, j'ai utilisé le capteur de température et d'humidité SI7021 pour la surveillance en intérieur qui utilise le protocole I2C et se connecte aux broches SDA et SCL. Pas cher, haute précision industrielle. Je l'aime parce que je n'ai eu aucun problème avec ça.

Pour les températures extérieures, j'ai utilisé du ds18b20 enfermé dans une capsule en acier inoxydable. Lectures bon marché et précises. Cependant, il nécessite une résistance de 4,7k Ohms, alors ne l'oubliez pas. La communication se fait via 1 fil.

Pour le moment où j'ai acheté le module DS 1307 RTC qui utilisait I2C.

Puis 3 LED pour les niveaux de CO2. Pour 400-800 ppm est la LED verte, pour 800-1200 ppm la LED orange et pour 1200 ppm - et au-dessus est la rouge.

De plus, 3 boutons en acier inoxydable avec LED. Celui de gauche est pour des heures d'ajustement. Celui du milieu est pour les minutes et celui de droite est pour le changement de couleur du texte.

De plus, j'ai câblé une photorésistance pour ajuster la luminosité des LED. Je ne voulais pas qu'ils brillent trop fort la nuit.

Puissance

Pour l'alimentation j'ai percé un trou dans le fond et j'y ai placé un connecteur DC :

Le problème était que je n'avais pas de sources d'alimentation adaptées. Je n'avais que des adaptateurs d'alimentation 19v et 15v alors que la tension recommandée pour Arduino est de 7-12v. Cependant, j'avais un tas de régulateurs de tension réglables DC-DC LM2696.

Je l'ai mis à l'intérieur de la boîte et l'ai ajusté à 7 volts. J'ai découvert que mon Arduino chauffe très vite sous 12 volts, j'ai donc choisi le minimum recommandé. En conséquence, il peut désormais être alimenté par diverses sources d'alimentation.

Pour le capteur de température extérieure, j'ai utilisé des connecteurs d'aviateur et des fils téléphoniques.

Boîte

C'était le problème majeur pour moi car je n'avais pas d'imprimante 3D. J'ai d'abord essayé de le faire en pâte polymère mais il ne tenait pas bien sa forme. De plus, je les ai brûlés dans un four.

La deuxième tentative était avec du contreplaqué de 6 mm. c'était plutôt bien mais c'était difficile à couper. J'ai dû utiliser une scie électrique et un outil dremel.

Le dernier et le plus réussi était à partir de contreplaqué de 3 mm (difficile à trouver) que j'ai pu couper sans équipement électrique et en utilisant uniquement un cutter et du papier de verre. Recouvrez-le de peinture acrylique et, par conséquent, il est beaucoup plus beau.

Coût

  • Arduino Mega 2560 R3 - 8,27$ (480Rub)
  • Afficher TFT 3.2 480x320 - 8$ (400Rub)
  • Module RTC DS1307 - 0,55$ (32Rub)
  • Capteur de CO2 mh-z19 - 20$ (1160Rub)
  • Capteur de température et d'humidité Si7021 - 2 $ (118 Rub)
  • Capteur de température DS18b20 en capsule - 1,14$ (66Rub)
  • Photorésistance - 1$/50pièces (65Rub)
  • LED - 0,67$/100pièces (39Rub)
  • Boutons poussoirs en acier inoxydable - 5,07$/3pcs (294Rub)
  • Prise aviation GX12-3 broches (ensemble) - 1,17$ (68Rub)
  • Connecteur DC 1,25$/10pcs (73Rub)
  • Régulateur de tension réglable DC-DC LM2596 - 0,69 $ (40Rub)
  • Adaptateur secteur 12v - 2,14$ (120Rub)
  • Fils - 1,78 $ (100 Rub)
  • Contreplaqué 3mm - 1,78$ (100Rub)

Total 55,51$ (3155 Rub)

Code

  • Code de surfeur aérien
Code de surfeur aérienArduino
#include #include "RTClib.h"//#include #include #include #include #include  #include #include #define ONE_WIRE_BUS 9#define VERT 5#define YELLOWLED 7#define ROUGE 8#define BUTTONLED 11OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensor(&oneWire); monGLCD(CTE32HR, 38, 39, 40, 41); HTU21D monHumidité;RTC_DS1307 rtc; extern uint8_t Ubuntu[]; octet cmd[9] ={0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79} ; réponse de caractère non signé[9];unsigned int ppm;unsigned long time;int photocellReading;int hourupg;int minupg;float humd;float temp;int tcolor;int Z; //luminosité LEDboolean Reset =false; // pour réinitialiser l'affichage; void lampes(void) { //CO2if (ppm<800){ myGLCD.setColor(255,140,255); //vert monGLCD.fillCircle(450, 87, 12); analogWrite(VERT, Z); analogWrite(JAUNE, 0); analogWrite(ROUGE, 0); } si (ppm>800 &ppm<1200) { myGLCD.setColor(70,70,255); //Jaune monGLCD.fillCircle(450, 87, 12); analogWrite(VERT, 0); analogWrite(JAUNE, Z); analogWrite(REDLED, 0);} if (ppm>1200){ myGLCD.setColor(VGA_AQUA); monGLCD.fillCircle(450, 87, 12); analogWrite(VERT, 0); analogWrite(JAUNE, 0); analogWrite (ROUGE, Z); } //Hum if (humd>30 &humd<50) { myGLCD.setColor(255,140,255); //vert monGLCD.fillCircle(450, 149, 12); } if (humd>20 &humd<30) { myGLCD.setColor(70,70,255); //Jaune monGLCD.fillCircle(450, 149, 12); } if (humd<20) { myGLCD.setColor(70,70,255); //Jaune monGLCD.fillCircle(450, 149, 12); } if (humd>50 &humd<60) { myGLCD.setColor(70,70,255); //Jaune monGLCD.fillCircle(450, 149, 12); } if (humd>60) { myGLCD.setColor(VGA_AQUA); monGLCD.fillCircle(450, 149, 12); } //Temp ins if (temp>
20 &temp<27) { myGLCD.setColor(255,140,255); //vert monGLCD.fillCircle(450, 213, 12); } else {monGLCD.setColor(70,70,255); //JaunemonGLCD.fillCircle(450, 213, 12); } //Tempouts if (sensors.getTempCByIndex(0)<10) {myGLCD.setColor(70,70,255); //YellowmyGLCD.fillCircle(450, 278, 12);} else { myGLCD.setColor(255,140,255); //vert 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); DateHeure maintenant =rtc.now(); // Timeif (maintenant.heure()<10) { monGLCD.print("0", 190, 7);myGLCD.printNumI(maintenant.heure(), 215, 7); } else {myGLCD.printNumI(now.hour(), 190, 7); } monGLCD.print(":", 240, 5); if (maintenant.minute()<10) { monGLCD.print("0", 265, 7);myGLCD.printNumI(maintenant.minute(), 290, 7); } else { monGLCD.printNumI(now.minute(), 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("Humidity", 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);monGLCD.print("+", 300, 200); //tempmyGLCD.printNumF(temp,1, 325, 200);}else{ monGLCD.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{ monGLCD.printNumF(temp,1, 275, 200);}}monGLCD.print("C", 398, 200);myGLCD.print("Temp(out)", 18 , 265);if (sensors.getTempCByIndex(0)<-100) { myGLCD.print("Empty", 300, 265);}else{if (sensors.getTempCByIndex(0)>=0) { if (capteurs. getTempCByIndex(0)<10) {myGLCD.print(" ", 275, 200);myGLCD.print("+", 300, 265);myGLCD.printNumF(sensors.getTempCByIndex(0),1, 325, 265);}else{ monGLCD.print("+", 275, 265);myGLCD.printNumF(sensors.getTempCByIndex(0),1, 300, 265);}}if (sensors.getTempCByIndex(0)<0){ if (sensors.getTempCByIndex(0)>-10) { myGLCD.print(" ", 275, 200);myGLCD.printNumF(sensors.getTempCByIndex(0),1, 300, 265);}else{ myGLCD.printNumF(capteurs .getTempCByIndex(0),1, 275, 265);}}myGLCD.print("C", 398, 265);}} void dateandtime(void) { DateTime now =rtc.now();hourupg=now.hour ();minupg=maintenant.minute(); //ajustement de l'heure 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(réponse, 0, 9); Serial3.readBytes(réponse, 9); int je; octet crc =0 ; pour (i =1 ; i <8 ; i++) crc+=réponse[i] ; crc =255 - crc; crc++; if ( !(réponse[0] ==0xFF &&réponse[1] ==0x86 &&réponse[8] ==crc) ) { } else { unsigned int responseHigh =(unsigned int) réponse[2]; unsigned int responseLow =(unsigned int) réponse[3] ; ppm =(256 * réponse élevée) + réponse faible ; }}void th(void) { humd =myHumidity.readHumidity(); temp =monHumidité.readTemperature(); capteurs.requestTemperatures(); // Envoie la commande pour obtenir les relevés de température}void photosensor(void) { photocellReading =analogRead(12); if (photocellReading <150) { // Serial.println(" - Dark"); analogWrite(BOUTTON, 5); Z=25 ; } else if (photocellReading <300) { // Serial.println(" - Dim"); analogWrite(BOUTON, 50); Z=80 ; } else if (photocellReading <700) { // Serial.println(" - Light"); analogWrite(BOUTON, 100); Z=120 ; } else if (photocellReading <900) { // Serial.println(" - Bright"); analogWrite(BOUTON, 150); Z=150 ; } else { // Serial.println(" - Très lumineux"); analogWrite(BOUTON, 200); Z=200 ; }// Serial.print(photocellReading);}void screenreset(void) { if(((hourupg==0 &&minupg==0) || (hourupg==12 &&minupg==0)) &&Reset==false ) {monGLCD.clrScr();monGLCD.fillScr(VGA_WHITE); //en raison des couleurs inversées sur mon displaymyGLCD.setBackColor(VGA_WHITE); //à cause des couleurs inversées sur mon displayReset=true;}if((hourupg==0 || hourupg==12)&&minupg>0) { Reset=false; }}configuration vide (void) {myGLCD.InitLCD();myGLCD.clrScr();myGLCD.fillScr(VGA_WHITE); //en raison des couleurs inversées sur mon displaymyGLCD.setBackColor(VGA_WHITE); //à cause des couleurs inversées sur mon displaySerial3.begin(9600);//Serial.begin(9600); capteurs.begin(); monHumidité.begin(); tcolor=0;rtc.begin();pinMode(VERT, SORTIE);pinMode(JAUNE, SORTIE);pinMode(ROUGE, SORTIE);pinMode(BUTTONLED, SORTIE);pinMode(2, INPUT_PULLUP);pinMode(3, INPUT_PULLUP );pinMode(4, INPUT_PULLUP);Z=0;}boucle vide(void) {co2(); capteur photo();dateetheure();th(); if (digitalRead(4) ==LOW){ tcolor=tcolor+1; }if (tcolor>=13) tcolor=0; drawmain();lamps();screenreset();}

Schémas


Processus de fabrication

  1. Comment mesurer la qualité de l'air sur OpenSensors
  2. Détecteur de pollution atmosphérique
  3. Hivernage d'un compresseur d'air
  4. Une introduction à l'actionneur de vérin pneumatique
  5. Guide de sélection des meilleurs compresseurs d'air
  6. Comprendre le compresseur dans les moteurs automobiles
  7. Comprendre le système de climatisation automobile
  8. Comprendre le système de suspension pneumatique
  9. Comprendre le système d'injection d'air