Forum: Mikrocontroller und Digitale Elektronik [AVR] 328p Temperaturwerte auf SD speichern C


von Gerhard H. (gerhardh)


Lesenswert?

Guten Tag,
Ich bin auf der Suche nach einem funktionierenden Projekt in C um 
einfache Strings und Messwerte in ein .txt zu schreiben welches auf 
einer SD Karte gespeichert werden soll.
dazu wird ein fertiges microSD-Modul verwendet.
Ich habe mittlerweile leider schon Tage mit der Recherche verbracht und 
mir auch das im Forum vorgestellte Projekt angesehen.
Wäre jemand so nett und würde mir ein funktionierendes Projekt zu 
Verfügung stellen?

Danke!

von Wolfgang (Gast)


Lesenswert?

Gerhard H. schrieb:
> Ich bin auf der Suche nach einem funktionierenden Projekt in C um
> einfache Strings und Messwerte in ein .txt zu schreiben welches auf
> einer SD Karte gespeichert werden soll.

Such mal nach "openLog"

von Gerhard H. (gerhardh)


Lesenswert?

Danke Wolfgang für deine Antwort!
sieht sehr interessant aus, werde ich mir ansehen.

für mich wirkt ELM Chan's SD library auch interessant. leider bin ich 
mit der programmiersprache C noch am Anfang. Für mich ist die 
Auswertung, welche in EXCEL ausgeführt werden soll interessant. daher 
würde ich nur gerne einfache Temperaturwerte  von meinem uController 
aufnehmen und diese auf eine SD-Karte speichern. Vielleicht hat ja schon 
mal jemand ähnliches gemacht. Ich würde dann gerne das Programm auf 
meine Bedürfnisse anpassen. Sämtliche Projekte die ich gefunden habe 
sind sehr umfangreich.
LG

von Stefan F. (Gast)


Lesenswert?

Gerhard H. schrieb:
> Sämtliche Projekte die ich gefunden habe
> sind sehr umfangreich.

Das ist ja auch ein umfangreiches Vorhaben.

- ADC Messungen durchführen
- Vermutlich mit Zeitstempel anreichern
- Messwerte linearisieren
- Messwerte in Grad Celsius umrechnen
- Auf eine SD Karte speichern
- In einem definierten Dateiformat (z.B. csv)

Dein Ansatz, ein vorhandenes Projekt umzuschreiben, würde ich nur für 
gut halten, wenn du umfangreiche Programmiererfahrung hast. Denn fremde 
Quelltexte zu verstehen ist oft viel schwieriger, als etwas eigenes zu 
schreiben.

https://www.mikrocontroller.net/articles/AVR_FAT32

Ich hatte diese Library zweimal benutzt und bin damit sehr gut klar 
gekommen.

von Andreas S. (igel1)


Lesenswert?

> dazu wird ein fertiges microSD-Modul verwendet.

Welches?

> Ich habe mittlerweile leider schon Tage mit der Recherche verbracht und
> mir auch das im Forum vorgestellte Projekt angesehen.

Dein 328p sitzt bekanntermaßen auf jedem Arduino Nano Board drauf.
Wenn man nach "Arduino Nano SD-Card temperature logger" sucht, so findet
man dutzende Projekte.

Allerdings scheint mir das so einfach, dass Du da sicherlich auch schon
selbst drauf gekommen bist. Ich vermute daher, Du willst ein Projekt,
welches kein Arduino-Framework verwendet?

Andererseits lese ich gerade in Deinem zweiten Post, dass Du C-Anfänger
bist. Dann wäre ein Einstieg via Arduino vielleicht doch nicht der
Schlechteste.

> Wäre jemand so nett und würde mir ein funktionierendes Projekt zu
> Verfügung stellen?

Ich empfehle, Deine Anforderungen hier nochmals viel genauer zu
beschreiben. Es gibt hier dutzende Forenmitglieder, die Temperatur-
logger gebaut haben (ich selbst mit eingeschlossen), aber auf die
Anforderungen im Detail kommt's halt an. Beispiel:

- Der Logger soll min. 3 Monate mit 3x1,5V Batterien funktionieren
- Der Logger soll max. alle 10 Minuten einen Wert aufnehmen und
  direkt auf SD-Karte schreiben
- Der Temperatursensor ist vom Typ XYZ und hat eine I2C-Schnittstelle.
  Der Link zum Datenblatt lautet: ... URL ...
- Das micro-SD-Modul ist dieses hier: ... URL ...
- Ich habe in XYZ-Board mit einem ATmega328p (URL: ...)

