INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 3 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Hilfe bei Liniendiagram
05.03.2016, 13:02
Beitrag #1
Hilfe bei Liniendiagram
Guten Morgen,

vorab Entschuldigung das ich mich mystisch Artikuliere aber ich wusste nicht wie ich es formulieren sollte.

Ausgangssituation ist,
1 x Arduino Mega 2560
1 x 3.2 Inch TFT Display 320 * 480 (mit UTFT Library)
1 x DHT22
1 x BMP085
1 x GPS Modul (mit TinyGPS Library)

Mein Ziel ist/war.
Mit den Sensoren Messwerte erfassen und auf dem Display darstellen.
[Bild: display.jpg]
soweit so gut..
Aber wie man sehen kann habe ich im oberen Teil ein Koordinatenfenster mit Werten von -100 nach 0 zu +100 und auf der Zeitachse von 0 auf 120...
hier möchte ich nun den Verlauf der magnetischen Änderungen bezogen auf den vergangenen 120 Minuten darstellen.
sieht dann in etwa so aus:
[Bild: klein.jpg]
auch das funktioniert eigentlich alles zufriedenstellend.
Es geht hier nicht in erster Linie um die Genauigkeit oder den Messbereich sondern um eine Optische Darstellungsvariante wo ich eure Hilfe gebrauchen könnte.

Wenn nämlich 120 Minuten um sind, wird dass Display gelöscht und beginnt wieder bei 0 Minuten.
Ich würde aber gern das 110 Minuten der möglichen 120 Minuten auf dem Bildschirm verbleiben und alles was älter ist, wird nach links rausgeschoben (also auf dem Bildschirm nicht mehr angezeigt.) Ich weiß nicht wie man dieses Darstellungsvariante nennt, aber wenn ich die letzen 2 Stunden sehe reicht mir das. Aber ich würde gern nach 3 Stunden auch noch die letzten 2 Stunden sehen wollen. Wie realisiere ich das.

Das Prinzip ist im Moment simple.
PHP-Code:
// -------------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------
// MAG3110 Library & Setup
#include <Wire.h>
#define MAG_ADDR  0x0E   //7-bit address for the MAG3110, doesn't 
int q ;
int calX ;
int calY ;
int calZ ;
int mag_x ;
int mag_y ;
int mag_z ;
// -------------------------------------------------------------------------------------------------------------------
// TFT Display Library & Setup
#include <UTFT.h>
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
UTFT myGLCD(CTE32HR38394041);
int buf[478];
int xx2;
int yy2;
int r;
// -------------------------------------------------------------------------------------------------------------------
char sz[32];
float ph 0;
// -------------------------------------------------------------------------------------------------------------------
int OP 45;    // Start von Links nach Rechts
int OD 116;   // Start von Oben nach Unten
int P ;     // Ziel von Links nach Rechts max = 460
int D 116 ;   // Ziel von Oben nach Unten   max = 320

