Heimwetterstation mit arduino-drahtlosem Sensor. Heimwetterstation auf Arduino und Senden von Daten an "People's Monitoring". Weiter zum Update

Als ich durch die Stadt spazierte, sah ich ein neues Elektronikgeschäft, das eröffnet wurde. Nachdem ich es betreten hatte, fand ich eine große Anzahl von Schilden für Arduina. Ich hatte ein Arduino Uno zu Hause und ein Arduino Nano kam sofort auf die Idee, mit Signalgebern aus der Ferne zu spielen. Ich habe mich für den günstigsten 433 MHz Sender und Empfänger entschieden:

Signalgeber.


Signalempfänger.

Nachdem die einfachste Skizze der Datenübertragung aufgeschrieben wurde (ein Beispiel ist hier entnommen), stellte sich heraus, dass Übertragungsgeräte für die Übertragung einfachster Daten wie Temperatur, Luftfeuchtigkeit durchaus geeignet sein können.

Der Sender hat folgende Eigenschaften:
1. Modell: MX -FS - 03V
2. Aktionsradius (abhängig von der Anwesenheit von behindernden Objekten): 20-200 Meter
3. Arbeitsspannung: 3,5 -12V
4. Modulabmessungen: 19 * 19 mm
5. Signalmodulation: AM
6. Sendeleistung: 10mW
7. Frequenz: 433 MHz
8. Erforderliche Länge der externen Antenne: 25cm
9. Einfach anzuschließen (nur drei Drähte): DATEN; VCC; Erde.

Eigenschaften des Empfangsmoduls:
1. Arbeitsspannung: DC 5V
2. Strom: 4mA
3. Arbeitsfrequenz: 433,92 MHz
4. Empfindlichkeit: - 105dB
5. Modulabmessungen: 30 * 14 * 7 mm
6. Externe Antenne erforderlich: 32 cm.

In den Weiten des Internets heißt es, dass die Übertragungsreichweite von Informationen bei 2Kb/s bis zu 150m betragen kann. Ich habe es selbst nicht überprüft, aber in einer Zweizimmerwohnung akzeptiert es überall.

Hardware der Heimwetterstation

Nach einigen Experimenten entschied ich mich, einen Temperatur-, Feuchtigkeitssensor und einen Sender an den Arduino Nano anzuschließen.


Der Temperatursensor DS18D20 wird wie folgt an das Arduino angeschlossen:

1) GND zum Minus des Mikrocontrollers.
2) DQ über einen Pull-Up-Widerstand an Masse und an den D2-Pin von Arduino
3) Vdd bis + 5V.

Das Sendemodul MX-FS - 03V wird mit 5 Volt gespeist, der Datenausgang (ADATA) ist mit dem D13 Pin verbunden.

An Arduino Uno schloss ein LCD-Display und ein BMP085-Barometer an.


Anschlussplan zu arduino uno

Der Signalempfänger wird an Pin D10 angeschlossen.

Das Modul BMP085 ist ein digitaler Atmosphärendrucksensor. Mit dem Sensor können Sie Temperatur, Druck und Höhe messen. Anschlussschnittstelle: I2C. Sensorversorgungsspannung 1,8-3,6 V

Das Modul wird wie andere I2C-Geräte mit dem Arduino verbunden:

  • VCC - VCC (3,3 V);
  • GND - GND;
  • SCL - an analogen Pin 5;
  • SDA - an analogen Pin 4.
  • Sehr niedrige Kosten
  • Strom und I/O 3-5V
  • Bestimmung der Luftfeuchtigkeit 20-80% mit 5% Genauigkeit
  • Bestimmung der Temperatur 0-50 Grad. mit 2% Genauigkeit
  • Die Abtastrate beträgt nicht mehr als 1 Hz (nicht mehr als einmal alle 1 Sek.)
  • Abmessungen 15,5 mm x 12 mm x 5,5 mm
  • 4 Stiftabstand 0,1"

DHT hat 4 Pins:

  1. Vcc (3-5V Stromversorgung)
  2. Datenausgabe - Datenausgabe
  3. Wird nicht benutzt
  4. Allgemein

Verbindet mit D8 Arduino.

Der Softwareteil der Heimwetterstation

Das Sendemodul misst und sendet die Temperatur alle 10 Minuten.

Nachfolgend das Programm:

/ * Sketch Version 1.0 Temperatur alle 10min senden. * / #include #include #include #define ONE_WIRE_BUS 2 // Pin zum Anschluss des Dallas OneWire oneWire-Sensors (ONE_WIRE_BUS); DallasTemperatursensoren (& oneWire); Geräteadresse im Thermometer; void setup (void) (//Serial.begin(9600); vw_set_ptt_inverted (true); // Erforderlich für DR3100 vw_setup (2000); // Baudrate (bps) einstellen Sensoren.begin (); if (! Sensoren .getAddress (insideThermometer, 0)); printAddress (insideThermometer); sensoren.setResolution (insideThermometer, 9);) void printTemperature (DeviceAddress deviceAddress) (float tempC = Sensoren.getTempC (deviceAddress); //Serial.print(Temp C: ") ; //Serial.println(tempC); // Daten bilden zum Senden int number = tempC; char symbol =" c "; // Servicesymbol zur Feststellung, dass es sich um einen Sensor handelt String strMsg =" z "; strMsg + = symbol ; strMsg + = ""; strMsg + = Zahl; strMsg + = ""; char msg; strMsg.toCharArray (msg, 255); vw_send ((uint8_t *) msg, strlen (msg)); vw_wait_tx (); / / Wir warten auf den Transfer zum Ende der Verzögerung (200);) void loop (void) (for (int j = 0; j<= 6; j++) { sensors.requestTemperatures(); printTemperature(insideThermometer); delay(600000); } } //Определение адреса void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16); //Serial.print("0"); //Serial.print(deviceAddress[i], HEX); } }

Das Empfangsgerät empfängt die Daten, misst Druck und Temperatur im Raum und sendet sie an das Display.

#include #include LiquidCrystal-LCD (12, 10, 5, 4, 3, 2); #include dht11-Sensor; #define DHT11PIN 8 #include #include BMP085 dps = BMP085 (); lang Temperatur = 0, Druck = 0, Höhe = 0; void setup () (Serial.begin (9600); vw_set_ptt_inverted (true); // Erforderlich für DR3100 vw_setup (2000); // Setze die Empfangsrate vw_rx_start (); // Starte die Überwachung des Broadcasts lcd.begin (16, 2 ); Wire.begin (); delay (1000); dps.init (); //lcd.setCursor(14,0); //lcd.write(byte(0)); //lcd.home (); ) void loop () (uint8_t buf; // Puffer für Nachricht uint8_t buflen = VW_MAX_MESSAGE_LEN; // Pufferlänge if (vw_get_message (buf, & buflen)) // Wenn eine Nachricht empfangen wird (// Parsing starten int i; // Wenn die Nachricht nicht an uns adressiert ist, beenden Sie if (buf! = "z") (return;) char command = buf; // Der Befehl steht bei Index 2 // Der numerische Parameter beginnt bei Index 4 i = 4; int number = 0; // Da die Übertragung zeichenweise erfolgt, müssen Sie den Zeichensatz in eine Zahl umwandeln while (buf [i]! = "") (number * = 10; number + = buf [i] - "0"; i ++;) dps.getPressure (& Pressure); dps.getAltitude (& Altitude); dps.getTemperature (& Temperature); //Serial.print (Befehl); Serial.print (""); Serial.println (Nummer); lcd.print ("T ="); lcd.setCursor (2.0); lcd.print (Nummer); lcd.setCursor (5.0); lcd.print ("P ="); lcd.print (Druck / 133,3); lcd.print ("mmH"); lcd.setCursor (0,1); lcd.print ("T ="); lcd.print (Temperatur * 0,1); lcd.print ("H ="); lcd.print (Sensor.Feuchtigkeit); lcd.home(); // Verzögerung (2000); int chk = sensor.read (DHT11PIN); switch (chk) (case DHTLIB_OK: //Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: //Serial.println("Checksum error"); break; case DHTLIB_ERROR_TIMEOUT: //Serial.println("Time out error "); break; default: //Serial.println("Unbekannter Fehler"); break;)))

PS In Zukunft plane ich folgendes hinzuzufügen:
- Feuchtesensor zum Sender, überarbeiten Sie den Datenübertragungsalgorithmus
- ein Sensor zur Messung der Windgeschwindigkeit und -richtung.
- Fügen Sie dem empfangenden Gerät ein weiteres Display hinzu.
- Empfänger und Sender auf einen separaten Mikrocontroller übertragen.

Unten hänge ich ein Foto von dem an, was passiert ist:

Liste der Radioelemente

Bezeichnung Art der Konfession Menge NotizEinkaufenMein Notebook
Übertragender Teil.
Arduino-Board

Arduino Nano 3.0

1 In den Notizblock
Temperatursensor

DS18B20

1 In den Notizblock
Widerstand

220 Ohm

1 In den Notizblock
SendermodulMX-FS-03V (433 MHz)1 In den Notizblock
Funkempfangsteil.
Arduino-Board

Arduino Uno

1 In den Notizblock
Trimmerwiderstand 1 In den Notizblock
Widerstand

Kürzlich hat ein Kollege von mir eine kleine Wissenschaftsausstellung veranstaltet.
Mein Lehrer bat mich, Studenten ein Elektronikprojekt vorzustellen. Ich hatte zwei Tage Zeit, mir etwas Interessantes und Einfaches einfallen zu lassen.



Da die Wetterbedingungen hier recht wechselhaft sind und die Temperatur im Bereich von 30-40 °C schwankt, habe ich mich für eine Heimwetterstation entschieden.

Welche Funktionen hat eine Heimwetterstation?
Die Arduino Wetterstation mit Display ist ein Gerät, das mit einer Vielzahl von Sensoren Daten über Wetter- und Umgebungsbedingungen sammelt.

In der Regel sind dies die folgenden Sensoren:

  • der Wind
  • Feuchtigkeit
  • Regen
  • Temperatur
  • Druck
  • Höhen

Mein Ziel ist es, mit meinen eigenen Händen eine tragbare Desktop-Wetterstation zu bauen.

Sie muss in der Lage sein, die folgenden Parameter zu bestimmen:

  • Temperatur
  • Feuchtigkeit
  • Druck
  • die Höhe

Schritt 1: Kaufen Sie die notwendigen Komponenten







  • DHT22, Temperatur- und Feuchtigkeitssensor.
  • BMP180, Drucksensor.
  • Lot
  • Einreihiger 40-poliger Steckverbinder

Von der Ausrüstung benötigen Sie:

  • Lötkolben
  • Nasenpadzange
  • Drähte

Schritt 2: DHT22 Temperatur- und Feuchtigkeitssensor







Zur Temperaturmessung werden verschiedene Sensoren verwendet. Beliebt sind DHT22, DHT11, SHT1x

Ich werde erklären, wie sie sich voneinander unterscheiden und warum ich DHT22 verwendet habe.

Der Sensor AM2302 verwendet ein digitales Signal. Dieser Sensor verwendet ein einzigartiges Codierungssystem und eine einzigartige Sensortechnologie, sodass seine Daten zuverlässig sind. Sein Sensorelement ist mit einem 8-Bit-Single-Chip-Computer verbunden.

Jeder Sensor dieses Modells ist temperaturkompensiert und präzise kalibriert, der Kalibrierfaktor wird in einem einmalig programmierbaren Speicher (OTP-Speicher) gespeichert. Beim Ablesen von Messwerten ruft der Sensor den Koeffizienten aus dem Speicher ab.

Kleine Abmessungen, geringer Stromverbrauch, lange Übertragungsdistanz (100 m) machen den AM2302 für fast alle Anwendungen geeignet, und 4 Ausgänge in einer Reihe machen die Installation sehr einfach.

Werfen wir einen Blick auf die Vor- und Nachteile der drei Sensormodelle.

DHT11

Vorteile: kein Löten erforderlich, das günstigste der drei Modelle, schnelles stabiles Signal, Reichweite über 20 m, starke Störungen.
Nachteile: Bibliothek! Keine Auflösungsoptionen, Temperaturmessfehler +/- 2 ° , relativer Luftfeuchtigkeitsmessfehler +/- 5 %, unzureichender Bereich der gemessenen Temperaturen (0-50 ° ).
Anwendungen: Gartenarbeit, Landwirtschaft.

DHT22

Vorteile: kein Löten erforderlich, geringe Kosten, geglättete Kurven, kleine Messfehler, großer Messbereich, Reichweite über 20 m, starke Störungen.
Nachteile: Empfindlichkeit könnte höher sein, langsame Verfolgung von Temperaturänderungen, Bibliothek erforderlich.
Anwendungen: Umweltstudien.

SHT1x

Vorteile: kein Löten erforderlich, glatte Kurven, kleine Messfehler, schnelle Reaktion, geringer Stromverbrauch, automatischer Ruhezustand, hohe Stabilität und Datenkonsistenz.
Nachteile: zwei digitale Schnittstellen, ein Fehler bei der Messung der Luftfeuchtigkeit, der gemessene Temperaturbereich beträgt 0-50 ° C, eine Bibliothek wird benötigt.
Anwendungen: Betrieb unter rauen Bedingungen und in Langzeitinstallationen. Alle drei Sensoren sind relativ preiswert.

Verbindung

  • Vcc - 5V oder 3,3V
  • Gnd - mit Gnd
  • Daten - zum zweiten Pin von Arduino

Schritt 3: Drucksensor BMP180



BMP180 ist ein barometrischer Drucksensor mit I2C-Schnittstelle.
Barometrische Drucksensoren messen den Absolutwert der Umgebungsluft. Dieser Wert hängt von den spezifischen Wetterbedingungen und von der Höhe ab.

Das BMP180 Modul hatte einen 3,3V 662kOhm Regler, den ich aus eigener Dummheit aus Versehen gesprengt habe. Ich musste Power Tracing direkt zum Chip machen.

Aufgrund des fehlenden Stabilisators bin ich bei der Wahl der Stromquelle eingeschränkt - eine Spannung höher als 3,3V zerstört den Sensor.
Andere Modelle haben möglicherweise keinen Stabilisator, achten Sie darauf, einen zu finden.

Anschlussplan von Sensor und I2C-Bus mit Arduino (Nano oder Uno)

  • SDA - A4
  • SCL - A5
  • VCC - 3,3 V
  • Masse - Masse

Lassen Sie uns ein wenig über Druck und seine Beziehung zu Temperatur und Höhe sprechen.

Der atmosphärische Druck ist an keiner Stelle konstant. Die komplexen Wechselwirkungen zwischen der Erdrotation, der Erdneigung, führen zu vielen Hoch- und Tiefdruckgebieten, die wiederum zu einem täglichen Wechsel der Wetterbedingungen führen. Durch Beobachten der Druckänderung können Sie eine kurzfristige Vorhersage des Wetters machen.

Druckabfall bedeutet beispielsweise meist Regenwetter oder ein drohendes Gewitter (Annähern an ein Tiefdruckgebiet, Zyklon). Steigender Druck bedeutet normalerweise trockenes, klares Wetter (ein Hochdruckgebiet, ein Hochdruckgebiet zieht über Sie hinweg).

Der Luftdruck ändert sich auch mit der Höhe. Der Absolutdruck im Basislager am Everest (5400 m ü. M.) ist niedriger als der Absolutdruck in Delhi (216 m ü. M.).

Da sich die Absolutdruckwerte an jedem Standort ändern, beziehen wir uns auf den relativen Druck oder den Meeresspiegeldruck.

Höhenmessung

Der durchschnittliche Druck auf Meereshöhe beträgt 1013,25 GPa (oder Millibar). Steigt man über die Atmosphäre, sinkt dieser Wert auf Null. Die Kurve für diesen Tropfen ist gut verständlich, sodass Sie die Höhe mit folgender Gleichung selbst berechnen können: alti = 44330 *

Wenn Sie den Meeresspiegeldruck von 1013,25 GPa als p0 nehmen, ist die Lösung der Gleichung Ihre aktuelle Höhe.

Vorsichtsmaßnahmen

Denken Sie daran, dass der BMP180-Sensor Zugang zur umgebenden Atmosphäre benötigt, um den Luftdruck ablesen zu können. Legen Sie den Sensor nicht in ein geschlossenes Gehäuse. Ein kleines Belüftungsloch sollte ausreichen. Aber lassen Sie es nicht zu offen - der Wind wird die Druck- und Höhenwerte niederschlagen. Denken Sie an Windschutz.

Vor Hitze schützen. Zur Druckmessung sind genaue Temperaturmessungen erforderlich. Versuchen Sie, den Sensor vor extremen Temperaturen zu schützen und lassen Sie ihn nicht in der Nähe von Hochtemperaturquellen.

Vor Feuchtigkeit schützen. Der BMP180-Sensor ist feuchtigkeitsempfindlich. Versuchen Sie, ein mögliches Eindringen von Wasser in den Sensor zu verhindern.

Blenden Sie den Sensor nicht. Überraschend war die Lichtempfindlichkeit des Silikons im Sensor, das durch das Loch in der Chipabdeckung in ihn eindringen kann. Versuchen Sie für genaueste Messungen, den Sensor vor Umgebungslicht zu schützen.

Schritt 4: Gerät zusammenbauen







Installieren von einreihigen Steckverbindern für den Arduino Nano. Eigentlich haben wir sie auf die richtige Größe zugeschnitten und ein wenig geschliffen, damit sie so aussehen, wie sie waren. Dann löten wir sie. Danach installieren wir einreihige Steckverbinder für den DHT22-Sensor.

Installieren Sie einen 10kΩ-Widerstand vom Datenstift zur Masse (Gnd). Wir löten alles.
Dann installieren wir auf die gleiche Weise einen einreihigen Stecker für den BMP180-Sensor, die Stromversorgung beträgt 3,3 V. Wir verbinden alles mit dem I2C-Bus.

Schließlich verbinden wir das LCD-Display mit demselben I2C-Bus wie den BMP180-Sensor.
(Ich plane später ein RTC-Modul (Echtzeituhr) an den vierten Anschluss anzuschließen, damit das Gerät auch die Uhrzeit anzeigt).

Schritt 5: Kodierung




Bibliotheken laden

Um Bibliotheken auf Arduino zu installieren, folgen Sie dem Link

#enthalten
#include #include #include "DHT.h" #include

SFE_BMP180-Druck;

#define HÖHE 20.56 #define I2C_ADDR 0x27 //<<- Add your address here. #define Rs_pin 0 #define Rw_pin 1 #define En_pin 2 #define BACKLIGHT_PIN 3 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7

#define DHTPIN 2 // Mit welchem ​​digitalen Pin sind wir verbunden?

// Entkommentieren Sie den verwendeten Typ! // # definieren Sie DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht (DHTPIN, DHTTYPE); LiquidCrystal_I2C lcd (I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin), Schwimmer t1, t2;

void setup () (Serial.begin (9600); lcd.begin (16,2); //<<-- our LCD is a 20x4, change for your LCD if needed // LCD Backlight ON lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home on LCD lcd.print("Weather Station"); delay(5000); dht.begin(); pressure.begin(); } void loop() { char status; double T,P,p0,a; status = pressure.startTemperature(); if (status != 0) { delay(status);

Status = Druck.getTemperature (T); if (status! = 0) (Serial.print ("1"); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Baro Temperature:"); lcd.setCursor (0,1 ), lcd.print (T, 2), lcd.print ("Grad C"), t1 = T, Verzögerung (3000);

Status = Druck.StartDruck (3); if (status! = 0) (// Warten bis die Messung abgeschlossen ist: Verzögerung (status);

Status = Druck.getPressure (P, T); if (status! = 0) (lcd.clear (); lcd.setCursor (0,0); lcd.print ("abslt pressure:"); lcd.setCursor (0,1); lcd.print (P, 2 ); lcd.print ("mb"); Verzögerung (3000);

p0 = Druck.Meeresspiegel (P, HÖHE); // wir sind auf 1655 Metern (Boulder, CO)

a = Druck.Höhe (P, p0); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Höhe:"); lcd.setCursor (0,1); lcd.print (a, 0); lcd.print ("Meter"); Verzögerung (3000); )))) float h = dht.readHumidity (); // Temperatur als Celsius lesen (Standard) float t = dht.readTemperature (); t2 = t; lcd.clear (); lcd.setCursor (0,0); // gehe zum Anfang der 2. Zeile lcd.print ("Feuchte:"); lcd.setCursor (0,1), lcd.print (h); lcd.print ("%"); Verzögerung (3000); lcd.clear (); lcd.setCursor (0,0); // gehe zum Anfang der 2. Zeile lcd.print ("DHT Tempurature:"); lcd.setCursor (0,1); LCD-Druck (t); lcd.print ("Grad C"); Verzögerung (3000); lcd.clear (); lcd.setCursor (0,0); // gehe zum Anfang der 2. Zeile lcd.print ("Mean Tempurature:"); lcd.setCursor (0,1); LCD-Druck ((t1 + t2) / 2); lcd.print ("Grad C"); Verzögerung (3000); )

Ich habe die Arduino 1.6.5 Version verwendet, der Code passt genau dazu, er kann auch zu den späteren passen. Wenn der Code aus irgendeinem Grund nicht passt, verwenden Sie Version 1.6.5 als Basisversion.

Das Wetter zu beobachten ist sehr aufregend. Ich beschloss, meine Wetterstation nach dem beliebten zu bauen .

Der Prototyp der Wetterstation sieht so aus:

Funktionen meiner Wetterstation:

  • Messung und Anzeige von Raum- und Außentemperaturen;
  • Anzeige der aktuellen Uhrzeit (Stunden und Minuten);
  • Anzeige der aktuellen Mondphasen und Mondtage;
  • Übertragung von Messergebnissen an einen Computer über eine serielle Verbindung;
  • Übertragung der Messergebnisse per Protokoll MQTT eine Anwendung auf einem Computer verwenden.


Verhexen
-Datei
Firmware für (Version vom 9. Mai 2018) - .
So flashen Sie verhexen-Datei zum Board Arduino habe ich beschrieben.

Arduino Nano 3.0 Mikrocontroller

Das Herzstück meiner Wetterstation ist ein Mikrocontroller Ebay):

Um die Anzeige und Abfrage von Sensoren zu steuern, verwende ich Timer 1 Arduino Interrupts mit einer Frequenz von 200 Hz (Periode - 5 ms) verursachen.

Indikator

Um die Messwerte der Sensoren und die aktuelle Uhrzeit anzuzeigen, habe ich eine Verbindung zu Arduino vierstellige LED-Anzeige Foryard FYQ-5643BH mit gemeinsamen Anoden (Anoden der gleichen Segmente aller Entladungen werden kombiniert).
Der Indikator enthält vier Ziffern aus sieben Segmenten und zwei Teilungspunkte (stündlich):

Die Anzeigeanoden sind über Strombegrenzungswiderstände mit den Klemmen verbunden Arduino:

entladen 1 2 3 4
Ausgang A3 A2 D3 D9

Segmentkathoden mit Pins verbunden Arduino:

Segment ein B C D e F g P
Ausgang D7 D12 D4 D5 D6 D11 D8 D13

Das Segment der Anzeige leuchtet auf, wenn an der Anode der entsprechenden Entladung (1) ein hohes Potenzial und an der Kathode ein niedriges (0) vorhanden ist.

Ich verwende eine dynamische Anzeige, um Informationen auf dem Indikator anzuzeigen - es ist immer nur eine Ziffer aktiv. Aktive Entladungen wechseln sich mit einer Frequenz von 200 Hz ab (Anzeigedauer 5 ms). Gleichzeitig ist das Flackern der Segmente für das Auge nicht wahrnehmbar.

Temperatursensor DS18x20

Für die Möglichkeit der Temperatur-Fernmessung habe ich einen Sensor angeschlossen , das die Außentemperatur über einen weiten Bereich misst. Der Sensor ist mit dem Bus verbunden 1-Draht und hat drei Ausgänge - Netzteil ( VCC), Daten ( DAT), Erde ( Masse):

Sensorkabel VCC DAT Masse
Ausgang Arduino 5V A1 Masse

Zwischen Schlussfolgerungen VCC und DAT Ich habe einen Pull-Up-Widerstand von 4,7k mitgeliefert.

Um zwischen Celsius und Fahrenheit umzurechnen, können Sie die folgende Platte verwenden:

Ich habe den Sensor außerhalb des Fensters des Hauses in ein Plastiketui aus einem Kugelschreiber gelegt:

\

In professionellen Wetterstationen wird ein Stevenson-Schirm verwendet, um das Thermometer vor direkter Sonneneinstrahlung zu schützen und die Luftzirkulation zu gewährleisten. Stevenson-Bildschirm):

BMP280 Druck- und Temperatursensor

Quecksilberbarometer und Aneroidbarometer werden traditionell zur Messung des atmosphärischen Drucks verwendet.

V Quecksilberbarometer Der atmosphärische Druck wird durch das Gewicht einer Quecksilbersäule ausgeglichen, deren Höhe zur Druckmessung verwendet wird:

V Aneroidbarometer Kompression und Expansion der Box unter Einwirkung von Atmosphärendruck wird verwendet:

Um Luftdruck und Raumtemperatur in meiner Heimwetterstation zu messen, verwende ich einen Sensor - klein SMD- 2 x 2,5 mm Sensor basierend auf piezoresistiver Technologie:

Auf dem Marktplatz gekaufter Sensorschal Ebay:

Der Sensor ist mit dem Bus verbunden I2C(Datenkontakt - SDA / SDI, Sync-Pin - SCL / SCK):

Sensorkabel VCC Masse SDI SCK
Ausgang Arduino 3V3 Masse A4 A5

Adafrucht- Dateien Adafruit_Sensor.h, Adafruit_BMP280.h, Adafruit_BMP280.cpp.

Atmosphärendruckeinheiten

Sensor über Funktion lesenDruck gibt den atmosphärischen Druckwert in Pascal an. Die Hauptmaßeinheit für den atmosphärischen Druck ist Hektopascal(hPa) (1 hPa = 100 Pa), analog zur Off-System-Einheit " Millibar"(mbar) (1 mbar = 100Pa = 1hPa). Um zwischen einer gebräuchlichen nicht systemischen Druckeinheit umzurechnen" Millimeter Quecksilber"(mmHg) und Hektopascal werden die folgenden Verhältnisse verwendet:
1 hPa = 0,75006 mmHg. Kunst. ≈ 3/4 mmHg; 1 mm Hg = 1,3332 hPa ≈ 4/3 hPa.

Abhängigkeit des Luftdrucks von der Höhe

Der atmosphärische Druck kann sowohl in absoluter als auch in relativer Form dargestellt werden.
Absoluter Druck QFE(engl. absoluter Druck) Ist der aktuelle Luftdruck, ohne die Korrektur über dem Meeresspiegel.
Der Luftdruck sinkt um ca. 1 hPa mit einer Höhenzunahme um 1 m:

Mit der barometrischen Formel können Sie die Korrektur der Barometerwerte bestimmen, um den relativen Druck (in mmHg) zu erhalten:
$ \ Delta P = 760 \ cdot (1 - (1 \ over (10 ^ ((0,0081350 \ cdot H) \ over (T + 0,00178308 \ cdot H))))) $,
wobei $ T $ die durchschnittliche Lufttemperatur auf der Rankin-Skala ist, ° Ra, $ H $ - Höhe, Füße.
Umrechnung von Celsius in Rankine:
$ ^ (\ circ) Ra = (^ (\ circ) C \ cdot 1,8) + 491.67 $
Die barometrische Formel wird für die barometrische Nivellierung verwendet - Höhenbestimmung (mit einem Fehler von 0,1 - 0,5 %). Die Formel berücksichtigt nicht die Luftfeuchtigkeit und die Änderung der Erdbeschleunigung mit der Höhe. Für kleine Höhenunterschiede kann diese exponentielle Abhängigkeit mit ausreichender Genauigkeit durch eine lineare Abhängigkeit angenähert werden.
Relativer Druck QNH(engl. relativer Druck, Q-Code Seehöhe) ist der Luftdruck unter Berücksichtigung der Korrektur auf den mittleren Meeresspiegel (eng. Mittlerer Meeresspiegel, MSL) (zum IST EIN und einer Temperatur von 15 Grad Celsius) und wird zunächst unter Berücksichtigung der Höhe eingestellt, in der sich die Wetterstation befindet. Es kann aus den Daten des Wetterdienstes, den Messwerten von geeichten Instrumenten an öffentlichen Orten, dem Flughafen (aus Berichten METAR), aus dem Internet.
Zum Beispiel für den nahegelegenen Flughafen Gomel ( UMGG) Ich kann eine Zusammenfassung des aktuellen Wetters sehen METAR unter ru.allmetsat.com/metar-taf/russia.php?icao=UMGG:
UMGG 191800Z 16003MPS CAVOK M06 / M15 Q1014 R28 / CLRD // NOSIG ,
wo Q1014- Druck QNH am Flugplatz beträgt sie 1014 hPa.
Zusammenfassung des Verlaufs METAR kann unter Aviationwxchartsarchive.com/product/metar bezogen werden.
Für normalen relativen Luftdruck QNH genommener Druck 760 mm Hg. Kunst. oder 1013,25 hPa (bei einer Temperatur von 0 ° C, auf einem Breitengrad von 45 ° auf der Nord- oder Südhalbkugel).
Ich stelle den Druck für das Aneroidbarometer ein QNH mit der Empfindlichkeitseinstellschraube:

Wettervorhersage

Die Analyse von Druckänderungen ermöglicht es Ihnen, eine Wettervorhersage zu erstellen, und ihre Genauigkeit ist umso höher, je abrupter die Druckänderungen sind. Eine alte Faustregel eines Seefahrers besagt beispielsweise, dass ein Druckabfall von 10 hPa (7,5 mm Hg) über einen Zeitraum von 8 Stunden auf einen starken Wind hindeutet.

Woher kommt der Wind? Luft strömt zum Zentrum des Tiefdruckgebiets, Wind- horizontale Luftbewegung von Hochdruckgebieten zu Tiefdruckgebieten (hoher Luftdruck drückt Luftmassen in Gebiete mit niedrigem Luftdruck). Wenn der Druck sehr niedrig ist, kann der Wind eine Stärke erreichen Stürme... Außerdem in der Gegend reduziert Druck (Druckabfall oder Zyklon), warme Luft steigt auf und bildet Wolken, die oft Regen oder Schnee.

Für die Windrichtung in der Meteorologie wird die Richtung genommen, aus der der Wind weht:

Diese Richtung wird auf acht Punkte reduziert.

Ein Algorithmus wird oft verwendet, um das Wetter basierend auf dem Luftdruck und der Windrichtung vorherzusagen Zambretti.

Feuchtigkeitssensor

Zur Bestimmung der relativen Luftfeuchtigkeit verwende ich das Modul DHT11(auf dem Marktplatz gekauft Ebay):

Feuchtigkeitssensor DHT11 hat drei Ausgänge - Netzteil ( + ), Daten ( aus), Erde ( - ):

Sensorkabel + aus -
Ausgang Arduino 5V D10 Masse

Um mit dem Sensor zu arbeiten, verwende ich die Bibliothek von Adafrucht- Dateien DHT.h, DHT.cpp.

Die Luftfeuchtigkeit charakterisiert die Menge an Wasserdampf in der Luft. Relative Luftfeuchtigkeit zeigt den prozentualen Feuchtigkeitsgehalt der Luft im Verhältnis zur maximal möglichen Menge bei der aktuellen Temperatur an. Um die relative Luftfeuchtigkeit zu messen, verwenden Sie :

Für den Menschen liegt der optimale Bereich der Luftfeuchtigkeit bei 40 ... 60 %.

Echtzeituhr

Als Echtzeituhr habe ich das Modul verwendet RTC DS1302(auf dem Marktplatz wurde ein Schal mit Uhr gekauft Ebay):

Modul DS1302 verbindet sich mit dem Bus 3-Leiter... Um dieses Modul in Verbindung mit . zu verwenden Arduino Bibliothek entwickelt iarduino_RTC ( von iarduino.ru).

Platine mit Modul DS1302 hat fünf Pins, die ich mit den Boardpins verbunden habe Arduino Nano:

Ausgang Echtzeituhr VCC Masse RST CLK DAT
Ausgang Arduino 5V Masse D2 D1 D0

Damit die Uhr auch im ausgeschalteten Zustand korrekt angezeigt wird, habe ich eine Batterie in den Steckplatz auf der Platine eingelegt CR2032.

Die Genauigkeit meines Uhrenmoduls erwies sich als nicht sehr hoch - die Uhr hat es in vier Tagen um etwa eine Minute eilig. Daher setze ich die Minuten auf "Null" und die Stunde auf die nächste zurück, während ich nach dem Einschalten der Wetterstation die mit dem A0-Pin des Arduino verbundene Taste gedrückt halte. Nach der Initialisierung wird der A0-Pin verwendet, um Daten über die serielle Verbindung zu übertragen.

Datenübertragung an einen Computer und Arbeit mit dem MQTT-Protokoll

So übertragen Sie Daten über eine serielle Verbindung zu Arduino verbindet USB-UART Konverter:

Ausgabe Arduino verwendet, um Daten im Format zu übertragen 8N1(8 Datenbits, keine Parität, 1 Stoppbit) bei 9600 bps. Die Daten werden in Paketen übertragen und die Paketlänge beträgt 4 Zeichen. Die Datenübertragung erfolgt in " Bit-Bang"Modus, ohne Verwendung eines seriellen Hardware-Ports Arduino.

Das Format der übertragenen Daten:

Parameter 1. Byte 2. Byte 3. Byte 4. Byte
Außentemperatur Ö Leerzeichen oder Minus Dutzende von Grad oder ein Leerzeichen Gradeinheiten
Zimmertemperatur ich Leerzeichen oder Minus Dutzende von Grad oder ein Leerzeichen Gradeinheiten
Atmosphärendruck P Hunderte von mm p. Kunst. Dutzende von mm Hg Einheiten mm Hg mit.
relative Luftfeuchtigkeit h Platz zehn Prozent oder ein Leerzeichen Einheiten von Prozent
aktuelle Uhrzeit zig Stunden Stundeneinheiten zig Minuten Einheiten von Minuten

MQTT

Golang Anwendung - Protokollclient MQTT Senden der von der Wetterstation empfangenen Informationen an den Server ( MQTT-Makler) :

Service ermöglicht es Ihnen, ein Konto mit einem kostenlosen Tarifplan zu erstellen " "(Grenzen: 10 Verbindungen, 10 Kb/s):

Um die Messwerte der meteorologischen Station zu überwachen, können Sie Android-Anwendung :

Ernährung

Ich verwende ein Ladegerät von einem alten Handy, um die Wetterstation mit Strom zu versorgen. Motorola, liefert eine Spannung von 5 V mit einem Strom von bis zu 0,55 A und ist mit den Kontakten verbunden 5V(+) und Masse (-):

Sie können auch eine 9-V-Batterie zur Stromversorgung verwenden, die an die Kontakte angeschlossen ist Fahrgestellnummer(+) und Masse (-).

Bedienung der Wetterstation

Beim Start werden die Sensoren initialisiert und überprüft.

Ohne Sensor DS18x20 der Fehler "E1" wird ausgegeben, wenn kein Sensor vorhanden ist - Fehler "E3".

Danach beginnt der Arbeitszyklus der Wetterstation:

  • Messung und Anzeige der Außentemperatur;
  • Messung und Anzeige der Raumtemperatur;
  • Messung und Anzeige des Luftdrucks und seines Trends;
  • Messung und Anzeige der relativen Luftfeuchtigkeit;
  • Anzeige der aktuellen Uhrzeit;
  • Anzeige der Mondphase und des Mondtages.


Ein Video meiner Wetterstation ist auf meinem verfügbar -Kanal: https://youtu.be/vVLbirO-FVU

Temperaturanzeige

Bei der Temperaturmessung werden zwei Stellen der Temperatur angezeigt und bei negativen Temperaturen das Minuszeichen (mit dem Gradsymbol ganz rechts);
für die Außentemperatur wird oben das Gradzeichen angezeigt:


für Raumtemperatur - unten:

Druckanzeige

Bei der Druckmessung werden drei Stellen des Drucks in mmHg angezeigt (mit dem Symbol " P"in der Ziffer ganz rechts):

Wenn der Druck stark abfällt, wird anstelle des " P"die Ziffer ganz rechts zeigt das Symbol an" L"wenn es stark gewachsen ist, dann" h". Das Kriterium für die Schärfe der Veränderung beträgt 8 mm Hg in 8 Stunden:

Da meine Wetterstation absoluten Druck anzeigt ( QFE), dann fallen die Messwerte im Vergleich zu den Angaben in der Zusammenfassung etwas unterschätzt aus METAR(was beinhaltet QNH) (14 UTC am 28. März 2018):

Druckverhältnis (lt. Angaben) ATIS) war $ (1015 \ über 998) = $ 1,017. Höhe des Flughafens Gomel (ICAO-Code UMGG) über dem Meeresspiegel liegt bei 143,6 m Die Temperatur nach ATIS betrug 1 ° C.

Die Messwerte meiner Wetterstation entsprachen fast dem absoluten Druck QFE nach Informationen ATIS!

Maximaler / minimaler Druck ( QFE), aufgezeichnet von meiner Wetterstation für die gesamte Beobachtungszeit:

Anzeige der relativen Luftfeuchtigkeit

Die relative Luftfeuchtigkeit wird in Prozent angezeigt (das Prozentsymbol wird in den beiden rechten Ziffern angezeigt):

Anzeige der aktuellen Uhrzeit

Auf der Anzeige wird die aktuelle Uhrzeit im Format „HH:MM“ angezeigt, wobei der trennende Doppelpunkt im Sekundentakt blinkt:

Anzeige der Mondphasen und des Mondtages

Die ersten beiden Ziffern des Indikators zeigen die aktuelle Mondphase und die nächsten beiden - den aktuellen Mondtag:

Der Mond hat acht Phasen (englische und russische (blau - ungenaue) Namen sind angegeben):

Auf der Anzeige sind die Phasen durch Piktogramme gekennzeichnet:

Phase Piktogramm
wachsende Sichel (Halbmond)
abnehmende Sichel (Halbmond)

Übertragen von Daten auf einen Computer

Wenn Sie die Wetterstation mit USB-UART Wandler (zum Beispiel basierend auf einer Mikroschaltung CP2102) verbunden USB-Port des Computers können Sie mit dem Terminalprogramm die von der Wetterstation übertragenen Daten beobachten:

Ich habe in Programmiersprache entwickelt golang ein Programm, das meteorologische Beobachtungen protokolliert und Daten an den Dienst sendet und sie können eingesehen werden auf Android-Smartphone mit der App :

Nach dem meteorologischen Beobachtungsprotokoll können Sie beispielsweise eine Grafik der Änderungen des Luftdrucks erstellen:
Beispiel für ein Diagramm mit einem spürbaren Druckminimum


Beispiel für ein Diagramm mit leichtem Druckanstieg

Geplante Verbesserungen:

  • Hinzufügen von Windrichtungs- und Geschwindigkeitssensoren

In meteorologischen Stationen dient ein Dreischalen-Anemometer (1) zur Messung der Windgeschwindigkeit und eine Wetterfahne zur Bestimmung der Windrichtung (2):

Wird auch zur Messung der Windgeschwindigkeit verwendet Hitzdraht-Anemometer(engl. Hitzdraht-Anemometer). Als Heizdraht können Sie einen Wolframdraht aus einer Glühbirne mit Glasscherben verwenden. Bei handelsüblichen Hitzdraht-Anemometern befindet sich der Sensor meist auf einem Teleskoprohr:

Das Funktionsprinzip dieses Geräts besteht darin, dass dem Heizelement aufgrund von Konvektion durch den Luftstrom - Wind - Wärme entzogen wird. In diesem Fall wird der Widerstand des Filaments durch die Filamenttemperatur bestimmt. Das Variationsgesetz des Widerstandes des Glühfadens $ R_T $ von der Temperatur $ T $ hat die Form:
$ R_T = R_0 \ cdot (1 + (\ alpha \ cdot (T - T_0))) $,
wobei $ R_0 $ der Widerstand des Fadens bei der Temperatur $ T_0 $ ist, $ \ alpha $ der Temperaturkoeffizient des Widerstands (für Wolfram $ \ alpha = 4,5 \ cdot (10 ^ (- 3) (^ (\ circ) (C^(-1)))) $).

Bei einer Änderung des Luftdurchsatzes ändert sich die Temperatur bei konstantem Heizstrom (Konstantstrom-Anemometer, eng. CCA). Wenn die Temperatur des Heizelements konstant gehalten wird, ist der Strom durch das Element proportional zum Luftdurchsatz (Konstanttemperatur-Anemometer). CTA).

Fortsetzung folgt



„Also, lass uns gleich zustimmen: Du wirst keinen Film für Hollywood machen. Selbst im Wunderland werden nicht mehr als fünf Prozent aller Drehbücher genehmigt, und nur ein Prozent geht dann in Produktion ... Also, statt all dem wirst du dein eigenes Hollywood erschaffen.“
Ed Gaskell "Digitales Kino oder Hollywood zu Hause machen"

Vorwort

Was, eine andere Wetterstation auf Arduino?! Ja, noch einen und, sagt mir etwas, nicht der letzte im Internet der Dinge.


So wie jeder Programmierer verpflichtet ist, ein Programm zu schreiben "Hello World!"
Eine beträchtliche Anzahl bereits erstellter Projekte von meteorologischen Stationen im Internet wird beschrieben, der Leser kann eines davon zur Umsetzung auswählen. Ehrlich gesagt habe ich ungefähr ein Dutzend ähnlicher Projekte und eine Reihe verwandter Projekte sorgfältig studiert. Daher kann man nicht sagen, dass ich alles von Grund auf neu geschaffen habe, natürlich habe ich "auf den Schultern von Giganten gestanden".


Ich muss gleich sagen, dass meine Pläne die Nutzung von Drittanbieterdiensten zur Speicherung und Anzeige von Daten nicht vorsahen. Ich wollte persönlich spüren und verstehen, wie das alles von Anfang bis Ende, von A bis Z, von innen funktioniert.


Wer also schnell etwas aus dem Nichts zusammennieten möchte, für den wird diese Artikelserie wahrscheinlich nicht funktionieren. Es ist einfacher, einen vorgefertigten Bausatz mit Montageanleitung zu kaufen. Profis der Mikroelektronik haben hier absolut nichts zu tun, vielleicht wiehern und erinnern sich am Anfang der Reise.
Aber für diejenigen, die es wirklich verstehen wollen, denke ich, sie werden es mögen. Vielleicht ist das Material als Lehrmittel nützlich.



Dieses Projekt wurde bereits 2016 umgesetzt, aber ich hoffe, es ist immer noch relevant.

Technologie-Suite

Wir lernen und arbeiten mit einfachen und komplexen Dingen:

  • Temperatur- und Feuchtigkeitssensoren DHT22, DHT11
  • barometrischer Drucksensor Typ BMP180
  • WLAN-Modul ESP8266
  • Funkmodul Typ nRF24 2,4 GHz
  • Familie Arduino Pro Mini, Arduino Mega
  • Solarbatterie und Akkus
  • Programmiersprache C / C++
  • Programmiersprache PHP
  • MySQL-Datenbankverwaltungssystem
  • die Programmiersprache Java und das Android-Framework (Erstellung einer Anwendung für Adnroid zur Anzeige von Wetterdaten auf einem Smartphone).

Einige der oben aufgeführten Themen sind keinen Dreck wert, andere können jahrelang studiert werden. Daher werden wir komplexe Dinge nur in dem Teil berühren, der direkt mit diesem Projekt zu tun hat, damit Sie verstehen, wie alles funktioniert.


Aber wir fangen von vorne an rechts. Nämlich aus der Beschreibung und dem Design des zukünftigen Gerätes "auf dem Papier" damit am ende jeder ziegel in seinen platz fällt.

Prototyp entwickeln

Wie Wikipedia richtig sagt, Prototyp entwickeln ist eine schnelle Entwurfsimplementierung eines funktionierenden Systems. Was, ja, nicht ganz ineffizient und mit einigen Fehlern funktionieren wird, aber eine Vorstellung davon gibt, ob das Handwerk zu einem Industriedesign entwickelt werden sollte. Der Prototyping-Prozess muss nicht langwierig sein. Auf die Prototyping-Phase folgt die Analyse des Systems und seine Verfeinerung.


Aber das ist in einer Branche, in der die Arbeitnehmer Vollzeit beschäftigt sind.


Jeder, der abends seine Lieblingsprojekte für das "Internet der Dinge" fesselt, sollte sich bewusst sein, dass er einen Prototypen, ein Halbfertigprodukt, schafft. Es ist sehr weit vom Niveau eines normalen Industrieprodukts entfernt. Deshalb unseren Hobbyhandwerkern sollten keine kritischen Bereiche der Lebenserhaltung anvertraut werden und hoffen, dass sie uns nicht im Stich lassen.


Ein Industrieprodukt wird auf einer Basis von Industrieelementen aufgebaut und durchläuft dann viele weitere Phasen, einschließlich Debugging, Test und Wartung, bevor es zu einem Verkaufsschlager wird.


Anstelle dieser ganzen Last werden wir also unser eigenes Spielzeug kreieren, aber kein einfaches. Mit Elementen der technischen Kreativität, Rudimenten der Programmierung und Kenntnissen (im Entstehungsprozess) vieler anderer verwandter Dinge.


Natürlich werden es Elektroniker in der Programmierphase schwer haben und Programmierer über Schaltungen schwitzen müssen, aber der Autor wird versuchen, alles so zugänglich wie möglich darzustellen und klar zu beschreiben, warum bestimmte Lösungen verwendet wurden.

Anforderungen

Dieser Schritt wird normalerweise übersprungen. Sich jetzt für so etwas zu entscheiden, und dann kommen kleine Details ans Licht, die das ganze Projekt zum Erliegen bringen oder sogar zu schwer machen. Alle unsere Wünsche müssen aufgezeichnet werden, ich benutze dafür eine Google-Disk, die von einem PC und von einem mobilen Gerät aus zugänglich ist.


Unsere Wetterstation sollte also:

  • Außentemperatur und Luftfeuchtigkeit messen
  • Temperatur und Luftfeuchtigkeit im Haus messen
  • atmosphärischen Druck messen
  • die angegebenen Werte auf dem Display anzeigen
  • Daten an einen Server im Internet übertragen, wo die Daten in einer Datenbank gespeichert und auf einer Webseite angezeigt oder in einer mobilen Anwendung verwendet werden.

Es werden die einfachsten und billigsten Sensoren verwendet. Wenn ich zum Beispiel nach vorne schaue, werde ich sagen, dass DHT22 die Temperatur ziemlich genau misst, aber bei Luftfeuchtigkeit ist es etwas ungenau. Aber noch einmal, ich wiederhole, es spielt keine Rolle, denn wir haben einen Prototyp vor uns und die Ausbreitung bei 5% Luftfeuchtigkeit wird nichts Wichtiges in unserem Leben beeinflussen.


Die Systemarchitektur, Hardware und Software müssen das System weiter erweitern, um neue Sensoren und neue Fähigkeiten hinzuzufügen.

Eisen. Komponentenauswahl

Dies ist der wichtigste Teil, nicht Löten oder Programmieren. Nachdem die Anforderungen an das System festgelegt wurden, muss entschieden werden, was genau umgesetzt werden soll.


Hier gibt es eine Nuance. Um Komponenten auszuwählen, müssen Sie ihre Fähigkeiten gut kennen, Sie müssen die Technologien selbst kennen. Das heißt, mit anderen Worten, hier müssen Sie weit entfernt von einem unerfahrenen Elektronikingenieur und Programmierer sein. Was also, um ein paar Jahre damit zu verbringen, die gesamte Palette möglicher Geräte zu studieren?


Teufelskreis? Aber es gibt Teufelskreise, um sie zu durchbrechen.


Es gibt einen Ausgang. Sie können einfach das Projekt eines anderen nehmen und wiederholen. Ich habe bereits bestehende Projekte von Wetterstationen studiert und hoffe, dass ich einen Schritt nach vorne gemacht habe.


So. Die Architektur der Wetterstation basiert auf Arduino. Denn Arduino hat eine kleine Einstiegsschwelle und damit habe ich mich bereits beschäftigt. Es ist einfacher, weiter zu wählen.


Es war sofort klar, dass die Wetterstation einen Fernsensor außerhalb des Fensters und ein Zentralmodul enthalten wird.


Die zentrale Haupteinheit wird sich im Innenbereich befinden. Es ist wichtig, dies in der Anfangsphase zu bestimmen, daraus so wichtige Eigenschaften wie Temperaturbedingungen für den Betrieb und Stromversorgung "Tanz".


Der Fernsensor (oder die Sensoren) wird ohne "Gehirn" sein, seine Aufgabe ist es, periodisch Daten zu messen und an die zentrale Hauseinheit zu übertragen. Die Zentraleinheit empfängt Daten von allen Sensoren, zeigt sie auf dem Bildschirm an und sendet sie ins Internet an die Datenbank. Nun, und da ist es schon viel einfacher, sobald die Daten in der Datenbank sind, kann man damit machen was man will, sogar Grafiken zeichnen.


Für die Kommunikation mit der Außenwelt wurde das Internet eindeutig gewählt WiFi-Modul ESP8266 praktisch ohne Alternative (ca. Vielleicht sind jetzt solche Alternativen aufgetaucht). Ethernet-Erweiterungskarten sind für den Arduino verfügbar, aber ich wollte überhaupt nicht an das Kabel gebunden sein.



Eine interessante Frage war, wie man eine Verbindung zwischen dem Sensor außerhalb des Fensters (oder Sensoren, erinnern Sie sich an die Forderung nach Systemerweiterbarkeit?) und der Mitte herstellt. 433 MHz Beacons sind definitiv nicht geeignet (sie sind für überhaupt nichts geeignet).


ESP8266 wieder verwenden?


Nachteile dieser Lösung:

    erfordert stabiles WLAN außerhalb des Hauses

    Kommunikationsreichweite wird nicht lang sein

    die Zuverlässigkeit leidet, wenn das Internet ausfällt, werden wir unsere Fernsensoren nicht sehen

    mehr Stromverbrauch.

    Leistungsaufnahme ESP8266:

    beim Senden von 120-170 mA

    beim Empfang von 50-56 mA

    im Deep Sleep-Modus 10 µA (µA)

    aus 5 µA (µA).

Am Ende entschied man sich für den nRF24L01+ Chip mit 2,4 GHz Sender und Empfänger in einer Flasche, um Fernsensoren mit der Hauptwohneinheit zu verbinden, mit einer zusätzlichen externen Antenne, um die Wände sicher "durchzubrechen".



Leistungsaufnahme nRF24L01 + 2,4 GHz:

  • bei Empfang von 11 mA
  • bei Übertragung mit einer Geschwindigkeit von 2Mbps - 13 mA
  • im Standby-I-Modus - 26 μA (μA)
  • Aus-Zustand 900 nA (nA).

Sowohl ESP8266 als auch nRF24L01+ haben einen geeigneten Betriebstemperaturbereich: von -40 ℃ bis + 80 ℃.


Sie können nRF24L01+ für ca. 1 US-Dollar oder sofort mit einer externen Antenne für 3 US-Dollar kaufen. Sie können den ESP8266-01 für etwa 4 US-Dollar kaufen. Lesen Sie die Produktbeschreibung sorgfältig durch! Andernfalls kaufen Sie eine Antenne.


Der Kern des Systems ist entstanden. Kommen wir zu den Sensoren selbst.


Auf der Straße kann die Temperatur ja bekanntlich negative Werte erreichen, daher ist der DHT11 Sensor nicht geeignet, aber der DHT22 genau richtig.



DHT22 / AM2302 Spezifikationen:

  • Netzteil 3,3V bis 5V, 5V empfohlen
  • Verbrauch 2,5 mA maximal, zum Zeitpunkt der Messung und Datenübertragung
  • Feuchtemessbereich 0-100% mit einem Fehler von 2-5%
  • Temperaturmessbereich von -40 bis + 125 ° C mit einer Genauigkeit von ± 0,5 ° C
  • Messanforderung nicht mehr als 0,5 Hz - einmal alle 2 Sekunden.

Im Haus wird es hoffentlich keine Minustemperaturen geben, sodass Sie DHT11 verwenden können, zumal ich bereits einen hatte.


DHT11-Spezifikationen:

  • Stromversorgung von 3,3V bis 5V
  • Verbrauch 2,5 mA maximal, zum Zeitpunkt der Messung und Datenübertragung
  • Feuchtemessbereich 20-80% mit einem Fehler von 5%
  • Temperaturmessbereich von 0 bis + 50 ° C mit einem Fehler von ± 2 ° C
  • Messanforderung nicht mehr als 1 Hz - einmal pro Sekunde.

Sie können DHT22 für etwa 3 US-Dollar kaufen. DHT11 kostet mit 1 US-Dollar weniger, ist aber auch weniger genau.


Kommen wir nun wieder zu Arduino zurück. Welches Board soll man wählen?


Ich habe einzelne Teile des Systems auf einem Arduino UNO getestet. Jene. Ich habe das ESP-Modul an UNO angeschlossen und es studiert, getrennt, dann das nRF24 angeschlossen usw. Für die endgültige Implementierung des Sensors außerhalb des Fensters wählte ich den Arduino Pro Mini als der dem Uno der Miniatur am nächsten.



Auch in Sachen Stromverbrauch macht der Arduino Pro Mini eine gute Figur:

  • es gibt keinen USB-TTL-Konverter, der allein schon viel "frisst",
  • die LED ist über einen 10k Widerstand angeschlossen.

Zur erweiterten Energieeinsparung war geplant:

  • Entfernen Sie die LED - die Betriebsanzeige des Arduino Pro Mini (ich habe es bereut, das Board nicht verdorben zu haben)
  • oder verwenden Sie eine "nackte" Baugruppe auf einem Atmel ATmega328-Mikroprozessor (nicht verwendet)
  • Verwenden Sie die Low Power Library oder JeeLib.

Von den Bibliotheken, die ich ausgewählt habe, ist die Low Power Library einfach und enthält nur das, was Sie brauchen.


Für die Zentraleinheit wurde, da geplant war, zahlreiche Peripheriegeräte daran anzuschließen, das Arduino Mega Board gewählt. Darüber hinaus ist es vollständig UNO-kompatibel und verfügt über mehr Speicher. Mit Blick auf die Zukunft werde ich sagen, dass diese Wahl voll und ganz gerechtfertigt war.


Sie können den Arduino Mega für etwa 8 US-Dollar kaufen.

Strom und Energieverbrauch

Nun zum Thema Ernährung und Energieverbrauch.


Arduino Pro Mini gibt es in zwei Geschmacksrichtungen:

  • für eine Versorgungsspannung von 5V und eine Frequenz von 16MHz
  • für eine Versorgungsspannung von 3,3V und eine Frequenz von 8MHz.

Da das nRF24L01+ Funkmodul 3,3V für die Stromversorgung benötigt und die Geschwindigkeit hier nicht wichtig ist, kauf dir einen Arduino Pro Mini mit 8MHz und 3,3V.


In diesem Fall beträgt der Versorgungsspannungsbereich des Arduino Pro Mini:

  • 3.35-12V für 3.3V-Modell
  • 5-12V für 5V-Modell.

Ich hatte bereits einen 5V Arduino Pro Mini, deshalb habe ich ihn verwendet. Sie können den Arduino Pro Mini für etwa 4 US-Dollar kaufen.


Die Stromversorgung der Zentraleinheit erfolgt aus einem 220-V-Netz über ein kleines Netzteil mit 12V, 450mA, 5W am Ausgang. So für 5 Dollar. Es gibt auch einen separaten Ausgang für 5V.



Und wenn dies nicht ausreicht, können Sie es stärker ausdrücken. Mit anderen Worten, es macht wenig Sinn, die Stromversorgung für die Zentraleinheit zu sparen. Aber für einen drahtlosen Fernsensor ist Energiesparen der wichtigste Teil. Aber ich möchte auch nicht auf die Funktionalität verzichten.


Daher werden der Arduino Pro Mini und das nRF24-Funkmodul mit einem Bündel von 4 Ni-Mh-Akkus betrieben.


Und merke dir maximale Kapazität eines modernen Akkus ca. 2500-2700mAh, all das ist eher Marketing-Gimmick (Ansmann 2850) oder Täuschung (UltraFire 3500).


Ich verwende aus mehreren Gründen keine Li-Ion-Akkus:

  • sehr teuer
  • wenn die Umgebungstemperatur unter 0 ° C sinkt, sinkt die Leistung des Lithium-Ionen-Akkus auf 40-50%
  • billige werden ohne Schutz hergestellt und sind unsicher (bei einem Kurzschluss oder einer Entladung können sie explodieren und brennen, siehe eine Reihe von Videos auf YouTube)
  • sie altern, auch wenn sie nicht benutzt werden (dies gilt jedoch für alle chemischen Elemente), verliert der Li-Ion Akku nach 2 Jahren ca. 20% seiner Kapazität.

Für einen Prototypen ist es durchaus möglich, mit hochwertigen Ni-MH AA- oder AAA-Batterien auszukommen. Außerdem brauchen wir keine großen Ströme. Der einzige Nachteil von Ni-MH-Akkus ist ihre lange Ladezeit.

Allgemeines Schema der Wetterstation

Fassen wir zusammen. Hier ist eine allgemeine Übersicht über die Funktionsweise.



Fortsetzung folgt.

In meiner Freizeit habe ich diesmal Anleitungen zum Bau einer kleinen Wetterstation geschrieben. Es fungiert als Datumsuhr und zeigt Innen- und Außentemperaturen an. Wir werden Arduino UNO als Hauptcontroller verwenden, aber ein anderes Board mit Atmega328p an Bord reicht aus. Zur Anzeige verwenden wir den Grafikbildschirm WG12864B. Wir werden auch zwei ds18b20 Temperatursensoren anschließen. Einer ist im Raum, der andere wird nach draußen gebracht. Lasst uns beginnen.

Bei der Herstellung hausgemachter Produkte benötigen wir:

Arduino UNO (Oder jedes andere Arduino-kompatible Board)
- WG12864B Grafikbildschirm
- ds18b20 Temperatursensor, 2 Stück
- Stromversorgung 6 - 12 V
- Widerstände 4,7 Ohm 0,25 W, 2 Stk.
- 100 Ohm 0,25 W Widerstände
- Batteriefach für 4 AAA "Little Finger" Batterien
- Box aus der Patrone des SEGA-Präfixes
- Isolierband
- Anschlussdrähte
- Platine
- Tasten
- Schreibwarenmesser
- Lötkolben
- Lötzinn, Kolophonium
- Doppelseitiges Klebeband

Schritt 1 Bereiten Sie WG12864B3 vor.
Wer noch nie mit Bildschirmen gearbeitet hat, mag sich von der Vielzahl an Modifikationen, die mit den Bildschirmen identisch aussehen, einschüchtern lassen. Lassen Sie mich ein wenig erklären. Die meisten Bildschirme dieses Typs funktionieren auf den Mikroschaltungen ks0107 / ks0108. Alle Bildschirme können in 4 Typen unterteilt werden:

Option A: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T

Option B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ-Displays AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LM12864LDW, Digitron, Q12864J464

Option C: Shenzhen Jinghua Displays Co., Ltd. JM12864

Option D: Wintek-Kaskaden WD-G1906G, Wintek - GEN / WD-G1906G / KS0108B, Wintek / WD-G1906G / S6B0108A, TECDIS / Y19061 / HD61202, Varitronix / MGLS19264 / HD61202

Sie sehen fast gleich aus. Aber ihre Anschlusspins sind unterschiedlich. Ich habe mich für WG12864B3 V2.0 entschieden und empfehle es Ihnen, aber wenn der Bildschirm anders kam oder Sie einfach keinen zur Hand haben, können Sie dies mit Hilfe der Tabelle leicht herausfinden:

Kurze Eigenschaften:

Es gibt viele verschiedene Verbindungsschemata im Internet und alles scheint zu funktionieren. Die Sache ist, dass es nicht nur verschiedene Bildschirme gibt, sondern auch zwei Möglichkeiten, sie zu verbinden: seriell und parallel. Bei Verwendung einer seriellen Portverbindung benötigen wir nur 3 Mikrocontroller-Ausgänge. Mit einem parallelen Minimum von 13. Die Wahl in diesem Fall liegt auf der Hand, das Arduino und so nicht viele Pins. Bei Parallelschaltung sieht das Anschlussschema wie folgt aus:

Für die serielle Verbindung, die wir verwenden werden, sieht das Diagramm wie folgt aus:

WG12864B - Arduino UNO 1 (GND) - GND 2 (VCC) - + 5V 4 (RS) - 10 5 (R / W) - 11 6 (E) - 13 15 (PSB) - GND 19 (BLA) - über Widerstand 100 Ohm - + 5V 20 (BLK) - GND

Es muss ein Potentiometer auf dem Bildschirm sein, um den Kontrast einzustellen. Es gibt Bildschirme ohne, aber das ist jetzt eine Seltenheit:

Ein 100-Ohm-Widerstand wird benötigt, damit eine Spannung von 5 Volt nicht versehentlich die Hintergrundbeleuchtungsdioden verbrennt.

Schritt 2 Herstellung des Gehäuses.
Nehmen wir für den Fall die Schachtel aus der Sega-Präfix-Kartusche. Wenn Sie diese Box nicht zur Hand finden, können Sie einen anderen Koffer verwenden. Hauptsache der Bildschirm und das Arduino passen hinein.

Schneiden Sie die transparente Folie oben auf der Schachtel ab, sodass keine Teile mehr übrig sind:

Schneiden Sie dann mit einem Büromesser ein 37x69-Fenster für den Bildschirm aus.

Auf der Rückseite entlang der Kante des Ausschnitts kleben wir doppelseitiges Klebeband, vorzugsweise schwarz:

Wir entfernen das Schutzpapier vom Klebeband und kleben unseren Bildschirm darauf:

Von außen sollte es so aussehen:

Unterhalb des Bildschirms, ebenfalls auf doppelseitigem Klebeband, befestigen wir den Arduino, nachdem wir vorläufige Ausschnitte für den USB-Anschluss und die Steckdose gemacht haben:

Ausschnitte für Arduino-Buchsen müssen auf beiden Seiten der Box angebracht werden, damit sie frei geschlossen werden kann:

Schritt 3 Temperatursensoren.
Wir werden digitale Temperatursensoren DS18B20 verwenden. Mit ihnen erreichen wir eine hohe Messgenauigkeit, einen Fehler von nicht mehr als 0,5 ° C, in einem weiten Temperaturbereich von -55 ... + 125 ° C. Darüber hinaus ist der Sensor digital und führt alle Berechnungen selbst durch, und der Arduino erhält einfach vorgefertigte Messwerte. Beachten Sie beim Anschließen dieses Sensors den 4,7 kΩ Pull-up-Widerstand zwischen den DQ- und VDD-Pins. Auch mehrere Anschlussmöglichkeiten sind möglich. Mit externer Stromversorgung, meiner Meinung nach die beste Option, werden wir sie verwenden:

Bei jeder Stromversorgungsoption werden die Sensoren parallel geschaltet:

Wir werden den Innentemperatursensor auf einer kleinen Tafel zusammen mit zwei Tasten platzieren, mit denen wir die Uhrzeit und das Datum der Uhr einstellen:

Wir verbinden das gemeinsame Kabel von beiden Tasten mit GND, verbinden das Kabel von der ersten Taste mit A0, von der zweiten mit A1.
Wir befestigen es auf doppelseitigem Klebeband neben dem Arduino:

Der Sensor, der außerhalb des Raumes platziert werden soll, wählt man besser in einem Metall-, Staub- und Feuchtigkeitsgeschützten Gehäuse:

Berechnen Sie den Draht der erforderlichen Länge, damit Sie den Sensor außerhalb des Fensters aufhängen können. Hauptsache, er sollte nicht mehr als 5 Meter betragen. Wenn Sie eine längere Länge benötigen, müssen Sie den Wert des Zugs reduzieren. Widerstand auf.

Verbinden Sie das Kabel vom DQ-Datenbus beider Sensoren mit Pin 5 des Arduino.
Vdd - +5 Arduino.
GND - GND Arduino.

Schritt 4 Leistung.
Zur Stromversorgung können Sie ein Netzteil mit einer Spannung von 6 bis 12 Volt verwenden. Am Ende des Stromkabels müssen Sie einen Stecker löten, der zur Arduino-Steckdose passt:

Oder Sie legen ein Batteriefach für vier AAA-Batterien in den Koffer. Und verbinden Sie den positiven Draht vom Fach mit Vin Arduino und den negativen Draht mit GND.

Schritt 5 Bereiten Sie die Programmierumgebung vor.
Zuerst müssen Sie die Arduino IDE von der offiziellen Website herunterladen und installieren

Und fügen Sie auch die beiden Bibliotheken hinzu, die für die Skizze erforderlich sind. OneWire - erforderlich, um mit ds18b20-Sensoren zu kommunizieren:

U8glib - wird verwendet, um Informationen auf dem Bildschirm anzuzeigen:

Herunterladen von Bibliotheken. Dann entpacken wir die Archive und verschieben den Inhalt der Archive in den Ordner "libraries", der sich in dem Ordner befindet, in dem die Arduino IDE installiert ist. Es ist auch möglich, Bibliotheken über die Arduino IDE hinzuzufügen. Um dies zu tun, ohne die Archive zu entpacken, starten Sie die Arduino IDE, wählen Sie Sketch - Connect Library aus dem Menü. Wählen Sie ganz oben in der Dropdown-Liste den Punkt "Add.Zip Library". Wir geben den Speicherort der heruntergeladenen Archive an. Nach allen Schritten müssen Sie die Arduino IDE neu starten.

Schritt 6 Bearbeiten der Skizze.
Temperatursensoren arbeiten nach dem One-Wire-Protokoll und haben für jedes Gerät eine eindeutige Adresse - einen 64-Bit-Code. Es ist nicht ratsam, der Skizze Befehle zum Auffinden von Sensoren hinzuzufügen. Es ist nicht erforderlich, den Arduino jedes Mal zu laden, wenn die Sensoren Schluckauf machen. Daher laden wir zunächst alles zusammen und laden eine Skizze in das Arduino hoch, das sich im Menü Datei - Beispiele - Dallas Temperature - OneWireSearch befindet. Starten Sie dann Tools - Port Monitor. Arduino muss unsere Sensoren finden, Adressen und Temperaturwerte schreiben. Diese Adressen müssen aufgeschrieben oder einfach irgendwo kopiert werden. Öffnen Sie nun die Skizze Ard_Tic_Tak_WG12864B_2_x_Term_Serial und suchen Sie nach den Linien:

Byte addr1 = (0x28, 0xFF, 0x75, 0x4E, 0x87, 0x16, 0x5, 0x63); // Adresse des internen Bytes addr2 = (0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97); // Adresse des externen Sensors

Wir ersetzen die dem Standort der Sensoren entsprechenden Adressen durch unsere eigenen Adressen.
Unsere Uhr verwendet kein RTC-Modul (Real Time Clock), daher ist eine Korrektur der Taktrate erforderlich. Der Einfachheit halber entkommentieren Sie die Zeile (Sekunden werden auf dem Bildschirm angezeigt):

//u8g.setPrintPos(44, 50); u8g.print (sek); // Sekunden anzeigen, um die Richtigkeit der Bewegung zu kontrollieren

Stellen Sie die richtige Uhrzeit über den Portmonitor ein. Öffnen Sie dazu den Portmonitor, warten Sie das Ende der ersten Temperaturmessungen ab und geben Sie das aktuelle Datum und die aktuelle Uhrzeit im Format "Tag, Monat, Jahr, Stunden, Minuten, Sekunden" ein. Ohne Leerzeichen trennen Sie die Zahlen durch Kommas oder Punkte.

Wenn die Uhr es eilig hat, ändern Sie den Wert auf einen größeren, ich empfehle, mit einem Schritt von 100 Einheiten zu experimentieren. Wenn ich im Rückstand bin, sollte der Wert in der Zeile reduziert werden:

Wenn (micros () - prevmicros> 494000) (// zu etwas anderem ändern, um es zu korrigieren, es waren 500000

Empirisch ermitteln wir die Zahl, bei der die Uhr genau genug läuft. Um die Genauigkeit des Kurses zu bestimmen, wird auch die Ausgabe von Sekunden benötigt. Nach genauer Kalibrierung der Zahl können die Sekunden kommentiert und somit vom Bildschirm entfernt werden.
Füllen Sie die Skizze aus.