Hallo!
Ich habe eine Wohnung mit Nachtspeicherheizungen. Die Ladesteuerung dieser Heizungen möchte ich mittels Arduinos (1 Stück / Heizung) "automatisieren".
Ich will einfach einen Abgleich von Aussentemperatur zu Heizungstemperatur durchführen.
Als Temp-Sensoren nutze ich DS18B20-Modelle.
Dafür habe ich einen Funkt-Aussentemperatur-Sender mit folgendem Code gebaut:
#include <VirtualWire.h>
#include <OneWire.h>#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
char msg[6];
void setup() {
sensors.begin();
vw_setup(2000);
vw_set_tx_pin(3);
}
void loop() {
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0);
dtostrf(temperature, 6, 2, msg);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
delay(200);
}
Und jetzt die Baustelle:
Am Empfänger habe ich ein Display angeschlossen.
Der Aussentemperaturwert soll in die Variable "aussentemp" geschrieben werden -> Dabei entseht aber nur "Datenmüll"!
Der untere Bereich mit den ganzen Schleifen dient dazu, bei sinkender Aussentemperatur die Heizung stärker aufladen zu lassen. Das funktioniert auch, wenn ich die Aussentemperatur manuell vorgebe und die Innentemperatur "mittels lötkolben" messe ![]()
Eine Anzeige der Aussentemperatur auf dem LCD-Display funktioniert auch (auch im negativen Bereich der Kühltruhe)!
Wenn ich aber die Temperatur vom Funkempfänger in die Variable "aussentemp" schiebe, kommt nur Müll raus!
Kann mir dabei jemand helfen, wie ich das hin bekomme?
DANKE!
/*
ALLES FUNKTIONIERT MIT EINER AUSNAHME
Der Aussentemperaturwert wird FALSCH in den Wert "aussentemp" übertragen!Übergangsweise ist aussentemp auf 12 gesetzt zum Test der Schleifenwerte!
*/#include <LiquidCrystal.h>
#include <VirtualWire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int i;
int heizungtemp; // Temperatur in C der Heizung selber über internen Fühler
int aussentemp; //Temperatur in C von draussen per Funksender
int heizungsoll; // Solltemperatur der Heizung
int ladungein = 11; // Kontakt-Pin, an den Last Lastrelais angeschlossn wird
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Ansteuerkontakte für LCD-Display MIT TASTEN!!
void setup(){
pinMode (ladungein, OUTPUT); // Deklarierung des Ansteuerkontaktes für Laderelais als Ausgang
sensors.begin();Serial.begin(9600);
lcd.begin(16, 2);
vw_setup(2000);
vw_rx_start();
vw_set_rx_pin(2); //Zuweisung Anschlusspin 2 Funkempfänger
}
void loop(){
digitalWrite(ladungein, LOW);
lcd.setCursor(0, 1); // Displayanzeige Innentemperatur der Heizunglcd.print("Indoor: ");
sensors.requestTemperatures();
heizungtemp = sensors.getTempCByIndex(0);
//lcd.print(sensors.getTempCByIndex(0)); // DisplayAusgabe der Heizungstemperaur über direkte Messung vom Sensor zum Display
lcd.print(heizungtemp); // DisplayAusgabe über variable "heizungstemp" zum Display
lcd.setCursor(14, 1);lcd.print((char)223);
lcd.print("C");
//Serial.println("heizungtemp:");
//Serial.println(sensors.getTempCByIndex(0));uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if( vw_get_message(buf, &buflen) )
{
lcd.setCursor(0, 0);
lcd.print("Outdoor:");
for (i = 0; i < buflen; i++)
{
//aussentemp = buf*; // Hier entsteht der Datenmüll[/b]*
lcd.write(buf*);*
}
lcd.setCursor(14, 0);
lcd.print((char)223);
lcd.print("C");
}
aussentemp = 13.8; //Nur zu Testzwecken manuell vorgegeben!
if (aussentemp < 16.5 )
{* heizungsoll < 24;*
}
if (aussentemp < 14.5 )
{* heizungsoll = 28;*
}
if (aussentemp < 12.5 )
{* heizungsoll = 32;*
}
if (aussentemp < 10.5 )
{* heizungsoll = 36;*
}
if (aussentemp < 8.5 )
{* heizungsoll = 40;*
}
if (aussentemp < 6.5 )
{* heizungsoll = 44;*
}
if (aussentemp < 4.5 )
{* heizungsoll = 48;*
}
if (aussentemp < 2.5 )
{* heizungsoll = 52;*
}
if (aussentemp < 0.5 )
{* heizungsoll = 56;*
}
if (aussentemp < -1.5 )
{* heizungsoll = 60;*
}
if (aussentemp < -3.5 )
{* heizungsoll = 64;*
}
if (aussentemp < -5.5 )
{* heizungsoll = 68;*
}
if (aussentemp < -7.5 )
{* heizungsoll = 72;*
}
if (aussentemp < -9.5 )
{* heizungsoll = 76;*
}
if (aussentemp < -11.5 )
{* heizungsoll = 80;*
}
if (aussentemp < -13.5 )
{* heizungsoll = 84;*
}
if (aussentemp < -15.5 )
{* heizungsoll = 88;*
}
if (aussentemp < -17.5 )
{* heizungsoll = 92;*
}
if (aussentemp > 16.5 )
{* heizungsoll = 0;*
}
if (heizungtemp < heizungsoll)
{* digitalWrite(ladungein, HIGH);*
* Serial.println("Ladung EIN");*
}
if (heizungtemp > heizungsoll)
{* digitalWrite(ladungein, LOW);*
* Serial.println("Ladung AUS");*
}
Serial.println("heizungtemp:"); //Displayausgabe der Heizungstemperatur, Heizungssoll-Temperatur & Außentemperatur
Serial.println(heizungtemp);
Serial.println("heizungsoll:");
Serial.println(heizungsoll);
Serial.println("aussentemp:");
Serial.println(aussentemp);
Serial.println("------------");
delay(5000); // Verlangsamte Messung im 5-Sekunden Takt
}
[/quote]