» elektronik » Arduino »Hemväderstation på GY-BMP280-3.3 och Ds18b20

Hemväderstation på GY-BMP280-3.3 och Ds18b20


Jag vill samla gör det själv instrument som mäter atmosfärstryck och temperatur. Temperaturgivaren måste vara avlägsen och tät, eftersom den måste mäta temperaturen på ett visst avstånd från enheten. Jag skulle vilja ha en sådan bärbar enhet med ett arbetsområde från -30 ° C till 50 ° C. Men detta kräver att alla komponenter ska kunna arbeta inom detta temperaturområde. Komponenter som kan arbeta i ett utökat temperaturområde är dyrare och det är svårare att köpa dem.
För att uppfylla min dröm till verklighet får jag hjälp av styrelsen, som jag beskrev i artikeln "GY-BMP280-3.3 kort för mätning av barometriskt tryck och temperatur».

Från praktiken är det känt att under montering och konfiguration elektronisk produkter före tillverkningen måste du kontrollera användbarheten för alla material och komponenter för var och en separat. Annars kan du bli förvirrad senare, och som ett resultat kommer den elektroniska produkten inte att fungera, och det kommer att vara mycket svårt att hitta orsaken till felet.

Låt oss komma igång.

Första etappen. Installera ett gratis programvaruskal på din dator Arduino IDE för att skriva program (skisser), sammanställa dem och sedan skriva dem till Mega328P mikrokontroller installerad på kortet. Jag rekommenderar att du laddar ner skalversionen av ARDUINO 1.6.5. Varför? Ursprungligen var ARDUINO-projektet ett, nu har utvecklarna spridit sig och fortsätter att utveckla ARDUINO-systemet, men var och en på sitt sätt, med små nyanser. Jag använde versionen ARDUINO 1.6.5. Det bör installeras och testas för samarbete med Arduino Uno-kortet med de enklaste exemplen.

Andra etappen. Vi kontrollerar GY-BMP280-3.3-kortet för att mäta barometriskt tryck och temperatur. Vi tar 4 trådar, vi kopplar dem GY-BMP280-3.3 och Arduino Uno, som visas på foto och diagram. Kurvor tunna flerfärgade linjer är ledare.



Låt oss börja kontrollera GY-BMP280-3.3-kortet. För att göra detta måste du installera biblioteket i Arduino IDE, skriven av programmerare som arbetar på webbplatsen. Som regel, efter installation av biblioteket i Arduino IDE, visas exempel (exempel) på kod. Genom att ändra provkoden något, kan vi kompilera den till data som är förståelig för mikrokontrollern och sedan skicka den till minnet på mikrokontrollern. Du kan hitta ett exempel (exempel) genom att uppmärksamma de två skärmbilderna nedan.


Efter att ha skrivit data till mikrokontrollern på Arduino Uno-kortet börjar den omedelbart köra programmet (kod) och skickar data via USB-kabel till datorn till vilken Arduino Uno-kortet är anslutet.Och vi kan se mätresultatet för GY-BMP280-3.3-kortet i Arduino IDE-fönstret, kallad “seriell portmonitor”.


Vi kan se resultatet av mätningar på GY-BMP280-3.3-kortet i Windows Hyper Terminal-programmet efter att ha stängt Arduino Uno-skalet och ställt in en session i Hyper Terminal-programmet. Det vill säga, vi kan få resultaten av GY-BMP280-3.3-kortet genom att ansluta Arduino Uno till vilken dator som helst med en USB-kabel på vilken drivrutinen för Arduino Uno-kortet är installerad. Det finns flera bibliotek för att arbeta med GY-BMP280-3.3. Allt fungerade för mig med biblioteket. Filen som du laddar ner från den här webbplatsen kommer att se ut så här: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Det måste byttas till: iarduino_Pressure_BMP.zip. Nu måste vi installera iarduino_Pressure_BMP-biblioteket i Arduino IDE-skalet.


