Kaum zu glauben, aber Weihnachten ist nur noch 6 Tage entfernt und auch heute haben die Weihnachtswichtel eine kleine Überraschung dabei. In den vergangenen Tagen haben Sie viele Projekte mit dem Uno R3 Typ 1 und dem Nano V3 gesehen, aber auch schon einige Projekte mit Micro Controllern der ESP32-Reihe! Heute soll wieder ein kleines Projekt mit dem ESP32 Dev Kit C verwirklicht werden und dazu auch Bauteile aus schon vergangenen Weihnachtsbeiträgen zum Einsatz kommen.
Andreas Wolter hat in seinem Weihnachtsblog den GY-BME280 Barometrischer Sensor für Temperatur, Luftfeuchtigkeit und Luftdruck schon vorgestellt und auch das LCD-Display 16x2 mit I2C-Adapter ist schon mehrfach verwendet worden. Im heutigen Blog wird zusätzlich gezeigt, dass der ESP32 Dev Kit C nicht nur eine, sondern gleich zwei I2C-Schnittstellen besitzt.
Was wird benötigt?
- Arduino IDE in der neusten Version
- Inhalt von Türchen Nr. 18
- Micro-USB-Kabel
- BME/BMP280
- LCD-Display 16x2 mit I2C-Adapter
- Die Bibliotheken Adafruit BME280 Library und LiquidCrystal_I2C mit allen Abhängigkeiten
Die Vorbereitung
Starten Sie die Arduino IDE und öffnen Sie die Voreinstellungen via Datei -> Voreinstellungen, siehe Abbildung 1. Sollten Sie die Arduino IDE noch nicht installiert haben, dann holen Sie dies bitte vorher nach.
Abbildung 1: Voreinstellungen öffnen
Fügen Sie bei der zusätzlichen Boardverwalter-URLs die Adresse https://dl.espressif.com/dl/package_esp32_index.json hinzu, siehe Abbildung 2.
Abbildung 2: Zusätzliche URL hinzufügen
Am besten starten Sie die Arduino IDE neu, auch wenn dies nicht zwingend notwendig ist, jedoch kann dies Problemen vorbeugen. Direkt danach öffnen Sie den Boardverwalter, siehe Abbildung 3.
|
Abbildung 3: Boardverwalter öffnen
Über die Suchleiste suchen Sie nach der ESP32-Bibliothek und installieren Sie die esp32 by Espressif Systems in der neusten Version, siehe Abbildung 4.
Abbildung 4:ESP-Boardbibliothek installieren
Damit sind die Vorbereitungen abgeschlossen und Sie können Türchen Nummer 18 nun einsetzen.
Der BME/BMP280 - Monitor
Die Verdrahtung für den BME/BMP280-Monitor ist in Abbildung 5 aufgezeigt. Bedenken Sie an dieser Stelle, dass wir zwei voneinander getrennte I“C-Schnittstellen verwenden wollen, daher den BME/BMP280 und das LCD-Display auf getrennte I2C-Pins legen.
Abbildung 5: Verdrahtung der Komponenten
Da die Bibliothek LiquidCrystal_I2C schon recht alt ist, geht nur die Default-I2C-Schnittstelle für die Konfiguration via GPIO 21 und 22. Beim BME/BMP280 können wir die Pins auf dem ESP32 Dev Kit C frei konfigurieren.
Der Quellcode ist auch recht einfach, siehe Code 1, und mit einigen Kommentaren versehen. Ansonsten können Sie die Funktion aus den seriellen Ausgaben herleiten.
//-----------------------------------------------------
// ESP32 Dev Kit C BME/BMP280 monitor
// Autor: Joern Weise
// License: GNU GPl 3.0
// Created: 11. Dec 2020
// Update: 11. Dec 2020
//-----------------------------------------------------
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <LiquidCrystal_I2C.h>
#define I2C_SDA2 17
#define I2C_SCL2 16
#define SEALEVELPRESSURE_HPA (1013.25)
#define TIMEUPDATESENSOR 30000
#define TIMESWITCHDISPLAY 10000
unsigned long lLastUpdateSensor, iLastSwitchDisplay;
float fTemp, fPress, fHumi, fAlt;
int iNewView;
TwoWire I2Ctwo = TwoWire(1);
Adafruit_BME280 bme; // I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
/*
=================================================================
Function: setup
Returns: void
Description: Needed setup()-function
=================================================================
*/
void setup() {
Serial.begin(115200);
while (!Serial); // time to get serial running
Serial.print("Init BME/BMP280 - Sensor ....");
unsigned status;
I2Ctwo.begin(I2C_SDA2, I2C_SCL2, 400000);
status = bme.begin(0x76, &I2Ctwo);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(), 16);
while (1) delay(10);
}
Serial.println(" DONE");
Serial.print("Init LCD-Display ....");
lcd.init(); // on error, try lcd.begin();
lcd.backlight();
lcd.clear();
lcd.home();
lcd.print(" BME/BMP280 ");
lcd.setCursor(0, 1);
lcd.print(" Monitoring ");
Serial.println(" DONE");
delay(5000);
Serial.println();
updateSensorData();
iNewView = -1;
}
/*
=================================================================
Function: loop
Returns: void
Description: Needed loop()-function that control sensor
and update display
=================================================================
*/
void loop() {
//Check if update for sensor-data is needed
if (millis() - lLastUpdateSensor > TIMEUPDATESENSOR) {
updateSensorData();
lLastUpdateSensor = millis();
}
//Check if new display view is needed
if (millis() - iLastSwitchDisplay > TIMESWITCHDISPLAY) {
iNewView++;
(iNewView >= 2) ? iNewView = 0 : iNewView = 1;
iLastSwitchDisplay = millis();
Serial.println("Update view on display");
updateDisplay(iNewView);
}
}
/*
=================================================================
Function: updateSensorData
Returns: void
Description: Update sensor for the newest sensor-data
=================================================================
*/
void updateSensorData() {
fTemp = bme.readTemperature();
fPress = (bme.readPressure() / 100.0F);
fAlt = bme.readAltitude(SEALEVELPRESSURE_HPA);
fHumi = bme.readHumidity();
Serial.println("----- NEXT UPDATE SENSOR -----");
Serial.println("Temperature = " + String(fTemp) + " *C");
Serial.println("Humidity = " + String(fHumi) + " %");
Serial.println("Pressure = " + String(fPress) + " hPa");
Serial.println("Approx. Altitude = " + String(fAlt) + " m");
Serial.println("------------------------------");
}
/*
=================================================================
Function: updateDisplay
IN iView: Index, which view is needed
Returns: void
Description: Update sensor for the newest sensor-data
=================================================================
*/
void updateDisplay(int iView) {
lcd.clear();
lcd.home();
if (iView == 0) //View temp and humidity {
lcd.print("Temp: " + String(fTemp) + " *C");
lcd.setCursor(0, 1);
lcd.print("Humi: " + String(fHumi) + " %");
}
else //View pressur and altitude {
lcd.print("Press: " + String(int(fPress)) + " hPa");
lcd.setCursor(0, 1);
lcd.print("Alt: " + String(fAlt) + " m");
}
}
Code 1: Code für BME/BMP280 Monitor (Download)
Damit haben Sie Türchen Nummer 18 in Betrieb genommen. Sie möchten weitere Projektideen? Dann hier einige Beispiele:
Weitere Projekte für AZ-Delivery von mir finden Sie unter https://github.com/M3taKn1ght/Blog-Repo.
1 Reactie
Klaus Kastrup
Prima Info, tolle ANGEBOTE
UND
Exzellenter Service!
Bitte weiter so!!!!