Kurzum: je genauer Deine Beschreibung desto bessere Antworten darfst Du 
erwarten. Wenn die Leute merken, dass Du Dir Mühe mit der Beschreibung 
und Deinen ersten C-Gehversuchen gibst, so erlebe ich hier in diesem 
Forum oft beispiellose Hilfe.

Viele Grüße

Igel1

von Wolfgang (Gast)


Lesenswert?

Gerhard H. schrieb:
> Ich würde dann gerne das Programm auf meine Bedürfnisse anpassen.
> Sämtliche Projekte die ich gefunden habe sind sehr umfangreich.

Wenn du Spaß dran hast ...
Was sind denn deine Bedürfnisse?

OpenLog schreibt einfach das, was du ihm über die serielle Schnittstelle 
zuschiebst, auf die SD-Karte.
Falls du lieber I2C verwendest, gibt es auch dafür einer fertige Lösung 
namens Qwiic OpenLog.

von Andreas S. (igel1)


Lesenswert?

Hier ein Arduino-Projekt, das alle Deine Anforderungen erfüllt:
http://www.electronics-lab.com/project/simple-arduino-data-logger/

von Gerhard H. (gerhardh)


Angehängte Dateien:

Lesenswert?

Danke für all eure Antworten!

Verwendet wird ein ELEGOO UNO R3 da dieser schon vorhanden war. (denke 
mal der ist baugleich mit einem Arduino uno)

LINKT ZU ELEGOO UNO R3:
https://www.amazon.de/Entwicklungsplatine-ATmega328P-ATmega16U2-USB-Kabel-Arduino/dp/B01EWOE0UU


Ebenfalls verwendet wird ein SPI micro-SD-Karten-Mudul von AZ-Delivery.
(Foto davon im Anhang)

LINK ZUM SD-Modul:
https://www.amazon.de/AZDelivery-Reader-Speicher-Memory-Arduino/dp/B077MCQS9P/ref=sr_1_3?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=1NLGID8W560D0&keywords=sd+karten+modul+arduino&qid=1558177689&s=computers&sprefix=sd+karten+modul+ard%2Ccomputers%2C190&sr=1-3


PINBELEGUNG:
SD-Modul zu ELEGOO UNO R3
GND  -  GND
VCC  -  5V (da levelshifter bereits am Modul)
MISO -  PB4
MOSI -  PB3
SCK  -  PB5
CS   -  PB2
Sollte so möglich sein, oder?

Ich möchte wenn möglich ein Atmel-Studio Programm verwenden. (möchte mit 
Atmel Studio vertrauter werden) Ein funktionierender Zeitstempel mittels 
i2c RTC ist vorhanden und sollte dann miteingebunden werden.

Zu den Aufzeichnung:
Der uController wird vorraussichtlich um die 24h laufen und wenn möglich 
jede sekunde einen Messwert inklusive Zeitstempel aufzeichnen.

Die genaue Auswahl des temperatursensors ist noch nicht erfolgt.
vermutlich werde ich einen DHT11 verwenden, da dieser bei einem 
Übungskit dabei war.

LINK ZUM Temperatursensor:
https://www.amazon.de/AZDelivery-%E2%AD%90%E2%AD%90%E2%AD%90%E2%AD%90%E2%AD%90-Temperatursensor-Luftfeuchtigkeitssensor-Arduino/dp/B078S7FCZ9/ref=sr_1_3?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&keywords=dht11&qid=1558177765&s=gateway&sr=8-3


Diese aufgezeichneten Werte sollen dann von mir in Excel ausgewertet 
werden.


Beste Grüße!

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Gerhard H. schrieb:
> Die genaue Auswahl des temperatursensors ist noch nicht erfolgt.
> vermutlich werde ich einen DHT11 verwenden, da dieser bei einem
> Übungskit dabei war.

warum nicht den besseren DHT22 oder einfacher DS18B20?

Der DHT11 ist einfach nur Schrott, so hat wohl jeder mal angefangen (ich 
auch) und gelernt das es rausgeworfenes Geld war.

Aber solange das noch nicht jeder weiss verkauft sich dieser "Schrott" 
wohl gut.

: Bearbeitet durch User
von Gerhard H. (gerhardh)


Lesenswert?

