Luftfeuchtigkeit messen

Hallo zusammen.
Ich würde gerne ein Gerät bauen was nicht nur die Luftfeuchtigkeit misst,
sondern gleichzeitig auch die Temperatur.
Das gerät soll die Werte dann auf ein LCD-Display mit I²C Anschluss schreiben und zusätslich noch mit dem Arduino
Ethernet-Shield auf einer SD-Karte speichern.
Auserdem soll ab 60% Luftfeuchtigkeit eine LED und ein Pizo-Speaker angehen.

Viele Grüße

Joel3D

Ok.....was hält dich davon ab ?

Ich kann auch keine Frage erkennen.

Aber ich habe eine, warum mit einem Ethernet-Shield ?

Sorry,
Ich habe das Ethernet-Shield gewählt weil man dann eventuell noch irgentwann einmal auf IP-Adresse umprogramieren
kann. Wie ich die Daten auf der SD-Karte speichere ist leicht aber das mit der LED die ab einem bestimmten Wert
leuchtet habe ich noch nicht so ganz verstanden.

Joel3D

Uii - das gibt Ärger mit den Mitbewohnern ;).
Wenn der Piezo auch noch mit angeschaltet wird und minutenlang vor sich hinpiept - auch wenn es wieder trockener wird.

@Joel: Ein BME280 liefert die gewünschten Werte - Temperatur und Luftfeuchtigkeit. Den Druck kannst Du ja ignorieren.

Zudem hätte ich noch eine Frage.
Um die Daten des Temperatur-Sensors auf der SD-Karte zu speichern habe ich folgenden Code verwendet:
Wie füge ich den Rest meines Vorhabens ein?

