/* Измеритель уровня СО2 с бесконтактным термометром. (C)2020 ООО "ЛИК", http://lic.com.ua */ #include "MHZ19.h" //https://github.com/strange-v/MHZ19 #include #include #include "Adafruit_LEDBackpack.h" #include "Adafruit_GFX.h" #include #define ledPin1 13 //светодиод на плате контроллера #define DISPLAY_ADDRESS 0x70 SoftwareSerial mySerial(10, 11); //Объявляем программный порт на выводах 10(RX), 11(TX) MHZ19 mhz(&mySerial); //Объявляем датчик CO2 MHZ-19B Adafruit_7segment clockDisplay = Adafruit_7segment(); //Объявляем 7-сегметный дисплей HT16K33 Adafruit_MLX90614 mlx = Adafruit_MLX90614(); uint32_t timer_co2 = 0, timer_start = 0, timer_temp = 0; int MHZ_CO2 = 0; float MLX_TO = 0.0; //температура объекта, измеренная датчиком MLX90614 float LiIon = 0.0; //Напряжение на аккумуляторе boolean switchDisplay = false; void setup(){ //Инициализируем программный и аппаратный порты mySerial.begin(9600); Serial.begin(9600); while (!Serial) { } Serial.println("Start programm!"); //Инициализируем 7-сегментный дисплей clockDisplay.begin(DISPLAY_ADDRESS); clockDisplay.clear(); clockDisplay.print(LiIon); clockDisplay.writeDisplay(); clockDisplay.setBrightness(1); //Устанавливаем диапазон <2000ppm для датчика СО2 mhz.setRange(MHZ19_RANGE_2000); mlx.begin(); //Измеряем и отображаем в течение 1с напряжение на аккумуляторах for (int i=0; i<100; i++) { LiIon += 5.0*analogRead(A0)/1024.0; clockDisplay.print(LiIon/i); clockDisplay.writeDisplay(); delay(10); } delay(1000); timer_start = millis(); } void loop() { if ((millis()-timer_temp) > 500) { //Получаем температуру объекта, измеренную бесконтактным термометром MLX_TO = int(mlx.readObjectTempC()*100.0)/100.0; if (((millis()-timer_co2) > 5000)and ((millis()-timer_start)>30000)) { MHZ19_RESULT response = mhz.retrieveData(); if (response == MHZ19_RESULT_OK) { //Получаем уровень углекислого газа в воздухе, CO2 MHZ_CO2 = mhz.getCO2(); Serial.println("CO2="+String(MHZ_CO2)+"ppm"); digitalWrite(ledPin1,(not digitalRead(ledPin1))); switchDisplay = not switchDisplay; } else { Serial.println("MHZ19 EROOR = "+String(response)); } timer_co2 = millis(); } //Периодически отображаем на дисплее содержание СО2 //и температуру, измеренную бесконтактным термометром if (switchDisplay) clockDisplay.print(MHZ_CO2, DEC); else clockDisplay.print(MLX_TO); clockDisplay.writeDisplay(); timer_temp = millis(); } }