Indholdsfortegnelse:

Mål tryk med din mikro: bit: 5 trin (med billeder)
Mål tryk med din mikro: bit: 5 trin (med billeder)

Video: Mål tryk med din mikro: bit: 5 trin (med billeder)

Video: Mål tryk med din mikro: bit: 5 trin (med billeder)
Video: Besøger en indfødt Odessa kvinde. Min drøm er gået i opfyldelse!!! Gå rundt i Odessa. 2024, Juli
Anonim
Mål tryk med din mikro: bit
Mål tryk med din mikro: bit
Mål tryk med din mikro: bit
Mål tryk med din mikro: bit

Følgende instruerbare beskriver en let at bygge og billig enhed til at udføre trykmålinger og demonstrere Boyles lov ved hjælp af micro: bit i kombination med BMP280 tryk-/temperatursensor.

Mens denne sprøjte/tryksensorkombination allerede er beskrevet i en af mine tidligere instruktioner, giver kombinationen med micro: bit nye muligheder, f.eks. til klasseværelsesprojekter.

Derudover er antallet af beskrivelser af applikationer, hvor micro: bit bruges i kombination med en I2C -drevet sensor, hidtil temmelig begrænset. Jeg håber, at denne instruktive kan være et udgangspunkt for andre projekter.

Enheden gør det muligt at udføre kvantitative lufttrykmålinger og vise resultaterne på micro: bit LED -arrayet eller på en tilsluttet computer til senere brug af den serielle skærm eller serielle plotterfunktioner i Arduino IDE. Derudover har du en haptisk feedback, da du selv vil skubbe eller trække i sprøjtens stempel og hermed føle den krævede effekt.

Som standard giver displayet dig mulighed for at estimere trykket ved hjælp af niveauindikatoren, der vises på LED -matrixen. Seriel plotteren på Arduino IDE gør det muligt at gøre det samme, men med meget bedre opløsning (se video). Mere detaljerede løsninger findes også, f.eks. i Processing -sproget. Du kan også vise de præcise måleværdier for tryk og temperatur på LED -matrixen efter at have trykket på henholdsvis A- eller B -knapperne, men den serielle skærm på Arduino IDE er meget hurtigere, hvilket gør det muligt at vise værdier i næsten realtid.

De samlede omkostninger og de tekniske færdigheder, der kræves for at bygge enheden, er ret lave, så det kan være et godt klasseværelsesprojekt under opsyn af en lærer. Derudover kan enheden være et værktøj til STEM -projekter med fokus på fysik eller bruges i andre projekter, hvor en kraft eller vægt skal omdannes til en digital værdi.

Princippet blev brugt til at konstruere en meget enkel micro: bit dive-o-meter, en enhed til at måle, hvor dybt du dykker.

Tillæg 27-maj-2018:

Da Pimoroni har udviklet et MakeCode -bibliotek til BMP280 -sensoren, gav dette mig mulighed for at udvikle et script til brug for den enhed, der er beskrevet her. Scriptet og den tilhørende HEX-fil findes i det sidste trin i denne instruks. For at bruge den skal du bare indlæse HEX -filen til din micro: bit. Intet behov for særlig software, og du kan bruge online MakeCode -editoren til at redigere scriptet.

Trin 1: Brugte materialer

Brugte materialer
Brugte materialer
Brugte materialer
Brugte materialer
Brugte materialer
Brugte materialer
Brugte materialer
Brugte materialer
  • En micro: bit, fik min fra Pimoroni - 13,50 GBP
  • Kitronic Edge Connector til micro: bit - via Pimoroni - 5 GBP, Bemærkning: Pimorini tilbyder nu et brødbræt -venligt kantstik kaldet pin: bit med pins på I2C -portene.
  • 2 x 2 -pins headerstrimler
  • Batteri eller LiPo til mikro: bit (ikke nødvendigt, men nyttigt), batterikabel med switch (dito) - Pimoroni
  • jumperkabler til tilslutning af sensorer til Edge -stik
  • lange (!) jumperkabler til sensoren, mindst lige så lang som sprøjten,, f/f eller f/m
  • BMP280 tryk- og temperatursensor - Banggood - 5 US $ for tre enheder Måleområdet for denne sensor er mellem 550 og 1537 hPa.
  • 150 ml plastik katetersprøjte med gummipakning - Amazon eller hardware- og havebutikker - cirka 2-3 US $
  • varm lim/varm limpistol
  • loddekolbe
  • en computer med Arduino IDE installeret

Trin 2: Monteringsvejledning

Monteringsvejledning
Monteringsvejledning
Monteringsvejledning
Monteringsvejledning
Monteringsvejledning
Monteringsvejledning

Loddehoveder til BMP280 -sensorudbrud.

Lod de to 2 -benede hoveder til pin 19 og pin 20 -stikene på Edge -stikket (se billede).

Tilslut micro: bit til Edge -stikket og din computer.

Forbered software og micro: bit som beskrevet i Adafruit micro: bit instruktionerne. Læs dem grundigt.

Installer de nødvendige biblioteker til Arduino IDE.

Åbn BMP280 -scriptet, der er vedhæftet i et senere trin.

Tilslut sensoren til Edge -stikket. GND til 0V, VCC til 3V, SCL til pin 19, SDA til pin 20.

Upload scriptet til micro: bit.

Kontroller, at sensoren giver rimelige data, trykværdier skal være omkring 1020 hPa, vist på den serielle skærm. Hvis det er tilfældet, skal du først kontrollere kabler og forbindelser, derefter softwareinstallation og rette.

Sluk mikro: bit, fjern sensor.

Før de lange jumperkabler gennem sprøjtens udløb. Hvis du måske skal udvide åbningen. Vær forsigtig med at udelade, at kablerne bliver beskadiget.

Tilslut sensoren til jumperkablerne. Kontroller, at forbindelserne er korrekte og gode. Tilslut til micro: bit.

Kontroller, at sensoren kører korrekt. Træk forsigtigt i kablerne, og flyt sensoren til toppen af sprøjten.

Indsæt stemplet, og flyt det lidt længere end den ønskede hvilestilling (100 ml).

Tilføj varm lim til enden af sprøjteudløbet, og flyt stemplet lidt tilbage. Kontroller, om sprøjten er lukket lufttæt, ellers tilføj mere varm lim. Lad afkøle den varme lim.

Kontroller igen, at sensoren fungerer. Hvis du flytter stemplet, skal tallene i den serielle skærm og micro: bit -displayet ændre sig.

Om nødvendigt kan du justere lydstyrken i sprøjten ved at klemme den tæt på pakningen og flytte stemplet.

Trin 3: Lidt teori og nogle praktiske målinger

Lidt teori og nogle praktiske målinger
Lidt teori og nogle praktiske målinger
Lidt teori og nogle praktiske målinger
Lidt teori og nogle praktiske målinger

Med den enhed, der er beskrevet her, kan du demonstrere sammenhængen mellem kompression og tryk i simple fysikeksperimenter. Da sprøjten kommer med en "ml" -skala på den, er selv kvantitative eksperimenter lette at udføre.

Teorien bag: Ifølge Boyles lov er [Volume * Pressure] en konstant værdi for en gas ved en given temperatur.

Dette betyder, at hvis du komprimerer et givet volumen gas N-fold, dvs. det endelige volumen er 1/N fold af originalen, stiger dets tryk N-fold, som: P0*V0 = P1*V1 = cons t. For flere detaljer, se venligst Wikipedia -artiklen om gaslove. Ved havniveau er barometertrykket normalt i området 1010 hPa (hekto Pascal).

Så startende ved et hvilested på f.eks. V0 = 100 ml og P0 = 1000 hPa, en komprimering af luften til ca. 66 ml (dvs. V1 = 2/3 * V0) vil resultere i et tryk på ca. 1500 hPa (P1 = 3/2 af P0). Træk stemplet til 125 ml (5/4 fold volumen) resulterer i et tryk på ca. 800 hPa (4/5 tryk). Målingerne er forbavsende præcise for sådan en enkel enhed.

Enheden giver dig mulighed for et direkte haptisk indtryk af, hvor meget kraft der kræves for at komprimere eller udvide den relativt lille mængde luft i sprøjten.

Men vi kan også udføre nogle beregninger og kontrollere dem eksperimentelt. Antag at vi komprimerer luften til 1500 hPa ved et basal barometrisk tryk på 1000 hPa. Så trykforskellen er 500 hPa eller 50.000 Pa. For min sprøjte er stemplets diameter (d) cirka 4 cm eller 0,04 meter.

Nu kan du beregne den kraft, der kræves for at holde stemplet i den position. Givet P = F/A (Tryk er Force divideret med Areal), eller transformeret F = P*A. SI -enheden for kraft er "Newton" N, for længden "Meter" m, og 1 Pa er 1N pr. Kvadratmeter. For et rundt stempel kan arealet beregnes ved hjælp af A = ((d/2)^2)*pi, hvilket giver 0,00125 kvadratmeter til min sprøjte. Så

50.000 Pa * 0.00125 m^2 = 63 N.

På Jorden korrelerer 1 N med en vægt på 100 gr, så 63 N er lig med at holde en vægt på 6,3 kg.

Dette kan let kontrolleres ved hjælp af en skala. Skub sprøjten med stemplet ind på vægten, indtil et tryk på ca. 1500 hPa er nået, og aflæs derefter vægten. Eller tryk, indtil vægten viser ca. 6-7 kg, tryk derefter på "A" -knappen og læs værdien, der vises på micro: bit's LED-matrix. Som det viste sig, var estimatet baseret på ovenstående beregninger ikke dårligt. Et tryk lidt over 1500 hPa korrelerede med en vist "vægt" på ca. 7 kg på en kropsvægt (se billeder). Du kan også vende dette koncept om og bruge enheden til at bygge en simpel digital skala baseret på trykmålinger.

Vær opmærksom på, at den øvre grænse for sensoren er omkring 1540 hPa, så ethvert tryk over dette kan ikke måles og kan beskadige sensoren.

Udover uddannelsesformål kan man også bruge systemet til nogle virkelige verden -applikationer, da det tillader kvantitativt at måle kræfter, der forsøger at flytte stemplet den ene eller den anden vej. Så du kan måle en vægt placeret på stemplet eller en slagkraft, der rammer stemplet. Eller opbyg en switch, der aktiverer et lys eller en summer eller afspiller en lyd, efter at en bestemt tærskelværdi er nået. Eller du kan bygge et musikinstrument, der ændrer frekvensen afhængigt af kraften, der påføres stemplet. Eller brug det som en spilcontroller. Brug din fantasi og spil!

Trin 4: MicroPython -scriptet

Vedhæftet finder du mit BMP280 -script til micro: bit. Det er en afledning af et BMP/BME280 -script, jeg et sted fandt Banggood -webstedet, kombineret med Adafruit's Microbit -bibliotek. Den første giver dig mulighed for at bruge Banggood -sensoren, den anden forenkler håndteringen af 5x5 LED -displayet. Min tak går til udviklerne af begge.

Som standard viser scriptet resultaterne af trykmålinger i 5 trin på micro: bit's 5x5 LED -display, så det er muligt at se ændringer med lidt forsinkelse. De præcise værdier kan vises parallelt på Arduino IDE seriel skærm, eller en mere detaljeret graf kan vises Arduino IDEs serielle plotter.

Hvis du trykker på A -knappen, vises de målte trykværdier på micro: bit's 5x5 LED -array. Hvis du trykker på knappen B, vises temperaturværdierne. Selvom dette gør det muligt at aflæse de præcise data, sænkes målecyklusserne betydeligt.

Jeg er sikker på, at der er meget mere elegante måder at programmere opgaverne på og forbedre scriptet. Enhver hjælp er velkommen.

#inkluder xxx

