» Elektronik » Arduino »Heimwetterstation auf dem GY-BMP280-3.3 und Ds18b20

Heimwetterstation auf GY-BMP280-3.3 und Ds18b20


Ich möchte sammeln mit seinen eigenen Händen Instrument zur Messung von Luftdruck und Temperatur. Der Temperatursensor muss entfernt und dicht sein, da er die Temperatur in einem bestimmten Abstand vom Gerät messen muss. Ich hätte gerne ein solches tragbares Gerät mit einem Arbeitsbereich von -30 ° C bis 50 ° C. Dies setzt jedoch voraus, dass alle Komponenten in diesem Temperaturbereich arbeiten können. Komponenten, die in einem erweiterten Temperaturbereich arbeiten können, sind teurer und schwieriger zu kaufen.
Um meinen Traum in die Realität umzusetzen, wird mir das Board helfen, das ich im Artikel „GY-BMP280-3.3-Karte zur Messung von Luftdruck und Temperatur».

Aus der Praxis ist bekannt, dass während der Montage und Konfiguration elektronisch Bei Produkten müssen Sie vor der Herstellung die Gebrauchstauglichkeit aller Materialien und Komponenten einzeln prüfen. Andernfalls können Sie später verwirrt werden. Infolgedessen funktioniert das elektronische Produkt nicht und es ist sehr schwierig, die Ursache für die Fehlfunktion zu finden.

Fangen wir an.

Erste Stufe. Installieren Sie eine kostenlose Software-Shell auf Ihrem Computer Arduino IDE zum Schreiben von Programmen (Skizzen), zum Kompilieren und anschließenden Schreiben auf den auf der Karte installierten Mega328P-Mikrocontroller. Ich empfehle Ihnen, die Shell-Version von ARDUINO 1.6.5 herunterzuladen. Warum? Ursprünglich war das ARDUINO-Projekt eines, jetzt haben die Entwickler das ARDUINO-System aufgelöst und entwickeln es weiter, aber jedes auf seine eigene Art und Weise mit kleinen Nuancen. Ich habe die Version ARDUINO 1.6.5 verwendet. Es sollte installiert und für die Zusammenarbeit mit dem Arduino Uno-Board anhand der einfachsten Beispiele getestet werden.

Zweite Stufe. Wir überprüfen die GY-BMP280-3.3-Karte auf Luftdruck und Temperatur. Wir nehmen 4 Drähte und verbinden sie mit GY-BMP280-3.3 und Arduino Uno, wie auf dem Foto und in der Abbildung gezeigt. Kurven dünne mehrfarbige Linien sind Leiter.



Beginnen wir mit der Überprüfung der GY-BMP280-3.3-Karte. Dazu müssen Sie die Bibliothek in der Arduino IDE installieren, die von Programmierern geschrieben wurde, die an der Site arbeiten. In der Regel werden nach der Installation der Bibliothek in der Arduino IDE Beispiele (Beispiele) für Code angezeigt. Durch geringfügiges Ändern des Beispielcodes können wir ihn in Daten kompilieren, die der Mikrocontroller versteht, und ihn dann an den Speicher des Mikrocontrollers senden. Sie finden ein Beispiel (Beispiel), indem Sie auf die beiden folgenden Bildschirmfotos achten.


Nach dem Schreiben von Daten auf den Mikrocontroller der Arduino Uno-Karte beginnt diese sofort mit der Ausführung des Programms (Code) und sendet die Daten über ein USB-Kabel an den Computer, an den die Arduino Uno-Karte angeschlossen ist.Und wir können das Messergebnis der GY-BMP280-3.3-Karte im Arduino IDE-Fenster sehen, das als „Serial Port Monitor“ bezeichnet wird.


Das Ergebnis der Messungen auf der GY-BMP280-3.3-Karte wird im Standardprogramm von Windows Hyper Terminal angezeigt, nachdem die Arduino Uno-Shell geschlossen und eine Sitzung im Programm Hyper Terminal eingerichtet wurde. Das heißt, wir können die Ergebnisse der GY-BMP280-3.3-Karte erhalten, indem wir das Arduino Uno mit einem USB-Kabel an einen beliebigen Computer anschließen, auf dem der Treiber für die Arduino Uno-Karte installiert ist. Es gibt mehrere Bibliotheken für die Arbeit mit GY-BMP280-3.3. Mit der Bibliothek hat alles für mich funktioniert. Die Datei, die Sie von dieser Site herunterladen, sieht folgendermaßen aus: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Es muss umbenannt werden in: iarduino_Pressure_BMP.zip. Jetzt müssen wir die Bibliothek iarduino_Pressure_BMP in der Arduino IDE-Shell installieren.


