'Fertig' Einsteiger und "Smart Wohnwagen"

Hallo zusammen,ich bin ganz frisch dabei.
Ich möchte gerne in meinen Wohnwagen ein paar Features einbauen.
Ich habe eine Hand voll Arduino Nano und einen Mega 2560 zur Verfügung.
Folgendes ist (erstmal) geplant:

  • Aussentemperatur mit DS18B20
  • Innentemperatur & Luftfeuchtigkeit DHT11
  • Temperatur Kühlschrank-Rückseite
  • Gassensor MQ2
  • Wasserstand per Ultraschall HC-SR04

DHT11 Innentemperatur klappt soweit.
Ich hänge gerade daran das der DS18b20 nur eine Kommastelle anzeigt.

Kann mir da jemand helfen?

Viele Grüße
Hutschy

Hier mein Sketch:

#include "Arduino.h"
#include "Wire.h"
#include "OneWire.h"
#include "MicroLCD.h"
#include "DallasTemperature.h"
//#include "fonts.h"
#define DS18B20 2
OneWire ourWire(DS18B20);
DallasTemperature sensors(&ourWire);
//LCD_SH1106 lcd; /* for SH1106 OLED module */
LCD_SSD1306 lcd; /* for SSD1306 OLED module */
#include <SimpleDHT.h>
int pinDHT11 = 4;
SimpleDHT11 dht11;
void setup()
{
lcd.begin();
sensors.begin();
Serial.begin(115200);
}
void loop()
{
    //Auslesen Aussensensor
    sensors.requestTemperatures();
    
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.setFontSize(FONT_SIZE_LARGE);
    lcd.print(sensors.getTempCByIndex(0));
    lcd.print(" C Out");
    
   //DHT11
   //Serial.println("=================================");
   //Serial.println("Sample DHT11...");
  
  // read without samples.
    byte temperature = 0;
    byte humidity = 0;
    int err = SimpleDHTErrSuccess;
    if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
    return;
  }

  Serial.print("Sample OK: ");
  Serial.print((int)temperature); Serial.print(" *C, "); 
  Serial.print((int)humidity); Serial.println(" H");
  
  lcd.setCursor(0, 2);
  lcd.setFontSize(FONT_SIZE_LARGE);
  lcd.print((int)temperature); Serial.print(" *C, ");
  lcd.print("C In");

  lcd.setCursor(64, 4);
  lcd.setFontSize(FONT_SIZE_LARGE);
  lcd.print((int)humidity); Serial.println(" H");
  lcd.print("% In");
  
  // DHT11 sampling rate is 1HZ.
  delay(1500);
  
}

Setze bitte Deinen Sketch in Codetags (</> oben links). Das kannst Du auch noch nachträglich tun.
Er ist dann besser lesbar, besonders auf mobilen Geräten.

Gruß Tommy

Edit: probier mal

 lcd.print(sensors.getTempCByIndex(0),1);

Top, das hat funktioniert. Jetzt habe ich noch den MQ-2 eingebunden.

Kann mir jemand helfen beim Wasserstand?
Ich habe einen Behälter (50 x 43 x 26 cm). Ich würde gerne den Wasserstand abfragen. Von der Theorie müsste man ja LxBxH rechnen (in m für Literangabe). L & B sind Fix. Aber H variiert. Ich möchte den Sensor in den Deckel einbauen und hab somit einen festen Abstand. wie bekomme ich das hin? Und wie zeige ich es auf dem Display an? Eine einfache % Angabe würde erstmal reichen.

Viele Grüße & Danke im vorrau :wink:

Hutschy

Hutschy:
Kann mir jemand helfen beim Wasserstand?
Ich würde gerne den Wasserstand abfragen.

Wenn du es nur in % benötigst, reicht dir doch die Höhe und berechnest es mit der Map-Funktion.

Allerdings ist dein Sensor nicht Wasserdicht und nicht für deine Anwendung geeignet.
Ich verwende einen wasserdichten US-Sensor in meiner Wasserzisterne, der hat allerdings den Nachteil, dass dieser erst ab 25 cm misst.

