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.
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.
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.
#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;
}
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.
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.
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.