Indholdsfortegnelse:

A Micro: bit Dive-O-Meter: 8 trin (med billeder)
A Micro: bit Dive-O-Meter: 8 trin (med billeder)

Video: A Micro: bit Dive-O-Meter: 8 trin (med billeder)

Video: A Micro: bit Dive-O-Meter: 8 trin (med billeder)
Video: Что ты такое?! 2024, Juli
Anonim
En Micro: bit Dive-O-Meter
En Micro: bit Dive-O-Meter
En Micro: bit Dive-O-Meter
En Micro: bit Dive-O-Meter
En Micro: bit Dive-O-Meter
En Micro: bit Dive-O-Meter

Sommeren er her, det er pool tid!

En god mulighed for at tage dig selv og din mikro: bid udenfor til, og i dette tilfælde endda ind i swimmingpoolen.

Micro: bit dive-o-meter beskrevet her er en simpel DIY dybdemåler, der giver dig mulighed for at måle, hvor dyb du er, eller var, dykning. Den består kun af en micro: bit, en batteripakke eller LiPo, et kantstik til micro: bit, en BMP280 eller BME280 barometrisk trykføler og nogle springkabler. Brug af Pimoroni enviro: bit gør tingene stadig enklere. Alt dette er pakket i to lag vandtætte klare plast- eller silikonesække, med nogle vægte tilføjet for at kompensere for den flydende kraft.

Det er en anvendelse af mikro: bit tryksensorenheden, jeg havde beskrevet i en tidligere instruerbar.

Du kan bruge enheden e. g. til dykkekonkurrencer med venner og familie, eller for at finde ud af hvor dyb den dam virkelig er. Jeg testede den ved hjælp af den dybeste pool i mit nabolag, og fandt ud af, at den fungerer i mindst 3,2 meters dybde. Cirka fem meter er det teoretiske maksimum. Indtil videre har jeg ikke testet dens præcision i nogen detaljer, men de rapporterede tal lå i det mindste i det forventede område.

Nogle bemærkninger: Dette er ikke beregnet til at være et redskab for rigtige dykkere. Din micro: bit bliver beskadiget, hvis den bliver våd. Du bruger dette instruerbart på egen risiko.

Opdatering 27. maj: Nu kan du finde et MakeCode HEX-script, du kan indlæse direkte i din micro: bit. Se trin 6. Opdater 13. juni: En Enviro: bit og en kabelversion tilføjet. Se trin 7 og 8

Trin 1: Teorien bag enheden

Vi lever på bunden af et hav af luft. Trykket hernede er omkring 1020 hPa (hectoPascal), da vægten af luftsøjlen dannes her til rummet er omkring 1 kg pr.

Vandtætheden er meget højere, da en liter luft vejer omkring 1,2 g og en liter vand 1 kg, dvs. cirka 800 gange. Så da faldet i barometrisk tryk er omkring 1 hPa for hver 8 meter i højden, er trykforøgelsen 1 hPa for hver centimeter under vandoverfladen. På en dybde på ca. 10 m er trykket 2000 hPa eller to atmosfærer.

Den trykføler, der bruges her, har et måleområde mellem 750 og 1500 hPa ved en opløsning på omkring et hPa. Det betyder, at vi kan måle dybder op til 5 meter ved en opløsning på cirka 1 cm.

Enheden ville være en dybdemåler af typen Boyle Marriotte. Dens samling er ganske enkel og beskrevet i et senere trin. Sensoren bruger I2C -protokollen, så et kantstik til micro: bit kommer praktisk. Den mest kritiske del er de vandtætte poser, da enhver fugtighed vil skade mikro: bit, sensoren eller batteriet. Da noget luft vil blive fanget inde i poserne, er tilføjelsen af vægte med til at kompensere for den flydende kraft.

Trin 2: Brug af enheden

Brug af enheden
Brug af enheden
Brug af enheden
Brug af enheden
Brug af enheden
Brug af enheden
Brug af enheden
Brug af enheden

Scriptet, som vist i detaljer på et senere trin, er en variation af et script, jeg tidligere har udviklet til en trykmåler. For at teste enheden kan du bruge det enkle trykkammer, der er beskrevet der.

Til dykkerformål viser den dybden i meter, beregnet ud fra trykmålinger, enten som et søjlediagram i trin på 20 cm eller efter anmodning i tal.

Ved hjælp af knappen A på micro: bit indstiller du det aktuelle tryk som referencetrykværdi. For at bekræfte indtastningen blinker matrixen en gang.

Du kan bruge dette enten til at se, hvor dybt du dykker, eller til at registrere, hvor dybt du dykkede.

I det første tilfælde indstilles det aktuelle lufttryk udefra som reference. I det andet tilfælde skal du indstille trykket på det dybeste punkt, hvor du var som trykreference, som derefter giver dig mulighed for at vise, hvor dybt du har været, når du er tilbage på overfladen. Knap B viser dybden, beregnet ud fra trykforskellen, som en numerisk værdi i meter.

Trin 3: Materialer påkrævet

Materialer påkrævet
Materialer påkrævet
Materialer påkrævet
Materialer påkrævet
Materialer påkrævet
Materialer påkrævet

En mikro: bit. F.eks. til 13 GBP/16 Euro hos Pimoroni UK/DE.

Et kantstik (Kitronic eller Pimoroni), 5 GBP. Jeg brugte Kitronic -versionen.

En BMP/BME280 sensor. Jeg brugte en BMP280 sensor fra Banggood, 4,33 Euro for tre enheder.

Jumperkabler til tilslutning af sensor og kantstik.

Et glimrende alternativ til kantstik/sensor kombinationen ovenfor kan være Pimoroni enviro: bit (ikke testet nu, se sidste trin).

En batteripakke eller LiPo til micro: bit.

Et strømkabel med en kontakt (valgfri, men nyttig). Tøm vandtætte poser. Jeg brugte en silikone pose til en mobiltelefon og en eller to små ziploc tasker. Sørg for at materialet er tykt nok, så stifterne på kantstikket beskadiger ikke poserne.

Nogle vægte. Jeg brugte stykker blyvægt, der bruges til fiskeri.

Arduino IDE og flere biblioteker.

Trin 4: Montering

montage
montage
montage
montage
montage
montage
montage
montage

Installer Arduino IDE og de nødvendige biblioteker. Detaljer er beskrevet her.

(Ikke påkrævet for MakeCode -scriptet.) I betragtning af at du bruger Kitronik -kantstikket, skal loddetappe til I2C -portene 19 & 20. Dette er ikke påkrævet for Pimoroni -kantstikket. Lodde hovedet til sensoren bryde ud og tilslut sensor og kant stik ved hjælp af jumper kabler. Tilslut VCC til 3V, GND til 0 V, SCL til port 19 og SDA til port 20. Alternativt lod kablerne direkte til breakout. Tilslut micro: bit til vores computer med et USB -kabel. Åbn det medfølgende script, og flash det til micro: bit. Brug den serielle skærm eller plotter, kontroller om sensoren giver rimelige data. Afbryd micro: bit fra din computer. Tilslut batteriet eller LiPo til micro: bit. Tryk på knap B, læs værdien Tryk på knap A. Tryk på knap B, læs værdien. Placer enheden i to lag lufttætte poser, så der kun er meget lidt luft i poserne. I tilfælde af at placere en vægt for at kompensere for opdriftskraften. Kontroller, om alt er vandtæt. Gå til poolen og leg.

Trin 5: MicroPython -scriptet

Scriptet tager bare trykværdien fra sensoren, sammenligner den med referenceværdien og beregner derefter dybden fra forskellen. For at vise værdierne som et søjlediagram, tages heltalet og den resterende del af dybdeværdien. Den første definerer linjens højde. Resten er opdelt i fem skraldespande, som bestemmer længden af stængerne. Det øverste niveau er 0 - 1 m, det laveste 4-5 m. Som nævnt før, tryk på knappen A indstiller referencetrykket, knappen B viser den "relative dybde" i meter, vist som en numerisk værdi. På nuværende tidspunkt præsenteres negative og positive værdier som søjlediagram på LED -matricen på samme måde. Du er velkommen til at optimere scriptet til dine behov. Du kan deaktivere visse linjer for at vise værdierne på den serielle skærm eller plotter af Arduino IDE. For at efterligne funktionen kan du bygge den enhed, jeg beskrev i en tidligere instruktion.

Jeg har ikke skrevet den del af scriptet, der læser sensoren. Jeg er ikke sikker på kilden, men jeg takker gerne forfatterne. Eventuelle rettelser eller tip til optimering er velkomne.

#omfatte

#inkludere Adafruit_Microbit_Matrix mikrobit; #define BME280_ADDRESS 0x76 unsigned long int hum_raw, temp_raw, pres_raw; signeret lang int t_fine; uint16_t dig_T1; int16_t dig_T2; int16_t dig_T3; uint16_t dig_P1; int16_t dig_P2; int16_t dig_P3; int16_t dig_P4; int16_t dig_P5; int16_t dig_P6; int16_t dig_P7; int16_t dig_P8; int16_t dig_P9; int8_t dig_H1; int16_t dig_H2; int8_t dig_H3; int16_t dig_H4; int16_t dig_H5; int8_t dig_H6; dobbelt tryk_norm = 1015; // en startværdi dobbelt dybde; // beregnet dybde // -------------------------------------------- ---------------------------------------------------------- ---------------------- void setup () {uint8_t osrs_t = 1; // Temperaturoversampling x 1 uint8_t osrs_p = 1; // Trykoversampling x 1 uint8_t osrs_h = 1; // Fugtighedsoversampling x 1 uint8_t mode = 3; // Normal tilstand uint8_t t_sb = 5; // Tstandby 1000ms uint8_t filter = 0; // Filtrer uint8_t spi3w_da = 0; // 3-leder SPI Deaktiver uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode; uint8_t config_reg = (t_sb << 5) | (filter << 2) | spi3w_da; uint8_t ctrl_hum_reg = osrs_h; pinMode (PIN_BUTTON_A, INPUT); pinMode (PIN_BUTTON_B, INPUT); Serial.begin (9600); // indstil seriel porthastighed Serial.print ("Tryk [hPa]"); // header til seriel output Wire.begin (); writeReg (0xF2, ctrl_hum_reg); writeReg (0xF4, ctrl_meas_reg); writeReg (0xF5, config_reg); readTrim (); // microbit.begin (); // microbit.print ("x"); forsinkelse (1000); } // ----------------------------------------------- ---------------------------------------------- void loop () {dobbelt temp_act = 0,0, press_act = 0,0, hum_act = 0,0; signeret long int temp_cal; usigneret lang int press_cal, hum_cal; int N; int M; dobbelt tryk_delta; // relativ tryk int dybde_m; // dybde i meter, heltal del dobbeltdybde_cm; // resten i cm readData (); // temp_cal = kalibrering_T (temp_raw); press_cal = kalibrering_P (pres_raw); // hum_cal = kalibrering_H (hum_raw); // temp_act = (dobbelt) temp_cal / 100,0; press_act = (dobbelt) press_cal / 100.0; // hum_act = (dobbelt) hum_cal / 1024.0; microbit.clear (); // nulstil LED -matrix // Knap A indstiller den faktiske værdi som reference (P nul) // Knap B viser den aktuelle værdi som dybde i meter (beregnet ud fra trykforskel) hvis (! digitalRead (PIN_BUTTON_A)) {// indstiller normalt lufttryk som nul press_norm = press_act; // microbit.print ("P0:"); // mikrobit.print (tryk_norm, 0); // microbit.print ("hPa"); microbit.fillScreen (LED_ON); // blink én gang for at bekræfte forsinkelse (100); } ellers hvis (! digitalRead (PIN_BUTTON_B)) {// vis dybde i meter microbit.print (dybde, 2); microbit.print ("m"); // Serial.println (""); } ellers {// beregne dybden fra trykforskel press_delta = (press_act - press_norm); // beregne relativ trykdybde = (press_delta/100); // dybde i meter depth_m = int (abs (dybde)); // dybde im meter depth_cm = (abs (dybde) - dybde_m); // resten /* // bruges til udvikling Serial.println (dybde); Serial.println (depth_m); Seriel.println (dybde_cm); */ // Trin til søjlediagram hvis (dybde_cm> 0,8) {// indstillet længde af søjler (N = 4); } ellers hvis (dybde_cm> 0,6) {(N = 3); } ellers hvis (dybde_cm> 0,4) {(N = 2); } ellers hvis (dybde_cm> 0,2) {(N = 1); } andet {(N = 0); }

