Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Air Surfer

Componenten en benodigdheden

Arduino Mega 2560
× 1
3.2 inch tft-module voor Mega 2560
× 1
Temperatuursonde
× 1
Adafruit-vochtigheids- en temperatuursensor
× 1
mh-z19 CO2-sensor
× 1
RTC-module
× 1
instelbare spanningsregelaar
× 1
Luchtvaartstekker L89 G12
× 1

Apps en online services

Arduino IDE

Over dit project

Als civiel ingenieur weet ik heel goed hoe ventilatiesystemen thuis moeten werken. Dus om de kwaliteit van de lucht in mijn appartement te meten, kocht ik een CO2-monitor en ik vond hem erg leuk omdat hij niet alleen CO2-niveaus maar ook kamertemperatuur liet zien.

Dit was echter niet genoeg voor mij. Ik wilde meer parameters meten, dus ik was op zoek naar een geschikt apparaat. Ik vond er een paar die belachelijk duur waren, dus besloot ik er zelf een te maken.

Op dat moment had ik al ervaring met het programmeren van arduino-controllers voor een pompstation met magneetventielen die verschillende pijpleidingvertakkingen aansturen.

Ik maakte een project op papier en bestelde vervolgens de benodigde gereedschappen en sensoren.

Basis

Ik wilde dat het een enorm scherm van minimaal 10 inch zou hebben, maar het zou mijn zakken heel snel leegmaken. Ik besloot realistisch te zijn en koos voor Arduino Mega 2560 R3 met tft 3.2 420x380-display. Deze opstelling vereiste minimale bedrading omdat het scherm rechtstreeks op het Arduino-bord wordt aangesloten.

Helaas was het display dat ik bij Aliexpress bestelde zo goedkoop dat het niet erg goed werkte. Er verschenen witte kleine stippen met de tijd en omgekeerde kleuren. Ik heb verschillende bibliotheken en verschillende controllers geprobeerd, maar het hielp niet. Dus ik heb kleuren in de code aangepast en schermverversing toegevoegd om 12.00 uur en 12.00 uur.

Sensoren

Het duurste onderdeel van het project was de mh-z19 CO2-sensor. Het is relatief goedkoop tussen andere CO2-sensoren en biedt betrouwbare metingen en een automatische kalibratiefunctie.

En hoewel andere modules relatief eenvoudig te installeren waren, had deze sensor niet veel informatie op zijn datasheet, dus ik zocht op forums naar een code en combineerde alle informatie. Hierdoor werkt alles nu perfect en zelfs beter dan de vorige sensor.

Het duurde echter 24 uur voordat het zichzelf had gekalibreerd, dus in het begin waren de metingen inconsistent. Automatische kalibratie is eenvoudig. Als ik mijn appartement verlaat, is er niemand die zuurstof verbruikt, dus het CO2-niveau zakt naar het buitenniveau, dat is 400ppm. Als de meetwaarden ergens onder deze cijfers liggen, wordt de sensor gekalibreerd.

Het kan communiceren via UART en PWM. Ik heb voor de eerste gekozen omdat ik die betrouwbaarder vind.

Daarna gebruikte ik de SI7021 temperatuur- en vochtigheidssensor voor binnenbewaking die het I2C-protocol gebruikt en verbinding maakt met SDA- en SCL-pinnen. Niet duur, industriële hoge precisie. Ik vind het leuk omdat ik er helemaal geen problemen mee had.

Voor buitentemperaturen gebruikte ik ds18b20 ingesloten in een roestvrijstalen capsule. Goedkope en nauwkeurige metingen. Het vereist echter een weerstand van 4,7k Ohm, dus vergeet het niet. Communicatie is via 1-draads.

Voor de tijd dat ik een DS 1307 RTC-module kocht die I2C gebruikte.

Dan 3 LED's voor CO2-niveaus. Voor 400-800ppm is de groene LED, voor 800-1200ppm de oranje LED en voor 1200ppm - en daarboven is de rode.

Plus, 3 roestvrijstalen knoppen met LED's. De linker is voor uren aanpassen. De middelste is voor minuten en de rechter is voor het wijzigen van de tekstkleur.

Bovendien heb ik een fotoresistor aangesloten om de helderheid van de LED's aan te passen. Ik wilde niet dat ze 's nachts te fel zouden schijnen.

Vermogen

Voor de voeding heb ik een gat in de bodem geboord en daar een DC-connector geplaatst:

Het probleem was dat ik geen geschikte voedingsbronnen had. Ik had alleen 19v en 15v voedingsadapters, terwijl de aanbevolen spanning voor Arduino 7-12v is. Ik had echter een stel LM2696 DC-DC instelbare spanningsregelaars.

Ik stopte het in de doos en stelde het af op 7 volt. Ik kwam erachter dat mijn Arduino erg snel opwarmt onder de 12 volt, dus ik koos het aanbevolen minimum. Als gevolg hiervan kan het nu worden gevoed door verschillende stroombronnen.

Voor de buitentemperatuursensor heb ik vliegerconnectoren en telefoondraden gebruikt.

Doos

Dit was het grootste probleem voor mij omdat ik geen 3D-printer had. Ik probeerde het eerst van polymeerklei te maken, maar het hield zijn vorm niet goed vast. Bovendien heb ik ze in een oven verbrand.

De tweede poging was met 6 mm multiplex. het was meestal prima, maar het was moeilijk te snijden. Ik moest een elektrische zaag en een dremelgereedschap gebruiken.

De laatste en de meest succesvolle was van 3 mm multiplex (wat moeilijk te vinden was) dat ik zonder elektrische apparatuur kon snijden en alleen een stanleymes en wat schuurpapier gebruikte. Bedekt met acrylverf en daardoor ziet het er veel beter uit.

Kosten

  • Arduino Mega 2560 R3 - 8,27$ (480Rub)
  • Toon TFT 3.2 480x320 - 8$ (400Rub)
  • RTC DS1307-module - 0,55$ (32Rub)
  • CO2 mh-z19-sensor - $ 20 (1160 roebel)
  • Temperatuur- en vochtigheidssensor Si7021 - 2$(118Rub)
  • Temperatuursensor DS18b20 in capsule - 1,14$ (66Rub)
  • Fotoresistor - 1$/50pieces (65Rub)
  • LED's - 0,67$/100pieces (39Rub)
  • Roestvrijstalen drukknoppen - 5,07$/3st (294Rub)
  • GX12-3-pins luchtvaartstekker (set) - 1,17$ (68Rub)
  • DC-connector 1,25$/10st (73Rub)
  • LM2596 DC-DC instelbare spanningsregelaar - 0,69$ (40Rub)
  • Voedingsadapter 12v - 2,14$ (120Rub)
  • Draden - 1,78$ (100Rub)
  • Multiplex 3mm - 1,78$ (100Rub)

Totaal 55,51$ (3155 roebel)

Code

  • Air surfer-code
