Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Air Surfer

Компоненты и расходные материалы

Arduino Mega 2560
× 1
3,2-дюймовый модуль tft для Mega 2560
× 1
Температурный датчик
× 1
Датчик влажности и температуры Adafruit
× 1
датчик CO2 mh-z19
× 1
модуль RTC
× 1
регулируемый регулятор напряжения
× 1
Авиационная пробка L89 G12
× 1

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Как инженер-строитель я прекрасно понимаю, как должны работать системы вентиляции дома. Поэтому, чтобы измерить качество воздуха в моей квартире, я купил датчик CO2, и он мне очень понравился, потому что он показывает не только уровень CO2, но и комнатную температуру.

Однако мне этого было мало. Я хотел измерить больше параметров, поэтому искал подходящий прибор. Я нашел такие, которые были смехотворно дорогими, и решил сделать свои собственные.

В то время у меня уже был опыт программирования контроллеров Arduino для насосной станции с соленоидными клапанами, управляющими различными ветвями трубопровода.

Я сделал проект на бумаге и заказал необходимые инструменты и датчики.

База

Я хотел, чтобы у него был огромный экран с диагональю не менее 10 дюймов, но он очень быстро опустошал мои карманы. Я решил быть реалистом и выбрал Arduino Mega 2560 R3 с дисплеем tft 3.2 420x380. Эта установка требовала минимального количества проводов, потому что дисплей подключается прямо к плате Arduino.

К сожалению, дисплей, который я заказал на Aliexpress, был настолько дешевым, что работал не очень хорошо. Появились белые маленькие точки со временем и инвертированные цвета. Я пробовал разные библиотеки и разные контроллеры, но это не помогло. Поэтому я скорректировал цвета в коде и добавил обновление экрана в 12.00 и 12.00.

Датчики

Самой дорогой частью проекта был датчик CO2 mh-z19. Он относительно дешев по сравнению с другими датчиками CO2, но обеспечивает надежные измерения и функцию автоматической калибровки.

И хотя другие модули было относительно легко установить, этот датчик не содержал много информации в его техническом описании, поэтому я поискал код на форумах и объединил всю информацию. В результате теперь все работает идеально и даже лучше, чем у предыдущего сенсора.

Однако для калибровки потребовалось 24 часа, поэтому сначала его показания были несовместимыми. Автокалибровка проста. Когда я выхожу из квартиры, там нет никого, кто потребляет кислород, поэтому уровень CO2 падает до внешнего уровня, который составляет 400 частей на миллион. Если показания ниже этих цифр, датчик калибруется.

Он может общаться через UART и PWM. Я выбрал первый, потому что считаю его более надежным.

Затем я использовал датчик температуры и влажности SI7021 для мониторинга в помещении, который использует протокол I2C и подключается к контактам SDA и SCL. Не дорого, промышленная высокая точность. Мне он нравится, потому что у меня с ним вообще не было проблем.

Для измерения наружных температур я использовал ds18b20, заключенный в капсулу из нержавеющей стали. Дешевые и точные показания. Однако для этого требуется резистор 4,7 кОм, так что не забывайте об этом. Связь осуществляется по 1-проводу.

На тот момент я купил модуль RTC DS 1307, который использовал I2C.

Затем 3 светодиода для уровней CO2. Для 400-800ppm - зеленый светодиод, для 800-1200ppm - оранжевый светодиод, а для 1200ppm - и выше - красный.

Плюс 3 кнопки из нержавеющей стали со светодиодами. Левый часами настраивается. Средний - для минут, а правый - для изменения цвета текста.

Дополнительно я подключил фоторезистор для регулировки яркости светодиодов. Я не хотел, чтобы они сияли по ночам слишком ярко.

Мощность

Для питания я просверлил отверстие внизу и поместил туда разъем постоянного тока:

Проблема заключалась в том, что у меня не было подходящих источников питания. У меня были только адаптеры питания на 19 В и 15 В, в то время как рекомендуемое напряжение для Arduino составляет 7-12 В. Однако у меня была куча регулируемых регуляторов напряжения LM2696 DC-DC.

Я положил его внутрь коробки и отрегулировал на 7 вольт. Я обнаружил, что моя Arduino очень быстро нагревается до 12 вольт, поэтому я выбрал рекомендуемый минимум. В результате теперь он может питаться от различных источников питания.

В качестве датчика наружной температуры я использовал разъемы «авиатор» и телефонные провода.

Коробка

Для меня это было главной проблемой, потому что у меня не было 3D-принтера. Сначала я пытался сделать его из полимерной глины, но форма плохо держалась. Плюс в духовке сжег.

Вторая попытка была с фанерой толщиной 6 мм. в основном это было хорошо, но резать было трудно. Пришлось использовать электрическую пилу и дремель.