int K ;
int k ;
// -------------------------------------------------------------------------------------------------------------------
void setup() {
  
Serial.begin(9600);
  
// ===========================================================================​========================================
  
myGLCD.InitLCD();
  
myGLCD.setFont(SmallFont);
  
// ===========================================================================​========================================
  
Wire.begin();
  
Wire.beginTransmission(MAG_ADDR);  // transmit to device 0x0E
  
Wire.write(0x11);                  // cntrl register2
  
Wire.write(0x80);                  // send 0x80, enable auto resets
  
Wire.endTransmission();            // stop transmitting
  
delay(15);
  
Wire.beginTransmission(MAG_ADDR);  // transmit to device 0x0E
  
Wire.write(0x10);                  // cntrl register1
  
Wire.write(1);                     // send 0x01, active mode
  
Wire.endTransmission();            // stop transmitting
  // ===========================================================================​========================================
  
calibrierung() ;                  // magnetischen Grundwert ermitteln
  
newscreen() ;                     // DIsplay neu aufbauen (zur Demonstration ohne Schnickschnack)
}
void loop() {
  
// -------------------------------------------------------------------------------------------
  
mag_x readx() - calX;           // Magnetometer auslesen und Grundwert abziehen (sollte im Idealfall Null ergeben)  
  
=  mag_x 116 ;                // Ausgangshöhe auf dem DIsplay + Magnetometer ergibt neue Höhe auf dem Display 
  
;                       // Abstand in Pixeln zwischen zwei Messwerten
  
myGLCD.drawLine (OPODPD) ;  // Zeichnen der Linie von OP, OD, also von 45,116 zu P (45 + 3) , d also OD + Magnetischem Wert) 
  
OD ;                          // alte Zielwerte als neue Startwerte übergeben, hier die Höhe
  
OP ;                          // alte Zielwerte als neue Startwerte übergeben, hier die (quasie) zeitlichen Verlauf
  
if (460) {                    // Wenn rechter Bildschirmrand erreicht, 
    
newscreen() ;               // alles löschen und von vorne beginnen.
    
42;
    
OP 45;
    
OD 116;
  }
  
// -------------------------------------------------------------------------------------------
  
delay(100);
}
// ###########################################################################​#################
int readx(void) {
  
int xlxh;  //define the MSB and LSB
  
Wire.beginTransmission(MAG_ADDR);  // transmit to device 0x0E
  
Wire.write(0x01);                  // x MSB reg
  
Wire.endTransmission();            // stop transmitting
  
delayMicroseconds(2);              //needs at least 1.3us free time between start and stop
  
Wire.requestFrom(MAG_ADDR1);     // request 1 byte
  
while (Wire.available()) {         // slave may send less than requested
    
xh Wire.read();                // receive the byte
  
}
  
delayMicroseconds(2);              //needs at least 1.3us free time between start and stop
  
Wire.beginTransmission(MAG_ADDR);  // transmit to device 0x0E
  
Wire.write(0x02);                  // x LSB reg
  
Wire.endTransmission();            // stop transmitting
  
delayMicroseconds(2);              //needs at least 1.3us free time between start and stop
  
Wire.requestFrom(MAG_ADDR1);     // request 1 byte
  
while (Wire.available()) {          // slave may send less than requested
    
xl Wire.read();                // receive the byte
  
}
  
int xout = (xl | (xh << 8));       //concatenate the MSB and LSB
  
return xout;
}
// ###########################################################################​#################
int newscreen(void) {
  
myGLCD.clrScr();                  // Bildschirm löschen
  
myGLCD.setFont(SmallFont);        // Schrifttyp auswählen
  
myGLCD.setBackColor(000);     // HIntergundfarbe setzen
  
myGLCD.setColor(255255255);   // Schrift & Zeichenfarbe setzen
  
calibrierung() ;                  // magnetischen Grundwert ermitteln
  
mag_x readx() - calX;           // Magnetometer auslesen und Grundwert abziehen (sollte im Idealfall Null ergeben)
  
=  mag_x ;                      // Magnetwert in Variable D (ist der Zielwerte der Linienhöhe)
  
42 ;                          // Startwert für Linienangang.
}
// ###########################################################################​#################
int calibrierung(void) {
  
calX readx();                   // Magnetometer auslesen und in Variable calX speichern
  
return calX ;
}
// ###########################################################################​################# 
das ganze ergibt dann soetwas hier.
[Bild: line.jpg]

und wie muss ich nun vorgehen um 80~90 % davon dauerhaft auf dem Bildschirm zu halten und ältere Daten zu löschen?
gibt es da einen einfachen Weg?

Danke und grüße aus Kiel
Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.03.2016, 13:32
Beitrag #2
RE: Hilfe bei Liniendiagram
Ich bin schon etwas beeindruckt von der Darstellung, auch weil ich dergleichen noch nicht programmiert habe.

Was du meinst, ist sich "Scollen" und da wäre meine Idee die Daten in das Eeprom zu speichern und entsprechend dem Zeitraum wieder auszulesen. Allerdings müsstest du ein Eeprom nehmen, welches entsprechend öfter beschrieben werden kann (höhere Schreibzyklen).

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.03.2016, 14:46
Beitrag #3
RE: Hilfe bei Liniendiagram (Scrollfunktion)
(05.03.2016 13:32)hotsystems schrieb:  Ich bin schon etwas beeindruckt von der Darstellung, auch weil ich dergleichen noch nicht programmiert habe.

Was du meinst, ist sich "Scollen" und da wäre meine Idee die Daten in das Eeprom zu speichern und entsprechend dem Zeitraum wieder auszulesen. Allerdings müsstest du ein Eeprom nehmen, welches entsprechend öfter beschrieben werden kann (höhere Schreibzyklen).

Ja, danke, für den Hinweis. Horizontales Scrollen dürfte der reichtige Begriff sein.

