Hallo, ich bin der Justin, ganz neu hier und versuche mir gerade für ein Schulprojekt ein EKG-Gerät mittels der AD8232 Platine zu bauen. Dies hat auch schön funktioniert, sodass ich auf meinem kleinen OLED-Display die EKG-Linie sehen kann.
Jetzt wollte ich noch zusätzlich, dass das Signal als Wert auf einem angeschlossenen SD-Modul auf einer SD-Karte gespeichert wird.
Zunächst habe ich mir dazu die Beispielsketchs angesehen und habe versucht diese in mein Programm einzubauen. Leider bekomme ich aber mittlerweile eine Fehlermeldung, die ich nicht verstehe, beziehungsweise nicht beseitigen kann.
Wäre cool, wenn mir da jemand etwas unter die Arme greifen könnte.
Geräte:
-
Arduino Uno Klon
-
AD8232 EKG Platine https://www.amazon.de/ILS-EKG-Messmodul-Portable-Monitor-Biological/dp/B079126RFK/ref=sr_1_3?ie=UTF8&qid=1529923704&sr=8-3&keywords=ad8232%23
-
SD Kartenmodul https://www.ebay.de/itm/microSD-TF-Card-Adapter-Reader-micro-SD-SPI-Arduino-Raspberr-Pi/162372748499?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649
#include <Adafruit_SSD1306.h>
#include <SD.h> //Load SD card library
#include<SPI.h> //Load SPI Library
#define OLED_Address 0x3C
Adafruit_SSD1306 oled(1);
int x=0;
int lastx=0;
int lasty=0;
int LastTime=0;
int chipSelect = 4; //chipSelect pin für den SD Kartenleser
void setup() {
oled.begin(SSD1306_SWITCHCAPVCC, OLED_Address);
oled.clearDisplay();
oled.setTextSize(1);
Serial.begin(9600); //Einschalten serial monitor
pinMode(10, OUTPUT); //10 muss Output sein
SD.begin(4); //Initialisierung SD Kartenleser
}
void loop()
{
if(x>127) //Breite des Displays
{
oled.clearDisplay(); //Löschen des Displays
x=0;
lastx=x;
}
int value=analogRead(0); //Eingabe Signal des AD8232
oled.setTextColor(WHITE);
int y=60-(value/16); //EKG Linie mittig im Display
oled.writeLine(lastx,lasty,x,y,WHITE);
lasty=y;
lastx=x;
oled.display();
x++;
delay(1);
File value = SD.open("HerzData.txt", FILE_WRITE); //Datei auf SD-Karte öffnen
value.println("HerzData", int); //Schreiben der Daten auf SD Karte
value.close("HerzData"); //Datei schließen
}
Und es wäre auch cool, wenn du die Fehlermeldung komplett posten würdest.
Dann fällt die Hilfe leichter.
Und jetzt sollen wir uns die <Adafruit_SSD1306.h> Library besorgen und deinen Sketch kompilieren, um zu raten, ob du wohl die gleiche Fehlermeldung kriegst?
Tip: Selbst wenn du sie nicht verstehst, hat es einen Grund, warum Fehlermeldungen aus Text bestehen.
Und in welcher Zeile der Fehler (nach Ansicht des Compilers) ist, sollte auch interessant sein.
Entschuldigung, hier ist die Fehlermeldung.
Arduino: 1.8.5 (Windows 10), Board: "Arduino/Genuino Uno"
C:\Users\Justin\AppData\Local\Temp\arduino_modified_sketch_712946\Datalogger.ino: In function 'void loop()':
Datalogger:48: error: conflicting declaration 'SDLib::File value'
File value = SD.open("HerzData.txt", FILE_WRITE); //Datei auf SD-Karte öffnen
^
C:\Users\Justin\AppData\Local\Temp\arduino_modified_sketch_712946\Datalogger.ino:37:7: note: previous declaration as 'int value'
int value=analogRead(0); //Eingabe Signal des AD8232
^
Datalogger:50: error: request for member 'println' in 'value', which is of non-class type 'int'
value.println("HerzData", int); //Schreiben der Daten auf SD Karte
^
Datalogger:50: error: expected primary-expression before 'int'
value.println("HerzData", int); //Schreiben der Daten auf SD Karte
^
Datalogger:51: error: request for member 'close' in 'value', which is of non-class type 'int'
value.close("HerzData"); //Datei schließen
^
exit status 1
conflicting declaration 'SDLib::File value'
Er sgt doch eindeutig, was ihn stört: Du hast 2 verschiedene Variablen mit dem Namen "value".
Datalogger:48: error: conflicting declaration 'SDLib::File value'
File value = SD.open("HerzData.txt", FILE_WRITE); //Datei auf SD-Karte öffnen
^
C:\Users\Justin\AppData\Local\Temp\arduino_modified_sketch_712946\Datalogger.ino:37:7: note: previous declaration as 'int value'
int value=analogRead(0); //Eingabe Signal des AD8232
^
Gruß Tommy
Was eine Variable ist, davon hast du eine Idee?
Eine Variable hat einen Datentyp, einen Namen und einen Wert. Der Wert kann sich ändern, der Datentyp nicht.
int und File sind übrigens Datentypen
Hi
Davon ab - ein recht sinnvoller Name für ein geöffnetes File, oder?
Selbst beim ADC macht diese Bezeichnung nicht wirklich Sinn ...
MfG
Soo.. ich habe es jetzt noch etwas umgebastelt und habe dei Infos einbauen können. Vielen Dank dafür!
Jetzt wird nur noch angemerkt, dass der dynamische Speicher zu voll wäre, wobei das Sketch nur 63% des Speicherplatzes benötigt.
Sind ihm die 5 globalen Variablen wirklich zuviel?
#include <Adafruit_SSD1306.h>
#include <SD.h> //Load SD card library
#include<SPI.h> //Load SPI Library
#define OLED_Address 0x3C
Adafruit_SSD1306 oled(1);
int x=0;
int lastx=0;
int lasty=0;
int LastTime=0;
int chipSelect = 4; //chipSelect pin für den SD Kartenleser
void setup() {
oled.begin(SSD1306_SWITCHCAPVCC, OLED_Address);
oled.clearDisplay();
oled.setTextSize(1);
Serial.begin(9600); //Einschalten serial monitor
pinMode(10, OUTPUT); //10 muss Output sein
SD.begin(4); //Initialisierung SD Kartenleser
}
void loop()
{
if(x>127) //Breite des Displays
{
oled.clearDisplay(); //Löschen des Displays
x=0;
lastx=x;
}
int EKG=analogRead(0); //Eingabe Signal des AD8232
oled.setTextColor(WHITE);
int y=60-(EKG/16); //EKG Linie mittig im Display
oled.writeLine(lastx,lasty,x,y,WHITE);
lasty=y;
lastx=x;
oled.display();
x++;
delay(1);
File dataFile = SD.open("HerzData.txt", FILE_WRITE); //Datei auf SD-Karte öffnen
dataFile.println(EKG); //Schreiben der Daten auf SD Karte
dataFile.close(); //Datei schließen
}
Fehlermeldung:
Arduino: 1.8.5 (Windows 10), Board: "Arduino/Genuino Uno"
Der Sketch verwendet 20566 Bytes (63%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 2184 Bytes (106%) des dynamischen Speichers, -136 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
Nicht genug Arbeitsspeicher; unter http://www.arduino.cc/en/Guide/Troubleshooting#size finden sich Hinweise, um die Größe zu verringern.
Fehler beim Kompilieren für das Board Arduino/Genuino Uno.
Richtig lesen:
Globale Variablen verwenden 2184 Bytes (106%) des dynamischen Speichers
Das sind nicht nur die paar int, die Du definiert hast. Auch die Libs haben globale Puffer. Z.B. die SD braucht 512 Sektorpuffer.
Da ist der Arduino zu klein.
Du könntest zwar noch ein paar Bytes sparen, die machen das Kraut aber nicht fett.
Gruß Tommy
Hi
Möglich, daß die Display-Lib den Inhalt als Array vorhält - da kommen einige Byte zusammen.
Deine 5 globalen Variablen kann man geringfügig verkleinern - das chipselect muß kein int sein, Da reicht ein byte.
(spart genau 1 Byte, sofern der Compiler Das nicht wegoprimiert, da sich diese Einstellung das ganze Programm nie ändert - ein const an Werte, Die sich NIE ändern sollen, hilft dem Compiler dabei)
MfG
Auch die Libs haben globale Puffer. Z.B. die SD braucht 512 Byte Puffer
Dieses halbe kB ist Minimum, wenn du jedenfalls SD verwenden willst.
Bleiben 1,5 kB in der SD und der SSD1306 Library, bei denen man sehen/suchen muss, auf was man verzichten kann.
Es gibt eine SD Logger Lib, die zwar Einschränkungen hat, aber weniger RAM braucht.
Aber vermutlich eventuell sind die ungenutzten Grafik-Fahigkeiten der OLED Library ein einfacherer Ansatz. Da gibt es eventuell auch was fertiges kleineres. (Keine Ahnung)
Nachtrag: Sorry, Grafik wird ja auch gebraucht.
Dann muss man halt über einen Prozessor mit mehr RAM nachdenken.
Gruß Tommy