Inhoudsopgave:
- Benodigdheden
- Stap 1: De componenten aansluiten
- Stap 2: Bibliotheek en Arduino-programma
- Stap 3: MIT App Inventor 2-programma
- Stap 4: HET RESULTAAT
Video: Systeem voor het bewaken van de luchtkwaliteit voor fijnstofverontreiniging: 4 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:16
INTRO:
1 In dit project laat ik zien hoe je een deeltjesdetector bouwt met gegevensweergave, gegevensback-up op SD-kaart en IOT. Visueel geeft een neopixels ringdisplay de luchtkwaliteit aan.
2 Luchtkwaliteit is tegenwoordig een steeds belangrijker aandachtspunt. er zijn systemen om de stofsnelheid te meten, maar die zijn erg duur. Er zijn goedkope deeltjesdetectoren van hoge kwaliteit op de markt, zoals blijkt uit sommige onderzoeken.
bijvoorbeeld:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Daarom besloot ik een apparaat te bouwen dat het aantal deeltjes per grootteklasse (0,5 µm tot 10 µm) kan meten, visueel met een eenvoudige weergave van het resultaat (neo pixelring), een meer gedetailleerde weergave op een TFT-scherm en een back-up met tijdstempel op een SD-kaart.
4 Daarnaast heb ik een bluetooth communicatie module toegevoegd om te kunnen communiceren met een android applicatie en zo de resultaten op een IOT server te publiceren.
5 De totale kostprijs van het geheel bedraagt niet meer dan 60 €
Benodigdheden
-Arduino uno R3
-Arduino proto-schild
-TFT-scherm ST7735
-Neopixelring 24 led
-Plantentoren PMS5003
-HC-06 bluetooth-module
Stap 1: De componenten aansluiten
de verschillende componenten zijn aangesloten volgens het bovenstaande schema
Stap 2: Bibliotheek en Arduino-programma
1 de bibliotheek
voor het TFT-scherm
github.com/adafruit/Adafruit-GFX-Library
voor de neo-pixelring
github.com/adafruit/Adafruit_NeoPixel
voor de sd-kaart
github.com/arduino-libraries/SD
2 de arduino-schets
#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #erbij betrekken
// Welke pin op de Arduino is verbonden met de NeoPixels?
#define PIN 6 // Op Trinket of Gemma, stel voor dit te wijzigen in 1
// Hoeveel NeoPixels zijn aangesloten op de Arduino?
#define NUMPIXELS 24 // Populaire NeoPixel ringmaat Adafruit_NeoPixel pixels (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixels. Kleur (0, 250, 0); uint32_t oranje = pixels. Kleur (250, 250, 0); uint32_t rouge = pixels. Kleur (255, 0, 0);
SoftwareSerial pmsSerial(2, 3);
#define cs 10 #define dc 9 #define rst 8 // deze kan je ook aansluiten op de Arduino reset
#include // Core grafische bibliotheek
#include // Hardwarespecifieke bibliotheek #include #include const int cs_sd=4; int-temp; // temps d'acquisition dubbele tempsInit; // initialisatie van de timer au démarrage du loop()
#indien gedefinieerd(_SAM3X8E_)
#undef _FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif
// Optie 1: gebruik alle pinnen, maar een beetje langzamer
//Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// Optie 2: moet de hardware SPI-pinnen gebruiken
// (voor UNO is dat sclk = 13 en sid = 11) en pin 10 moet // een output zijn. Dit is veel sneller - ook vereist als u // de microSD-kaart wilt gebruiken (zie het afbeeldingsvoorbeeld) Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst); float nombre_leds=0; void setup() { Serial.begin(9600); // Initialiseer de liaison I2C Wire.begin(); // Initialiseer de module RTC RTC.begin(); Serial.print("init SD"); vertraging (1000); if(!SD.begin(cs_sd)) //Condition vérifiant si la carte SD est présente dans l'appareil { Serial.print("Defaut SD"); opbrengst; } Serial.print("Carte SD OK");
Bestandsgegevens = SD.open("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println(""); data.println("Démarrage acquisitie"); // Ecrit dans ce ficier data.close(); tft.initR(INITR_GREENTAB); // initialiseer een ST7735S-chip, zwarte tab Serial.println ("init"); // onze foutopsporingsuitvoer tft.fillScreen (ST7735_BLACK); // de baudrate van de sensor is 9600 pmsSerial.begin (9600);
pixels.begin(); // INITIALISEER NeoPixel-stripobject (VERPLICHT)
pixels.setHelderheid(2);
}
struct pms5003data {
uint16_t framelen; uint16_t pm10_standard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t partikels_03um, partikels_05um, partikels_10um, partikels_25um, partikels_50um, partikels_100um; uint16_t ongebruikt; uint16_t controlesom; };
structuur pms5003data-gegevens; void loop() { pixels.clear(); // Zet alle pixelkleuren op 'off' DateTime now=RTC.now(); //Recupère l'heure et le date courante //affiche_date_heure(nu);
temps = ((millis() - tempsInit))/1000; // Démarrage du chrono
if (leesPMSdata (& pmsSerial)) { // tft.fillScreen (ST7735_BLACK); tft.setCursor(10, 5); tft.setTextColor(ST7735_WHITE); tft.println(" aantal onderdelen/0.1 l");
tft.setCursor(10, 17); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize(1); tft.setCursor(10, 17); tft.print("0.3 um ");tft.print(data.particles_03um);tft.print(" ");
tft.setCursor(10, 29);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize(1); tft.print("0.5 um ");tft.print(data.particles_05um);tft.print(" ");
tft.setCursor(10, 41);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize(1); tft.print("1.0 um ");tft.print(data.particles_10um);tft.print(" ");
tft.setCursor(10, 53);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize(1); tft.print("2.5 um ");tft.print(data.particles_25um);tft.print(" ");
tft.setCursor(10, 65);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize(1); tft.print("5.0 um ");tft.print(data.particles_50um);tft.print(" ");
tft.setCursor(10, 77);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize(1); tft.print("10 um ");tft.print(data.particles_100um);tft.print(" ");
tft.setCursor(2, 89);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize(1); tft.print("PM 1.0 ");tft.setTextColor(ST7735_YELLOW, ST7735_BLACK);tft.print(data.pm10_standard);tft.print(" ");tft.setTextColor(ST7735_GREEN, ST7735_BLACK);tft.print(" microgram/m3 ");
tft.setCursor(2, 100); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize(1); tft.print("PM 2.5 ");tft.setTextColor(ST7735_YELLOW, ST7735_BLACK);tft.print(data.pm25_standard);tft.setTextColor(ST7735_GREEN, ST7735_BLACK);tft.print(" microg/m3 ");
tft.setCursor(2, 110);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize(1); tft.print("PM 10 ");tft.setTextColor(ST7735_YELLOW, ST7735_BLACK);tft.print(data.pm100_standard);tft.setTextColor(ST7735_GREEN, ST7735_BLACK);tft.print(" microg/m3 ");
tft.setCursor(10, 5);
tft.setTextColor (ST7735_WHITE, ST7735_BLACK); tft.setTextSize(1); tft.println(" aantal onderdelen/0.1 l");
// Serial.print (tijdelijk);
// Serial.print (" "); Serieafdruk ("#"); Serial.print ("03 µm "); Serial.print(data.particles_03um); Serieafdruk (" "); Serieafdruk ("05 µm "); Serial.print(data.particles_05um); Serieafdruk (" "); Serieafdruk ("1µm "); Serial.print(data.particles_10um); Serieafdruk (" "); Serieafdruk ("25 µm "); Serial.print(data.particles_25um); Serieafdruk (" "); Serieafdruk ("50 µm "); Serial.print(data.particles_50um); Serieafdruk (" "); Serieafdruk ("100 µm "); Serial.print(data.particles_100um); Serieel.println (" "); nombre_leds =int (((float (data.particles_03um)/65535)*24)); //nombre_leds =(8); Serial.println (nombre_leds);
if ((nombre_leds=1)){
pixels.fill(vert, 0, nombre_leds); } else if ((nombre_leds=8)) { pixels.fill(vert, 0, 8); pixels.fill(oranje, 8, ((nombre_leds)-8)); } else if (nombre_leds>16) {
pixels.fill(vert, 0, 8); pixels.fill(oranje, 8, 8); pixels.fill(rouge, 16, ((nombre_leds)-16)); } else if (nombre_leds<=1) { pixels.fill(vert, 0, 1); } pixels.show(); // Stuur de bijgewerkte pixelkleuren naar de hardware.
// Definitie données String PM03=String(data.particles_03um); String PM05=String(data.particles_05um); String PM10=String(data.particles_10um); String PM25=String(data.particles_25um); String PM50=String(data.particles_50um); String PM100=String(data.particles_100um); String PMS10=String(data.pm10_standard); String PMS25=String(data.pm25_standard); String PMS100=String(data.pm100_standard); String Temps=String(temp);
//Ecriture des données dans le fichier texte
Bestandsgegevens=SD.open("donnees.txt", FILE_WRITE); data.println(Temps + " " + PM03+ " " + PM05 +" " +PM10+" " +PM25+" "+PM50+" " +PM100+" "+PMS10+" "+PMS25+" "+PMS100+" "); gegevens.sluiten(); }
}
boolean readPMSdata(Stream *s) {
if (! s->available()) { return false; } // Lees een byte per keer totdat we bij de speciale '0x42' start-byte komen if (s->peek() != 0x42) { s->read(); onwaar retourneren; }
// Lees nu alle 32 bytes
if (s->available() readBytes(buffer, 32);
// maak de checksum klaar
for (uint8_t i=0; i<30; i++) { sum += buffer; }
/* debuggen
for (uint8_t i=2; i<32; i++) { Serial.print("0x"); Serial.print(buffer, HEX); Serieel.print(", "); } Serieel.println(); */ // De gegevens komen in endian'd, dit lost het op zodat het op alle platforms werkt uint16_t buffer_u16[15]; for (uint8_t i=0; i<15; i++) {buffer_u16 = buffer[2 + i*2 + 1]; buffer_u16 += (buffer[2 + i*2] << 8); }
// zet het in een mooie structuur:)
memcpy((void *)&data, (void *)buffer_u16, 30);
if (sum != data.checksum) {
Serial.println ("Checksum-fout"); onwaar retourneren; } // succes! retourneer waar; }
//Converti le numéro de jour en jour /!\ la semaine start un dimanche
String donne_jour_semaine(uint8_t j){ switch(j){ geval 0: retourneer "DIM"; geval 1: retourneer "LUN"; geval 2: retourneer "MAR"; geval 3: retourneer "MER"; geval 4: retourneer "JEU"; geval 5: retourneer "VEN"; geval 6: retourneer "SAM"; standaard: retourneer " "; } }
// affiche la date et l'heure sur l'écran
void affiche_date_heure(DateTime datetime){ // Date String jour = donne_jour_semaine(datetime.dayOfTheWeek()) + " " + Vers2Chiffres(datetime.day())+ "/" + Vers2Chiffres(datetime.month())+ "/" + String (datetime.year(), DEC); // heure String heure = ""; heure = Vers2Chiffres(datetime.hour())+ ":" + Vers2Chiffres(datetime.minute())+ ":" + Vers2Chiffres(datetime.second());
Serial.print(jour); Serieel.print(" "); Serial.print(heure); //Serial.print(" "); Bestandsgegevens=SD.open("donnees.txt", FILE_WRITE); data.print(jour + " " + heure+" "); gegevens.sluiten();
tft.setCursor(2, 120);
tft.setTextColor(ST7735_GREEN); tft.setTextSize(1); tft.print("date ");tft.setTextColor(ST7735_YELLOW);tft.print(jour);tft.setTextColor(ST7735_GREEN);tft.setCursor(2, 130);tft.print("heure");tft. setTextColor(ST7735_YELLOW);tft.print(heure);
vertraging (500);
}
//permet d'afficher les nombres sur deux chiffres
String Vers2Chiffres (byte nombre) { String resultat = ""; if(nombre < 10) resultat = "0"; resultaat resultaat += String (nombre, DEC); }
Stap 3: MIT App Inventor 2-programma
dit is het codeblok van de MIT-app-uitvinder
Stap 4: HET RESULTAAT
hier is de video van het resultaat
Aanbevolen:
Gebruik van microcontrollers om het irrigatiesysteem op afstand te bedienen en te bewaken: 4 stappen
Gebruik van microcontrollers om het irrigatiesysteem op afstand te bedienen en te bewaken: boeren en kassenbouwers voor een goedkoop automatisch irrigatiesysteem. In dit project integreren we een elektronische bodemvochtsensor met een microcontroller om planten automatisch te irrigeren als de bodem te droog is zonder menselijke tussenkomst
AirCitizen - Luchtkwaliteit bewaken - Ajarnpa
AirCitizen - Luchtkwaliteit bewaken: Hallo allemaal! Vandaag zullen we u leren hoe u ons project kunt reproduceren: AirCitizen door het AirCitizenPolytech Team!--Afkomstig van de 'OpenAir / What's your air?' Projects, het AirCitizen-project heeft tot doel burgers in staat te stellen actief de kwaliteit van
Hoe maak je een IoT-apparaat om apparaten te bedienen en het weer te bewaken met behulp van Esp8266: 5 stappen
Hoe maak je een IoT-apparaat om apparaten te bedienen en het weer te bewaken met behulp van Esp8266: Het internet der dingen (IoT) is de inter-netwerking van fysieke apparaten (ook wel "verbonden apparaten" en "slimme apparaten" genoemd), gebouwen, en andere items ingebed met elektronica, software, sensoren, actuatoren en
Instructies voor het voltooien van de mock-up van het ontwerp van de rupsschuif voor het heffen/verlagen van in het midden gemonteerde voetsteunen op elektrische rolstoelen - Ajarnpa
Instructies voor het voltooien van de mock-up van het ontwerp van de rupsschuif voor het omhoog/omlaag brengen van in het midden gemonteerde voetsteunen op elektrische rolstoelen: in het midden gemonteerde voetsteunen kunnen omhoog worden gebracht om onder de zitting goed te worden opgeborgen en omlaag om te worden ingezet. Een mechanisme voor onafhankelijke bediening van het opbergen en plaatsen van de voetsteun is niet inbegrepen in elektrische rolstoelen op de markt, en PWC-gebruikers hebben de behoefte geuit
Hoe u uw pc drastisch kunt versnellen en die snelheid kunt behouden voor de levensduur van het systeem: 9 stappen
Hoe u uw pc drastisch kunt versnellen en die snelheid kunt behouden voor de levensduur van het systeem en om dat zo te houden. Ik zal foto's plaatsen zodra ik de kans krijg, helaas heb ik op dit moment geen