Ich möchte noch etwas dazu sagen was das ganze überhaupt soll.
Worum geht es bei diesem Projekt.
Ganz einfach, ich möchte damit das Erdmagnetfeld überwachen.
Dieses ist nicht konstant da es äuuseren Einflüssen unterlegen ist wie z.B. dem Sonnenwind. Hat die Sonnen einen sogenannten koronalen Massenauswurf und bewegen sich diese Teilchen auf die Erde zu so verändern Sie das magnetische Feld das die Erde umgibt. diese veränderung kann man mit einem Magnetometer messen und aus den Messwerten Rückschlüsse auf Dichte, Menge und Geschwindigkeit ziehen. Dies Information hilft zum Beispiel dem AMatuerfunker wenn er versucht DX Verbindungen aufzubauen, also weit enfernte Stationen zu erreichen.

Das ganze spielt sich im Nanotesla Bereich ab und Magnetometer müssen schon sehr sehr empfindlich sein. Das MAG3110 sollte für grobe Messungen geeignet sein. Nun warum mache ich das obwohl ich kein Amateurfunker bin??

Polarlichter entstehen wenn der Konronale Massenauswurf unser Erdmagnetfeld durchbricht und das geht nur, wenn bestimmte Kriterien erfüllen sind. Durch die Veränderung des Magnetfeldes können Rückschlüsse und Prognosen erstellt werden und ich weiß dann... aha.. Kamera bereit machen, ab ins Auto und raus aufs Land wo mich kein Streulicht stört. Blick grob nach Norden, Nordwest und abwarten, ggf. Hintern abfrieren Smile

[Bild: aurora.png]

Durch das Scrollen kann ich besser die Entwicklung der Magntischen Veränderung verfolgen und Trends erkennen. Irgendwwann tausche ich das MAG3110 gegen ein empfindlicheren Sensor aus, aber erstmal muss der Prototyp sich bewähren Big Grin

Kommen wir zur Praktischen Seite. des Scrollens.
Ich habe 3 Messwerte die ich mir merken müßte.

Ich beginne links mit dem Wert 45 und arbeite mich in 3 Pixelschritten auf Position 460 vor. das heißt, ich habe 139 Messwerte was der horizontale Bewegung entspicht.
Also baue ich ein Array auf, das folgende Informationen enthalten müßte.

Das Array umfasst 139 werte mit je einem H und einem V Wert: wobei H die Horiontale und V die Vertikale Position darstellt.

Also habe ich (grob) 420 Werte in einem Array. wofür brauche ich ein Eprom?

Nach dem Hochladen melde mir die IDE das mir noch 6734 Bytes für Variablen verbleiben , das müßte doch mit dem internenm Speicher des Arduino machbar sein.
Was mir Probleme bereitet (a) das füllen des Arrays und dem auslesen und der Darstellung auf dem Display? Und Sorry, ich bin nicht wirklich Fit bei dieser Art von Arraymanipulationen.

ich werde mal Google bemühen ob ich was finde das ich für meine Zwecke verwenden kann. Aber ich bin offen für eure Vorschläge, Ideen und Anregungen.

Danke..
Gruß aus KIel
Peter



.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.03.2016, 14:48
Beitrag #4
RE: Hilfe bei Liniendiagram
Hallo Peter,

ich nehme mal an dass es bei einer Darstellung über 120 Minuten auch 120 Messwerte sind.
Für diese Messwerte würde ich eine Array im RAM und einen Zeiger auf die aktuelle Schreibposition anlegen.
Code:
int messwerte[120];
byte zeiger = 0;

Immer dann wenn ein neuer Messwert eingelesen wurde, wird dieser in das Messwertarray eingetragen und der Zeiger um 1 erhöht. Wenn der Zeiger die 119 überschreitet wird er wieder auf 0 gesetzt.
Code:
messwerte[zeiger] = messwert;
zeiger++;
if (zeiger >= 120) zeiger = 0;
So wird das Array nach und nach mit Messwerten gefüllt wobei nach 120 Minuten immer der älteste Messwert überschrieben wird.

Für die Ausgabe auf dem Display von links nach rechts gibst du die Werte aus dem Array von zeiger bis 0 und dann von 119 bis zeiger +1 aus. Das Array wird also rückwärts ausgelesen und ausgegeben. So wird der aktuellste Messwert im Display linksbündig dargestellt. Der älteste Messwert der an der Position Zeiger +1 steht, wird im Display dann rechtsbündig ausgegeben.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.03.2016, 15:00
Beitrag #5
RE: Hilfe bei Liniendiagram
(05.03.2016 14:48)ardu_arne schrieb:  Hallo Peter,

ich nehme mal an dass es bei einer Darstellung über 120 Minuten auch 120 Messwerte sind.
Für diese Messwerte würde ich eine Array im RAM und einen Zeiger auf die aktuelle Schreibposition anlegen.
Code:
int messwerte[120];
byte zeiger = 0;