hvis (dybde_m == 4) {// indstillet niveau == meter

(M = 4); } ellers hvis (depth_m == 3) {(M = 3); } ellers hvis (dybde_m == 2) {(M = 2); } ellers hvis (depth_m == 1) {(M = 1); } andet {(M = 0); // øverste række} /* // bruges til udviklingsformål Serial.print ("m:"); Serial.println (depth_m); Serial.print ("cm:"); Seriel.println (dybde_cm); Serial.print ("M:"); Serial.println (M); // til udviklingsformål Serial.print ("N:"); Serial.println (N); // i udviklingsøjemed forsinkelse (500); */ // tegne søjlediagram mikrobit.drawLine (0, M, N, M, LED_ON); }

// send værdi til seriel port for plotter

Serial.print (tryk_delta); // tegne indikatorlinjer og fix vist område Serial.print ("\ t"); Serial.print (0); Serial.print ("\ t"); Seriel.print (-500); Serial.print ("\ t"); Serial.println (500); forsinkelse (500); // Mål to gange i sekundet} // ----------------------------------------- ---------------------------------------------------------- ---------------------------------------------------------- -------- // følgende er påkrævet for bmp/bme280-sensoren, behold det som det er ugyldigt readTrim () {uint8_t data [32], i = 0; // Fix 2014/Wire.beginTransmission (BME280_ADDRESS); Wire.write (0x88); Wire.endTransmission (); Wire.requestFrom (BME280_ADDRESS, 24); // Fix 2014/while (Wire.available ()) {data = Wire.read (); i ++; } Wire.beginTransmission (BME280_ADDRESS); // Tilføj 2014/Wire.write (0xA1); // Tilføj 2014/Wire.endTransmission (); // Tilføj 2014/Wire.requestFrom (BME280_ADDRESS, 1); // Tilføj 2014/data = Wire.read (); // Tilføj 2014/i ++; // Tilføj 2014/Wire.beginTransmission (BME280_ADDRESS); Wire.write (0xE1); Wire.endTransmission (); Wire.requestFrom (BME280_ADDRESS, 7); // Fix 2014/while (Wire.available ()) {data = Wire.read (); i ++; } dig_T1 = (data [1] << 8) | data [0]; dig_P1 = (data [7] << 8) | data [6]; dig_P2 = (data [9] << 8) | data [8]; dig_P3 = (data [11] << 8) | data [10]; dig_P4 = (data [13] << 8) | data [12]; dig_P5 = (data [15] << 8) | data [14]; dig_P6 = (data [17] << 8) | data [16]; dig_P7 = (data [19] << 8) | data [18]; dig_T2 = (data [3] << 8) | data [2]; dig_T3 = (data [5] << 8) | data [4]; dig_P8 = (data [21] << 8) | data [20]; dig_P9 = (data [23] << 8) | data [22]; dig_H1 = data [24]; dig_H2 = (data [26] << 8) | data [25]; dig_H3 = data [27]; dig_H4 = (data [28] << 4) | (0x0F & data [29]); dig_H5 = (data [30] 4) & 0x0F); // Fix 2014/dig_H6 = data [31]; // Fix 2014/} void writeReg (uint8_t reg_address, uint8_t data) {Wire.beginTransmission (BME280_ADDRESS); Wire.write (reg_adresse); Wire.write (data); Wire.endTransmission (); } void readData () {int i = 0; uint32_t data [8]; Wire.beginTransmission (BME280_ADDRESS); Wire.write (0xF7); Wire.endTransmission (); Wire.requestFrom (BME280_ADDRESS, 8); mens (Wire.available ()) {data = Wire.read (); i ++; } pres_raw = (data [0] << 12) | (data [1] 4); temp_raw = (data [3] << 12) | (data [4] 4); hum_raw = (data [6] 3) - ((signeret lang int) dig_T1 11; var2 = (((((adc_T >> 4) - ((signeret lang int) dig_T1)) * ((adc_T >> 4) - ((signeret lang int) dig_T1))) >> 12) * ((signeret lang int) dig_T3)) >> 14; t_fine = var1 + var2; T = (t_fine * 5 + 128) >> 8; return T; } usigneret lang int kalibrering_P (signeret lang int adc_P) {signeret lang int var1, var2; usigneret lang int P; var1 = (((signeret lang int) t_fine) >> 1) - (signeret lang int) 64000; var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * ((signeret lang int) dig_P6); var2 = var2 + ((var1 * ((signeret lang int) dig_P5)) 2) + (((signeret lang int) dig_P4) 2) * (var1 >> 2)) >> 13)) >> 3) + (((((signeret lang int) dig_P2) * var1) >> 1)) >> 18; var1 = ((((32768+var1))*((signeret lang int) dig_P1)) >> 15); hvis (var1 == 0) {return 0; } P = (((usigneret lang int) (((signeret lang int) 1048576) -adc_P)-(var2 >> 12))))*3125; hvis (P <0x80000000) {P = (P << 1) / ((usigneret lang int) var1); } ellers {P = (P / (unsigned long int) var1) * 2; } var1 = (((signeret lang int) dig_P9) * ((signeret lang int) (((P >> 3) * (P >> 3)) >> 13))) >> 12; var2 = (((signeret lang int) (P >> 2)) * ((signeret lang int) dig_P8)) >> 13; P = (usigneret lang int) ((signeret lang int) P + ((var1 + var2 + dig_P7) >> 4)); returnere P; } usigneret lang int kalibrering_H (signeret lang int adc_H) {signeret lang int v_x1; v_x1 = (t_fine - ((signeret lang int) 76800)); v_x1 = (((((adc_H << 14) -(((signeret lang int) dig_H4) 15) * ((((((v_x1 * ((signeret lang int) dig_H6)) >> 10) * (((v_x1 * ((signeret lang int) dig_H3)) >> 11) + ((signeret lang int) 32768))) >> 10) + ((signeret lang int) 2097152)) * ((signeret lang int) dig_H2) + 8192) >> 14)); v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signeret lang int) dig_H1)) >> 4)); v_x1 = (v_x1 419430400? 419430400: v_x1); return (usigneret lang int) (v_x1 >> 12);

Trin 6: En større forenkling: MakeCode/JavaScript -koden

En større forenkling: MakeCode/JavaScript -koden
En større forenkling: MakeCode/JavaScript -koden
En større forenkling: MakeCode/JavaScript -koden
En større forenkling: MakeCode/JavaScript -koden

I maj 2018 har Pimoroni frigivet enviro: bit, der leveres med en BME280 tryk-/fugtigheds-/temperatursensor, en TCS3472 lys- og farvesensor og en MEMS -mikrofon. Derudover tilbyder de et JavaScript -bibliotek til MakeCode -editoren og et MicroPython -bibliotek til disse sensorer.

Jeg har brugt deres MakeCode -bibliotek til at udvikle scripts til min enhed. Vedhæftet finder du de tilsvarende hex -filer, som du kan kopiere direkte til din micro: bit.

Nedenfor finder du den tilsvarende JavaScript -kode. Test i puljen fungerede godt med en tidligere version af scriptet, så jeg formoder, at de også vil fungere. Ud over den grundlæggende, søjlediagramversion er der også en trådkorsversion (X) og en L-version, der skal gøre læsningen lettere, især under dårlige lysforhold. Vælg den, du foretrækker.

lad kolonne = 0

lad Meter = 0 lad forblive = 0 lad Row = 0 lad Delta = 0 lad Ref = 0 lad Is = 0 Is = 1012 basic.showLeds (` # # # # # #.. # #. #. # #… # # # # # # # `) Ref = 1180 basic.clearScreen () basic.forever (() => {basic.clearScreen () if (input.buttonIsPressed (Button. A)) {Ref = envirobit.getPressure () basic.showLeds (` # # # # # # # # # # # # # # # # # # # # # #`) basic.pause (1000)} ellers hvis (input.buttonIsPressed (Button. B)) {basic.showString ("" + Row + "." + forbliv + "m") basic.pause (200) basic.clearScreen ()} else {Is = envirobit.getPressure () Delta = Is - Ref Meter = Math.abs (Delta) if (Meter> = 400) {Row = 4} else if (Meter> = 300) {Row = 3} else if (Meter> = 200) {Row = 2} else if (Meter> = 100) {Række = 1} ellers {Række = 0} forblive = Meter - Række * 100 hvis (forblive> = 80) {Kolonne = 4} ellers hvis (forblive> = 60) {Kolonne = 3} ellers hvis (forblive> = 40) {Kolonne = 2} ellers hvis (forblive> = 20) {Kolonne = 1} ellers {Kolonne = 0} for (lad ColA = 0; ColA <= Kolonne; ColA ++) {led.plot (C olA, række)} basic.pause (500)}})

Trin 7: Enviro: bit -versionen

Enviro: bit version
Enviro: bit version
Enviro: bit version
Enviro: bit version
Enviro: bit version
Enviro: bit version

I mellemtiden modtog jeg enviro: bit (20 GBP) og power: bit (6 GBP), begge fra Pimoroni.

Som tidligere nævnt leveres enviro: bit med BME280 tryk-, fugtigheds- og temperatursensor, men også en lys- og farvesensor (se en ansøgning her) og en MEMS -mikrofon.

Power: bit er en god løsning til at drive micro: bit og leveres med en tænd/sluk -kontakt.

Det store er, at det begge bare er klik og brug, ingen lodning, kabler, brødbrætter. Tilføj enviro: bit til micro: bit, indlæs koden til micro: bit, brug den.

I dette tilfælde brugte jeg micro, power og enviro: bit, lagde dem i en Ziploc taske, lagde den i en klar vandtæt plastpose til mobiltelefoner, klar. En meget hurtig og pæn løsning. Se billederne. Omskifteren er stor nok til at bruge den gennem beskyttelseslagene.

Den er testet i vand, fungerede godt. På en dybde på cirka 1,8 m var måleværdien cirka 1,7 m. Ikke så dårligt for en hurtig og billig løsning, men langt fra at være perfekt. Det tager et stykke tid at justere, så du skal muligvis blive på en bestemt dybde i cirka 10-15 sekunder.

Trin 8: Kabel- og sensorprobeversion

Kabel- og sensorprobeversion
Kabel- og sensorprobeversion
Kabel- og sensorprobeversion
Kabel- og sensorprobeversion

Dette var faktisk den første idé jeg havde til en micro: bit dybdemåler, den sidste der skulle bygges.

Her lodde jeg BMP280-sensoren til 5 m af et 4-leder kabel og placerede hunjumper i den anden ende. For at beskytte sensoren mod vand blev kablet ført gennem en brugt vinkork. Korkens ender blev forseglet med varm lim. Før jeg havde skåret to hak i proppen, gik begge rundt om den. Derefter pakkede jeg sensoren i en svampbold, placerede en ballon omkring den og fikserede enden af ballonen på proppen (lavere hak). derefter lagde jeg 3 40 g stykker blyvægte ind i en anden ballon, viklede den rundt om den første, vægte placeret på ydersiden og fikserede enden af ballonen ved det andet hak. Luften blev fjernet fra den anden ballon, derefter blev alt fastgjort med gaffatape. Se billeder, mere detaljerede kan følge.

Jumperne blev forbundet til micro: bit via et kantstik, enheden blev tændt og referencetrykket blev indstillet. Derefter blev sensorhovedet langsomt frigivet til bunden af bassinet (10 m springtårn, cirka 4,5 m dybt).

Resultater:

Til min forbavselse virkede det selv med dette lange kabel. På den anden side, men ikke overraskende, syntes målefejlen at blive større ved højere tryk, og en estimeret dybde på 4 m blev rapporteret til ca. 3 m.

Potentielle applikationer:

Med nogle fejlrettelser kan enheden muligvis bruges til at måle dybden til ca. 4 m.

I forbindelse med en Arduino eller Raspberry Pi kan dette bruges til at måle og kontrollere påfyldningspunktet for en pool eller vandtank, f.eks. at fremkalde en advarsel, hvis vandstandene går over eller under visse tærskler.

Udendørs fitness udfordring
Udendørs fitness udfordring
Udendørs fitness udfordring
Udendørs fitness udfordring

Runner Up i Outdoor Fitness Challenge

Anbefalede: