Ik wil verzamelen doe het zelf instrument dat atmosferische druk en temperatuur zal meten. De temperatuursensor moet op afstand en dicht zijn, omdat hij de temperatuur op een bepaalde afstand van het apparaat moet meten. Ik zou zo'n draagbaar apparaat willen hebben met een werkbereik van -30 ° C tot 50 ° C. Maar dit vereist dat alle componenten in dit temperatuurbereik kunnen werken. Componenten die in een groter temperatuurbereik kunnen werken, zijn duurder en het is moeilijker om ze te kopen.
Om mijn droom werkelijkheid te laten worden, word ik geholpen door het bestuur, dat ik beschreef in het artikel “GY-BMP280-3.3 bord voor het meten van barometrische druk en temperatuur».
Uit de praktijk is dat bekend tijdens montage en configuratie elektronisch producten voordat het wordt vervaardigd, moet u de bruikbaarheid van alle materialen en componenten van elk afzonderlijk controleren. Anders kunt u later in de war raken, met als resultaat dat het elektronische product niet werkt en dat het erg moeilijk zal zijn om de oorzaak van de storing te vinden.
Laten we beginnen.
Eerste fase. Installeer een gratis software-shell op uw computer Arduino IDE voor het schrijven van programma's (schetsen), het compileren en vervolgens schrijven naar de Mega328P-microcontroller die op het bord is geïnstalleerd. Ik raad je aan de shell-versie van ARDUINO 1.6.5 te downloaden. Waarom? Aanvankelijk was het ARDUINO-project één, nu hebben de ontwikkelaars het ARDUINO-systeem verspreid en blijven ontwikkelen, maar elk op zijn eigen manier, met kleine nuances. Ik gebruikte versie ARDUINO 1.6.5. Het moet worden geïnstalleerd en getest voor samenwerking met het Arduino Uno-bord met behulp van de eenvoudigste voorbeelden.
Tweede fase. We controleren het GY-BMP280-3.3-bord voor het meten van de barometrische druk en temperatuur. We nemen 4 draden, we verbinden ze GY-BMP280-3.3 en Arduino Uno, zoals weergegeven in de foto en het diagram. Curven dunne veelkleurige lijnen zijn geleiders.
Laten we beginnen met het controleren van het GY-BMP280-3.3-bord. Om dit te doen, moet je de bibliotheek in de Arduino IDE installeren, geschreven door programmeurs die aan de site werken. In de regel verschijnen er na het installeren van de bibliotheek in de Arduino IDE voorbeelden (voorbeelden) van code. Door de voorbeeldcode enigszins te wijzigen, kunnen we deze compileren in gegevens die de microcontroller begrijpt en vervolgens naar het geheugen van de microcontroller sturen. U kunt een voorbeeld (voorbeeld) vinden door op de twee onderstaande schermfoto's te letten.
Na het schrijven van gegevens naar de microcontroller van het Arduino Uno-bord, begint het onmiddellijk met het uitvoeren van het programma (code) en verzendt het de gegevens via een USB-kabel naar de computer waarop het Arduino Uno-bord is aangesloten.En we kunnen het meetresultaat van het GY-BMP280-3.3-bord zien in het Arduino IDE-venster, de zogenaamde "seriële poortmonitor".
We kunnen het resultaat van metingen op het GY-BMP280-3.3-bord zien in het standaard Windows Hyper Terminal-programma, na het sluiten van de Arduino Uno-shell en het opzetten van een sessie in het Hyper Terminal-programma. Dat wil zeggen, we kunnen de resultaten van het GY-BMP280-3.3-bord krijgen door de Arduino Uno aan te sluiten op elke computer met een USB-kabel waarop de driver voor het Arduino Uno-bord is geïnstalleerd. Er zijn verschillende bibliotheken om met GY-BMP280-3.3 te werken. Alles werkte voor mij met de bibliotheek. Het bestand dat u van deze site downloadt, ziet er als volgt uit: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Het moet worden hernoemd als: iarduino_Pressure_BMP.zip. Nu moeten we de iarduino_Pressure_BMP-bibliotheek installeren in de Arduino IDE-shell.
Start de Arduino IDE, ga naar het menu Sketch / Include Librari / Add.ZIP Library ... selecteer vervolgens het bestand iarduino_Pressure_BMP.zip en klik op de knop Openen. U moet ook de bibliotheken installeren:,. Na het installeren van de bibliotheken, herstarten we de Arduino IDE-shell, dat wil zeggen, sluiten en opnieuw starten. Selecteer vervolgens het menu Bestand / Monsters / iarduino Druk BMP (druksensoren) / voorbeeld.
We zien de code in het venster.
De code moet enigszins worden gewijzigd.
Verwijder op de vijfde regel twee schuine strepen '//' en voeg (0x76) of (0x77) toe op de elfde regel. (0x76) is het adres van het barometerbord. Mijn GY-BMP280-3.3-kaart aangesloten op de I2C-bus bleek hetzelfde adres te hebben (0x76). Hoe weet ik het nummer van het apparaat dat op de I2C-bus is aangesloten? U krijgt het antwoord op deze vraag door het volledige artikel te lezen.
Dus we hebben de code in het venster gerepareerd, nu beginnen we met het controleren en compileren van de code in het menu Sketch / Check / Compile. Als de verificatie en compilatie van de code succesvol is, starten we in het Sketch / Load-menu de programma-opname in Arduino Uno.
Als de download succesvol is, zullen we door het openen van de seriële poortmonitor in het menu: Tools / Serial Port Monitor, de gegevens zien die door de GY-BMP280-3.3-kaart zijn verzonden.
In de volgende schermafbeelding, het resultaat van het GY-BMP280-3.3-bord dat werkt op een computer waarop de Arduino IDE-shell niet is geïnstalleerd. De gegevens worden ontvangen door het PuTTY-programma.
Tegelijkertijd werd een laboratoriumaneroïdebarometer gefotografeerd, die zich naast het GY-BMP280-3.3-bord bevond. Door de meetwaarden van het instrument te vergelijken, kunt u zelf conclusies trekken over de nauwkeurigheid van het GY-BMP280-3.3-bord. Aneroïde barometer gecertificeerd door laboratorium van de staat.
Derde fase. Controle van het LCD-scherm met de I2C-interfacemodule. We vinden een LDC-display met een interfacemodule die via de I2C-bus verbinding maakt met de Arduino UNO.
We controleren de werking met voorbeelden uit de Arduino IDE-shell. Maar daarvoor bepalen we het adres van de interfacemodule. Mijn interfacemodule heeft het adres 0x3F. Ik heb dit adres in de schetslijn ingevoegd: LiquidCrystal_I2C lcd (0x3F, 16.2);
Ik heb dit adres bepaald met behulp van de schets "I2C-apparaatadresscanner" beschreven in.
Ik lanceerde de Arduino IDE-shell, uit het artikel dat ik de programmacode heb gekopieerd en het Arduino IDE-venster geplakt.
Ik begon de compilatie en schreef vervolgens de code naar het Arduino UNO-bord, waarop het GY-BMP280-3.3-bord en het LDC-display met de I2C-interfacemodule waren aangesloten. Vervolgens kreeg ik in de seriële poortmonitor het volgende resultaat. Mijn interfacemodule heeft het adres 0x3F.
Vierde fase. Controle van de DS18b20 temperatuursensor. We verbinden het als volgt.
De OneWire Arduino-bibliotheek voor het werken met de DS18b20-temperatuursensor is al geïnstalleerd.
Open het DS18x20_Temperature-monster, compileer, laad en bekijk het meetresultaat in de seriële poortmonitor. Als alles werkt, ga dan verder met de volgende stap.
Vijfde etappe. Vergadering thuis weerstations op de GY-BMP280-3.3 en Ds18b20.
We monteren het apparaat volgens het schema:
Ik heb de code voor het apparaat ontvangen door alle voorbeelden in één te combineren en de uitvoer op het LDC-scherm in te stellen. Dit is wat ik heb:
// Uncomment voor een software-implementatie van de I2C-bus: //
// #define pin_SW_SDA 3 // Wijs een Arduino-pin toe om te werken als een SDA-lijn van de I2C-softwarebus.
// #define pin_SW_SCL 9 // Wijs een Arduino-pin toe om als een SCL-lijn te werken aan de I2C-softwarebus.
// Uncomment voor compatibiliteit met de meeste boards: //
#include
#include // De iarduino-bibliotheek zal de methoden en functies van de Wire-bibliotheek gebruiken.
#include // Bibliotheek voor het werken van LDC type 1602 op de I2C-bus
//
#include // Verbind de iarduino_Pressure_BMP-bibliotheek om te werken met BMP180 of BMP280.
iarduino_Pressure_BMP-sensor (0x76); // Verklaar een sensorobject voor het werken met een druksensor met behulp van de functies en methoden van de iarduino_Pressure_BMP-bibliotheek.
LiquidCrystal_I2C lcd (0x3F, 16.2);
OneWire ds (10);
ongeldige setup () {
lcd.init ();
lcd.backlight ();
Serial.begin (9600); // Start gegevensoverdracht naar de seriële poortmonitor op 9600 baud.
vertraging (1000); // We wachten op de voltooiing van transiënten bij het toepassen van stroom
sensor.begin (73); // Start werkzaamheden met de sensor. De huidige hoogte wordt genomen op 73 m. - de hoogte van de stad Buzuluk boven zeeniveau
} //
leegte lus () {
// Lees de gegevens en geef weer: temperatuur in ° C, druk in mm. rt., verandering in hoogte ten opzichte van de opgegeven in de beginfunctie (standaard 0 meter).
lcd.setCursor (0,0); // definieer het uitgangspunt "P =" op de LDC
lcd.print ("P =");
lcd.print (sensor.pressure / 1000.3); // deel de waarde van P uitgegeven door BMP280 door 1000 en stel de uitvoer in op 3 decimalen
lcd.setCursor (12.0); // definieer het uitgangspunt "kPa" op de LDC
lcd.print ("kPa");
lcd.setCursor (0,1);
lcd.print ("T =");
lcd.print (sensor.temperatuur, 1); // stel de uitvoer in op 1 decimaal
lcd.setCursor (6.1);
// lcd.print ("C");
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1);
if (sensor.read (1)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tMM.PT.CT, \ t T = "+ sensor.temperatuur +" * C, \ t \ t B = "+ sensor.hoogte +" M. ");}
anders {Serial.println ("HET OTBETA OT CEHCOPA");}
// Lees de gegevens en geef weer: temperatuur in ° C en druk in Pa, druk in mm. rt., verandering in hoogte ten opzichte van de opgegeven in de beginfunctie (standaard 0 meter).
if (sensor.read (2)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tPa, \ t \ t T =" + sensor.temperature + "* C, \ t \ t B =" + sensor.altitude + "M.");}
anders {Serial.println ("HET OTBETA OT CEHCOPA");}
byte i;
byte aanwezig = 0;
byte type_s;
bytegegevens [12];
byte addr [8];
zweven celsius, fahrenheit;
if (! ds.search (addr)) {
Serial.println ("Geen adressen meer.");
Serial.println ();
ds.reset_search ();
vertraging (250);
terugkeer
}
Serial.print ("ROM =");
voor (i = 0; i & 8; i ++) {
Serial.write ('');
Serial.print (addr [i], HEX);
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
Serial.println ("CRC is niet geldig!");
terugkeer
}
Serial.println ();
// de eerste ROM-byte geeft aan welke chip
schakelaar (addr [0]) {
zaak 0x10:
Serial.println ("Chip = DS18S20"); // of oude DS1820
type_s = 1;
breken;
zaak 0x28:
Serial.println ("Chip = DS18B20");
type_s = 0;
breken;
zaak 0x22:
Serial.println ("Chip = DS1822");
type_s = 0;
breken;
standaard:
Serial.println ("Apparaat is geen DS18x20 familie-apparaat.");
terugkeer
}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1); // start conversie, met parasiet aan het einde aan
vertraging (1000); // misschien is 750ms genoeg, misschien ook niet
// we kunnen hier een ds.depower () doen, maar de reset zorgt ervoor.
aanwezig = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Lees Scratchpad
Serial.print ("Data =");
Serial.print (aanwezig, HEX);
Serial.print ("");
voor (i = 0; i & 9; i ++) {// hebben we 9 bytes nodig
gegevens [i] = ds.read ();
Serial.print (data [i], HEX);
Serial.print ("");
}
Serial.print ("CRC =");
Serial.print (OneWire :: crc8 (data, 8), HEX);
Serial.println ();
// Converteer de gegevens naar de werkelijke temperatuur
// omdat het resultaat een 16-bits geheel getal met teken is, zou het moeten
// worden opgeslagen in een "int16_t" -type, dat altijd 16 bits is
// zelfs wanneer gecompileerd op een 32-bits processor.
int16_t raw = (data [1] & lt; & lt; 8) | gegevens [0];
if (type_s) {
raw = raw & lt; & lt; 3; // 9 bit resolutie standaard
if (data [7] == 0x10) {
// "Count Rest" geeft een volledige resolutie van 12 bits
raw = (raw & amp; 0xFFF0) + 12 - data [6];
}
} anders {
byte cfg = (data [4] & 0x60);
// bij een lagere resolutie zijn de lage bits niet gedefinieerd, dus laten we ze op nul zetten
if (cfg == 0x00) raw = raw & amp; ~ 7; // 9 bit resolutie, 93,75 ms
anders als (cfg == 0x20) raw = raw & amp; ~ 3; // 10 bit res, 187,5 ms
anders als (cfg == 0x40) raw = raw & amp; ~ 1; // 11 bit res, 375 ms
//// standaard is 12 bit resolutie, 750 ms conversietijd
}
celsius = (float) raw / 16,0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print ("Temperature =");
Serial.print (celsius);
Serial.print ("Celsius");
Serial.print (fahrenheit);
Serial.println ("Fahrenheit");
lcd.setCursor (8.1); // definieer het uitvoerpunt "Tds =" op de LDC
lcd.print ("Tds =");
lcd.print (celsius, 1);
vertraging (3000);
}
Dit is wat ik heb:
Het GY-BMP280-3.3-bord geeft druk af in pascals, wat niet erg handig is. Ik kon het probleem niet oplossen van het maken van de uitgangsdrukgegevens van de GY-BMP280-3.3-kaart in kilopascal. Ik heb dit probleem opgelost in de uitvoerregel van het LDC-display.
lcd.print (sensor.pressure / 1000.3); // deel de waarde van P uitgegeven door BMP280 door 1000 en stel de uitvoer in op 3 decimalen
Het GY-BMP280-3.3-bord biedt ook hoogtewaarden.
sensor.begin (73); // Start werkzaamheden met de sensor. De huidige hoogte wordt genomen op 73 m. - de hoogte van de stad Buzuluk boven zeeniveau
Als u op zee wilt ontspannen en "sensor.begin (73);" op "sensor.begin (0);" in de code, en compileer en bewaar het programma dan op het weerstation thuis op de GY-BMP280-3.3 en Ds18b20, en maak een hoogte-uitvoer naar het LDC-scherm, dan krijg je ook een hoogtemeter.
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1); // Druk de hoogtewaarden af in meters met één decimaal
De stroom wordt in mijn versie via een USB-kabel aan het circuit geleverd. U kunt een 5V / 600 mA laagspannings boost-pulsomvormer gebruiken en uw weerstation wordt draagbaar. Dit type voeding is goed beschreven in artikel.
Succesvolle compilatie!