Последний и самый удачный был из фанеры толщиной 3 мм (которую было трудно найти), которую я мог резать без электрического оборудования и использовал только нож для резки бумаги и немного наждачной бумаги. Покрыл его акриловой краской, и в результате он выглядит намного лучше.

Стоимость

  • Arduino Mega 2560 R3 - 8,27 $ (480 руб.)
  • Дисплей TFT 3.2 480x320 - 8 $ (400 руб.)
  • Модуль RTC DS1307 - 0,55 $ (32руб.)
  • Датчик CO2 mh-z19 - 20 $ (1160 руб.)
  • Датчик температуры и влажности Si7021 - 2 $ (118руб.)
  • Датчик температуры DS18b20 в капсуле - 1,14 $ (66руб.)
  • Фоторезистор - 1 $ / 50 штук (65руб.)
  • Светодиоды - 0,67 $ / 100 штук (39руб.)
  • Кнопки из нержавеющей стали - 5,07 $ / 3 шт. (294 руб.)
  • Штекер авиационный GX12-3 (комплект) - 1,17 $ (68руб.)
  • Разъем постоянного тока 1,25 $ / 10шт (73руб.)
  • Регулируемый стабилизатор напряжения DC-DC LM2596 - 0,69 $ (40руб.)
  • Адаптер питания 12В - 2,14 $ (120руб.)
  • Провода - 1,78 $ (100руб.)
  • Фанера 3 мм - 1,78 $ (100 руб.)

Итого 55,51 $ (3155 руб.)

Код

  • Код воздушного серфера