Joachim B. schrieb:
> Gerhard H. schrieb:
>> Die genaue Auswahl des temperatursensors ist noch nicht erfolgt.
>> vermutlich werde ich einen DHT11 verwenden, da dieser bei einem
>> Übungskit dabei war.
>
> warum nicht den besseren DHT22 oder einfacher DS18B20?
>
> Der DHT11 ist einfach nur Schrott, so hat wohl jeder mal angefangen (ich
> auch) und gelernt das es rausgeworfenes Geld war.
>
> Aber solange das noch nicht jeder weiss verkauft sich dieser "Schrott"
> wohl gut.

Danke für deinen "Einwand"
werde mich in diesem fall dann klar für einen der beiden, von dir 
vorgeschlagenen temperatursensoren entscheiden.

Ich find eure Hilfe hier wirklich bemerkenswert. Danke schonmal (:

von Joachim B. (jar)


Lesenswert?

Gerhard H. schrieb:
> Danke für deinen "Einwand"
> werde mich in diesem fall dann klar für einen der beiden, von dir
> vorgeschlagenen temperatursensoren entscheiden.

der DHT22 ist innen in meinem Wäscheaufhängzimmer um die Luftfeuchte 
online abzufragen, Lüften wenn zu feucht und wenn trocken Wäsche 
wegpacken.

der DS18B20 hängt an 2-Draht parasitär gepeist an 10m Leine aus dem 
Fenster im Schatten und dem macht Feuchtigkeit schön in Schrumpfschlauch 
verpackt zu den Drähten nichts aus.

von Gerhard H. (gerhardh)


Lesenswert?

okay danke, werde mir diese mal bestellen. bis dahin werde ich den DHT11 
verwenden, da für mich die genaue temperatur derzeit noch nicht wichtig 
ist. wichtiger ist mir zurzeit die Einbindung der SD-Library. lg

von Wolfgang (Gast)


Lesenswert?

Gerhard H. schrieb:
> Der uController wird vorraussichtlich um die 24h laufen und wenn möglich
> jede sekunde einen Messwert inklusive Zeitstempel aufzeichnen.

Du solltest prüfen, ob bei dieser Messfolge die Eigenerwärmung des von 
dir gewählten Temperatursensors nicht zu hoch wird.

von Joachim B. (jar)


Lesenswert?

Wolfgang schrieb:
> Du solltest prüfen, ob bei dieser Messfolge die Eigenerwärmung des von
> dir gewählten Temperatursensors nicht zu hoch wird.

ja, jede Sekunde ist heftig, alle 2 Sekunden reichten im Allgemeinen, 
wenn sich die Temperatur im Zimmer innerhalb von Sekunden um 10°C erhöht 
brennt die Bude, dann braucht man es eh nicht mehr wissen.

von Wolfgang (Gast)


Lesenswert?

Joachim B. schrieb:
> ja, jede Sekunde ist heftig, alle 2 Sekunden reichten im Allgemeinen,

Gewöhnlich ist es sinnvoll, die Abtastrate an der thermischen 
Zeitkonstanten des Sensors zu orientieren. Sonst schreibt man sich den 
Großteil der Speicherkarte mit gut korrelierten Datenpunkten voll.

von Gerhard H. (gerhardh)


Lesenswert?

Danke Wolfgang und Joachim,
ich werde eure Tipps berücksichtigen.
Habt ihr vielleicht ein Projekt für mich, bei dem die SD-Karten Funktion 
schon integriert ist, damit ich mir darüber keine gedanken mehr machen 
muss?
Danke schonmal!

von Andreas S. (igel1)


Lesenswert?

Gerhard H. schrieb:
> PINBELEGUNG:
> SD-Modul zu ELEGOO UNO R3
> GND  -  GND
> VCC  -  5V (da levelshifter bereits am Modul)
> MISO -  PB4
> MOSI -  PB3
> SCK  -  PB5
> CS   -  PB2
> Sollte so möglich sein, oder?


Habe gerade einmal Deine Pin-Belegungen mit folgenden Internet-Quellen 
gegengeprüft:

- https://lastminuteengineers.com/arduino-micro-sd-card-module-tutorial/
- https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf

SD-Modul-Pin  SD-Modul  Arduino Uno R3    PIN     PORT
------------------------------------------------------
     1         GND        GND
     2         VCC        5V
     6         CS         SS              10      PB2
     4         MOSI       MOSI            11      PB3
     3         MISO       MISO            12      PB4
     5         SCK        SCK             13      PB5

Fazit:  Deine Pinbelegung scheint korrekt zu sein und Deine Überlegungen 
zu den Levelshiftern erscheinen mir ebenfalls korrekt zu sein.

Mit der richtigen Library solltest Du nun halbwegs geradeaus zum Ziel 
kommen können - Stefanus hatte Dir weiter oben ja bereits einen guten 
Link zugeschickt: https://www.mikrocontroller.net/articles/AVR_FAT32

Einfach ausprobieren und bei Problemen Code hier posten und 
Fehler/Problem hier so gut und genau wie möglich beschreiben. Und nur 
keine Scheu - jeder hier hat mal klein angefangen.

Viele Grüße

Igel1

von Andreas S. (igel1)


Lesenswert?

Gerhard H. schrieb:
> Habt ihr vielleicht ein Projekt für mich, bei dem die SD-Karten Funktion
> schon integriert ist, damit ich mir darüber keine gedanken mehr machen
> muss?
> Danke schonmal!

Du willst, dass Dir die Hähnchen gebraten in den Mund fliegen.

Aber eigentlich tun sie das in Form der o.g. Library ja schon.

Jetzt musst nur nur alles in kleinen Schritten zusammenfügen und schon 
werden Dir die Elektronik-Götter hold sein:

1.) Deinen Arduino Uno R3 gemäß obiger Tabelle mit
    dem SD-Card-Modul verbinden.
2.) Atmel Studio 7 installieren
3.) Rudimentäres Programm (vielleicht ein Blinky) schreiben oder
    irgendwo aus dem Internet kopieren
4.) Dein Blinky-Programm in Studio kompilieren, linken und auf
    das Board flashen
5.) Freuen, wenn's blinkt.  Dann hast Du die grundsätzliche Abfolge
    in Atmel Studio verstanden.
6.) Die von Stefanus verlinkte SD-Card Bibliothek zu Deinem Programm
    dazustricken
7.) Schritt für Schritt die einzelnen Funktionen der Bibliothek
    aufrufen und ausprobieren.
8.) Wieder freuen, wenn's funktioniert.

Solltest Du bei irgendeinem dieser Schritte Probleme haben, so werden 
Dir die Leute hier im Forum sicher helfen.

Nur Mut und ran ans Werk!

Viele Grüße

Igel1

von Gerhard H. (gerhardh)


Lesenswert?

So Freunde,
ich habe gestern ein neues Projekt erstellt,
im main habe ich mir den Beispielcode aus dem Forum reinkopiert und dann 
alle notwendigen .h dateien in den Projektordner kopiert und eingefügt.
scheinbar habe ich beim Einbinden dieser Dateien einen Fehler gemacht.
Ich bekomme 35 Meldungen mit "undefined reference to ... "

hier zu meiner Vorgehensweise:
1) - Neues Projekt erstellt
2) - im Main den Beispielcode von mikrocontroller.net kopiert
3) - danach die .h und .c Dateien (mmc. fat. fil. usw) in das 
Projektverzeichnis kopiert
4) - Mittels Rechtsklick im Solution-Explorer auf "Add" - "Existing 
Item" und dann die nötigen headerdateien ausgewählt. -so hat es 
zumindest auch bei bisherigen programmen funktioniert.

habe ich hier etwas falsch gemacht bzw. braucht man hierfür noch etwas?


Beste Grüße

von Gerhard H. (gerhardh)


Lesenswert?

hier noch ein kleiner Nachtrag:

C:\Users\ccc\Desktop\TryOuts\SD\SD-Write-Tryout\SD-Write-Tryout\main.c(2 
7,1):  error: undefined reference to `uinit'

lg

von Gerhard H. (gerhardh)


Angehängte Dateien:

Lesenswert?

Hier mal mein Projekt.
Scheitert derzeit noch am kompielieren.


LG

von Mitlesa (Gast)


Lesenswert?

Gerhard H. schrieb:
> Scheitert derzeit noch am kompielieren.

Du musst schon alles nehmen was in dem Beispiel vorkommt.

Auf die Schnelle sehe ich bei dir keine globale Variable
<TimingDelay> und die zugehörige Timer-Initialisierung.

Also alles von vorne, erst nur das Testbeispiel erfolgreich
compilieren und dann deine Änderungen hinzufügen.

von Andreas S. (igel1)


Lesenswert?

Gerhard H. schrieb:
> habe ich hier etwas falsch gemacht bzw. braucht man hierfür noch etwas?

Nein, Du hast nichts falsch gemacht, aber die Autoren der MC-Seite, auf 
die wir Dich gelockt haben, die haben Dich in die Wüste geschickt:

Du hattest vermutlich das dortige Beispiel 1:1 in Deine main.c kopiert:
https://www.mikrocontroller.net/articles/AVR_FAT32#Einfaches_Code-Beispiel

Leider fehlten darin ein paar wichtige Dinge (evtl. aus didaktischen 
Gründen?) und dieses Beispiel kompiliert daher nicht sauber.

So kommst Du aus der Zwickmühle heraus:

Im Zip-Paket ("AVR-mmc-0.6.4.zip") ist die Datei "main_simple.c" 
enthalten. Wenn Du den Inhalt Deiner main.c durch deren Inhalt ersetzt, 
so kompiliert der Code und Du hast ein schönes Beispiel.

Kannst ja mal schreiben, ob der Code dann auch wirklich auf Deiner 
Hardware funktioniert hat - das kann ich hier leider nicht testen, weil 
ich hier in der Grabbelkiste auf die Schnelle kein SD-Modul finde.

Viele Grüße

Igel1

: Bearbeitet durch User
von Gerhard H. (gerhardh)


Lesenswert?

Danke vielmals (:
das Projekt lässt sich nun compilieren.
Werde jetzt mal herausfinden, wie ich nun auf die SD schreiben kann.
Ich finde eure Hilfe bemerkenswert!
Danke!

von Andreas S. (igel1)


Lesenswert?

Gerhard H. schrieb:
> Werde jetzt mal herausfinden, wie ich nun auf die SD schreiben kann.

Und? Hattest Du Erfolg?

Viele Grüße

Igel1

von Gerhard (Gast)


Lesenswert?

Leider noch nicht.
Über das HTerm wird nur der Status "Boot" geschrieben. Nicht wie erhofft 
"Boot OK"

Bin gerade dabei den Code zu verstehen. Sehe aber noch nicht wirklich 
wie ich nun meinen Messwert auf die SD schreiben kann.

Werde mich aber auf jeden Fall melden, sobald es läuft.

LG

von Gerhard H. (gerhardh)


Lesenswert?

Kleines Update meinerseits....
Initialisierung funktioniert!
lag wohl an einer schlechten China-Strippe.
ärgerlich, dass soetwas einem Stunden an Zeit kosten kann.

von Wolfgang (Gast)


Lesenswert?

Gerhard H. schrieb:
> lag wohl an einer schlechten China-Strippe.
> ärgerlich, dass soetwas einem Stunden an Zeit kosten kann.

In solchen Fällen lässt sich die Suchzeit erheblich reduzieren, indem 
man einen Billig-China-Logikanalysator (z.B. 
https://www.ebay.de/itm/202437260818) für die systematische Fehlersuche 
einsetzt.

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Gerhard H. schrieb:
> Kleines Update meinerseits....
> Initialisierung funktioniert!
> lag wohl an einer schlechten China-Strippe.
> ärgerlich, dass soetwas einem Stunden an Zeit kosten kann.

auf dem Steckbrett altbekannt, ich lege ja alle Leitungen stets doppelt!
Seit dem nie mehr Probleme!

von Stefan F. (Gast)


Lesenswert?

Joachim B. schrieb:
> ich lege ja alle Leitungen stets doppelt!
> Seit dem nie mehr Probleme!

Ich glaube Dir das, aber das ist doch gaga. Kann man keine Steckbretter 
mehr kaufen, die normal funktionieren?

von Joachim B. (jar)


Lesenswert?

Stefanus F. schrieb:
> Ich glaube Dir das, aber das ist doch gaga. Kann man keine Steckbretter
> mehr kaufen, die normal funktionieren?

bestimmt, aber die beiden die besser sind kosteten das 10 bis 100 - 
fache

und sind schwer zu bekommen, die billigen taugen halt mit etwas 
Mehraufwand.

Die genauen Lieferquellen finde ich nicht mal mehr, es waren genau 2 
gute Bretter mit blauem Plastikuntergrund.

so z.B.
https://rn-wissen.de/wiki/images/3/3b/Avrtutorial_steckbrett_max232.jpg

von Stefan F. (Gast)


Lesenswert?

Joachim B. schrieb:
> Die genauen Lieferquellen finde ich nicht mal mehr, es waren genau 2
> gute Bretter mit blauem Plastikuntergrund.

Ha! Genau so sieht meins aus, allerdings in Schwarz. Das ist schon 20 
Jahre alt und immer noch gut (außer ein paar einzelne Kontate die ich 
vergewaltigt habe). Ich glaube, meins hatte damals etwa 50 DM gekostet.

von Andreas S. (igel1)


Lesenswert?

Gerhard H. schrieb:
> Initialisierung funktioniert!

Glückwunsch Gerhard! Gut gemacht!

Viele Grüße

Igel1

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.