Starten Sie die Arduino IDE, gehen Sie zum Menü Sketch / Include Librari / Add.ZIP Library ... wählen Sie die Datei iarduino_Pressure_BMP.zip aus und klicken Sie auf die Schaltfläche Öffnen. Sie müssen auch die Bibliotheken installieren:,. Nach der Installation der Bibliotheken starten wir die Arduino IDE-Shell neu, schließen sie und starten sie erneut. Wählen Sie dann das Menü Datei / Proben / iarduino Druck BMP (Drucksensoren) / Beispiel.

Wir sehen den Code im Fenster.

Der Code muss leicht geändert werden.

Entfernen Sie in der fünften Zeile zwei Schrägstriche "//" und fügen Sie in der elften Zeile (0x76) oder (0x77) hinzu. (0x76) ist die Adresse der Barometerplatine. Meine an den I2C-Bus angeschlossene GY-BMP280-3.3-Karte hatte dieselbe Adresse (0x76). Wie finde ich die Nummer des an den I2C-Bus angeschlossenen Geräts heraus? Sie erhalten die Antwort auf diese Frage, indem Sie den vollständigen Artikel lesen.

Also haben wir den Code im Fenster korrigiert und beginnen nun, den Code im Menü Skizzieren / Prüfen / Kompilieren zu überprüfen und zu kompilieren. Wenn die Überprüfung und Kompilierung des Codes erfolgreich ist, starten wir im Menü Skizzieren / Laden die Programmaufzeichnung in Arduino Uno.

Wenn der Download erfolgreich ist, werden durch Öffnen des Serial Port Monitors im Menü: Tools / Serial Port Monitor die von der GY-BMP280-3.3-Karte gesendeten Daten angezeigt.

Im folgenden Screenshot wird das Ergebnis der GY-BMP280-3.3-Karte auf einem Computer angezeigt, auf dem die Arduino IDE-Shell nicht installiert ist. Die Daten werden vom PuTTY-Programm empfangen.

Gleichzeitig wurde ein Labor-Aneroid-Barometer fotografiert, das sich neben der GY-BMP280-3.3-Platine befand. Durch Vergleichen der Instrumentenablesungen können Sie selbst Rückschlüsse auf die Genauigkeit der GY-BMP280-3.3-Karte ziehen. Aneroidbarometer vom staatlichen Labor zertifiziert.


Dritte Stufe. Überprüfen der LCD-Anzeige mit dem I2C-Schnittstellenmodul. Wir finden ein LDC-Display mit einem Schnittstellenmodul, das über den I2C-Bus mit dem Arduino UNO verbunden ist.
Heimwetterstation auf GY-BMP280-3.3 und Ds18b20

Wir überprüfen die Funktionsweise anhand von Beispielen aus der Arduino IDE-Shell. Zuvor bestimmen wir jedoch die Adresse des Schnittstellenmoduls. Mein Schnittstellenmodul hat eine Adresse von 0x3F. Ich habe diese Adresse in die Skizzenzeile eingefügt: LiquidCrystal_I2C lcd (0x3F, 16.2);
Ich habe diese Adresse anhand der in beschriebenen Skizze „I2C-Geräteadressenscanner“ ermittelt.
Ich habe die Arduino IDE-Shell gestartet, aus dem Artikel habe ich den Programmcode kopiert und das Arduino IDE-Fenster eingefügt.

Ich habe mit der Kompilierung begonnen und dann den Code auf die Arduino UNO-Karte geschrieben, an die die GY-BMP280-3.3-Karte und das LDC-Display mit dem I2C-Schnittstellenmodul angeschlossen waren. Dann habe ich im seriellen Port-Monitor das folgende Ergebnis erhalten. Mein Schnittstellenmodul hat eine Adresse von 0x3F.

Vierte Stufe. Überprüfen des Temperatursensors DS18b20. Wir verbinden es wie folgt.

Die OneWire Arduino Library für die Arbeit mit dem DS18b20-Temperatursensor ist bereits installiert.

Öffnen Sie das Beispiel DS18x20_Temperature, kompilieren Sie es, laden Sie es und beobachten Sie das Messergebnis im Monitor der seriellen Schnittstelle. Wenn alles funktioniert, fahren Sie mit dem nächsten Schritt fort.

Fünfte Stufe. Montage nach Hause Wetterstationen auf dem GY-BMP280-3.3 und Ds18b20.
Wir montieren das Gerät nach dem Schema:

Ich habe den Code für das Gerät erhalten, indem ich alle Beispiele zu einem zusammengefasst und die Ausgabe auf dem LDC-Bildschirm eingestellt habe. Folgendes habe ich bekommen:

// Kommentar für eine Software-Implementierung des I2C-Busses: //
// #define pin_SW_SDA 3 // Weisen Sie einen beliebigen Arduino-Pin als SDA-Leitung des I2C-Softwarebusses zu.
// #define pin_SW_SCL 9 // Weisen Sie dem I2C-Softwarebus einen beliebigen Arduino-Pin zu, der als SCL-Leitung fungiert.
// Kommentar zur Kompatibilität mit den meisten Boards: //
#include
#include // Die iarduino-Bibliothek verwendet die Methoden und Funktionen der Wire-Bibliothek.
#include // Bibliothek zum Arbeiten mit LDC Typ 1602 auf dem I2C-Bus

                                                            // //
#include // Verbinden Sie die Bibliothek iarduino_Pressure_BMP mit BMP180 oder BMP280.
iarduino_Pressure_BMP-Sensor (0x76); // Deklarieren Sie ein Sensorobjekt für die Arbeit mit einem Drucksensor mit den Funktionen und Methoden der Bibliothek iarduino_Pressure_BMP.
LiquidCrystal_I2C lcd (0x3F, 16,2);
OneWire ds (10);
void setup () {
    lcd.init ();
    lcd.backlight ();
    Serial.begin (9600); // Initiieren Sie die Datenübertragung zum Monitor für die serielle Schnittstelle bei 9600 Baud.
    Verzögerung (1000); // Wir warten auf den Abschluss von Transienten, wenn Strom angelegt wird
    sensor.begin (73); // Arbeit mit dem Sensor beginnen. Die aktuelle Höhe wird mit 73 m angenommen - der Höhe der Stadt Buzuluk über dem Meeresspiegel
} // //
void loop () {
// Daten lesen und anzeigen: Temperatur in ° C, Druck in mm. rt., Änderung der Höhe relativ zu der in der Startfunktion angegebenen (Standard 0 Meter).
lcd.setCursor (0,0); // Definiere den Ausgabepunkt "P =" auf dem LDC
lcd.print ("P =");
lcd.print (sensor.pressure / 1000.3); // dividiere den von BMP280 ausgegebenen Wert von P durch 1000 und setze die Ausgabe von 3 Dezimalstellen
lcd.setCursor (12.0); // Definiere den Ausgabepunkt "kPa" auf dem LDC
lcd.print ("kPa");
lcd.setCursor (0,1);
lcd.print ("T =");
lcd.print (Sensortemperatur, 1); // setze die Ausgabe von 1 Dezimalstelle
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.temperature +" * C, \ t \ t B = "+ sensor.altitude +" M. ");}
    sonst {Serial.println ("HET OTBETA OT CEHCOPA");}
// Daten lesen und anzeigen: Temperatur in ° C und Druck in Pa, Druck in mm. rt., Änderung der Höhe relativ zu der in der Startfunktion angegebenen (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.");}
    sonst {Serial.println ("HET OTBETA OT CEHCOPA");}
    Byte i;
  Byte vorhanden = 0;
  Byte type_s;
  Byte-Daten [12];
  Byte-Adresse [8];
  float celsius, fahrenheit;
  if (! ds.search (addr)) {
    Serial.println ("Keine Adressen mehr.");
    Serial.println ();
    ds.reset_search ();
    Verzögerung (250);
    zurück
  }}
  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 ist ungültig!");
      zurück
  }}
  Serial.println ();
  // Das erste ROM-Byte gibt an, welcher Chip
  switch (addr [0]) {
    Fall 0x10:
      Serial.println ("Chip = DS18S20"); // oder alter DS1820
      type_s = 1;
      Pause;
    Fall 0x28:
      Serial.println ("Chip = DS18B20");
      type_s = 0;
      Pause;
    Fall 0x22:
      Serial.println ("Chip = DS1822");
      type_s = 0;
      Pause;
    Standard:
      Serial.println ("Gerät ist kein Gerät der DS18x20-Familie.");
      zurück
  }}
  ds.reset ();
  ds.select (addr);
  ds.write (0x44, 1); // Konvertierung starten, am Ende mit eingeschaltetem Parasiten
  
  Verzögerung (1000); // vielleicht sind 750ms genug, vielleicht auch nicht
  // Wir könnten hier ein ds.depower () machen, aber das Zurücksetzen wird sich darum kümmern.
  present = ds.reset ();
  ds.select (addr);
  ds.write (0xBE); // Scratchpad lesen
  Serial.print ("Data =");
  Serial.print (vorhanden, HEX);
  Serial.print ("");
  für (i = 0; i & lt; 9; i ++) {// benötigen wir 9 Bytes
    Daten [i] = ds.read ();
    Serial.print (Daten [i], HEX);
    Serial.print ("");
  }}
  Serial.print ("CRC =");
  Serial.print (OneWire :: crc8 (Daten, 8), HEX);
  Serial.println ();
  // Konvertiere die Daten in die tatsächliche Temperatur
  // Da das Ergebnis eine 16-Bit-Ganzzahl mit Vorzeichen ist, sollte dies der Fall sein
  // in einem "int16_t" -Typ gespeichert werden, der immer 16 Bit beträgt
  // auch wenn auf einem 32-Bit-Prozessor kompiliert.
  int16_t raw = (Daten [1] & lt; & lt; 8) | Daten [0];
  if (type_s) {
    roh = roh & lt; & lt; 3; // 9 Bit Standardauflösung
    if (data [7] == 0x10) {
      // "Anzahl bleibt" ergibt die volle 12-Bit-Auflösung
      raw = (raw & amp; 0xFFF0) + 12 - Daten [6];
    }}
  } else {
    Byte cfg = (Daten [4] & amp; 0x60);
    // Bei niedrigerer Auflösung sind die niedrigen Bits undefiniert, also lasst sie uns auf Null setzen
    if (cfg == 0x00) raw = raw & amp; ~ 7; // 9 Bit Auflösung, 93,75 ms
    sonst wenn (cfg == 0x20) raw = raw & amp; ~ 3; // 10 Bit res, 187,5 ms
    sonst wenn (cfg == 0x40) raw = raw & amp; ~ 1; // 11 Bit res, 375 ms
    //// Standard ist 12 Bit Auflösung, 750 ms Konvertierungszeit
  }}
  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); // Definiere den Ausgabepunkt "Tds =" auf dem LDC
lcd.print ("Tds =");
lcd.print (celsius, 1);
    Verzögerung (3000);
}}


Folgendes habe ich bekommen:


Die GY-BMP280-3.3-Karte gibt Druck in Pascal ab, was nicht sehr praktisch ist. Ich konnte das Problem nicht lösen, wie die Ausgangsdruckdaten der GY-BMP280-3.3-Karte in Kilopascal erstellt werden. Ich habe dieses Problem in der Ausgabezeile des LDC-Displays gelöst.

lcd.print (sensor.pressure / 1000.3); // dividiere den von BMP280 ausgegebenen Wert von P durch 1000 und setze die Ausgabe von 3 Dezimalstellen
Die Karte GY-BMP280-3.3 bietet auch Höhenwerte.

sensor.begin (73); // Arbeit mit dem Sensor beginnen. Die aktuelle Höhe wird mit 73 m angenommen - der Höhe der Stadt Buzuluk über dem Meeresspiegel
Wenn Sie sich auf See entspannen und "sensor.begin (73)" ändern möchten; auf "sensor.begin (0);" Wenn Sie das Programm im Code kompilieren und in der Heimwetterstation auf dem GY-BMP280-3.3 und Ds18b20 speichern und eine Höhenausgabe auf dem LDC-Display vornehmen, erhalten Sie auch einen Höhenmesser.
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1); // Drucke die Höhenwerte in Metern mit einer Dezimalstelle
Die Stromversorgung der Schaltung in meiner Version erfolgt über ein USB-Kabel. Sie können einen 5V / 600 mA-Niederspannungs-Boost-Impulswandler verwenden, und Ihre Wetterstation wird tragbar. Diese Art der Stromversorgung ist in ausführlich beschrieben Artikel.

Erfolgreiche Zusammenstellung!
5
8.8
6.3

Kommentar hinzufügen

    • lächelnlächeltxaxaokweiß nichtYahoonea
      ChefKratzerDummkopfjaja-jaaggressivGeheimnis
      Entschuldigungtanzendance2Tanz3VerzeihungHilfeGetränke
      hör aufFreundegutgut gutpfeifenOhnmachtZunge
      RauchklatschenCrayerklärenspöttischdon-t_mentionherunterladen
      Hitzeärgerlichlach1mdaTreffenMoskingnegativ
      not_iPopcornbestrafenlesenerschreckenAngstSuche
      verspottendankedasto_clueumnikakutstimme zu
      schlechtbeeeblack_eyeblum3errötenprahlenLangeweile
      zensiertAngenehmheitsecret2drohenSiegyusun_bespectacled
      shokrespektlolvorgezogenWillkommenKrutoyya_za
      ya_dobryiHelferne_huliganne_othodiFludVerbotschließen

Wir empfehlen Ihnen zu lesen:

Gib es für das Smartphone ...