Der Sensor kommt nicht mit dem Wasser in Berührung. Der Schraubdeckel liegt ca 4 cm über Oberkante. Dadurch das der tank nur ganz langsam gefüllt wird, schwabbt da nix. Während der Fahrt habe ich kein Wasser im Tank.
Die Map Funktion sagt mir (noch) nichts. Kann ich denn irgendwie angeben- zb 26cm = 0%... 3 cm= 100% ?

VG
Hutschy

Hier findest du Map().
Auch wenn da nicht schwappt, du hast immer eine hohe Luftfeuchtigkeit innerhalb des Tanks und das zerstört in kurzer Zeit den Sensor. Dem gebe ich höchstens 1/2 Jahr.

Das versteh ich nicht so ganz :-/ mein Code sieht jetzt so aus:

#include "Arduino.h"
#include "Wire.h"
#include "OneWire.h"
#include "MicroLCD.h" //OLED
#include "DallasTemperature.h" //DS18B20
//Aussenfühler
#define DS18B20 2
OneWire ourWire(DS18B20);
DallasTemperature sensors(&ourWire);
//OLED
LCD_SSD1306 lcd; /* for SSD1306 OLED module */
//Temp+Hum Sensor
#include <SimpleDHT.h>
int pinDHT11 = 4;
SimpleDHT11 dht11;
//MQ-2 Sensor (LPG)
#include <MQ2.h>
//change this with the pin that you use
int pin = A7;
int lpg, co, smoke;
MQ2 mq2(pin);
#include <Ultrasonic.h>
Ultrasonic ultrasonic(12, 13);
void setup()
{
lcd.begin();
sensors.begin();
mq2.begin();
Serial.begin(9600);
}
void loop()
{
  Serial.print("Distance in CM: ");
  // Pass INC as a parameter to get the distance in inches
  Serial.println(ultrasonic.distanceRead());
  lcd.clear();
  lcd.setCursor(0, 6);
  lcd.setFontSize(FONT_SIZE_LARGE);
  lcd.println(ultrasonic.distanceRead());
  //delay(100);

  int val = analogRead(0);
  val = map(val, 0, 1023, 0, 255);
  analogWrite(13, val);

    //Auslesen Aussensensor
    sensors.requestTemperatures();
    
    //lcd.clear();
    lcd.setCursor(0,0);
    lcd.setFontSize(FONT_SIZE_LARGE);
    lcd.print(sensors.getTempCByIndex(0),1);
    lcd.print(" C Out");
    
   //DHT11
   //Serial.println("=================================");
   //Serial.println("Sample DHT11...");
  
  // read without samples.
    byte temperature = 0;
    byte humidity = 0;
    int err = SimpleDHTErrSuccess;
    if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    //Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(10);
    return;
      }

  Serial.print("Sample OK: ");
  Serial.print((int)temperature); Serial.print(" *C, "); 
  Serial.print((int)humidity); Serial.println(" H");
  
  lcd.setCursor(0, 2);
  lcd.setFontSize(FONT_SIZE_LARGE);
  lcd.print((int)temperature); Serial.print(" *C, ");
  lcd.print("C In");

  lcd.setCursor(64, 2);
  lcd.setFontSize(FONT_SIZE_LARGE);
  lcd.print((int)humidity); Serial.println(" H");
  lcd.print("% In");
  
  // DHT11 sampling rate is 1HZ.

//Gassensor
lcd.setCursor(0, 4);
lcd.setFontSize(FONT_SIZE_SMALL);
lcd.print("LPG:");
lcd.print ((float)lpg, 1);
lcd.print("%");
//Rauchmelder
lcd.setCursor(60, 4);
lcd.setFontSize(FONT_SIZE_SMALL);
lcd.print("CO2:");
lcd.print ((float)co, 1);
lcd.print("%");
//Smoke
//lcd.setCursor(80, 6);
//lcd.print("Rauch:");
//lcd.print ((float)smoke, 1);
  delay(15000);
  
}

hab ich das jetzt an der falschen Stelle eingetragen?

Hallo,
Du hast doch hier

lcd.println(ultrasonic.distanceRead());

den Abstand in cm?

Beispiel:
voller Tank, Abstand 5cm
leerer tank, Abstand 65cm

also

also
int Füllstand;
Füllstand = map (ultrasonic.distanceRead(), 5, 65, 100,0)

Zeigt Dir den Füllstand von 100% voll bis 0% leer an.

