Uczniowie klas mechatronicznych i elektrycznych zbudowali mobilny miernik jakości powietrza na bazie platformy Arduino. W ramach projektu wybrali odpowiednie komponenty elektroniczne oraz zaprojektowali połączenie ich w całość: platforma Arduino, laserowy czujnik jakości powietrza, wyświetlacz OLED oraz sygnalizator dźwiękowy informujący o przekroczeniu dopuszczalnych norm zanieczyszczeń. Następnie zaprogramowali układ w środowisku Arduino IDE, implementując odczyt wartości czujnika na wyświetlaczu. Zadbali także o optymalizację kodu pod kątem wydajności oraz energooszczędności. W końcowym etapie przeprowadzili testy działania miernika w różnych warunkach środowiskowych, dokonali kalibracji czujnika oraz wprowadzili poprawki w celu zwiększenia precyzji pomiarów. Zaprogramowali alarm dźwiękowy w postaci brzęczyka i alarm wizualny w postaci napisu „uwaga/Achtung” po przekroczeniu co najmniej jednej z norm jakości powietrza.
Die Schüler der mechatronischen und elektrotechnischen Klassen haben ein mobiles Luftqualitätsmessgerät auf der Basis der Arduino-Plattform gebaut. Im Rahmen des Projekts wählten sie die entsprechenden elektronischen Komponenten aus und entwarfen deren Verbindung: die Arduino-Plattform, einen Laser-Luftqualitätssensor, ein OLED-Display und ein akustisches Signal, das über das Überschreiten der zulässigen Luftverschmutzungsgrenzen informiert. Anschließend programmierten sie das System in der Arduino IDE, implementierten das Auslesen der Sensorwerte auf dem Display und sorgten für eine Optimierung des Codes hinsichtlich Leistung und Energieeffizienz. In der letzten Phase führten sie Tests des Messgeräts unter verschiedenen Umweltbedingungen durch, kalibrierten den Sensor und nahmen Anpassungen vor, um die Messgenauigkeit zu verbessern. Sie programmierten einen akustischen Alarm in Form eines Summer und einen visuellen Alarm in Form der Anzeige „uwaga/Achtung“ nach Überschreiten mindestens eines der Luftqualitätsnormen.
#include "Seeed_HM330X.h"
#include "Arduino_SensorKit.h"
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
#define SERIAL_output SerialUSB
#else
#define SERIAL_OUTPUT Serial
#endif
#define BUZZER 5
HM330X sensor;
u8 buf[30];
const char *str[]={"sensor num: ","PM1.0 concentration(CF=1,Standard particulate matter,unit:ug/m3): ",
"PM2.5 concentration(CF=1,Standard particulate matter,unit:ug/m3): ",
"PM10 concentration(CF=1,Standard particulate matter,unit:ug/m3): ",
"PM1.0 concentration(Atmospheric environment,unit:ug/m3): ",
"PM2.5 concentration(Atmospheric environment,unit:ug/m3): ",
"PM10 concentration(Atmospheric environment,unit:ug/m3): ",
};
HM330XErrorCode print_result(const char* str,u16 value)
{
if(NULL==str)
return ERROR_PARAM;
SERIAL_OUTPUT.print(str);
SERIAL_OUTPUT.println(value);
return NO_ERROR;
}
HM330XErrorCode parse_result(u8 *data)
{
u16 value=0;
if(NULL==data)
return ERROR_PARAM;
for(int i=1;i<8;i++)
{
value = (u16)data[i*2]<<8|data[i*2+1];
print_result(str[i-1],value);
}
return NO_ERROR;
}
HM330XErrorCode parse_result_value(u8 *data)
{
if(NULL==data)
return ERROR_PARAM;
for(int i=0;i<28;i++)
{
SERIAL_OUTPUT.print(data[i],DEC);
SERIAL_OUTPUT.print(" ");
if((0==(i)%5)||(0==i))
{
SERIAL_OUTPUT.println(" ");
}
}
Oled.print("PM1.0: ");
Oled.print(data[5],DEC);
Oled.println("ug/m3");
Oled.print("PM2.5: ");
Oled.print(data[7],DEC);
Oled.println("ug/m3");
Oled.print("PM10: ");
Oled.print(data[9],DEC);
Oled.println("ug/m3");
if(data[5] > 50||data[7] > 25||data[9] > 50 ){
Oled.print("Achtung")
}
else{
Oled.print(" ");
noTone(BUZZER);
}
u8 sum=0;
for(int i=0;i<28;i++)
{
sum+=data[i];
}
if(sum!=data[28])
{
SERIAL_OUTPUT.println("wrong checkSum!!!!");
}
SERIAL_OUTPUT.println(" ");
SERIAL_OUTPUT.println(" ");
return NO_ERROR;
}
void setup()
{
SERIAL_OUTPUT.begin(115200);
delay(100);
SERIAL_OUTPUT.println("Serial start");
if(sensor.init())
{
SERIAL_OUTPUT.println("HM330X init failed!!!");
while(1);
}
Oled.begin();
Oled.setFlipMode(true);
}
void loop()
{
Oled.setFont(u8x8_font_8x13B_1x2_r);
Oled.setCursor(0, 32);
if(sensor.read_sensor_value(buf,29))
{
SERIAL_OUTPUT.println("HM330X read result failed!!!");
}
parse_result_value(buf);
parse_result(buf);
SERIAL_OUTPUT.println(" ");
SERIAL_OUTPUT.println(" ");
SERIAL_OUTPUT.println(" ");
delay(1000);
}