So, jetzt hat es geklappt.
Danke, Combie für den Hinweis. Die delays sind mir gar nicht aufgefallen.
Auf jeden Fall finden sich die Funkmodule wieder.
Ich musste den HC-05 noch mal mit den AT-Commands einstellen. Warum der manchmal so zickt weiß ich auch nicht. Der vertsellt sich immer: Er verliert "AT+ROLE=1" und "AT+CMODE=1" immer wieder.
Jetzt schickt der Sender sein Signal und der Empfänger schreibt die Zahlen fein säuberlich auf das Display. Nebenbei läuft der Nachtwächter und schaltet beim Sender die LED an Pin 13 alle 6 Sekunden an und aus.
Also, herzlichen Dank an alle die zu meinem Problem und zur Hilfe aller beigetragen haben.
Für alle, die ein ähnlichen Problem haben sollten, hier ein Sketch, der soweit funktioniert.
Zunächst der Sender mit Nachtwächter:
#include <Streaming.h> //Bibliothek zur BT Verbindung
#include <SoftwareSerial.h>
#include "DHT.h" //DHT Bibliothek laden
enum Comand {
Temperatur = 1,
Feuchtigkeit = 2
};
int LedStatus = LOW;
int LedPin = 13;
unsigned long LED_timestore; //Variable Speicher für Systemzeit
const long interval = 1000;
#define rxPin 3
#define txPin 4
#define DHTPIN 2
#define DHTTYPE DHT22 //Es handelt sich um den DHT22 Sensor
SoftwareSerial btSerial(rxPin, txPin);
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen
void setup()
{
btSerial.begin(9600);
Serial.begin(9600);
dht.begin();
//Festlegen der Ein- und Ausgänge für die BL Verbindung
pinMode(LedPin, OUTPUT); //teilt dem Arduino mit, dass das ein Ausgang ist
}
void loop()
{
if (LedStatus == LOW)
{
if (millis() - LED_timestore>1000)
{
digitalWrite (LedPin, HIGH);
LED_timestore = millis();
LedStatus = HIGH;
}
}
else
{
if (millis() - LED_timestore>300)
{
digitalWrite(LedPin, LOW);
LedStatus = LOW;
}
}
float tempaussen = dht.readTemperature(); //Temperatur außen wird gemessen und gespeichert
float feuchteaussen = dht.readHumidity(); //Luftfeuchte außen wird gemessen und gespeichert
//Senden der Messwerte
delay(3000);
btSerial << Temperatur << ',' << tempaussen << ';' << endl;
delay(3000);
btSerial << Feuchtigkeit << ',' << feuchteaussen << ';' << endl;
/*****************************************/
//Löschen der Messwerte
tempaussen = 0; //Der Wert für Temperatur wird genullt
feuchteaussen = 0; //Der Wert für Feuchte wird für die nächste Runde genullt
}
Der Empfänger-Sketch sieht so aus:
#include <CmdMessenger.h> //Bibliothek zur BT Verbindung
#include <Streaming.h> //Bibliothek zur BT Verbindung
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h> //LiquidCrystal_I2C Bibliothek einbinden
///////////Für das "°" Zeichen ////////////
byte degree[8] = {
B01110,
B01010,
B01110,
B00000,
B00000,
B00000,
B00000,
B00000
};
/////////////Für das "³" Zeichen ////////////////
byte hochdrei[8] = {
B00111,
B00001,
B00011,
B00001,
B00111,
B00000,
B00000,
B00000
};
enum Comand {
Temperatur = 1,
Feuchtigkeit = 2
};
#define ledfR 8
#define ledfG 9
#define ledfB 10
#define ledR 11
#define ledG 12
#define ledB 13
#define rxPin 3
#define txPin 4
float t = 0;
float f = 0;
float ti = 0;
float fi = 0;
LiquidCrystal_I2C lcd(0x27, 20, 4); //Hier wird festgelegt um welches Display es sich handelt
SoftwareSerial btSerial(rxPin, txPin);
CmdMessenger cmdMessenger {btSerial};
void setup()
{
Serial.begin(9600);
btSerial.begin(9600);
Serial << "Start: "<< __FILE__ << endl;
cmdMessenger.attach(Temperatur, [](){
t = cmdMessenger.readFloatArg();
Serial << "Temperatur " << t << " °C" << endl;
});
cmdMessenger.attach(Feuchtigkeit, [](){
f = cmdMessenger.readFloatArg();
Serial << "Feuchtigkeit " << f << " %" << endl;
});
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
lcd.init(); //Im Setup wird der LCD gestartet
lcd.backlight(); //Hintergrundbeleuchtung einschalten
analogWrite(ledR,0);
analogWrite(ledG,0);
analogWrite(ledB,255);
}
void loop()
{
cmdMessenger.feedinSerialData();
//Berechnung der absoluten Feuchtigkeit
float RD = 461.5;
float e_sat = 611.2*pow(2.7183, (17.62*t/(243.12+t)));
float rho_sat = (e_sat*1000)/(RD*(t+273.15));
float rho_fi = rho_sat*(f/100);
//Displayausgabe der Temperatur Außen
if(t >= 9.95)
{
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(t, 1);
lcd.createChar(0, degree);
lcd.setCursor(5, 0);
lcd.write(0);
lcd.print("C");
}
if(t < 9.95)
{
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(1, 0);
lcd.print(t, 1);
lcd.createChar(0, degree);
lcd.setCursor(5, 0);
lcd.write(0);
lcd.print("C");
}
//Displayausgabe der Feuchtigkeit Außen
if(f >= 9.95)
{
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(f, 1);
lcd.print(" %");
}
if(f < 9.95)
{
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(1, 1);
lcd.print(f, 1);
lcd.print(" %");
}
//Displayausgabe der absoluten Feuchtigkeit Außen
if(rho_fi >= 9.95)
{
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print(rho_fi, 1);
lcd.print(" g/m");
}
if(rho_fi < 9.95)
{
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(1, 2);
lcd.print(rho_fi, 1);
lcd.print(" g/m");
}
lcd.createChar(1, hochdrei);
lcd.setCursor(8, 2);
lcd.write(1);
//Auswertung der Luftfeuchtigkeit
if((f < 30) or (f > 70))
{
analogWrite(ledfR,255);
analogWrite(ledfG,0);
analogWrite(ledfB,0);
}
if((f >= 30) and (f < 40) or (f > 60) and (f <= 70))
{
analogWrite(ledfR,255);
analogWrite(ledfG,100);
analogWrite(ledfB,0);
}
if((f >= 40) and (f <= 60))
{
analogWrite(ledfR,0);
analogWrite(ledfG,150);
analogWrite(ledfB,0);
}
delay(5000); //5 Sekunden Pause
}
Falls es für die Sketche irgendwelche Verbesserungen gibt, bin ich dafür offen.