Gruß und Spaß
Andreas

@Hutschy

Auf das "lcd" darfst du kein "println" machen.

lcd.println()

ist falsch, da kommen komische Zeichen raus.
Einfach nur

lcd.print()

.

Hallo,

wegen Wasserstand habe ich hier mal was geschrieben. Ich habe mir das zuerst auch etwas einfacher vorgestellt. Aber jetzt funktioniert es recht ordentlich.

Hallo,
wenn mich nicht alles täuscht, dann ist Kapazitive Füllstandmessung auch
immer ein wenig Elektrolyse.
Es entsteht also auch Anodenschlamm.
Bei Brauchwasser wäre mir das wohl egal, aber bei Trinkwasser würde ich mich einmal schlaulesen.
Gruß und Spaß
Andreas

Hallo,

bei meinem Sensor ist der innere Leiter 100% gegen das Waser isoliert (durch das Glasrohr). Da fließt kein Strom und somit gibt es auch keine Elektrolyse. Außerdem wird der Arduino nur mit Spannung versorgt, denn der Hauptschalter für die Pumpe an ist.

SkobyMobil:
Hallo,
wenn mich nicht alles täuscht, dann ist Kapazitive Füllstandmessung auch
immer ein wenig Elektrolyse.

Nein, Wieso?
Kapazitive Messung heißt daß die Elektroden isoliert sind auch vom Wasser. Man muß die Elektroden nur richtig gestalten, daß das Wasser als Leiter die Kapazität ändert.
Wenn man eine Elekrode ins Wasser hält und die andere Isoliert aufstellt dann passiert auch keine Elektrolyse sondern die Elektrode wird chemisch angegriffen. (ist nicht optimal)

Grüße Uwe

Hallo zusammen,
der erste Urlaub mit dem Wohnwagen ist hinter mir. Der Arduino ist die ganze Zeit sauber durchgelaufen.
Ich möchte mein Projekt hier auch gerne zur Verfügung stellen:

Ich habe folgende Komponenten verbaut:

1x Arduino Mega 2560
1x OLED 128x64 SSD1306 ( etwas klein aber gut lesbar)
2x DHT 11 Sensoren für die Innentemperatur und Aussentemperatur vom Kühlschrank
1x DHT 22 für den Kühlschrank innen
1x DS18B20 für die Außentemperatur unterhalb des Wohnwagens
1x Ultraschallsensor HC-SR04
1x MQ-2 Rauchsensor

Hier der Code & viel Spaß damit :slight_smile:

#include <ST_HW_HC_SR04.h>
#include <U8g2lib.h>
#include <U8x8lib.h>
#include <Adafruit_GFX.h>
#include <gfxfont.h>
#include "Arduino.h"
#include "Wire.h"
#include "OneWire.h"
#include "MicroLCD.h" //OLED
#include "DallasTemperature.h" //DS18B20

  //Aussenfühler
  #define DS18B20 5
  OneWire ourWire(DS18B20);
  DallasTemperature sensors(&ourWire);
//OLED
  LCD_SSD1306 lcd; /* for SSD1306 OLED module */

//Temp+Hum Sensor

#include "DHT.h"
#define DHT1PIN 2     // what pin we're connected to
#define DHT2PIN 3
#define DHT3PIN 4

#define DHT1TYPE DHT11   // DHT 11
#define DHT2TYPE DHT22   // DHT 11 
#define DHT3TYPE DHT11   // DHT 11
DHT dht1(DHT1PIN, DHT1TYPE);
DHT dht2(DHT2PIN, DHT2TYPE);
DHT dht3(DHT3PIN, DHT3TYPE);
//MQ-2 Sensor (LPG)
  #include <MQ2.h>
//change this with the pin that you use
  int pin = A0;
  int lpg, co, smoke;
  
  MQ2 mq2(pin);
#include <Ultrasonic.h>
  Ultrasonic ultrasonic(6, 7);

  //Relais

const int relais1 = 8;
 
//Buzzer
const int buzzer = 40; //buzzer to arduino pin40

void setup()