Код воздушного серфера Arduino
 #include  #include "RTClib.h" // # include  #include  #include  #include  #include  #include  #include  #define ONE_WIRE_BUS 9 # define ЗЕЛЕНЫЙ 5 #define ЖЕЛТЫЙ 7 # define КРАСНЫЙ 8 # define BUTTONLED 11OneWire oneWire (ONE_WIRE_BUS); датчики температуры U myGLCD (CTE32HR, 38, 39, 40, 41); HTU21D myHumidity; RTC_DS1307 rtc; extern uint8_t Ubuntu []; байт cmd [9] ={0xFF, 0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; unsigned char response [9]; unsigned int ppm; беззнаковое долгое время; int photocellReading; int hourupg; int minupg; float humd; float temp; int tcolor; int Z; // яркость светодиода булевский Reset =false; // для сброса дисплея; пустые лампы (void) {// CO2if (ppm <800) {myGLCD.setColor (255,140,255); // зеленый myGLCD.fillCircle (450, 87, 12); analogWrite (ЗЕЛЕНЫЙ, Z); analogWrite (ЖЕЛТЫЙ, 0); analogWrite (КРАСНЫЙ, 0); } если (частей на миллион> 800 и частей на миллион <1200) {myGLCD.setColor (70,70,255); // Желтый myGLCD.fillCircle (450, 87, 12); analogWrite (ЗЕЛЕНЫЙ, 0); analogWrite (ЖЕЛТЫЙ, Z); analogWrite (REDLED, 0);} если (ppm> 1200) {myGLCD.setColor (VGA_AQUA); myGLCD.fillCircle (450, 87, 12); analogWrite (ЗЕЛЕНЫЙ, 0); analogWrite (ЖЕЛТЫЙ, 0); analogWrite (КРАСНЫЙ, Z); } // Гудеть if (humd> 30 &humd <50) {myGLCD.setColor (255,140,255); // зеленый myGLCD.fillCircle (450, 149, 12); } if (humd> 20 &humd <30) {myGLCD.setColor (70,70,255); // Желтый myGLCD.fillCircle (450, 149, 12); } если (humd <20) {myGLCD.setColor (70,70,255); // Желтый myGLCD.fillCircle (450, 149, 12); } if (humd> 50 &humd <60) {myGLCD.setColor (70,70,255); // Желтый myGLCD.fillCircle (450, 149, 12); } если (humd> 60) {myGLCD.setColor (VGA_AQUA); myGLCD.fillCircle (450, 149, 12); } // Временные параметры if (temp>
 20 &temp <27) {myGLCD.setColor (255,140,255); // зеленый myGLCD.fillCircle (450, 213, 12); } еще {myGLCD.setColor (70,70,255); //YellowmyGLCD.fillCircle(450, 213, 12); } // Временные выходы if (sensor.getTempCByIndex (0) <10) {myGLCD.setColor (70,70,255); //YellowmyGLCD.fillCircle(450, 278, 12);} else {myGLCD.setColor (255,140,255); // зеленый 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); если (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); } еще {myGLCD.printNumI (now.hour (), 190, 7); } myGLCD.print (":", 240, 5); если (now.minute () <10) {myGLCD.print ("0", 265, 7); myGLCD.printNumI (now.minute (), 290, 7); } еще {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 (" Влажность ", 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 (сенсоры.getTempCByIndex (0) <- 100) {myGLCD.print ("Пусто", 300, 265);} else {if (сенсоры.getTempCByIndex (0)> =0) {if (сенсоры. getTempCByIndex (0) <10) {myGLCD.print ("", 275, 200); myGLCD.print ("+", 300, 265); myGLCD.printNumF (sensor.getTempCByIndex (0), 1, 325, 265);} else {myGLCD.print ("+", 275, 265); myGLCD.printNumF (sensor.getTempCByIndex (0), 1, 300, 265);}} if (sensor.getTempCByIndex (0) <0) {if (сенсоры.getTempCByIndex (0)> - 10) {myGLCD.print ("", 275, 200); myGLCD.printNumF (сенсоры.getTempCByIndex (0), 1, 300, 265);} else {myGLCD.printNumF (сенсоры .getTempCByIndex (0), 1, 275, 265);}} myGLCD.print ("C", 398, 265);}} void dateandtime (void) {DateTime now =rtc.now (); hourupg =now.hour (); minupg =now.minute (); // корректировка времени if (digitalRead (3) ==LOW) {if (minupg ==59) {minupg =0; } еще {minupg =minupg + 1; } rtc.adjust (DateTime (0,0,0, hourupg, minupg, 0)); } если (digitalRead (2) ==LOW) {если (hourupg ==23) {hourupg =0; } еще {hourupg =hourupg + 1; } rtc.adjust (DateTime (0,0,0, hourupg, minupg, 0)); }} void co2 (void) {Serial3.write (cmd, 9); memset (ответ, 0, 9); Serial3.readBytes (ответ, 9); int i; байт crc =0; для (я =1; я <8; я ++) crc + =ответ [я]; 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) ответ [3]; ppm =(256 * responseHigh) + responseLow; }} void th (void) {humd =myHumidity.readHumidity (); temp =myHumidity.readTemperature (); sensor.requestTemperatures (); // Отправляем команду на получение показаний температуры} void photosensor (void) {photocellReading =analogRead (12); if (photocellReading <150) {// Serial.println ("- Темный"); analogWrite (КНОПКА, 5); Z =25; } else if (photocellReading <300) {// Serial.println ("- Dim"); analogWrite (КНОПКА, 50); Z =80; } else if (photocellReading <700) {// Serial.println ("- Свет"); analogWrite (КНОПКА, 100); Z =120; } else if (photocellReading <900) {// Serial.println ("- Яркий"); analogWrite (КНОПКА, 150); Z =150; } else {// Serial.println ("- Очень яркий"); analogWrite (КНОПКА, 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); // из-за инвертированных цветов на моем дисплееmyGLCD.setBackColor (VGA_WHITE); // из-за инвертированных цветов на моем дисплееReset =true;} if ((hourupg ==0 || hourupg ==12) &&minupg> 0) {Reset =false; }} установка void (void) {myGLCD.InitLCD (); myGLCD.clrScr (); myGLCD.fillScr (VGA_WHITE); // из-за инвертированных цветов на моем дисплееmyGLCD.setBackColor (VGA_WHITE); // из-за инвертированных цветов на моем displaySerial3.begin (9600); // Serial.begin (9600); sensor.begin (); myHumidity.begin (); tcolor =0; rtc.begin (); pinMode (ЗЕЛЕНЫЙ, ВЫХОД); pinMode (ЖЕЛТЫЙ, ВЫХОД); pinMode (КРАСНЫЙ, ВЫХОД); pinMode (BUTTONLED, OUTPUT); pinMode (2, INPUT_PULL_PULLUP); pinMode (3, INPUT_PULLUP); ); pinMode (4, INPUT_PULLUP); Z =0;} void loop (void) {co2 (); фотосенсор (); dateandtime (); th (); если (digitalRead (4) ==LOW) {tcolor =tcolor + 1; } if (tcolor> =13) tcolor =0; drawmain (); лампы (); screenreset ();} 

Схема


Производственный процесс

  1. Как измерить качество воздуха на OpenSensors
  2. Детектор загрязнения воздуха
  3. Подготовка воздушного компрессора к зиме
  4. Введение в привод воздушного цилиндра
  5. Руководство по выбору лучших воздушных компрессоров
  6. Понимание нагнетателя в автомобильных двигателях
  7. Разбираемся с системой кондиционирования автомобиля
  8. Понимание системы пневматической подвески
  9. Понимание системы впрыска воздуха
  10. Воздух =Деньги