### 4.3.7 Temperatuur- en vochtigheidsregeling #### 4.3.7.1 Overzicht ![Img](./media/top1.png) In dit project laten we zien hoe je een temperatuur- en vochtigheidsregelsysteem bouwt met een micro:bit board, XHT11 temperatuur- en vochtigheidssensor, 130 motor, atomisatiemodule en OLED-display. Het systeem meet de omgevings-temperatuur en -vochtigheid met de XHT11-sensor en past deze aan door de rotatie van de ventilator en het sproeien van watermist door de atomisatiemodule te regelen wanneer dat nodig is. Wanneer de temperatuur of vochtigheid de ingestelde drempel overschrijdt, zal het de ventilator inschakelen en watermist uit de atomisatiemodule sproeien. Tegelijkertijd toont het OLED-display de actuele temperatuur en vochtigheid in realtime. Aangezien het temperatuur en vochtigheid kan regelen, wordt het veel toegepast in projecten die temperatuur en vochtigheid moeten controleren. ![Img](./media/bottom1.png) #### 4.3.7.2 Componentkennis ![Img](./media/2top.png) **XHT11 Temperatuur- en vochtigheidssensor** ![Img](./media/XHT11.png) De XHT11 temperatuur- en vochtigheidssensor geeft digitale signalen uit. Hij neemt analoge signalen op en zet deze om, en detecteert temperatuur en vochtigheid om uitstekende lange-termijn stabiliteit en hoge betrouwbaarheid te garanderen. Bovendien bevat hij een hoge-precisie resistieve vochtigheidssensor en een resistieve thermogevoelige temperatuur-sensor, en is verbonden met een 8-bit high-performance single-chip microcontroller. **XHT11 communicatiemodus:** De XHT11 gebruikt een vereenvoudigde single-bus communicatie. Een single-bus betekent dat er slechts één datalijn is, dus data-uitwisseling en controle in het systeem worden hier gerealiseerd. - Definitie van single-bus bitoverdracht: - Single-bus dataformaat: er worden in één keer 40 bits data verzonden, met de hogere bits eerst. - 8-bit vochtigheid geheel + 8-bit vochtigheid decimaal + 8-bit temperatuur geheel + 8-bit temperatuur decimaal + 8-bit pariteitsbit. **Let op: het decimale deel van de vochtigheid is 0**. - Definitie van pariteitsbit data: - 8-bit vochtigheid geheel + 8-bit vochtigheid decimaal + 8-bit temperatuur geheel + 8-bit temperatuur decimaal. Het 8-bit pariteitsbit is de laatste 8 bits van het resultaat. ![Img](./media/cou73-1.png) Datatijdreeksgrafiek: Nadat de host (MCU) eenmaal een startsignaal verstuurt, schakelt de XHT11 van laag-energiemodus naar hoge-snelheidsmodus. Zodra het startsignaal van de host eindigt, stuurt de XHT11 een responssignaal, geeft 40-bit data uit en voert signaalacquisitie uit. De signaaltransmissie wordt hieronder weergegeven. ![Img](./media/A229.png) ⚠️ **Opmerking:** De temperatuur- en vochtigheidsgegevens die de host van de XHT11 leest, zijn altijd de vorige meetwaarde. Als het interval tussen twee metingen lang is, lees dan twee keer achter elkaar en neem de tweede verkregen waarde als de realtime waarde. **Schematische afbeelding:** ![Img](./media/cou73-2.png) **Parameters:** - Bedrijfsspanning: DC 3.3V~5V - Bedrijfstroom: (Max)2.5mA@5V - Maximaal vermogen: 0.0125W - Temperatuurbereik: -25 ~ +60°C (±2℃) - Vochtigheidsbereik: 5 ~ 95%R (nauwkeurigheid ±5%RH rond 25 °C) - Uitgangssignaal: Digitale bidirectionele single bus **Atomisatiemodule** ![Img](./media/Atomization.jpg) De atomisatiemodule bestaat uit een stuurcircuit en een atomisatieplaat, die water vernevelt. Hij kan worden aangestuurd door een microcontroller of handmatige knoppen. **Werking:** De atomisatiemodule gebruikt over het algemeen ultrasone technologie om watermist te genereren. Hij bevat een piëzo-elektrische keramische plaat die begint te trillen wanneer er een hoogfrequente spanning op wordt toegepast. De trilling verzamelt kleine waterdruppels op het wateroppervlak, die vervolgens worden gedispergeerd om fijne watermist te vormen. **Kwaliteit van de watermist:** Deze module kan water effectief omzetten in kleine waterdeeltjes, meestal binnen 1 tot 5 micron. Deze fijne mist verdampt en diffuseert gemakkelijker in de lucht en fungeert daarmee als een effectieve bevochtiger. ⚠️ **Aandacht:** **1. Nadat hij is ingeschakeld, moet de atomisatieplaat in water geplaatst worden. Als hij lange tijd in de lucht blijft, wordt de plaat heet en kan hij verbranden.** **2. Plaats de atomisatieplaat voorzichtig op het wateroppervlak. Als hij ondergedompeld is in water, zal hij geen watermist genereren.** **Parameters:** - Werkspanning: DC 3.3 ~ 5V - Installatiegat: diameter 4.8mm, afstand 16mm - Afmetingen: 31mm lengte, 23mm breedte en 8mm hoogte - Gewicht: 4.5g - Bedienings-temperatuur: -25°C tot +60°C - Module-interface: 3-pin gebogen pinnen, afstand 2.54 - Atomisatieplaat-interface: PH2.0 female end - Functie: gebruikt om water om te zetten in fijne watermist en deze in de lucht vrij te geven **Afmetingen atomisatieplaat:** ![Img](./media/AB10.jpg) ⚠️ **Opmerking: Trek indien mogelijk niet aan de draad op de plaat, anders kan het soldeerpunt losraken.** **Gebruiksaanwijzing van de atomisatiemodule:** Er zijn twee bedieningsmodi: door knoppen en door MCU-programmering. **Knopbediening:** Druk op de knop om de atomisatiemodule aan te zetten. Druk nogmaals op de knop om hem uit te zetten. **MCU-programmering:** Simuleer het indrukken van een knop. De uitgang is normaal hoog en laag wanneer ingedrukt. Laat de knop los en de uitgang wordt weer hoog. Daarom hoeven we bij gebruik met MCU slechts kortstondig een laag niveau naar de module te sturen, zoals het indrukken van de knop. We kunnen de start- of pauzetijd van de atomisatiemodule regelen door de duur van het hoge niveau aan te passen. **Installeer de katoenen staaf:** 1\. Week de katoenen staaf volledig in water (zoek een container met voldoende capaciteit zodat de gehele staaf onder water staat en week deze meer dan 5 minuten zodat hij volledig water kan opnemen). ![Img](./media/ASZX11.png) 2\. Plaats de atomisatieplaat in de plastic beugel. Let op de richting van de plaat. Leg de draad in de groef van de beugel. ![Img](./media/AB051.png) ![Img](./media/AB05.jpg) 3\. Sluit de andere kant van de plastic beugel. ![Img](./media/AB06.jpg) 4\. Steek de katoenen staaf in het midden van de beugel. Hij moet helemaal tot de bodem worden ingebracht totdat hij de atomisatieplaat raakt. ![Img](./media/AB07.jpg) 5\. Verbind de atomisatieplaat met de PH2.0 female aansluiting van de module, zoals hieronder getoond. ![Img](./media/AB09.png) 6\. Verbind de atomisatiemodule met de micro:bit shield en sluit een externe voeding aan. ![Img](./media/WPS010.png) 7\. Dompel de katoenen staaf opnieuw meer dan 3 minuten in water. Het water moet de staaf zoveel mogelijk bedekken, maar er mag geen water overstromen. ![Img](./media/WPS11.jpg) 8\. Druk op de zwarte knop op de module en je ziet dat hij begint te sproeien. De watermist wordt 3 seconden gesproeid. Druk nogmaals op de knop om hem uit te schakelen. ⚠️ **Aandacht: De atomisatieplaat mag niet langdurig werken; elk gebruik mag niet langer dan 5 seconden duren. Het is het beste om 1 tot 2 minuten te stoppen totdat de katoenen staaf weer vol water zit voordat je verder gaat werken. Anders kan hij verbranden.** ![Img](./media/sz12.png) ![Img](./media/WPS12.jpg) ![Img](./media/2bottom.png) #### 4.3.7.3 Vereiste componenten | ![Img](./media/microbitV2.png)| ![Img](./media/ExpansionBoard.png) | ![Img](./media/Atomization1.png)| | :--: | :--: | :--: | | micro:bit V2 main board ×1 | micro:bit shield ×1 | atomization module ×1 | |![Img](./media/DHT11.png)|![Img](./media/OLED.png)|![Img](./media/motor.png) | | XHT11 temperature and
humidity sensor ×1 | OLED display ×1 | 130 motor ×1 | |![Img](./media/usb.png) |![Img](./media/4pin.png)|![Img](./media/3pin.png)| | micro USB cable ×1 | 4 pin wire ×2 | 3 pin wire ×2 | |![Img](./media/fan.png) |![Img](./media/batterycase.png)| ![Img](./media/AAbattery.png)| | fan ×1 | battery holder ×1 | AA battery(**self-prepared**) ×6 | #### 4.3.7.4 Bedradingsschema ⚠️ **Let bij het bedraden op de draadkleur.** | 130 motor | wire color | micro:bit shield pin | micro:bit board pin | | :-------: | :--------: | :------------------: | :-----------------: | | G | black | G | G | | V | red | V2 | V | | IN+ | blue | 2 | P2 | | IN- | green | 13 | P13 | | OLED display | wire color | micro:bit shield pin | micro:bit board pin | | :----------: | :--------: | :------------------: | :-----------------: | | GND | black | G | G | | VCC | red | V2 | V | | SDA | blue | 20 | P20 | | SCL | green | 19 | P19 | | atomization module | wire color | micro:bit shield pin | micro:bit board pin | | :----------------: | :--------: | :------------------: | :-----------------: | | G | black | G | G | | V | red | V2 | V | | S | yellow | 16 | P16 | | XHT11 temperature and
humidity sensor | wire color | micro:bit shield pin | micro:bit board pin | | :----------------------------------------: | :--------: | :------------------: | :-----------------: | | G | black | G | G | | V | red | V1 | V | | S | yellow | 0 | P0 | ![Img](./media/couj7.png) #### 4.3.7.5 Codeflow ![Img](./media/flow-chart-07.png) #### 4.3.7.6 Testcode ⚠️ **Tip 1: Voordat je de code naar de Microbit board downloadt, importeer het bibliotheekbestand “oled_ssd1306\.py” en het bibliotheekbestand “DHT11\.py” verwijzend naar ** “[Import Library on MU](https://docs.keyestudio.com/projects/KS4050/en/latest/docs/MicroPython/MU_development_environment.html#import-library-on-mu)” . ⚠️ **Tip 2: De drempelwaarden 30 en 70 in de if()-voorwaarde kunnen aangepast worden aan de praktische situatie.** **Volledige code:** ```Python ''' Theme: Air temperature and humidity regulation Function: OLED displays temperature and humidity, XHT11 sensor controls the motor and the atomization module to regulate the environment temperature and humidity Compiling IDE: MU 1.2.0 Author: https://docs.keyestudio.com ''' # import gerelateerde bibliotheken from microbit import * from oled_ssd1306 import * from DHT11 import * # initialiseer en wis oled initialize() clear_oled() sensor = DHT11(pin0) # stel pin voor temperatuur en vochtigheid in # Voeg een initiële wachttijd toe display.show(Image.ALL_CLOCKS, wait=False, loop=True) sleep(3000) # Geef de sensor 3 seconden stabilisatietijd display.clear() pin16.write_digital(1) # zet P16 pin op hoog niveau # Voeg een lees-teller toe read_count = 0 last_valid_temp = 0 last_valid_humid = 0 while True: # Probeer meerdere keren te lezen for i in range(3): sensor.read() # lees de temperatuur- en vochtigheidswaarden if sensor.temp != 0 or sensor.humid != 0: break sleep(1000) T = sensor.temp # sla de temperatuurwaarde op in T H = sensor.humid # sla de vochtigheidswaarde op in H # Controleer de geldigheid van de data if T == 0 and H == 0 and read_count < 5: # De eerste paar uitlezingen kunnen 0 zijn. Blijf proberen read_count += 1 add_text(0, 0, "Initializing...") add_text(0, 2, "Attempt: " + str(read_count)) sleep(1000) continue # Als de data geldig is, werk de laatst geldige waarde bij if T != 0 or H != 0: last_valid_temp = T if T != 0 else last_valid_temp last_valid_humid = H if H != 0 else last_valid_humid read_count = 10 # De waarde is succesvol gelezen # Gebruik geldige data (als de huidige waarde 0 is, gebruik de laatst geldige waarde display_temp = T if T != 0 else last_valid_temp display_humid = H if H != 0 else last_valid_humid clear_oled() add_text(0, 0, "Temper: " + str(display_temp) + " C") # Toon de temperatuurwaarde add_text(0, 2, "Humid: " + str(display_humid) + " %RH") # Toon de vochtigheidswaarde # regel-logica if display_temp > 30 or display_humid > 70: add_text(0, 4, "Cooling/Humidifying") pin2.write_analog(500) pin13.write_digital(0) sleep(2000) pin2.write_analog(0) pin13.write_digital(0) sleep(500) pin16.write_digital(0) sleep(200) pin16.write_digital(1) sleep(3000) pin16.write_digital(0) sleep(200) pin16.write_digital(1) sleep(1000) else: add_text(0, 4, "Normal State") pin2.write_analog(0) pin13.write_digital(0) pin16.write_digital(1) sleep(500) ``` ![Img](./media/line1.png) **Korte uitleg:** ① Importeer bibliotheken microbit, oled_ssd1306 en DHT11. ```Python from microbit import * from oled_ssd1306 import * from DHT11 import * ``` ② Initialiseer OLED-pixels, wis het OLED. ```Python initialize() clear_oled() ``` ③ Initialiseer de pin van de XHT11 temperatuur- en vochtigheidssensor. ```Python sensor = DHT11(pin0) # stel pin voor temperatuur en vochtigheid in ``` ④ Definieer variabelen en zet hun beginwaarden op 0. ```Python read_count = 0 last_valid_temp = 0 last_valid_humid = 0 ``` ⑤ Lees meerdere keren de temperatuur en vochtigheid en wijs de gelezen temperatuur toe aan variabele T en de vochtigheid aan variabele H. ```Python for i in range(3): sensor.read() # lees de temperatuur- en vochtigheidswaarden if sensor.temp != 0 or sensor.humid != 0: break sleep(1000) T = sensor.temp # sla de temperatuurwaarde op in T H = sensor.humid # sla de vochtigheidswaarde op in H ``` ⑥ Controleer de geldigheid van de temperatuur- en vochtigheidswaarden. ```Python if T == 0 and H == 0 and read_count < 5: # De eerste paar uitlezingen kunnen 0 zijn. Blijf proberen read_count += 1 add_text(0, 0, "Initializing...") add_text(0, 2, "Attempt: " + str(read_count)) sleep(1000) continue ``` ⑦ Als ze geldig zijn, werk de laatst geldige waarde bij. ```Python if T != 0 or H != 0: last_valid_temp = T if T != 0 else last_valid_temp last_valid_humid = H if H != 0 else last_valid_humid read_count = 10 # De waarde is succesvol gelezen ``` ⑧ Gebruik de geldige data (als de huidige waarde 0 is, gebruik de laatst geldige waarde). ```Python display_temp = T if T != 0 else last_valid_temp display_humid = H if H != 0 else last_valid_humid ``` ⑨ Toon de door de XHT11 gedetecteerde temperatuur en vochtigheid op het OLED. ```Python add_text(0, 0, "Temper: " + str(display_temp) + " C") # Toon de temperatuurwaarde add_text(0, 2, "Humid: " + str(display_humid) + " %RH") # Toon de vochtigheidswaarde ``` ⑩ Beslissingsverklaring: if()...else... Als de gedetecteerde temperatuur hoger is dan 30℃ of de vochtigheid hoger is dan 70%RH, stopt de ventilator na 2 seconden draaien. Vervolgens werkt de atomisatiemodule en sproeit watermist om de omgevings-temperatuur en -vochtigheid te regelen. Ondertussen toont het OLED “Cooling/Humidifying”. ```Python if display_temp > 30 or display_humid > 70: add_text(0, 4, "Cooling/Humidifying") pin2.write_analog(500) pin13.write_digital(0) sleep(2000) pin2.write_analog(0) pin13.write_digital(0) sleep(500) pin16.write_digital(0) sleep(200) pin16.write_digital(1) sleep(3000) pin16.write_digital(0) sleep(200) pin16.write_digital(1) sleep(1000) ``` Anders zullen de ventilator en de atomisatiemodule niet werken en toont het OLED “Normal State”. ```Python else: add_text(0, 4, "Normal State") pin2.write_analog(0) pin13.write_digital(0) pin16.write_digital(1) ``` ⑪ Pauze 500ms(0.5s) ```Python sleep(500) ``` #### 4.3.7.7 Testresultaat ![Img](./media/4top.png) Na het aansluiten en inschakelen via de micro USB-kabel, sluit je de externe voeding aan (6 AA-batterijen) om voldoende stroomvoorziening te garanderen, en klik op “Flash” om de code naar de micro:bit board te downloaden. ![Img](./media/A129.png) Na het uploaden van de testcode, druk op de resetknop aan de achterkant van de micro:bit. ![Img](./media/A455.png) De 5×5 LED-matrix op de micro:bit board toont het roterende wijzerpatroon, het OLED toont de initialisatie-informatie van de XHT11 temperatuur- en vochtigheidssensor, en daarna toont het OLED in realtime de temperatuur- en vochtigheidswaarde die door de XHT11-sensor is gedetecteerd. Als de gedetecteerde temperatuur hoger is dan 30℃ of de vochtigheid hoger is dan 70%RH, stopt de ventilator na 2 seconden draaien. Vervolgens werkt de atomisatiemodule en sproeit watermist om de omgevings-temperatuur en -vochtigheid te regelen. Ondertussen toont het OLED “Cooling/Humidifying”. Anders werken de ventilator en atomisatiemodule niet en toont het OLED “Normal State”. ![Img](./media/dongtu-07.gif) ⚠️ **Opmerking: De bouwstenen in het experiment zijn niet inbegrepen in deze kit.** (**Tip:** Als er geen resultaat wordt waargenomen, druk dan op de resetknop van de micro:bit board.) ![Img](./media/4bottom.png)