Starta Arduino IDE, gå till Sketch / Include Librari / Add.ZIP Library-menyn ... välj sedan iarduino_Pressure_BMP.zip-filen och klicka på Öppna-knappen. Du måste också installera biblioteken:,. Efter att ha installerat biblioteken startar vi om Arduino IDE-skalet, det vill säga, stäng det och starta det igen. Välj sedan menyn File / Samples / iarduino Pressure BMP (trycksensorer) / exempel.

Vi ser koden i fönstret.

Koden måste ändras något.

I den femte raden tar du bort två snedstreck “//” och lägger till (0x76) eller (0x77) i den elfte raden. (0x76) är barometerkortets adress. Mitt GY-BMP280-3.3-kort anslutet till I2C-bussen visade sig ha samma adress (0x76). Hur hittar jag numret på enheten ansluten till I2C-bussen? Du får svaret på denna fråga genom att läsa hela artikeln.

Så fixade vi koden i fönstret, nu börjar vi kontrollera och sammanställa koden i menyn Sketch / Check / Compile. Om verifieringen och sammanställningen av koden är framgångsrik startar vi i Sketch / Load-menyn programinspelningen i Arduino Uno.

Om nedladdningen är framgångsrik kommer vi att se de data som skickas av GY-BMP280-3.3-kortet genom att öppna den seriella portmonitorn i menyn: Verktyg / Serial Port Monitor.

I följande skärmdump är resultatet av GY-BMP280-3.3-kortet som arbetar på en dator där Arduino IDE-skalet inte är installerat. Informationen tas emot av PuTTY-programmet.

Samtidigt fotograferades en aneroidbarometer i laboratoriet, som låg bredvid GY-BMP280-3.3-kortet. Genom att jämföra instrumentavläsningarna kan du själv dra slutsatser om GY-BMP280-3.3-kortets noggrannhet. Aneroidbarometer certifierad av statligt laboratorium.


Tredje etappen. Kontrollera LCD-skärmen med I2C-gränssnittsmodulen. Vi hittar en LDC-skärm med en gränssnittsmodul som ansluts via I2C-bussen till Arduino UNO.
Hemväderstation på GY-BMP280-3.3 och Ds18b20

Vi kontrollerar dess funktion med hjälp av exempel från Arduino IDE-skalet. Men innan det bestämmer vi adressen till gränssnittsmodulen. Min gränssnittsmodul har en adress på 0x3F. Jag satte in den här adressen i skissraden: LiquidCrystal_I2C lcd (0x3F, 16.2);
Jag bestämde den här adressen med skissen "I2C-enhetsadressskanner" som beskrivs i.
Jag lanserade Arduino IDE-skalet, från artikeln kopierade jag programkoden och klistrade in Arduino IDE-fönstret.

Jag startade sammanställningen och skrev sedan koden till Arduino UNO-kortet, till vilket GY-BMP280-3.3-kortet och LDC-skärmen med I2C-gränssnittsmodulen anslutits. Sedan fick jag följande resultat på seriell portmonitor. Min gränssnittsmodul har en adress på 0x3F.

Fjärde etappen. Kontrollera DS18b20-temperatursensorn. Vi ansluter det enligt följande.

OneWire Arduino-biblioteket för att arbeta med DS18b20-temperatursensorn är redan installerat.

Öppna DS18x20_Temperature-provet, kompilera, ladda, titta på mätresultatet i seriell portmonitor. Om allt fungerar, fortsätt till nästa steg.

Femte etappen. montering hem väderstationer på GY-BMP280-3.3 och Ds18b20.
Vi monterar enheten enligt schemat:

Jag fick koden för enheten genom att kombinera alla exempel i ett och ställa in utgången på LDC-skärmen. Här är vad jag fick:

// Avdelning för programvaruimplementering av I2C-bussen: //
// #definiera pin_SW_SDA 3 // Tilldela vilken Arduino-stift som helst som en SDA-linje i I2C-programbussen.
// #definiera pin_SW_SCL 9 // Tilldela alla Arduino-stift för att fungera som en SCL-linje till I2C-programbussen.
// Uncomment för kompatibilitet med de flesta brädor: //
#include
#include // Iarduino-biblioteket kommer att använda metoderna och funktionerna i Wire-biblioteket.
#include // Bibliotek för att arbeta LDC-typ 1602 på I2C-bussen

                                                            //
#include // Anslut iarduino_Pressure_BMP-biblioteket för att arbeta med BMP180 eller BMP280.
iarduino_Pressure_BMP sensor (0x76); // Förklara ett sensorobjekt för att arbeta med en trycksensor med hjälp av funktionerna och metoderna i iarduino_Pressure_BMP-biblioteket.
LiquidCrystal_I2C lcd (0x3F, 16,2);
OneWire ds (10);
ogiltig installation () {
    lcd.init ();
    lcd.backlight ();
    Serial.begin (9600); // Starta dataöverföring till seriell portmonitor vid 9600 baud.
    fördröjning (1000); // Vi väntar på slutförandet av transienter när vi applicerar ström
    sensor.begin (73); // Starta arbetet med sensorn. Den nuvarande höjden kommer att tas som 73 m. - höjden på staden Buzuluk över havet
} //
void loop () {
// Läs data och visa: temperatur i ° C, tryck i mm. rt., ändring i höjd relativt den som anges i startfunktionen (standard 0 meter).
lcd.setCursor (0,0); // definiera utgångspunkten "P =" på LDC
lcd.print ("P =");
lcd.print (sensor.pressure / 1000.3); // dividera värdet på P utfärdat av BMP280 med 1000 och ställ in utgången på 3 decimaler
lcd.setCursor (12,0); // definiera utgångspunkten "kPa" på LDC
lcd.print ("kPa");
lcd.setCursor (0,1);
lcd.print ("T =");
lcd.print (sensor.temperature, 1); // ställa in utgången på 1 decimal
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.temperatur +" * C, \ t \ t B = "+ sensor.altitude +" M. ");}
    annat {Serial.println ("HET OTBETA OT CEHCOPA");}
// Läs data och visa: temperatur i ° C och tryck i Pa, tryck i mm. rt., ändring i höjd relativt den som anges i startfunktionen (standard 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.");}
    annat {Serial.println ("HET OTBETA OT CEHCOPA");}
    byte i;
  byte närvarande = 0;
  byte typ_s;
  byte-data [12];
  byte addr [8];
  float celsius, fahrenheit;
  if (! ds.search (addr)) {
    Serial.println ("Inga fler adresser.");
    Serial.println ();
    ds.reset_search ();
    fördröjning (250);
    återvända;
  }
  Serial.print ("ROM =");
  för (i = 0; i & lt; 8; i ++) {
    Serial.write ('');
    Serial.print (addr [i], HEX);
  }
  if (OneWire :: crc8 (addr, 7)! = addr [7]) {
      Serial.println ("CRC är inte giltigt!");
      återvända;
  }
  Serial.println ();
  // den första ROM-byten anger vilket chip
  switch (addr [0]) {
    fall 0x10:
      Serial.println ("Chip = DS18S20"); // eller gamla DS1820
      typ_s = 1;
      break;
    fall 0x28:
      Serial.println ("Chip = DS18B20");
      typ_s = 0;
      break;
    fall 0x22:
      Serial.println ("Chip = DS1822");
      typ_s = 0;
      break;
    standard:
      Serial.println ("Enheten är inte en DS18x20-familjenhet.");
      återvända;
  }
  ds.reset ();
  ds.select (addr);
  ds.skriv (0x44, 1); // starta omvandling, med parasitström på i slutet
  
  fördröjning (1000); // Kanske räcker 750 ms, kanske inte
  // vi kanske gör en ds.depower () här, men återställningen kommer att ta hand om det.
  närvarande = ds.reset ();
  ds.select (addr);
  ds.skriv (0xBE); // Läs Scratchpad
  Serial.print ("Data =");
  Serial.print (nuvarande, HEX);
  Serial.print ("");
  för (i = 0; i & lt; 9; i ++) {// vi behöver 9 byte
    data [i] = ds.read ();
    Serial.print (data [i], HEX);
    Serial.print ("");
  }
  Serial.print ("CRC =");
  Serial.print (OneWire :: crc8 (data, 8), HEX);
  Serial.println ();
  // Konvertera data till faktisk temperatur
  // eftersom resultatet är ett 16 bitars signerat heltal, borde det
  // lagras i en typ "int16_t", som alltid är 16 bitar
  // även när det kompileras på en 32-bitars processor.
  int16_t raw = (data [1] & lt; & lt; 8) | data [0];
  if (typ_s) {
    raw = raw & lt; & lt; 3; // 9 bitars upplösning standard
    if (data [7] == 0x10) {
      // "count rest" ger full 12-bitars upplösning
      raw = (raw & amp; 0xFFF0) + 12 - data [6];
    }
  } annat {
    byte cfg = (data [4] & 0x60);
    // vid lägre res är de låga bitarna odefinierade, så låt oss noll dem
    if (cfg == 0x00) raw = raw & amp; ~ 7; // 9 bitars upplösning, 93,75 ms
    annars om (cfg == 0x20) raw = raw & amp; ~ 3; // 10 bitars res, 187,5 ms
    annars om (cfg == 0x40) raw = raw & amp; ~ 1; // 11 bitars res, 375 ms
    // // standard är 12 bitars upplösning, konverteringstid på 750 ms
  }
  celsius = (flyta) rå / 16,0;
  fahrenheit = celsius * 1,8 + 32,0;
  Serial.print ("Temperatur =");
  Serial.print (celsius);
  Serial.print ("Celsius,");
  Serial.print (fahrenheit);
  Serial.println ("Fahrenheit");
lcd.setCursor (8.1); // definiera utgångspunkten "Tds =" på LDC
lcd.print ("Tds =");
lcd.print (celsius, 1);
    fördröjning (3000);
}


Här är vad jag fick:


GY-BMP280-3.3-kortet ger ut tryck i pascaler, vilket inte är särskilt bekvämt. Jag kunde inte lösa problemet med att göra GY-BMP280-3.3-kortets utgångstryckdata i kilopascals. Jag löst detta problem i utgångslinjen på LDC-skärmen.

lcd.print (sensor.pressure / 1000.3); // dividera värdet på P utfärdat av BMP280 med 1000 och ställ in utgången på 3 decimaler
GY-BMP280-3.3-kortet ger också höjdvärden.

sensor.begin (73); // Starta arbetet med sensorn. Den nuvarande höjden kommer att tas som 73 m. - höjden på staden Buzuluk över havet
Om du kopplar av till sjöss och byter "sensor.begin (73);" på "sensor.begin (0);" i koden, och sedan kompilera och spara programmet till hemmaväderstationen på GY-BMP280-3.3 och Ds18b20, och göra en höjdutgång till LDC-skärmen, får du också en höjdmätare.
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1); // Skriv ut höjdvärdena i meter med en decimal
Strömmen matas till kretsen i min version via en USB-kabel. Du kan använda en 5V / 600 mA lågspänningsimpulsomvandlare och din väderstation blir bärbar. Denna typ av strömförsörjning beskrivs väl i Artikel.

Framgångsrik sammanställning!
5
8.8
6.3

Lägg till en kommentar

    • lelerxaxaOKdontknowyahoonea
      bossscratchluraJaja-jaaggressivhemlighet
      ledsendansdance2dance3benådningHjälpdrycker
      stoppvännerbragoodgoodvisselpipasvimningsanfalltunga
      rökklapparcraydeclarehånfulldon-t_mentionnedladdning
      hettaRASANDElaugh1mdamötemoskingnegativ
      not_ipopcornstraffalässkrämmalarmrapportersök
      hånthank_youdettato_clueumnikakutöverens
      illabeeeblack_eyeblum3rougeskrytaledan
      censureradepleasantrysecret2hotasegeryusun_bespectacled
      shokrespektlolprevedvälkommenkrutoyya_za
      ya_dobryihjälparene_huliganne_othodiFLUDförbudstänga

Vi rekommenderar att du läser:

Räcka den till smarttelefonen ...