Hallo zusammen, ich mal wieder.
Folgendes Problem beschäftigt mich. Ich habe einen Aufbau mit einem Arduino Nano, einem DHT22 , einem BMP180 und einem kleinen Oled Display.
Der erste Code wirkt noch etwas unaufgeräumt, funktioniert auch einwandfrei
Alle 3 Sekunden wechselt das Display zwischen den Werten und das passt auch so
#include <BMP180I2C.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
//Temperatursensor
#include "DHT.h"
#define DHTPIN 4 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
//oled-Display
// 0X3C+SA0 - 0x3C or 0x3D
#define I2C_ADDRESS 0x3C
//Drucksensor
BMP180I2C bmp180(0x77);
float druck;
//Mehr Infos: https://arduino-projekte.webnode.at/meine-libraries/luftdrucksensor-bmp180/
// Define proper RST_PIN if required.
#define RST_PIN -1
SSD1306AsciiWire oled;
int warten = 3000;
//------------------------------------------------------------------------------
void setup() {
// temperatursensor
dht.begin();
Serial.begin(9600);
//oled Display
Wire.begin();
Wire.setClock(400000L);
//Drucksensor
//begin() initializes the interface, checks the sensor ID and reads the calibration parameters.
if (!bmp180.begin())
{
Serial.println("begin() failed. check your BMP180 Interface and I2C Address.");
while (1);
}
//reset sensor to default parameters.
bmp180.resetToDefaults();
//enable ultra high resolution mode for pressure measurements
bmp180.setSamplingMode(BMP180MI::MODE_UHR);
//Mehr Infos: https://arduino-projekte.webnode.at/meine-libraries/luftdrucksensor-bmp180/
#if RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0
oled.setFont(Arial14);
}
//------------------------------------------------------------------------------
uint32_t m = micros();
void loop() {
//start a temperature measurement
if (!bmp180.measureTemperature())
{
Serial.println("could not start temperature measurement, is a measurement already running?");
return;
}
//wait for the measurement to finish. proceed as soon as hasValue() returned true.
do
{
} while (!bmp180.hasValue());
Serial.print("Temperature: ");
Serial.print(bmp180.getTemperature());
Serial.println(" degC");
//start a pressure measurement. pressure measurements depend on temperature measurement, you should only start a pressure
//measurement immediately after a temperature measurement.
if (!bmp180.measurePressure())
{
Serial.println("could not start perssure measurement, is a measurement already running?");
return;
}
//wait for the measurement to finish. proceed as soon as hasValue() returned true.
do
{
delay(100);
} while (!bmp180.hasValue());
druck = (bmp180.getPressure() / 100);
Serial.print("Pressure: ");
Serial.print(bmp180.getPressure() / 100);
Serial.println(" hPa");
//Mehr Infos: https://arduino-projekte.webnode.at/meine-libraries/luftdrucksensor-bmp180/
// Temperaturmessung
// Wait a few seconds between measurements.
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
//oled.clear();
oled.set2X();
oled.setCursor(0, 0);
oled.println("Temp:");
//oled.set2X();
oled.print(t);
oled.print(" C");
delay(warten);
Serial.println(t);
oled.clear();
//oled.set1X();
oled.setCursor(0, 0);
oled.println("Hum:");
//oled.set2X();
oled.print(h);
oled.print(" %");
delay(warten);
oled.clear();
oled.setCursor(0, 0);
oled.println("Press:");
//oled.set2X();
oled.print(druck);
oled.print(" hPa");
delay(warten);
oled.clear();
if (druck > 913)
{
oled.println("Hochdruck");
delay(warten);
oled.clear();
}
else
{
oled.println("Tiefdruck");
delay(warten);
oled.clear();
}
}
Jetzt habe ich die Schaltung um einen Taster und einen Pulldownwiderstand (1K) erweitert, um manuell zwischen den Anzeigen zu schalten.
Das funktioniert soweit. Allerdings habe ich zwei Probleme.
- Wenn der Arduino einen Reset erfährt, wird auf dem Display erst etwas angezeigt, wenn der Taster gedrückt wird. Ist ja eigentlich auch klar, da die Einzelnen States erst ausgewertet werden, nachdem der Taster gedrückt wurde. Gibt es da eine Möglichkeit, das zu umgehen?
- Die Druckanzeige stimmt ist um 60 hPa kleiner als beim vorherigen Sketch. Kann das mit dem Taster zusammenhängen, und wenn ja, wieso?
#include <BMP180I2C.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
//Temperatursensor
#include "DHT.h"
#define DHTPIN 4 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
//oled-Display
// 0X3C+SA0 - 0x3C or 0x3D
#define I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;
//Drucksensor
BMP180I2C bmp180(0x77);
float druck;
//Taster
#define tasterPin 3
#define debounce_delay 15 //Entprellzeit für den Taster in ms
bool led_state, tasterState, tasterState_alt;// Variablendeklaration (global)
uint8_t counter; //Zählt wie oft die Taste gedrückt wurde
// Define proper RST_PIN if required.
#define RST_PIN -1
int warten = 3000;
//------------------------------------------------------------------------------
void setup() {
// temperatursensor
dht.begin();
Serial.begin(9600);
//oled Display
Wire.begin();
Wire.setClock(400000L);
//Drucksensor
if (!bmp180.begin())
{
Serial.println("begin() failed. check your BMP180 Interface and I2C Address.");
while (1);
}
//reset sensor to default parameters.
bmp180.resetToDefaults();
//enable ultra high resolution mode for pressure measurements
bmp180.setSamplingMode(BMP180MI::MODE_UHR);
//oled.begin
#if RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0
oled.setFont(Arial14);
}
//------------------------------------------------------------------------------
uint32_t m = micros();
void loop() {
//start a pressure measurement. pressure measurements depend on temperature measurement, you should only start a pressure
//measurement immediately after a temperature measurement.
if (!bmp180.measurePressure())
{
Serial.println("could not start perssure measurement, is a measurement already running?");
return;
}
//wait for the measurement to finish. proceed as soon as hasValue() returned true.
do
{
delay(100);
} while (!bmp180.hasValue());
druck = (bmp180.getPressure() / 100);
// Temperaturmessung
// Wait a few seconds between measurements.
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
oled.set2X();
//Taster auswerten
static uint32_t debounce_time;
if (millis() - debounce_time > debounce_delay)tasterState = digitalRead(tasterPin); //einlesen des Tasters
if (tasterState != tasterState_alt) // bei Pegelwechsel
{
debounce_time = millis();
oled.clear();
#ifdef DEBUG
Serial.println(counter);
#endif
if (!tasterState) //wenn Taster gedrückt
{
counter++;
if (counter < 2 || counter > 3)counter = 1;
}
tasterState_alt = tasterState; // state aktualisieren
}
if (counter == 1)
{
oled.setCursor(0, 0);
oled.println("Temp:");
oled.print(t);
oled.print(" C");
}
if (counter == 2)
{
oled.setCursor(0, 0);
oled.println("Hum:");
oled.print(h);
oled.print(" %");
}
if (counter == 3)
{
oled.setCursor(0, 0);
oled.println("Press:");
oled.print(druck,1);
oled.print(" hPa");
}
}
Ich find den Fehler nicht. Hier noch der Aufbau. die beiden Kabel, welche aus dem Bild gehen sind die Stromversorgung für einen 2. Aufbau.