Wohnwagen Kontrollcenter Arduino

Premium Wohnwagen haben es oft schon Serienmäßig. Doch wer ältere oder günstige neue auch auf den aktuellen Stand der Technik bringen will, steht vor einem Problem. Entweder sind die Plug & Play Lösungen sofern überhaupt vorhanden ziemlich teuer.

Es geht aber auch anders und das überaus günstig.

Mit einem Arduino kann man fast alles machen was das Herz begehrt. Hier zeige ich unsere Lösung die sich auch nur ein paar Parameter beschränkt (es ist aber jederzeit erweiterbar).

Wir wollen eigentlich nur ein paar Dinge wissen. Das sind die Innentemperatur, die Außentemperatur, die Temperatur vom Kühlschrank und den Wasserstand. (Batterie wird bei uns sowieso über den Solarladeregler angezeigt, daher haben wir das nicht mit eingebunden)

Was braucht man alles?

Softwareseitig die aktuelle Arduino IDE

Hardwareseitig hier per affilate Links zu Amazo (ihr müsst natürlich nicht über diese Links bestellen, doch unterstützt ihr uns damit, wenn ihr es macht) :

Arduino Nano oder Uno (wir haben einen Uno im Einsatz)
DS18B20 Temperatursensoren
Ultraschallsensor HC-SR04 gibt es auch unter in Wasserdicht mit der Bezeichnung JSN-SR04T
LED Farbe je nach Wunsch
1x Widerstand 330 Ohm für LED und 1x 4.7Kohm für die Sensoren
Lochraster oder Streifenplatinie
5×2 bzw 3×3 Terminal Screw (das sind Schraubverbindungen die auf die Platine gelötet werden=
1x Kamera Flachbandkabel (ein ultraflachkabel üblicherweise für Kameras, aber so kommt man gut in den Kühlschrank ohne das die Dichtung leiden muss)
Jumperkabel
Lötkolben
LCD 2004 Display mit I2C Shield I2C Display Libary am besten die von LiquidCrystal_I2C Master verwenden
(Am Display selbst aufpassen, wenn nichts angezeigt wird, hinten ist ein Porti, der für den Kontrast zuständig ist und der ist meist zu schwach eingestellt. Da also mal verstellen dann sollte auch was angezeigt werden.)
Kabel, wir haben 15m Cat 6 Kabel benutzt, die sind dünn und in großen längen verfügbar zu geringem Preis.
ggf. 3D Drucker für Gehäuse etc.
ggf. eine USB Steckdose zur Stromversorgung des Arduinos oder gesicherte 12V über den Jackanschluss.

Fangen wir also an, als allererstes sollten wir den Arduino mit den Komponenten verbinden (wichtig wenn ihr Pins ändert, muss das im Code auch geändert werden)
Hier dazu der Schaltplan, ihr könnt auch statt einer Lochraster Platine ein Bredboard verwenden, jedoch wird das auf Dauer durch die Virbrationen im Wohnwagen/Wohnmobil nicht allzu lange halten und nimmt dazu noch viel Platz weg. Jedoch empfiehlt es sich den ersten Aufbau damit zu machen um alle komponenten zu testen. Insbesondere auch um die jeweilige ID der Temperatursensoren einfach zu ermitteln.

Hier unser Aufbau über Breadboard und und der Anschlussplan über Lochrasterplatine. (auch im Code habe ich Hinweise für den Anschluss kommentiert)

 

Um die jeweilige ID der Sensoren zu ermitteln, müssen wir ersteinmal einen I2C Scanner auf den Arduino spielen und einen Sensor nach dem anderen Anschließen und auslesen. Die Sensoren am besten farblich markieren damit man sie später besser zuordnen kann. Die ID muss im Code geändert werden (bei DeviceAddress sensor) da ihr sonst keine Daten bekommt (die IDs im Code entsprechen unseren Sensoren).

Für den Ultraschall müsst ihr natürlich noch euren Tank anpassen ich habe die Stellen im Code Grün hinterlegt.

Auslesen der IDs und übertragen in den Code.

Link 

Hier der Testaufbau in Aktion (Ultraschallsensor zeigt in die Luft und produziert damit einen Fehler, den die LED signalisiert)

Das wars eigentlich schon. Die LED signalisiert durch Blinken ob die Kühlschranktemperatur zu hoch ist oder ob der Wasserstandssensor ein Problem hat. Haben beide Teile gleichzeitig ein Problem leuchtet die LED dauerhaft.

Hier der Aufbau fertig auf Platine gelötet und verbaut.
Bilder folgen sobald der neue Wohnwagen geliefert wurde und die Steuerung eingebaut wurde.


Sketch Code:

//Display lcd scl pin A5 SDA pin A4

int trigger=7; //pin 7 für trigger signal von Ultraschall
int echo=6; //pin 6 für echo signal von Ultraschall
int AlarmTemp = 7.5; // das ist die Alarmtemperatur für die Kühlung
long dauer=0;
long zeit=0;
long entfernung=0;
long entfernung1=0;
long max_liter=0;

int AO = 0;
int LED = 5; //plus an pin 5 minus an 330ohm widerstand zu minus

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h> // IIC-Bibliothek
#include <LiquidCrystal_I2C.h> // LCD-Bibliothek für IIC
#define ONE_WIRE_BUS 2 // Data wire => Digitaler Pin 2 des Arduino
LiquidCrystal_I2C lcd(0x27,20,4); // IIC-ID LCD: 0x27, Größe: 16×2
OneWire oneWire(ONE_WIRE_BUS); // Initialisieren des 1-Wire Bus
DallasTemperature sensors(&oneWire); // Übergabe der 1-Wire Info

// Device Adressen der einzelnen ds18b20 Temperatursensoren angeben (die Sensoren wurden farblich markiert zur Unterscheidung)
DeviceAddress sensor1 = { 0x28, 0x2D, 0x55, 0x79, 0xA2, 0x16, 0x03, 0x83 }; // Innen“ gold
DeviceAddress sensor2 = { 0x28, 0x4B, 0xA1, 0x79, 0xA2, 0x16, 0x03, 0x4B }; // Aussen“, rot orange
DeviceAddress sensor3 = { 0x28, 0x23, 0xD7, 0x79, 0xA2, 0x16, 0x03, 0xD8 }; // Kühlung,grün

byte termometru[8]={0x04,
0x0A,
0x0A,
0x0A,
0x0E,
0x1F,
0x1F,
0x0E}; //icon für termometer

byte block[8]={
0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e}; //icon für weißen block

byte tropfen[] = //Icon für Wasserhahn
{
0x04,
0x1E,
0x1F,
0x01,
0x00,
0x01,
0x00,
0x01
};

void setup(void) {
lcd.init(); // LCD initialisieren
lcd.backlight(); // Hintergrundlicht einschalten
sensors.begin();

// Thermometersymbol auf LCD Speichern
lcd.createChar(1, termometru); //definert die eigenen icons

// Wasserhahnsymbol auf LCD Speichern
lcd.createChar(2, tropfen); //definert die eigenen icons

// Weißer Blocksymbol
lcd.createChar(3, block); //definert die eigenen icons

Serial.begin (9600);
pinMode(trigger, OUTPUT); // definiert den Trigger Pin auf dem Board als Ausgang
pinMode(echo, INPUT); // definiert den Echo Pin auf dem Board als Eingang
pinMode(12, OUTPUT); // definiert Pin 12 auf dem Board als Ausgang
pinMode (LED, OUTPUT); // definiert den Pin der LED auf dem Board als Ausgang

}

void loop(void) {
// Nun starten die eigentlichen Abfragen
sensors.requestTemperatures();

lcd.setCursor(0,0); // Cursor auf Beginn der 1. Zeile
lcd.print(char(1)); //Thermometer
lcd.setCursor(1,0); // Cursor auf Beginn der 1. Zeile und das 2. kästchen
lcd.print(„Innen „);

lcd.setCursor(9,0); // Cursor auf Beginn der 1. Zeile und das 10. kästchen
lcd.print(sensors.getTempC(sensor1)); // Temperatur ausgeben
lcd.setCursor(14,0); // Cursor auf Beginn der 1. Zeile und das 15. kästchen
lcd.print(„\337C“);
lcd.setCursor(16,0); // Cursor auf Beginn der 1. Zeile und das 17. kästchen
lcd.print(char(3)); //weißer Block
lcd.setCursor(17,0); // Cursor auf Beginn der 1. Zeile und das 18. kästchen
lcd.print(„MA“);
lcd.setCursor(19,0); // Cursor auf Beginn der 1. Zeile und das 20. kästchen
lcd.print(char(3)); //weißer Block

lcd.setCursor(0,1); // Cursor auf Beginn der 2. Zeile und das 1. kästchen
lcd.print(char(1)); //Temperatur Icon
lcd.setCursor(1,1); // Cursor auf Beginn der 2. Zeile und das 2. kästchen
lcd.print(„Aussen „);
lcd.setCursor(9,1); // Cursor auf Beginn der 2. Zeile und das 10. kästchen
lcd.print(sensors.getTempC(sensor2)); // Temperatur ausgeben
lcd.setCursor(14,1); // Cursor auf Beginn der 2. Zeile und das 15. kästchen
lcd.print(„\337C“);
lcd.setCursor(16,1); // Cursor auf Beginn der 2. Zeile und das 17. kästchen
lcd.print(char(3)); //weißer Block
lcd.setCursor(17,1); // Cursor auf Beginn der 2. Zeile und das 18. kästchen
lcd.print(„TZ“);
lcd.setCursor(19,1); // Cursor auf Beginn der 2. Zeile und das 20. kästchen
lcd.print(char(3)); //weißer Block

lcd.setCursor(0,2); // Cursor auf Beginn der 3. Zeile und das 1. kästchen
lcd.print(char(1)); //Temperatur Icon
lcd.setCursor(1,2); // Cursor auf Beginn der 3. Zeile und das 2. kästchen
lcd.print(„K\365hlung“);
lcd.setCursor(9,2); // Cursor auf Beginn der 3. Zeile und das 10. kästchen
lcd.print(sensors.getTempC(sensor3)); // Temperatur ausgeben
lcd.setCursor(14,2); // Cursor auf Beginn der 3. Zeile und das 15. kästchen
lcd.print(„\337C“);
lcd.setCursor(16,2); // Cursor auf Beginn der 3. Zeile und das 17. kästchen
lcd.print(char(3)); //weißer Block
lcd.setCursor(17,2); // Cursor auf Beginn der 3. Zeile und das 18. kästchen
lcd.print(„AT“);
lcd.setCursor(19,2); // Cursor auf Beginn der 3. Zeile und das 20. kästchen
lcd.print(char(3)); //weißer Block

digitalWrite(trigger, LOW); //akziviert das trigger signal vom US
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH);
zeit= (dauer/2.0); //da wir nur den einfachen weg der Entfernung brauchen müssen wir die Dauer vom Ausgang des Signals zum Abprall und dann zum Empfang des Signals halbieren
entfernung = zeit / 29.1; // Schallgeschwindigkeit
max_liter=25.0; // definiert die max Liter hier 25 Liter

int distance,percentage,heightTank,deviation,liter,liter2;
heightTank=22.0; //definiert den max Abstand bis zum Boden des Tanks
deviation=2.0; //definiert den Abstand vom Sensor bis zur max Höhe des Tanks

percentage=100.0-(((entfernung-deviation)*100.0)/heightTank);
entfernung1=(entfernung-deviation); //falls man lieber Prozent ausgeben möchte statt liter kann man bei lcd.print(liter2); auch lcd.print(percentage); eingeben

if((sensors.getTempC(sensor3) > AlarmTemp)){ //wenn sensor 3 werte über der definierten Temperatur ausgibt…
digitalWrite(LED, HIGH); //…dann soll die LED leuchten
}

else if((sensors.getTempC(sensor3) <= AlarmTemp)){ //und falls der Wert unter der definierten Temperatur lieg dann…
digitalWrite(LED, LOW); //…soll die LED aus sein.
}

if (entfernung >= 22 || entfernung <= 0) //Fehler ausgeben
{
lcd.setCursor(0,3); // Cursor auf Beginn der 4. Zeile und das 1. kästchen
lcd.write(2); //Wasserhahn
lcd.setCursor(1,3); // Cursor auf Beginn der 4. Zeile und das 2. kästchen
lcd.print(„Wasser“);
lcd.setCursor(8,3); // Cursor auf Beginn der 4. Zeile und das 9. kästchen
lcd.print(„?? Liter“); //Text ausgabe
lcd.setCursor(16,3); // Cursor auf Beginn der 4. Zeile und das 17. kästchen
lcd.print(char(3)); //weißer Block
lcd.setCursor(17,3); // Cursor auf Beginn der 4. Zeile und das 18. kästchen
lcd.print(„ON“);
lcd.setCursor(19,3); // Cursor auf Beginn der 4. Zeile und das 20. kästchen
lcd.print(char(3)); //weißer Block
digitalWrite(LED, HIGH); //dann soll die LED leuchten //bei dieser Fehlerabfrage wenn postiv dann soll die LED leuchten

}

else // falls keine Fehler vorliegen beginne Berechnung

{

liter=22 – entfernung1; //zieht von der max Entfernung den Abstand des Sensors ab
liter2= liter * 1.25; //berechnet die gemessenen cm in liter um 1.25 ist der mulitplikator 100% Tankvolumen geteilt durch die max höhe des tanks
//hier 25L Tank bei 22cm minus abstand sensor 2cm. Also 25 geteilt durch 20 = 1,25
lcd.setCursor(0,3); // Cursor auf Beginn der 4. Zeile und das 1. kästchen
lcd.write(2); //Wasserhahn
lcd.setCursor(1,3); // Cursor auf Beginn der 4. Zeile und das 2. kästchen
lcd.print(„Wasser „);
digitalWrite(LED, LOW); //Sicherheitshalber die LED ausschalten sollte sie noch von einer fehlmessung zuvor an sein.

lcd.setCursor(8,3); // Cursor auf Beginn der 4. Zeile und das 9. kästchen
if(liter2 <10) lcd.print(“ „); // ein leerzeichen wenn Zahl kleiner 2-stellig einfügen um bei vorheriger 15 und neu 9 ein 95 zu verhindern

lcd.print(liter2);
lcd.setCursor(11,3); // Cursor auf Beginn der 4. Zeile und das 12. kästchen
lcd.print(„Liter“);
lcd.setCursor(16,3); // Cursor auf Beginn der 4. Zeile und das 17. kästchen
lcd.print(char(3)); //weißer block
lcd.setCursor(17,3); // Cursor auf Beginn der 4. Zeile und das 18. kästchen
lcd.print(„ON“);
lcd.setCursor(19,3); // Cursor auf Beginn der 4. Zeile und das 20. kästchen
lcd.print(char(3));

}
delay(1000); //sekündlich alles wiederholen

}