Inhoudsopgave:
- Benodigdheden
- Stap 1: Uw RPi. instellen
- Stap 2: MCP3008 + TMP36
- Stap 3: Database
- Stap 4: HNT11, voor de echte jongens
- Stap 5: Gassensoren (alleen legendes)
- Stap 6: Het schuifregister, 74HC595AG
- Stap 7: Frontend, een waardevolle les
- Stap 8: De backend
- Stap 9: de zaak maken
- Stap 10: Evaluatie en conclusie
Video: CPC-klasse vervuilingscontrole - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:15
Hallo daar, ik ben een student uit België en dit is mijn eerste grote project voor mijn bachelor! Deze Instructable gaat over het maken van een luchtvervuilingsmeter voor gesloten ruimtes, vooral klaslokalen!
Ik hoor je denken waarom dit project? Het begon allemaal toen ik naar de middelbare school ging. 's Middags na een goede lunch en een pauze beginnen de lessen weer. Maar er is een probleem, de lerares vergat het raam open te zetten terwijl we aan het lunchen waren, dus het is heet, bezweet en je kunt je niet concentreren omdat je in slaap valt. Dat komt omdat er te veel CO2 in de lucht zit.
Mijn project zal dit oplossen en alle studenten meer geconcentreerd maken tijdens hun lessen.
Benodigdheden
1 x Raspberry Pi 4 (€55)
1 x stappenmotor met driver (€5)
2 x 12v 6800 mAh batterijen (2x €20)
2 x stepdown-module (2x €5)
1x 16x2 LCD (€1,5)
Sensoren: 1x MQ8, 1x MQ4, 1x MQ7, 1x MQ135, 1x HNT11, 1x TMP36 (1 x €23)
IC's: 1x MCP3008, 2x 74hc595AG (1x €2,30, 2x €0,40)
LED's: 2x groen, 2x rood, 3x geel (te vinden in sommige oude hardware, normaal € 0,01 per stuk)
Aansluiting voor de batterijen (2 x € 0,35)
40 f-naar-f connectorkabels (€ 1,80)
40 f-naar-m connectorkabels (€ 1,80)
20 m-naar-m aansluitkabels (€ 1,80)
2 x PCB om op te solderen (2x € 0,70)
Gereedschap:
Soldeerbout (bij voorkeur 60 Watt)
Tin om te solderen
Aluminium plaat 50x 20
Behuizing (ik gebruikte een oude mini computerkast)
Dit kan gemakkelijk wat MDF zijn of eigen ideeën.
Stap 1: Uw RPi. instellen
Dus ons hart, ons brein en onze ziel zit in dit product. Bedreig het goed, want het kan je op de een of andere manier pijn doen. Ik gebruik een RPi 4B 4GB, andere modellen zouden het prima moeten doen. Op oudere modellen mag je wat meer lag verwachten.
We hebben het besturingssysteem van onze school gekregen met vooraf geïnstalleerde software zoals phpMyAdmin.
Zorg er allereerst voor dat je via ssh verbinding kunt maken met je Raspberry Pi, we hebben hem lang nodig.
Dus eerst moeten we de SPI-bus, GPIO-pinnen inschakelen en andere bussen uitschakelen, die hebben we niet nodig.
U kunt dit doen in het menu raspi-config. Navigeer naar Interfaces en schakel GPIO en SPI in, normaal gesproken is het niet nodig om uw opslagruimte uit te breiden door naar geavanceerd te gaan en vervolgens op Enter te drukken om opslagruimte uit te breiden.
Nu opnieuw opstarten. We hebben enkele extensies nodig om VS Code op onze pi te gebruiken, om onze server en database te laten draaien.
Het installatieproces voor de VS Code Extension vindt u hier.
Nu gaan we de extensies voor onze server en database installeren. Gebruik de terminal en typ 'python install flask, flask-cors, mysql-python-connector, eventlet' wacht tot het klaar is.
Nu kunnen we beginnen met het maken van het project.
Stap 2: MCP3008 + TMP36
We hebben dus 6 sensoren: 4 gas, 1 vochtigheid + temperatuur en 1 temperatuursensor. Het is een hele klus om ze allemaal aan het werk te krijgen. Alle sensoren zijn analoge sensoren, dus we moeten het analoge signaal omzetten naar een digitaal signaal. Dat komt omdat de RPi (Rasberry Pi) alleen digitale signalen kan "begrijpen". Voor meer info klik hier.
Om die taak te voltooien heb je een MCP3008 nodig, dit zal het werk geweldig doen!
Het heeft 16 poorten, geteld vanaf de bovenkant (de kleine bubbel) naar links, naar beneden, naar de andere kant en naar boven. Pin1-8 zijn de ingangen voor het analoge signaal van onze sensoren. Pin 9 aan de andere kant is een GND deze moet worden aangesloten op de GND van de hele schakeling anders werkt dit niet. Pin 10-13 moet zorgvuldiger worden aangesloten, deze zullen gegevens van en naar de RPi verzenden. Pin 14 is een andere GND en pinnen 15 en 16 zijn de VCC's deze moeten worden aangesloten op de positieve kant van het circuit.
Dit is de lay-out voor de bedrading:
- MCP3008 VDD naar externe 3.3V MCP3008 VREF naar externe 3.3V
- MCP3008 AGND naar externe GND
- MCP3008 DGND naar externGND
- MCP3008 CLK naar Raspberry Pi pin 18
- MCP3008 DOUT naar Raspberry Pi pin 23
- MCP3008 DIN naar Raspberry Pi pin 24
- MCP3008 CS/SHDN naar Raspberry Pi pin 25
Dit is ook een goed moment om de GND van de RPI aan te sluiten op de externe GND. Hierdoor zal elektriciteit uit de RPi stromen.
Hier leest u hoe u het op de juiste manier aansluit.
Zorg ervoor dat je op de juiste manier aansluit, anders kun je alles kortsluiten!
Het eerste stukje code komt hier op zijn plaats.
U kunt mijn code kopiëren van mijn project github onder models. Analog_Digital.
Onderaan de pagina vind je de broncode om het te laten werken.
Maar we hebben onze eerste sensor nodig, zodat we kunnen testen.
We moeten onze sensor testen of hij werkt. Sluit een 3.3V of 5V voeding aan op de positieve kant van de TMP36. Vergeet niet om het ook op de GND aan te sluiten, dit is misschien iets stoms om te gebeuren, maar geloof me. Dat is de realiteit;). Je kunt met je multimeter de uitgang van de sensor testen dit is de middelste pin. Met deze eenvoudige vergelijking kun je de temperatuur in °C controleren. ((milivolts*ingangsspanning)-500)/10 en voila donne! Doei! Nou nee hahah we hebben de MCP3008 nodig. Sluit de analoge pin voor je TMP36 aan op de eerste inputpin van de MCP3008. Dit is pin 0.
U kunt de voorbeeldcode onderaan gebruiken voor deze MCP-klasse. Of iets dat u online zult vinden, zal het werk prima doen.
Stap 3: Database
Dus nu we onze eerste sensor kunnen inlezen, moeten we deze in een database loggen. Dit is het geheugen van onze hersenen. Ik heb deze database zo ontworpen dat deze uitbreidbaar en gemakkelijk aanpasbaar is voor toekomstige wijzigingen.
Dus eerst moeten we bedenken wat we als invoer zullen krijgen en of we specifieke dingen moeten loggen, zoals statussen van bepaalde objecten.
Mijn antwoord zou zijn: input van 6 sensoren dus we moeten een sensortabel maken, met deze sensoren gaan we waarden maken. Wat is gekoppeld aan een waarde? Voor mij is het de status van het raam, is het open of is het gesloten terwijl de sensor de waarde meet. Maar de locatie is ook een factor voor mijn waarde, dus daar zullen we aan toevoegen. De tijd en datum voor een waarde zijn ook belangrijk, dus ik zal dat toevoegen.
Voor toekomstige uitbreiding heb ik een gebruikerstabel toegevoegd.
Dus wat is mijn idee van tabellen: tafelwaarden, tafeladres (gekoppeld aan kamer), tafelkamer (gekoppeld aan waarde), tafelvenster (gekoppeld aan waarde), tafelsensor (gekoppeld aan waarde) en een tafel in het wild voor gebruikers.
Wat betreft het aan elkaar koppelen van de tabellen. Elke waarde heeft één sensor nodig, één venster, een waarde voor de sensor, een id zodat we de waarde uniek kunnen maken, een tijdstempel voor wanneer de waarde is gemaakt en als laatste hebben we geen kamer nodig, dus dat is optioneel, maar kan worden toegevoegd.
Dus zo ziet het er nu uit. Dit is wat ik gebruik voor de rest van mijn project.
Stap 4: HNT11, voor de echte jongens
Dus omdat we geen enkele vorm van bibliotheken mochten gebruiken. We moeten alles zelf programmeren.
De HNT11 is een eendraadssysteem, dus dit betekent dat je een GND en VCC hebt zoals elk ander elektronisch apparaat, maar de derde pin is een in- en uitvoerpin. Dus het is een beetje vreemd, maar ik heb er veel van geleerd.
Sluit de VCC aan op de externe 3.3V en de GND op de externe GND.
De datasheet van de DHT11 bevat alles om deze sensoren te gebruiken.
We kunnen vaststellen dat een hoog bit uit een laag en hoog bit bestaat. Maar de duur van het hoge deel bepaalt het bit echt. Als het hoge deel langer dan 100 µs (normaal 127 µs) wordt uitgezonden, is het bit hoog. Is het bit korter dan 100µs (normaal rond de 78µs) dan is het bit laag.
Wanneer de HNT11 is geactiveerd, begint deze signalen uit te zenden. Dit is altijd 41 bits. Het begint met een beginbit, dit betekent niets, dus deze kunnen we overslaan. De eerste 16 bits / 2bytes zijn het gehele en zwevende deel voor de vochtigheid. Het is hetzelfde voor de laatste 2 bytes, maar nu is het voor de temperatuur.
We hoeven dus alleen de duur van elk bit te berekenen en dan zijn we klaar.
In de broncode onder DHT11 vind je mijn methode om dit probleem op te lossen.
Stap 5: Gassensoren (alleen legendes)
Dus ik dacht bij de start van het project dat het een goed idee zou zijn om veel sensoren te gebruiken. Denk na voordat je handelt en koop lokaal dit scheelt je veel slaapuren! Omdat je eerder kunt beginnen en hierdoor zal je sneller geneigd zijn om ervoor te gaan.
Ik heb dus 4 gassensoren. MQ135, MQ8, MQ4 en een MQ7 al deze sensoren hebben specifieke gassen die ze het beste meten. Maar deze zijn allemaal verschillend in hun configuratie.
Dus ik heb eerst de datasheet gebruikt, dit maakte me geen wens. Toen zocht ik naar codevoorbeelden. Wat ik vond was een bibliotheek van Adafruit. Ik heb geprobeerd het zo goed mogelijk na te bootsen. Het werkte met een van de vier sensoren.
Ik liet het een tijdje rusten en kwam er weer op terug.
Wat ik deed om het voor die ene sensor te laten werken, is:
- Ik heb de datasheet gebruikt om punten van het gas te markeren die ik wilde meten. Dus 1 ro/rs tot 400ppm, 1.2 tot 600ppm …
- Daarna heb ik al die punten in Excel gezet en de formule voor de curve geëxtraheerd. Deze heb ik opgeslagen in mijn database.
- Uit de datasheet lees ik ook de normale weerstand en de schone luchtweerstand. Deze waarden zijn ook opgeslagen in de database.
Ik heb dit allemaal in een code gegoten, je kunt dit vinden als de laatste drie functies in de MCP3008-klasse. Maar dit is nog niet klaar, helaas had ik niet genoeg tijd.
Stap 6: Het schuifregister, 74HC595AG
Dit is dus een IC. En het doet iets bijzonders, met dit apparaat is het mogelijk om minder GPIO-uitgangen te gebruiken voor hetzelfde uitgangssignaal. Ik heb dit gebruikt voor het LCD (Liquid Crystal Display) en mijn leds. Ik zal het ip-adres op het LCD-scherm laten zien zodat iedereen naar de site kan surfen.
De LED's zijn wijselijk gekozen 2 rode, 3 gele en 2 groene. Dit toont op elk moment de luchtkwaliteit in de kamer.
Het schuifregister is een parallel uitvoerapparaat, dus het is niet mogelijk om verschillende signalen in een tijdsperiode uit te voeren. Dit zou mogelijk zijn als het van buitenaf is geprogrammeerd, maar niet native wordt ondersteund.
Hoe gebruik je de IC? Nou, je hebt 5 ingangen en 9 uitgangen. 8 logische uitgangen voor de 8 pinnen en dan de 9e pin om de overgebleven data naar een ander schuifregister te sturen.
Dus we verbinden pin 16 met de externe VCC, de volgende pin is de eerste uitgang, dus voor het LCD-scherm hebben we het nodig.. Pin 14 is de datalijn, hier sturen we gegevens naar. De 13e pin is de aan van de schakelaar, een laag signaal is het inschakelen van het IC een hoog signaal is nodig om het uit te schakelen. Pin 12 is de pin waar we kunnen bepalen wanneer een bit is verzonden, wanneer je deze pin zo van hoog naar laag naar beneden trekt, leest hij de signaalstatus van pin 13 en slaat deze op in zijn 8bit-geheugen. Pin 11 is vergelijkbaar wanneer deze pin hoog is ingesteld en vervolgens laag, hij voert de 8 bits uit naar zijn poort. En de laatste pin, pin 10 is de master reset, deze pin moet hoog blijven anders werkt hij niet. De laatste verbinding is de GND pin 8 die we nodig hebben om deze aan te sluiten op de externe GND.
Dus sluit nu de pinnen aan op de raspberry pi zoals je wilt. De manier waarop ik het deed was om ze zo dicht mogelijk bij elkaar te verbinden om er zeker van te zijn dat ik wist waar ze waren.
Wanneer je een juiste output krijgt. Deze kun je met de LED's op een printje solderen. en 220 Ohm weerstanden. Soldeer de uitgang van het IC aan de bijbehorende led. Je zou nu zoiets als dit moeten hebben.
Mijn testcode vind je hier onder Shiftregister. Als je met een 74HC595N werkt, heb je de MR niet nodig, dus je kunt hem niet aangesloten laten.
Het LCD-scherm is vrijwel hetzelfde. Het is vrij eenvoudig om het te gebruiken met het schuifregister omdat de invoer voor de LCD precies de invoer voor het schuifregister is.
Voor het LCD-scherm is er een andere code om het te laten werken, maar het is vrijwel hetzelfde als alleen het shifregister. De testcode vindt u hier onder LCD.
Stap 7: Frontend, een waardevolle les
Dus hier zal ik afdwalen, dit is een gedeelte van hoe je het zou moeten doen. Dit is iets heel erg waardevols dat geleerd heeft.
Maak de frontend voor de backend!!!!
Ik deed het andersom. Ik deed nutteloze oproepen voor mijn database, ik besteed hier te veel tijd aan.
Op de landingspagina had ik de huidige temperatuur en vochtigheid nodig en de waarden van alle gassensoren in een mooie grafiek. Ik moet ook het ip-adres van de RPi laten zien.
Op de pagina van de sensoren heb ik de selectie van één sensor en de selectietijd nodig. Ik koos voor de selectie van één dag en dan de periode vanaf die dag. Dit maakte het voor mij een stuk makkelijker omdat ik het meer onder controle had.
Op de laatste pagina, de instellingenpagina, is het mogelijk om bepaalde waarden te beheren, zoals gezond gevaarlijk of gevaarlijk gas en temperatuurniveaus. U kunt de RPi ook opnieuw opstarten als u de behoefte voelt om dit te doen.
Dus eerst heb ik een ontwerp gemaakt zodat ik gemakkelijk aan het codeergedeelte kon gaan werken. Stap voor stap boekte ik vooruitgang. De opdracht was eerst mobiel, dus daar zal ik me eerst op concentreren. Dan ga ik naar de grotere schermen.
Je kunt mijn pagina's, css en js vinden in mijn Github.
Stap 8: De backend
Dit deel is het deel dat ik met de frontend heb gemixt. Toen ik iets voor de frontend maakte, liet ik het werken op de backend. Zodat het later niet hoeft te worden herzien. Dit was iets wat ik in eerste instantie niet deed en hierdoor verloor ik zeker 2 weken tijd. Domme Ik! Maar een les die ik graag meeneem naar andere projecten.
Dus als je een backend maakt, maak dan iets dat je gaat gebruiken. Maar maak het toekomstbestendig door het herbruikbaar te maken en niet hard gecodeerd. Dus als ik de laatste 50 waarden van mijn DHT11 nodig heb, controleer ik of er waarden worden gemaakt? Ja, hoe zet ik ze in de database. Hoe krijg ik ze uit de database. Hoe laat ik het zien? Grafiek, grafiek of alleen de gewone gegevens? Dan maak ik een nieuwe route met de verschillende parameters en eigenschappen zoals data, specifieke sensornamen of wat ik ga noemen. Ik bedoel, noem ik alle waarden van de MQ-sensoren of noem ik alle sensoren met MQ in zijn naam. Dan heb ik er wat errorhandling in gedaan. Als het verzoek van de call de juiste methode is, kan het alleen doorgaan, anders krijgt het een mooie foutmelding.
Ook bevinden zich hier de threads, dit zijn stukjes software waarmee je parallelle code kunt draaien. U kunt de website-aanroepen, de waardecreatiefunctie en het led+shiftregister uitvoeren. Deze functies werken volledig onafhankelijk van elkaar.
Dus voor de led's. Ik heb een bodem/gezonde waarde gemaakt voor de CO2. Deze waarde kwam uit meerdere gouvernementele bronnen. De gezonde waarde voor klaslokalen ligt onder de 600 ppm CO2 per kubieke meter. De ongezonde waarde is alles boven de 2000 ppm. Dus de LED's maken de brug. Als de waarde van de MQ4-sensor 1400 is, wordt automatisch berekend in welke mate van gevaar het is. 2000 - 600 = 1400 dus het totale bereik is 1400 /7 = 200. Dus als de waarde 550 bereikt, gaat er een groene led branden. 750 toont 2 groene led's, 950 1 gele 2 groene led's. Enzovoort.
Wanneer de waarde boven het midden komt, wordt het venster geopend. Ik heb een stappenmotor gebruikt vanwege het hoge koppel en de precisie. En als de waarde boven de 2000 komt gaat er een klein alarm af. Dit is om de mensen in de kamer te alarmeren.
Ook kunnen wij rookgassen detecteren dus bij brand. Deze registreert dit ook. Als het boven een bepaalde waarde komt, gaat het alarm af en knipperen de LED's.
Het LCD-scherm is er vooral om het IP-adres weer te geven zodat je naar de site kunt surfen.
Je kunt alles + code vinden in mijn Githubin de app.py
Stap 9: de zaak maken
Ik vond een kleine computerkast voor al mijn componenten.
Ik heb een aluminium plaat op maat gesneden. En wat gaten geboord waar het laken zou rusten. Dit komt overeen met de gaten in het moederbord.
Toen keek ik hoe alles in de koffer zou passen. Ik legde alles neer en begon te bewegen.
Toen ik tevreden was met hoe het zou werken, begon ik de gaten te markeren die ik nodig had voor de sensoren, RPi, PCB's, powermodules en stappenmotormodule. De gaten zijn voor de PCB-afstand, dit maakt wat ruimte zodat de metalen delen niet in contact komen met de aluminiumplaat. Het geeft het ook een mooie uitstraling.
Ik pakte van elk IC of ander apparaat de kabels en bond ze samen. Dit is omdat ik kon zien welke kabels waarvoor zijn. Ik plaatste alles mooi op een aantal afstandhouders en gebruikte wat moeren en schroeven om alles mooi op zijn plaats te houden.
Om dit alles van stroom te voorzien heb ik 2 batterijen gebruikt. Deze leveren veel stroom maar dit zijn nog steeds batterijen dus deze zullen na verloop van tijd leeg raken. Deze heb ik met klittenband gemonteerd. Ik gebruikte klittenband omdat ik dan gemakkelijk de batterijen kon vervangen of wegdoen.
De stappenmotor, LCD en LED's komen uit de bovenkant van de behuizing. Dus legde ik voorzichtig de deksel van de behuizing erop en markeerde de gaten en boorde ze met een boor. Zodat we alles gemakkelijk kunnen zien.
Als de behuizing klaar is, moeten we alles bedraden, hier vind je het bedradingsschema.
Stap 10: Evaluatie en conclusie
Dit is/was dus mijn eerste project.
Het ziet er goed uit denk ik.
Ik heb veel nieuwe dingen geleerd, de goede en de slechte kant van projectmanagement geleerd. Het was echt een waardevolle les. Ik leunde dat je niet kunt wachten, je moet echt blijven geven. Je moet elke beweging documenteren (bijna hele beweging), en dat je het moet doen toen je het net deed.
Focus op 1 ding tegelijk. Wil je de temperatuur op je scherm? Doe dit, dit en dat. Wacht niet of probeer het voorbij te laten gaan. Het zal niet helpen. En het zal je zo kostbare tijd verliezen.
Ook lijkt 4 weken veel tijd. Maar minder is waar. Dit klopt gewoon niet. Je hebt maar 4 weken. Eerste 2 weken niet echt zo veel druk. 3 week afronden en de 4de week slapeloze nacht. Dit is hoe je het niet moet doen.
Ik was misschien een beetje ambitieus: ik heb een superkleine behuizing, geen gebruiksvriendelijke sensoren, batterijen … Maak het een stuk eenvoudiger en maak het dan geleidelijk moeilijker en moeilijker, alleen dan krijg je een goed prototype/product.