{
lcd.begin();
sensors.begin();
mq2.begin();
// An welchen Pins hängen die Sensoren?
//  dht2.setup(5); // data pin 2

dht1.begin();
dht2.begin();
dht3.begin();

//Buzzer
pinMode(buzzer, OUTPUT); // Set buzzer - pin 40 as an output

//Relais
pinMode(relais1, OUTPUT); // Den PWM PIN "relaisPin" als Ausgangssignal setzen.

Serial.begin(9600);
}
void loop()
{


  //Ultraschall
  
      Serial.print("Distance in CM: ");
      // Pass INC as a parameter to get the distance in inches
      Serial.println(ultrasonic.distanceRead());
      int Fuellstand;
      Fuellstand = map (ultrasonic.distanceRead(), 7, 30, 100,0);
      
// DHT Sensoren

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h1 = dht1.readHumidity();
  float t1 = dht1.readTemperature();
  float h2 = dht2.readHumidity();
  float t2 = dht2.readTemperature();
  float h3 = dht3.readHumidity();
  float t3 = dht3.readTemperature();
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t1) || isnan(h1)) {
    Serial.println("Failed to read from DHT #1");
  } else {
    Serial.print("Humidity 1: "); 
    Serial.print(h1);
    Serial.print(" %\t");
    Serial.print("Temperature 1: "); 
    Serial.print(t1);
    Serial.println(" *C");
  }
  if (isnan(t2) || isnan(h2)) {
    Serial.println("Failed to read from DHT #2");
  } else {
    Serial.print("Humidity 2: "); 
    Serial.print(h2);
    Serial.print(" %\t");
    Serial.print("Temperature 2: "); 
    Serial.print(t2);
    Serial.println(" *C");
  }

if (isnan(t3) || isnan(h3)) {
    Serial.println("Failed to read from DHT #3");
  } else {
    Serial.print("Humidity 3: "); 
    Serial.print(h3);
    Serial.print(" %\t");
    Serial.print("Temperature 3: "); 
    Serial.print(t3);
    Serial.println(" *C");
  }
  
  Serial.println();

//Gassensor MQ2

float* values= mq2.read(true); //set it false if you don't want to print the values in the Serial
  //lpg = values[0];
  lpg = mq2.readLPG();
  //co = values[1];
  co = mq2.readCO();
  //smoke = values[2];
  smoke = mq2.readSmoke();
 
//Display Ausgabe

      
      lcd.clear();
      
     
  //Aussenfühler 
 
      sensors.requestTemperatures();
      lcd.setCursor(35,0);
      lcd.setFontSize(FONT_SIZE_LARGE);
      lcd.print("Outdoor");
      lcd.setCursor(50,2);
      lcd.print(sensors.getTempCByIndex(0),0);
      lcd.print(" °C");

      delay(2000);
      
  //Innentemperatur
    lcd.clear();
      lcd.setCursor(30, 0);
      lcd.setFontSize(FONT_SIZE_LARGE);
      lcd.print("Wohnwagen ");
      lcd.setCursor(45,2);
      lcd.print("Innen : ");
      lcd.setCursor(35, 6);
      lcd.print(t1,1) ;
      lcd.println(" °C");

delay(2000);

    lcd.clear();
    lcd.setCursor(30, 0);
    lcd.setFontSize(FONT_SIZE_LARGE);
    lcd.print("Wohnwagen ");
    lcd.setCursor(40,2);
    lcd.print(h1,0);
    lcd.print(" %\t");
    lcd.setCursor(45,4);
    lcd.print("Luft-");
    lcd.setCursor(15,6);
    lcd.print("feuchtigkeit ");

    delay(2000);

    // Kühlschrank

      lcd.clear();
      lcd.setCursor(20, 0);
      lcd.setFontSize(FONT_SIZE_LARGE);
      lcd.print("Kuehlschrank ");
      lcd.setCursor(45,2);
      lcd.print("Innen : ");
      lcd.setCursor(35, 6);
      lcd.print(t2,1) ;
      lcd.println(" °C");

delay(2000);

    lcd.clear();
    lcd.setCursor(20, 0);
    lcd.setFontSize(FONT_SIZE_LARGE);
    lcd.print("Kuehlschrank ");
    lcd.setCursor(40,2);
    lcd.print(h2,0);
    lcd.print(" %\t");
    lcd.setCursor(45,4);
    lcd.print("Luft-");
    lcd.setCursor(20,6);
    lcd.print("feuchtigkeit ");

    delay(1000);

    // Kühlschrank Aussen

      lcd.clear();
      lcd.setCursor(20, 0);
      lcd.setFontSize(FONT_SIZE_LARGE);
      lcd.print("Kuehlschrank ");
      lcd.setCursor(45,2);
      lcd.print("Aussen : ");
      lcd.setCursor(35, 6);
      lcd.print(t3,1) ;
      lcd.println(" °C");

      
 //Kuehlschrank Buzzer Alarm 

/*
  if (t3>=10) {
  // Buzzer an
  digitalWrite(buzzer, HIGH); //Relais an
} else {
  // Buzzer aus
  digitalWrite(buzzer, LOW); //Relais aus
}
*/

//Kuehlschrank Ventilator Relais

if (t3 >=26) {
  // Lüfter an
  digitalWrite(relais1, LOW); //Relais an
  Serial.print("Ventilatoren");
  Serial.print("  laufen");
      lcd.clear();
      lcd.setCursor(20, 0);
      lcd.setFontSize(FONT_SIZE_LARGE);
      lcd.print("Ventilatoren ");
      lcd.setCursor(45,2);
      lcd.print("laufen");
      
} else {
  // Lüfter aus
digitalWrite(relais1, HIGH); //Relais aus
  Serial.print("Ventilatoren");
  Serial.print("  aus");
  lcd.clear();
      lcd.setCursor(20, 0);
      lcd.setFontSize(FONT_SIZE_LARGE);
      lcd.print("Ventilatoren ");
      lcd.setCursor(45,2);
      lcd.print("aus");
}

Serial.print("    Relais geschaltet( 0=An 1=Aus)  ");
Serial.print(digitalRead(relais1));

delay(1500);

    lcd.clear();
    lcd.setCursor(20, 0);
    lcd.setFontSize(FONT_SIZE_LARGE);
    lcd.print("Kuehlschrank ");
    lcd.setCursor(40,2);
    lcd.print(h3,0);
    lcd.print(" %\t");
    lcd.setCursor(45,4);
    lcd.print("Luft-");
    lcd.setCursor(20,6);
    lcd.print("feuchtigkeit ");

    delay(1000);
    
        
 //Gassensor
        lcd.clear();
        lcd.setCursor(55, 0);
        lcd.setFontSize(FONT_SIZE_LARGE);
        lcd.print("GAS:");
        lcd.setCursor(50, 4);
        lcd.print ((float)lpg, 0);
        //lcd.setCursor(0, 4);
        lcd.print("ppm");

        /*
         if (co>=5) {
          // Buzzer an
        digitalWrite(...);
        } else {
          // Buzzer aus
        digitalWrite(...);
}       
        */
        delay(1500);
        
        //Rauchmelder
        lcd.clear();
        lcd.setCursor(55, 0);
        lcd.setFontSize(FONT_SIZE_LARGE);
        lcd.print("CO2:");
        lcd.setCursor(50, 4);
        lcd.print ((float)co, 0);
        lcd.print("%");

        delay(1500);
        
        //Smoke
        lcd.clear();
        lcd.setCursor(48, 0);
        lcd.print("Rauch:");
        lcd.setCursor(53, 4);
        lcd.print ((float)smoke, 0);
        lcd.print("%");

        delay(1500);
        
  
      //Wasserstand
      lcd.clear();
      lcd.setFontSize(FONT_SIZE_LARGE);
      lcd.setCursor(20, 0);
      lcd.print("Wassertank:");
                                    //lcd.print(ultrasonic.distanceRead());
      lcd.setCursor(48, 2);
      lcd.print(Fuellstand);
      lcd.print("%");
      lcd.setCursor(30, 4);
      lcd.print("gefuellt:");

  delay(2000);
}
1 Like

Hutschy:
Hier der Code & viel Spaß damit :slight_smile:

Code können wir auch selbst, wir wollen Bilder sehen! :wink:

sth77:
Code können wir auch selbst, wir wollen Bilder sehen! :wink:

Bist Du aber heute neugierig. :wink: :wink: :wink:

Keine Phantasie wie ein "Smart Wohnwagen" aussieht? So natürlich:

sth77:
Code können wir auch selbst, wir wollen Bilder sehen! :wink:

Jawoll!

Gruß

Gregor