#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; // beholdere til målte værdier int værdi0; int værdi1; int værdi2; int værdi3; int værdi4; // ------------------------------------------------ ---------------------------------------------------------- ------------------ 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); // Serial.println ("Temperatur [deg C]"); // Serial.print ("\ t"); Serial.print ("Tryk [hPa]"); // header 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 () {double 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; // indstil tærskelværdier for LED matrix display, i hPa dobbelt max_0 = 1100; dobbelt max_1 = 1230; dobbelt max_2 = 1360; dobbelt max_3 = 1490; 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 /* Serial.print ("TRYK:"); Serial.println (press_act); Serial.print ("hPa"); Serial.print ("TEMP:"); Serial.print ("\ t"); Serial.println (temp_act); */ if (! digitalRead (PIN_BUTTON_B)) {// visning af værdier i tal forsinker måling af cirkler microbit.print ("T:"); microbit.print (temp_act, 1); microbit.print ("'C"); // Serial.println (""); } ellers hvis (! digitalRead (PIN_BUTTON_A)) {microbit.print ("P:"); microbit.print (tryk_akt, 0); microbit.print ("hPa"); } ellers {// viser trykværdier som pixels eller linjer i et bestemt niveau // 5 trin: 1490 hPa // tærskler defineret af max_n -værdierne hvis (press_act> max_3) {(N = 0); // øvre række} ellers hvis (tryk_akt> max_2) {(N = 1); } ellers hvis (press_act> max_1) {(N = 2); } ellers hvis (press_act> max_0) {(N = 3); } andet {(N = 4); // basisrække} // Serial.println (N); // til udviklingsformål // microbit.print (N); // som linje // microbit.drawLine (N, 0, 0, 4, LED_ON); // skift værdier til næste linie værdi4 = værdi3; værdi3 = værdi2; værdi2 = værdi1; værdi1 = værdi0; værdi0 = N; // tegne billede, kolonne for kolonne mikrobit.drawPixel (0, værdi0, LED_ON); // som Pixel: kolonne, række. 0, 0 venstre øverste hjørne mikrobit.drawPixel (1, værdi1, LED_ON); microbit.drawPixel (2, værdi2, LED_ON); microbit.drawPixel (3, værdi3, LED_ON); microbit.drawPixel (4, værdi4, LED_ON); } // sende data til seriel skærm og seriel plotter // Serial.println (press_act); // send værdi (er) til seriel port til numerisk visning, valgfri

Serial.print (press_act); // send værdi til seriel port for plotter

// tegne indikatorlinjer og fix vist område Serial.print ("\ t"); Serial.print (600); Serial.print ("\ t"); Serial.print (1100), Serial.print ("\ t"); Serial.println (1600); forsinkelse (200); // Mål tre gange i sekundet} // ----------------------------------------- ---------------------------------------------------------- ---------------------------------------------------------- - // følgende er påkrævet for bmp/bme280-sensoren. Behold 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] << 8) | data [7]; }

signeret long int kalibrering_T (signeret long int adc_T)

{signeret lang int var1, var2, T; var1 = ((((adc_T >> 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 5: MakeCode/JavaScript -scripts

MakeCode/JavaScript -scripts
MakeCode/JavaScript -scripts

Pimoroni har for nylig frigivet enviro: bit, der leveres med en BMP280 trykføler, en lys/farvesensor og en MEMS mikrofon. De tilbyder også et MicroPython og et MakeCode/JavaScript -bibliotek.

Jeg brugte det senere til at skrive et MakeCode -script til trykføleren. Den tilsvarende hex -fil kan kopieres direkte til din micro: bit. Koden vises nedenfor og kan ændres ved hjælp af online MakeCode -editoren.

Det er en variation af scriptet til micro: bit dive-o-meter. Som standard viser den trykforskellen som et søjlediagram. Tryk på knap A indstiller referencetrykket, tryk på knap B viser forskellen mellem det faktiske og referencetrykket i hPa.

Udover den grundlæggende stregkodeversion finder du også en "X", trådkorsversion og en "L" version, der skal gøre læsningen lettere.

lad kolonne = 0

lad forblive = 0 lad Række = 0 lad Meter = 0 lad Delta = 0 lad Ref = 0 lad Is = 0 Er = 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 ("" + Delta + "hPa") basic.pause (200) basic.clearScreen ()} ellers {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) {Row = 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 (ColA, Row)} basic.pause (500)}})

Anbefalede: