Guten Tag,
ich bastel im moment an einer art Wetterstation, aktuell mit Temperatur und Luftfeuchtesensoren.
Nun möchte ich eine kleine Funktion einbauen, welche eine Fehlermeldung ausgibt sobald ein Sensor kein Signal liefert.
Das wollte ich hiermit bewerkstelligen:
void Fehlermeldung()
{
if (isnan(h)) {
display.fillScreen(BLACK);
display.setTextColor(CYAN, BLACK);
display.setTextSize(1);
display.setCursor(0,0);
display.println("Feuchtesensor");
display.println("konnte nicht");
display.println("gefunden werden");
return;
}
Theoretisch sollte das Programm so lange in der Schleife festsitzen bis der Sensor wieder Zahlenwerte liefert.
Jedoch überschreiben sich die Fehlermeldung und die normale Anzeige (Temperatur und Luftfeuchtigkeit) mit jedem Durchgang.
Hier der ganze Code:
#define sclk 13
#define mosi 11
#define cs 10
#define rst 9
#define dc 8
// Displayfarben
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
// Temperatur Datenport
#define ONE_WIRE_BUS 2
// Luftfeuchtigkeit Datenport
#define DHTPIN 3
#define DHTTYPE DHT22
// LIBS
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1331.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"
Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, mosi, sclk, rst);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DHT dht(DHTPIN, DHTTYPE);
long previousMillis1 = 0; // Zeit merken Temperaturabfrage
long previousMillis2 = 0; // Zeit merken Display
long previousMillis3 = 0; // Zeit merken Luftfeuchtigkeitsmessung
long interval1 = 1000; // Temperaturabfrage
long interval2 = 1000; // Displayfrequenz
long interval3 = 2000; // Frequenz Luftfeuchtigkeit
float h = 0; // Luftfeuchtigkeit
float t = 0; // Temperatur
void setup(void) {
Serial.begin(9600);
display.begin();
sensors.begin();
dht.begin(); // DHT22 Lib
uint16_t time = millis();
display.fillScreen(BLACK);
time = millis() - time;
}
void loop() {
unsigned long currentMillis = millis();
Fehlermeldung(); // <-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-
if(currentMillis - previousMillis1 > interval1) {
TempAbfragen ();
previousMillis1 = currentMillis;
}
if(currentMillis - previousMillis2 > interval2) {
TemperaturOLED();
previousMillis2 = currentMillis;
}
if(currentMillis - previousMillis3 > interval3) {
Luftfeuchtigkeit();
previousMillis3 = currentMillis;
}
}
/*************************************************************/
/* ****************** F U N K T I O N E N ****************** */
/*************************************************************/
void TemperaturOLED()
{
/*~~~~~~~~~~~~~~~~~~~ Temperatur ~~~~~~~~~~~~~~~~~~~~~*/
display.setTextColor(GREEN, BLACK);
display.setTextSize(1);
display.setCursor(2,2);
display.print("Temperatur:");
display.setTextColor(RED, BLACK);
display.setTextSize(2);
display.setCursor(2,12);
display.print(t);
display.print((char)247);
display.print("C");
/*~~~~~~~~~~~~~~~~ Luftfeuchtigkeit ~~~~~~~~~~~~~~~~~~*/
display.setTextColor(GREEN, BLACK);
display.setTextSize(1);
display.setCursor(2,36);
display.print("Luftfeuchte:");
display.setTextColor(RED, BLACK);
display.setTextSize(2);
display.setCursor(2,46);
display.print(h);
display.print("%");
}
void TempAbfragen ()
{
sensors.requestTemperatures();
t = (sensors.getTempCByIndex(0));
Serial.println(t);
}
void Luftfeuchtigkeit()
{
h = dht.readHumidity();
Serial.println(h);
}
void Fehlermeldung() // <-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-
{
if (isnan(h)) {
display.fillScreen(BLACK);
display.setTextColor(CYAN, BLACK);
display.setTextSize(1);
display.setCursor(0,0);
display.println("Feuchtesensor");
display.println("konnte nicht");
display.println("gefunden werden");
return;
}
}
Was muss ich nun anders machen um eine unterbrechung bewerkstelligen zu können?
Ich vermute mal das das mit den millis() zusammenhängt das das so nicht klappt?
Mit freundlichen Grüßen
Troxan