[color=#5e6d03]#include[/color] [color=#434f54]<[/color][b][color=#d35400]SD[/color][/b][color=#434f54].[/color][color=#000000]h[/color][color=#434f54]>[/color]      [color=#434f54]//SD Library hinzufügen[/color]
[color=#00979c]int[/color] [color=#000000]a[/color][color=#434f54]=[/color][color=#000000]0[/color][color=#000000];[/color] [color=#434f54]// Variable für einen Zählvorgang[/color]
[color=#00979c]int[/color] [color=#000000]b[/color][color=#434f54]=[/color][color=#000000]0[/color][color=#000000];[/color] [color=#434f54]// Variable für einen Zählvorgang[/color]
[color=#00979c]const[/color] [color=#00979c]int[/color] [color=#000000]chipSelect[/color] [color=#434f54]=[/color] [color=#000000]4[/color][color=#000000];[/color] [color=#434f54]//Chip Pin für die SD Karte(bei UNO 4,bei MEGA 53)[/color]

[color=#00979c]void[/color] [color=#5e6d03]setup[/color][color=#000000]([/color][color=#000000])[/color] [color=#000000]{[/color]
[color=#d35400]pinMode[/color] [color=#000000]([/color][color=#000000]13[/color][color=#434f54],[/color] [color=#00979c]OUTPUT[/color][color=#000000])[/color][color=#000000];[/color]
  [color=#5e6d03]if[/color] [color=#000000]([/color][color=#000000]startSDCard[/color][color=#000000]([/color][color=#000000])[/color] [color=#434f54]==[/color] [color=#00979c]true[/color][color=#000000])[/color] [color=#434f54]// Durch den Rückgriff auf den Programmblock "startSDCard" wird die SD-Karte geprüft. Wenn die SD Karte gelesen werden kann dann soll die onboard-LED an Pin13 zweimal blinken[/color]
  [color=#000000]{[/color] 
  [color=#d35400]digitalWrite[/color][color=#000000]([/color][color=#000000]13[/color][color=#434f54],[/color] [color=#00979c]HIGH[/color][color=#000000])[/color][color=#000000];[/color] [color=#434f54]//an[/color]
  [color=#d35400]delay[/color][color=#000000]([/color][color=#000000]500[/color][color=#000000])[/color][color=#000000];[/color]
  [color=#d35400]digitalWrite[/color][color=#000000]([/color][color=#000000]13[/color][color=#434f54],[/color] [color=#00979c]LOW[/color][color=#000000])[/color][color=#000000];[/color] [color=#434f54]//aus[/color]
  [color=#d35400]delay[/color][color=#000000]([/color][color=#000000]500[/color][color=#000000])[/color][color=#000000];[/color]
  [color=#d35400]digitalWrite[/color][color=#000000]([/color][color=#000000]13[/color][color=#434f54],[/color] [color=#00979c]HIGH[/color][color=#000000])[/color][color=#000000];[/color] [color=#434f54]//an[/color]
  [color=#d35400]delay[/color][color=#000000]([/color][color=#000000]500[/color][color=#000000])[/color][color=#000000];[/color]
  [color=#d35400]digitalWrite[/color][color=#000000]([/color][color=#000000]13[/color][color=#434f54],[/color] [color=#00979c]LOW[/color][color=#000000])[/color][color=#000000];[/color] [color=#434f54]//aus[/color]
  [color=#d35400]delay[/color][color=#000000]([/color][color=#000000]500[/color][color=#000000])[/color][color=#000000];[/color]
  [color=#000000]}[/color]
[color=#000000]}[/color]

[color=#00979c]void[/color] [color=#5e6d03]loop[/color][color=#000000]([/color][color=#000000])[/color]
[color=#000000]{[/color]
  [color=#d35400]File[/color] [color=#000000]dataFile[/color] [color=#434f54]=[/color] [b][color=#d35400]SD[/color][/b][color=#434f54].[/color][color=#d35400]open[/color][color=#000000]([/color][color=#005c5f]"zaehlen.csv"[/color][color=#434f54],[/color] [color=#00979c]FILE_WRITE[/color][color=#000000])[/color][color=#000000];[/color] [color=#434f54]//Excel Datei auf der SD Karte anlegen mit dem Namen "zaehlen" [/color]
[color=#000000]a[/color][color=#434f54]=[/color][color=#000000]a[/color][color=#434f54]+[/color][color=#000000]1[/color][color=#000000];[/color] [color=#434f54]// Unter der Variablen "a" wird jetzt der Wert a+1 gespeichert. Dadurch wird der Wert für "a" in jeden Durchgang um 1 erhöht.[/color]
[color=#000000]b[/color][color=#434f54]=[/color][color=#000000]b[/color][color=#434f54]+[/color][color=#000000]2[/color][color=#000000];[/color] [color=#434f54]// Unter der Variablen "b" wird jetzt der Wert b+2 gespeichert. Dadurch wird der Wert für "b" in jeden Durchgang um 2 erhöht.[/color]
[color=#000000]dataFile[/color][color=#434f54].[/color][color=#d35400]print[/color][color=#000000]([/color][color=#000000]a[/color][color=#000000])[/color][color=#000000];[/color] [color=#434f54]// Wert für "a" wird auf die SD-Karte gespeichert[/color]
[color=#000000]dataFile[/color][color=#434f54].[/color][color=#d35400]print[/color][color=#000000]([/color][color=#005c5f]";"[/color][color=#000000])[/color][color=#000000];[/color] [color=#434f54]// Es wird ein Semikolon in die CSV-Datei gespeichert, daduch lassen sich die Werte später als Tabelle getrennt darstellen.[/color]
[color=#000000]dataFile[/color][color=#434f54].[/color][color=#d35400]println[/color][color=#000000]([/color][color=#000000]b[/color][color=#000000])[/color][color=#000000];[/color] [color=#434f54]// Wert für "b" wird auf die SD-Karte gespeichert[/color]
[color=#000000]dataFile[/color][color=#434f54].[/color][color=#d35400]close[/color][color=#000000]([/color][color=#000000])[/color][color=#000000];[/color] [color=#434f54]// Die Datei wird vorrübergehend geschlossen.[/color]
[color=#d35400]digitalWrite[/color][color=#000000]([/color][color=#000000]13[/color][color=#434f54],[/color] [color=#00979c]HIGH[/color][color=#000000])[/color][color=#000000];[/color]
[color=#d35400]delay[/color][color=#000000]([/color][color=#000000]500[/color][color=#000000])[/color][color=#000000];[/color]
[color=#d35400]digitalWrite[/color][color=#000000]([/color][color=#000000]13[/color][color=#434f54],[/color] [color=#00979c]LOW[/color][color=#000000])[/color][color=#000000];[/color]
[color=#d35400]delay[/color][color=#000000]([/color][color=#000000]500[/color][color=#000000])[/color][color=#000000];[/color] [color=#434f54]// Hier endet der Loop und beginnt dann wieder von vorne. Es werden im Sekundentakt die Werte für "a" und "b" in die Tabelle auf der SD-Karte gespeichert.[/color]
[color=#000000]}[/color]

[color=#00979c]boolean[/color] [color=#000000]startSDCard[/color][color=#000000]([/color][color=#000000])[/color] [color=#434f54]// Dieser Programmblock wird benötigt, um zu prüfen, ob die SD-Karte einsatzbereit ist.[/color]
[color=#000000]{[/color]
  [color=#00979c]boolean[/color] [color=#000000]result[/color] [color=#434f54]=[/color] [color=#00979c]false[/color][color=#000000];[/color]
  [color=#d35400]pinMode[/color][color=#000000]([/color][color=#000000]4[/color][color=#434f54],[/color] [color=#00979c]OUTPUT[/color][color=#000000])[/color][color=#000000];[/color] [color=#434f54]// 4 bei UNO, bei MEGA in 53 ändern[/color]

  [color=#5e6d03]if[/color] [color=#000000]([/color][color=#434f54]![/color][b][color=#d35400]SD[/color][/b][color=#434f54].[/color][color=#d35400]begin[/color][color=#000000]([/color][color=#000000]chipSelect[/color][color=#000000])[/color][color=#000000])[/color] [color=#434f54]//Überprüfen ob die SD Karte gelesen werden kann[/color]
  [color=#000000]{[/color] 
    [color=#000000]result[/color] [color=#434f54]=[/color] [color=#00979c]false[/color][color=#000000];[/color]
  [color=#000000]}[/color] 

  [color=#5e6d03]else[/color] [color=#434f54]// Wenn ja Datei wie im Loop anlegen[/color]
  [color=#000000]{[/color]  
  [color=#d35400]File[/color] [color=#000000]dataFile[/color] [color=#434f54]=[/color] [b][color=#d35400]SD[/color][/b][color=#434f54].[/color][color=#d35400]open[/color][color=#000000]([/color][color=#005c5f]"datalog.csv"[/color][color=#434f54],[/color] [color=#00979c]FILE_WRITE[/color][color=#000000])[/color][color=#000000];[/color]
   [color=#5e6d03]if[/color] [color=#000000]([/color][color=#000000]dataFile[/color][color=#000000])[/color] 
    [color=#000000]{[/color]
      [color=#000000]dataFile[/color][color=#434f54].[/color][color=#d35400]close[/color][color=#000000]([/color][color=#000000])[/color][color=#000000];[/color]
      [color=#000000]result[/color] [color=#434f54]=[/color] [color=#00979c]true[/color][color=#000000];[/color]
    [color=#000000]}[/color]
  [color=#000000]}[/color]  
  [color=#5e6d03]return[/color] [color=#000000]result[/color][color=#000000];[/color]
[color=#000000]}

[/color]

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter oder gehe in der IDE auf Bearbeiten - Für Forum kopieren und füge es hier ein).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

#include <SD.h>      //SD Library hinzufügen
int a=0; // Variable für einen Zählvorgang
int b=0; // Variable für einen Zählvorgang
const int chipSelect = 4; //Chip Pin für die SD Karte(bei UNO 4,bei MEGA 53)

void setup() {
pinMode (13, OUTPUT);
  if (startSDCard() == true) // Durch den Rückgriff auf den Programmblock "startSDCard" wird die SD-Karte geprüft. Wenn die SD Karte gelesen werden kann dann soll die onboard-LED an Pin13 zweimal blinken
  { 
  digitalWrite(13, HIGH); //an
  delay(500);
  digitalWrite(13, LOW); //aus
  delay(500);
  digitalWrite(13, HIGH); //an
  delay(500);
  digitalWrite(13, LOW); //aus
  delay(500);
  }
}

void loop()
{
  File dataFile = SD.open("zaehlen.csv", FILE_WRITE); //Excel Datei auf der SD Karte anlegen mit dem Namen "zaehlen" 
a=a+1; // Unter der Variablen "a" wird jetzt der Wert a+1 gespeichert. Dadurch wird der Wert für "a" in jeden Durchgang um 1 erhöht.
b=b+2; // Unter der Variablen "b" wird jetzt der Wert b+2 gespeichert. Dadurch wird der Wert für "b" in jeden Durchgang um 2 erhöht.
dataFile.print(a); // Wert für "a" wird auf die SD-Karte gespeichert
dataFile.print(";"); // Es wird ein Semikolon in die CSV-Datei gespeichert, daduch lassen sich die Werte später als Tabelle getrennt darstellen.
dataFile.println(b); // Wert für "b" wird auf die SD-Karte gespeichert
dataFile.close(); // Die Datei wird vorrübergehend geschlossen.
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500); // Hier endet der Loop und beginnt dann wieder von vorne. Es werden im Sekundentakt die Werte für "a" und "b" in die Tabelle auf der SD-Karte gespeichert.
}

boolean startSDCard() // Dieser Programmblock wird benötigt, um zu prüfen, ob die SD-Karte einsatzbereit ist.
{
  boolean result = false;
  pinMode(4, OUTPUT); // 4 bei UNO, bei MEGA in 53 ändern

  if (!SD.begin(chipSelect)) //Überprüfen ob die SD Karte gelesen werden kann
  { 
    result = false;
  } 

  else // Wenn ja Datei wie im Loop anlegen
  {  
  File dataFile = SD.open("datalog.csv", FILE_WRITE);
   if (dataFile) 
    {
      dataFile.close();
      result = true;
    }
  }  
  return result;
}

Aktuel den des temperatur sensors.

Hallo,

wie Du die Werte speichers ist doch einfach , aber so wird das nix. Du speicherst die Werte für a und b.

schau dir mal an wie man mit append eine Datei öffnet um an das Ende zu speichern. Ein Beispiel dazu gibts bestimmt bei der SD Lib. Dann sollten die delay aus dem loop raus. Es gibt da auch ein Beispiel Datalogger das kannst Du dir mal ansehen.

was war noch mal deine Frage.

Heinz

Vielen Dank,
Meinst du du könntest mal den richtigen code hochladen?
Das von mir war auch nur eine Vorlage.

Joel3D

@Heinz: was bedeuten die wörter nam und apend?
Oder ist das eventuell ein tastatur Fehler?

wie "man mit append" ...

Lt. Arduino Referenz für die SD Card Library öffnet "write" schon richtig zum Anfügen:

FILE_WRITE: open the file for reading and writing, starting at the end of the file.

Das Datalogger-Beispiel macht das auch nicht anders.

@Heinz: Hast Du eine andere SD-Lib im Hinterkopf?

wno158:
@Heinz: Hast Du eine andere SD-Lib im Hinterkopf?

Hallo,
ups sorry da war ich auf der falschen Spur und habe das mit dem Filesystem des ESP gleichgesetzt.

SPIFFS.open(path, mode)
or LittleFS.open(path, mode)

a Open for appending (writing at end of file). The file is
created if it does not exist. The stream is positioned at the
end of the file.

Heinz

Man könnte in der SD.h die Open-Attribute auch anpassen/erweitern, wenn man ein reines CREATE und ein APPEND haben will.

Gruß Tommy

Hallo,
@tommy . Entstanden ist mein Fehler dadurch das mir die ESP Filesystem funktionen etwas geläufiger sind als die original Arduino SD Lib.

Gruß Heinz

Die vom ESP orientieren sich auch mehr an den üblichen Attributen.

Ich hallte ein generelles APPEND bei WRITE auch nicht für eine glückliche Entscheidung, aber man kann es ja übersteuern, indem man die O_-Attribute verodert oder damit gleich neue Attribute generiert. Darauf wollte ich nur hinweisen.

Gruß Tommy

noiasca:
warum du keine konkrete Frage stellst, habe ich auch noch nicht ganz verstanden.

Aber so gehts sicher:

if (luftfeuchtigkeit >= 60)

{
  digitalWrite(ledPin, HIGH);
}

warum nicht
digitalWrite(ledPin, luftfeuchtigkeit >= 60);dann geht sie wenigstens auch wieder aus.

Neben den Messwerten solltest du auch Datum und Uhrzeit mit speichern, weil die Daten ansonsten ohne jeden Nutzen sind. Wenn dir NTP zu ufwändig ist (eines der wenigen Web-Protokolle, die rein binär anstatt im Textmodus arbeiten), dann kann man sich die Zeit auch aus dem Haeder eines HTTP-Request auf irgend einen beliebigen Webserver holen.

Wenn dein Sensor sowieso im LAN ist, wäre noch das Speichern der Daten auf eine MySQL-DB (z.B. im Web oder auf einem NAS im LAN) in Betracht zu ziehen. Das erspart dir die SD-Karte und/oder den physischen Zugriff auf den Sensor. Da der Appetit bekanntlich beim Essen kommt, kann man so auch (später) bequem mehrere Sensoren zusammen auswerten (per Web-Frontend) ...

Hallo,
bei diesem code findet arduino IDE beim kompilieren keinen Fehler.
Aber wenn man das Gerät aufbaut zeichnet es auf der SD-Karte immer den Wert 0 auf.

#include <SPI.h>
#include <SD.h>
#include <dht.h>

dht DHT;

#define DHT11_PIN A0

const int chipSelect = 4;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("Initializing SD card...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
}

void loop() {
  // make a string for assembling the data to log:
  String dataString = "";

  // read three sensors and append to the string:
  for (int analogPin = 0; analogPin < 1; analogPin++) {
    int chk = DHT.read11(DHT11_PIN);
    dataString += String(chk);
    if (analogPin < 2) {
      dataString += ",";
    }
  }

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(DHT.temperature);
    dataFile.println(DHT.humidity);
    dataFile.close();
    // print to the serial port too:
    Serial.print("Temperature = ");
  Serial.println(DHT.temperature);
  Serial.print("Humidity = ");
  Serial.println(DHT.humidity);
  delay(600000);
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }
}

Es währe nett wenn einer von euch vielleicht mal nach einem Fehler suchen könnte.

Joel3D

Beitrag entfernt

Hallo,
wenn du Luftfeuchtigkeit und temperatur gleichzeitig messen willst dann empfehle ich dir den bme 280.

Joel3D