Immer dann wenn ein neuer Messwert eingelesen wurde, wird dieser in das Messwertarray eingetragen und der Zeiger um 1 erhöht. Wenn der Zeiger die 119 überschreitet wird er wieder auf 0 gesetzt.
Code:
messwerte[zeiger] = messwert;
zeiger++;
if (zeiger >= 120) zeiger = 0;
So wird das Array nach und nach mit Messwerten gefüllt wobei nach 120 Minuten immer der älteste Messwert überschrieben wird.

Für die Ausgabe auf dem Display von links nach rechts gibst du die Werte aus dem Array von zeiger bis 0 und dann von 119 bis zeiger +1 aus. Das Array wird also rückwärts ausgelesen und ausgegeben. So wird der aktuellste Messwert im Display linksbündig dargestellt. Der älteste Messwert der an der Position Zeiger +1 steht, wird im Display dann rechtsbündig ausgegeben.

Gruß
Arne

Hallo Arne, danke für den Tip.
Ja bei den Messswerten sollen es 120 Messwerte werden, ich war auch am Überlegen ob ich evtl. auf 180 Minuten (also 3 STunden) gehe, der Trend wäre vielleicht besser erkennbar.
ich probier da deinen Tip mal aus...
sollte es wirklich so einfach sein? Dodgy
Gruß
Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.03.2016, 15:38
Beitrag #6
RE: Hilfe bei Liniendiagram
Aahhhh, ein Polarlichterjäger. Wink

Ich denke schon dass es so einfach sein kann, aber der Teufel steckt oft im Detail.
Als Zeiger habe ich eine Variable vom Typ "byte" vorgeschlagen. Das passt nur wenn es weniger als 255 Messwerte im Array sind. Werden es mehr musst du "unsigned int" nehmen.

Die Ausgabe auf das Display kann vermutlich in eine "for" Schleife erfolgen. Die ist natürlich etwas tricky weil die rückwärts laufen muss und aus zwei Teilen besteht.
1. Teil: zeiger --> 0
2. Teil: 119 --> zeiger+1

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.03.2016, 16:07
Beitrag #7
RE: Hilfe bei Liniendiagram
Ich bin Amatuerfunker Klasse "A".
Unter DX verstehen die Forumsnutzer nicht das, welches wir verstehen.
Das musst du ihnen schon näher erklären.

Gruss
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.03.2016, 16:13 (Dieser Beitrag wurde zuletzt bearbeitet: 05.03.2016 16:26 von hotsystems.)
Beitrag #8
RE: Hilfe bei Liniendiagram
(05.03.2016 16:07)arduinofan schrieb:  Ich bin Amatuerfunker Klasse "A".
Unter DX verstehen die Forumsnutzer nicht das, welches wir verstehen.
Das musst du ihnen schon näher erklären

Hat er das nicht schon gemacht?
Warum erklärst du uns das nicht, wenn es nicht richtig war?

@Wetteronkel
In jedem Fall ist das ein sehr schönes Projekt.
Mein Vorschlag zielte auch darauf hin, wenn Stromausfall ist, die Daten dann zurück zu holen.
Wenn das mit dem Ram so funktioniert, umso besser.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Hilfe: IR Remote Steuerung, MSGEQ7 + RGB-LED Streifen dastob 1 118 14.10.2016 21:40
Letzter Beitrag: hotsystems
Sad Ich brauche Hilfe Prosac 4 232 09.10.2016 18:39
Letzter Beitrag: Prosac
  at24c256 Hilfe Gandalf 6 247 29.08.2016 18:59
Letzter Beitrag: MKc
Smile Progammier Neuling Codeschloss bittet um Hilfe Donalonso 2 284 27.08.2016 18:23
Letzter Beitrag: Binatone
  Hilfe gesucht. Webserver Statsiche und Dynamische HTMl Seite b3ta 11 449 22.08.2016 08:07
Letzter Beitrag: b3ta
  Hilfe: Mega2560 - ENC 28J60 - MYSQL Gandalf 1 179 28.07.2016 16:30
Letzter Beitrag: Gandalf
  Selbstfahrender Roboter Programm änderung hilfe ? arekklone 11 538 06.07.2016 14:59
Letzter Beitrag: Binatone
  Hilfe beim Arduino Shield reimundko 6 454 05.06.2016 11:28
Letzter Beitrag: rpt007
  Brauche etwas Hilfe bei der Umsetzung einer Idee raspido 3 527 23.04.2016 10:26
Letzter Beitrag: rkuehle
  Hilfe bei RTC und SD baron007 21 1.581 13.03.2016 17:36
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste