Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Air Surfer

Componentes e suprimentos

Arduino Mega 2560
× 1
Módulo tft de 3,2 polegadas para Mega 2560
× 1
Sonda de temperatura
× 1
Sensor de umidade e temperatura Adafruit
× 1
sensor de CO2 mh-z19
× 1
Módulo RTC
× 1
regulador de tensão ajustável
× 1
Plugue de aviação L89 G12
× 1

Aplicativos e serviços online

Arduino IDE

Sobre este projeto


Como engenheiro civil, estou muito ciente de como os sistemas de ventilação devem funcionar em casa. Então, para medir a qualidade do ar em meu apartamento, comprei um monitor de CO2 e gostei muito, pois não só mostrava os níveis de CO2, mas também a temperatura ambiente.

No entanto, isso não foi suficiente para mim. Eu queria medir mais parâmetros, então estava procurando um dispositivo apropriado. Encontrei alguns que eram ridiculamente caros, então decidi fazer o meu próprio.

Naquela época, eu já tinha experiência em programar controladores arduino para uma estação de bombeamento com válvulas solenóides controlando diferentes ramais de dutos.

Fiz um projeto em papel e depois encomendei as ferramentas e sensores necessários.





Base


Eu queria que ele tivesse uma tela enorme de 10 polegadas, no mínimo, mas esvaziaria meus bolsos muito rápido. Decidi ser realista e escolhi o Arduino Mega 2560 R3 com tela tft 3.2 420x380. Essa configuração exigia fiação mínima porque o monitor se conecta diretamente à placa arduino.

Infelizmente, o display que encomendei da Aliexpress era tão barato que não funcionou muito bem. Havia pequenos pontos brancos aparecendo com o tempo e cores invertidas. Tentei diferentes bibliotecas e diferentes controladores, mas não ajudou. Então eu ajustei as cores no código e adicionei a atualização da tela às 12h00 e 12h00.





Sensores


A parte mais cara do projeto foi o sensor de CO2 mh-z19. É relativamente barato entre outros sensores de CO2, enquanto fornece medições confiáveis ​​e função de calibração automática.

E embora outros módulos fossem relativamente fáceis de instalar, este sensor não tinha muitas informações em sua folha de dados, então procurei nos fóruns por um código e combinei todas as informações. Como resultado, agora tudo funciona perfeito e ainda melhor do que o sensor anterior.

Porém, demorou 24h para se calibrar, então a princípio suas leituras foram inconsistentes. A calibração automática é simples. Quando eu saio do meu apartamento não há ninguém que consome oxigênio, então o nível de CO2 cai para o nível externo, que é 400 ppm. Se as leituras estiverem em algum lugar abaixo dessas figuras, o sensor será calibrado.

Ele pode se comunicar via UART e PWM. Escolhi o primeiro porque acho mais confiável.

Em seguida, usei o sensor de temperatura e umidade SI7021 para monitoramento interno que usa o protocolo I2C e se conecta aos pinos SDA e SCL. Não é caro, de alta precisão industrial. Eu gosto porque não tive nenhum problema com isso.



Para temperaturas externas, usei ds18b20 fechado em uma cápsula de aço inoxidável. Leituras baratas e precisas. No entanto, ele requer um resistor de 4,7 k Ohms, então apenas não se esqueça dele. A comunicação é via 1 fio.



Na época, comprei o módulo DS 1307 RTC que usava I2C.



Em seguida, 3 LEDs para os níveis de CO2. Para 400-800ppm é o LED verde, para 800-1200ppm o LED laranja e para 1200ppm - e acima é o vermelho.

Além disso, 3 botões de aço inoxidável com LEDs. O da esquerda é para horas de ajuste. O do meio é para minutos e o certo é para a mudança da cor do texto.

Além disso, conectei um fotorresistor para ajustar o brilho dos LEDs. Eu não queria que eles brilhassem muito à noite.






Poder


Para fonte de alimentação, fiz um furo na parte inferior e coloquei um conector DC:

O problema era que eu não tinha nenhuma fonte de alimentação adequada. Eu tinha apenas adaptadores de fonte de 19 V e 15 V, enquanto a voltagem recomendada para o Arduino é de 7 a 12 V. No entanto, eu tinha um monte de reguladores de tensão ajustáveis ​​LM2696 DC-DC.

Coloquei dentro da caixa e ajustei para 7 volts. Descobri que meu Arduino está esquentando muito rapidamente abaixo de 12 volts, então escolhi o mínimo recomendado. Como resultado, agora ele pode ser fornecido por várias fontes de energia.

Para sensor de temperatura externa usei conectores aviador e fios de telefone.





Caixa


Esse era o principal problema para mim, porque eu não tinha uma impressora 3D. Eu tentei fazer de argila de polímero no começo, mas não manteve seu formato bem. Além disso, queimei alguns no forno.

A segunda tentativa foi com compensado de 6 mm. estava quase tudo bem, mas era difícil de cortar. Tive de usar uma serra elétrica e uma ferramenta dremel.

A última e mais bem-sucedida foi de compensado de 3mm (difícil de encontrar) que consegui cortar sem equipamento elétrico e usei apenas uma faca e um pouco de lixa. Cobriu com tinta acrílica e, como resultado, ficou muito melhor.





Custo

  • Arduino Mega 2560 R3 - 8,27 $ (480Rub)
  • Display TFT 3.2 480x320 - 8 $ (400Rub)
  • Módulo RTC DS1307 - 0,55 $ (32Rub)
  • Sensor CO2 mh-z19 - 20 $ (1160Rub)
  • Sensor de temperatura e umidade Si7021 - 2 $ (118Rub)
  • Sensor de temperatura DS18b20 na cápsula - 1,14 $ (66Rub)
  • Fotorresistor - 1 $ / 50 peças (65Rub)
  • LEDs - 0,67 $ / 100 peças (39Rub)
  • Botões de aço inoxidável - 5,07 $ / 3pcs (294Rub)
  • plugue de aviação GX12-3 pinos (conjunto) - 1,17 $ (68Rub)
  • Conector DC 1,25 $ / 10pcs (73Rub)
  • Regulador de tensão ajustável LM2596 DC-DC - 0,69 $ (40Rub)
  • Adaptador de alimentação 12v - 2,14 $ (120Rub)
  • fios - 1,78 $ (100 rub)
  • Contraplacado de 3 mm - 1,78 $ (100Rub)

Total 55,51 $ (3155 Rub)

Código

  • Código do surfista do ar
Código do 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 11 OneWire oneWire (ONE_WIRE_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}; resposta não assinada char [9]; não assinada int ppm; tempo longo não assinado; int fotocélulaLeitura; int horaupg; int minupg; float humd; float temp; int tcolor; int Z; // LED brilhoboolean Reset =false; // para redefinir a exibição; lâmpadas void (void) {// CO2if (ppm <800) {myGLCD.setColor (255,140,255); // verde myGLCD.fillCircle (450, 87, 12); analogWrite (GREENLED, Z); analogWrite (AMARELO, 0); analogWrite (REDLED, 0); } if (ppm> 800 &ppm <1200) {myGLCD.setColor (70,70,255); // Yellow myGLCD.fillCircle (450, 87, 12); analogWrite (GREENLED, 0); analogWrite (AMARELO, Z); analogWrite (REDLED, 0);} if (ppm> 1200) {myGLCD.setColor (VGA_AQUA); myGLCD.fillCircle (450, 87, 12); analogWrite (GREENLED, 0); analogWrite (AMARELO, 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); // Yellow myGLCD.fillCircle (450, 149, 12); } if (humd <20) {myGLCD.setColor (70,70,255); // Yellow myGLCD.fillCircle (450, 149, 12); } if (humd> 50 &humd <60) {myGLCD.setColor (70,70,255); // Yellow myGLCD.fillCircle (450, 149, 12); } if (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); // verde 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 now =rtc.now (); // Timeif (now.hour () <10) {myGLCD.print ("0", 190, 7); myGLCD.printNumI (now.hour (), 215, 7); } else {myGLCD.printNumI (now.hour (), 190, 7); } myGLCD.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 (" Umidade ", 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 ("Vazio", 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);}} if (sensores.getTempCByIndex (0) <0) {se (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 =agora.minuto (); // ajuste de tempo 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)); }} co2 vazio (vazio) {Serial3.write (cmd, 9); memset (resposta, 0, 9); Serial3.readBytes (resposta, 9); int i; byte crc =0; para (i =1; i <8; i ++) crc + =resposta [i]; crc =255 - crc; crc ++; if (! (resposta [0] ==0xFF &&resposta [1] ==0x86 &&resposta [8] ==crc)) {} else {unsigned int responseHigh =(unsigned int) response [2]; resposta int não assinadaLow =(int não assinada) resposta [3]; ppm =(256 * resposta alta) + respostaBaixa; }} void th (void) {humd =myHumidity.readHumidity (); temp =myHumidity.readTemperature (); sensores.requestTemperatures (); // Envie o comando para obter leituras de temperatura} void photosensor (void) {photocellReading =analogRead (12); if (photocellReading <150) {// Serial.println ("- Escuro"); analogWrite (BUTTONLED, 5); Z =25; } else if (photocellReading <300) {// Serial.println ("- Dim"); analogWrite (BUTTONLED, 50); Z =80; } else if (photocellReading <700) {// Serial.println ("- Light"); analogWrite (BUTTONLED, 100); Z =120; } else if (photocellReading <900) {// Serial.println ("- Bright"); analogWrite (BUTTONLED, 150); Z =150; } else {// Serial.println ("- Muito brilhante"); analogWrite (BUTTONLED, 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); // devido às cores invertidas em meu displaymyGLCD.setBackColor (VGA_WHITE); // devido às cores invertidas em meu displayReset =true;} if ((hourupg ==0 || hourupg ==12) &&minupg> 0) {Reset =false; }} configuração vazia (vazia) {myGLCD.InitLCD (); myGLCD.clrScr (); myGLCD.fillScr (VGA_WHITE); // devido às cores invertidas em meu displaymyGLCD.setBackColor (VGA_WHITE); // devido às cores invertidas em meu displaySerial3.begin (9600); // Serial.begin (9600); sensores.begin (); myHumidity.begin (); tcolor =0; rtc.begin (); pinMode (GREENLED, OUTPUT); pinMode (YELLOWLED, OUTPUT); pinMode (REDLED, OUTPUT); pinMode (BUTTONLED, OUTPUT); pinMode (2, INPUT_PULLUP); pinMode (3UP, INPUT_PULLUP); pinMode (3UP, INPUT_PULLUP); ); pinMode (4, INPUT_PULLUP); Z =0;} loop vazio (vazio) {co2 (); fotossensor (); data e hora (); th (); if (digitalRead (4) ==LOW) {tcolor =tcolor + 1; } if (tcolor> =13) tcolor =0; drawmain (); lâmpadas (); screenreset ();} 

Esquemas


Processo de manufatura

  1. Como medir a qualidade do ar em OpenSensors
  2. Detector de poluição do ar
  3. Invernando um compressor de ar
  4. Uma introdução ao atuador de cilindro de ar
  5. Guia de seleção dos principais compressores de ar
  6. Entendendo o Supercharger em Motores de Automóveis
  7. Entendendo o sistema de ar condicionado automotivo
  8. Entendendo o sistema de suspensão a ar
  9. Entendendo o sistema de injeção de ar
  10. Ar =Dinheiro