Air surfer-codeArduino
#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);DallasTemperature sensoren(UT&oneWire);FT mijnGLCD(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 response[9];unsigned int ppm;unsigned long time;int photocellReading;int hourupg;int minupg;float humd;float temp;int tcolor;int Z; //LED helderheidboolean Reset =false; // voor het resetten van het display; lege lampen (void) {//CO2if (ppm<800){ myGLCD.setColor (255,140,255); //groene myGLCD.fillCircle (450, 87, 12); analoogWrite(GROENLED, Z); analoogWrite(GEEL, 0); analoogWrite(REDLED, 0); } if (ppm>800 &ppm<1200) { myGLCD.setColor(70,70,255); //Gele myGLCD.fillCircle (450, 87, 12); analoogWrite(GROENLED, 0); analogWrite (GEEL, Z); analogWrite(REDLED, 0);} if (ppm>1200){ myGLCD.setColor(VGA_AQUA); mijnGLCD.fillCircle(450, 87, 12); analoogWrite(GROENLED, 0); analoogWrite(GEEL, 0); analoogWrite(REDLED, Z); } //Hum if (humd>30 &humd<50) { myGLCD.setColor (255,140,255); //groene myGLCD.fillCircle (450, 149, 12); } if (humd>20 &humd<30) { myGLCD.setColor(70,70,255); //Gele myGLCD.fillCircle (450, 149, 12); } if (humd<20) { myGLCD.setColor(70,70,255); //Gele myGLCD.fillCircle (450, 149, 12); } if (humd>50 &humd<60) { myGLCD.setColor(70,70,255); //Gele myGLCD.fillCircle (450, 149, 12); } if (humd>60) { myGLCD.setColor(VGA_AQUA); mijnGLCD.fillCircle(450, 149, 12); } // Temp ins if (temp>
20 &temp<27) { myGLCD.setColor(255,140,255); //groene myGLCD.fillCircle (450, 213, 12); } else {myGLCD.setColor(70,70,255); //YellowmyGLCD.fillCircle (450, 213, 12); } //Tempouts als (sensors.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 nu =rtc.now(); // Timeif (now.hour()<10) { myGLCD.print("0", 190, 7);myGLCD.printNumI(now.hour(), 215, 7); } else {myGLCD.printNumI(now.hour(), 190, 7); } mijnGLCD.print(":", 240, 5); if (now.minute()<10) { myGLCD.print("0", 265, 7);myGLCD.printNumI(now.minute(), 290, 7); } else { myGLCD.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("Vochtigheid", 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);mijnGLCD.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 (sensors.getTempCByIndex(0)<-100) { myGLCD.print("Empty", 300, 265);}else{if (sensors.getTempCByIndex(0)>=0) { if (sensors. getTempCByIndex(0)<10) {myGLCD.print(" ", 275, 200);myGLCD.print("+", 300, 265);myGLCD.printNumF(sensors.getTempCByIndex(0),1, 325, 265);}else{ myGLCD.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(sensoren .getTempCByIndex(0),1, 275, 265);}}myGLCD.print("C", 398, 265);}} void dateandtime(void) { DateTime now =rtc.now();hourupg=now.hour ();minupg=nu.minuut(); // tijdaanpassing if (digitalRead (3) ==LAAG) {if (minupg==59) {minupg=0; } else { minupg=minupg+1; } rtc.adjust(DateTime(0,0,0,hourupg,minupg,0)); } if (digitalRead(2) ==LAAG) {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(antwoord, 0, 9); Serial3.readBytes(antwoord, 9); int ik; byte-crc =0; voor (i =1; i <8; i++) crc+=antwoord[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) response [3]; ppm =(256*responsHoog) + responsLaag; }} void th (void) { humd =myHumidity.readHumidity(); temp =myHumidity.readTemperature(); sensoren.requestTemperatures(); // Stuur de opdracht om temperatuurmetingen te krijgen} void photosensor (void) { photocellReading =analogRead (12); if (photocellReading <150) { // Serial.println ("- Dark"); analogWrite(BUTTONLED, 5); Z=25; } else if (photocellReading <300) { // Serial.println ("- Dim"); analoogWrite(BUTTONLED, 50); Z=80; } else if (photocellReading <700) { // Serial.println ("- Light"); analogWrite (TOETSEN, 100); Z=120; } else if (photocellReading <900) { // Serial.println ("- Bright"); analoogWrite(KNOPPEN, 150); Z=150; } else { // Serial.println(" - Zeer helder"); analoogWrite(BUTTONLED, 200); Z=200; }// Serial.print(photocellReading);}void screenreset(void) { if(((hourupg==0 &&minupg==0) || (hourupg==12 &&minupg==0)) &&Reset==false ) {mijnGLCD.clrScr();mijnGLCD.fillScr(VGA_WHITE); // vanwege omgekeerde kleuren op mijn displaymyGLCD.setBackColor (VGA_WHITE); // vanwege omgekeerde kleuren op mijn displayReset=true;}if((hourupg==0 || hourupg==12)&&minupg>0) { Reset=false; }} ongeldige setup(void) {myGLCD.InitLCD();myGLCD.clrScr();myGLCD.fillScr(VGA_WHITE); // vanwege omgekeerde kleuren op mijn displaymyGLCD.setBackColor (VGA_WHITE); // vanwege omgekeerde kleuren op mijn displaySerial3.begin (9600);//Serial.begin (9600); sensoren.begin(); mijnVochtigheid.begin(); tcolor=0;rtc.begin();pinMode(GROENLED, UITGANG);pinMode(GEEL, UITGANG);pinMode(REDLED, UITGANG);pinMode(BUTTONLED, UITGANG);pinMode(2, INPUT_PULLUP);pinMode(3, INPUT_PULLUP );pinMode(4, INPUT_PULLUP);Z=0;}void loop(void) {co2(); fotosensor();datum en tijd();th(); if (digitalRead(4) ==LAAG){ tcolor=tcolor+1; }if (tkleur>=13) tkleur=0; drawmain();lampen();screenreset();}

Schema's


Productieproces

  1. Hoe de luchtkwaliteit op OpenSensors te meten
  2. Luchtverontreinigingsdetector
  3. Een luchtcompressor winterklaar maken
  4. Een inleiding tot luchtcilinderactuator:
  5. Top luchtcompressoren selectiegids
  6. Supercharger in automotoren begrijpen
  7. Inzicht in auto-airconditioningsysteem
  8. Luchtveersysteem begrijpen
  9. Luchtinjectiesysteem begrijpen
  10. Lucht =geld
  11. Perslucht is waar?!