Show Posts
Pages: 1 2 3 [4] 5 6 ... 164
46  International / Deutsch / Re: Windmesser auslesen on: April 11, 2014, 10:19:56 am
Vielen Dank für den Hinweis. Dem bin ich nun nachgegangen, das Ergebnis bleibt das gleiche ( siehe Bild ).

???

Verstehe ich das richtig:
Dein Sketch aus  Reply #2 mit kurzschlußträchtigem Sensoranschluß an Serial liefert dieselbe Ausgabe wie mein Sketch aus  Reply #4 mit sauber getrenntem Sensoranschluss an Serial1?

Oder hast Du Deinen Sketch aus  Reply #2 so abgeändert, dass er nun mit dem an Serial1 angeschlossenen Sensor läuft?

Und Du hast wirklich keinerlei Datenblatt? Hersteller? Typenbezeichnung vom Sensor?
Irgendein Herstellerlogo oder Aufdruck auf dem Sensor verfügbar?
So dass man vielleicht etwas mehr über den Sensor herausfinden kann?

Wenn Du keinerlei technische Angaben hast, weißt Du ja noch nicht einmal, was der Sensor sendet?
Windstärke in Meter pro Sekunde? Oder in Yard pro Sekunde? In Kilometer pro Stunde? Meilen Pro Stunde? Knoten? Beaufort?

Anyway, hier ein neuer Test-Sketch zum Ausknobeln des Sendeprotokolls:
Code:
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial1.begin(9600);
}

unsigned long receiveCount=0;

void loop() {
  while (Serial1.available())
  {
    receiveCount++;
    byte b=Serial1.read();
    char c=b;
    Serial.print(receiveCount);
    Serial.print('\t');
    Serial.print(b);
    Serial.print('\t');
    Serial.print(c);  
    Serial.println();
  }
}

Lasse mal laufen und poste die serielle Ausgabe, und zwar NICHT als Screenshot, sondern indem Du die Ausgabe im seriellen Monitor markierst und per Copy-and-Paste hier einfügst, am besten innerhalb von Code-Tags.

Vielleicht den Sensor auch mal mit einem Fön in der Kaltluftstufe anblasen, damit er andere Werte als Null liefert.
47  International / Deutsch / Re: HC-SR04 Sensor fehlt da was? on: April 11, 2014, 09:23:12 am
Gibt es hier irgendwo ein umfangreiches Beispielprogramm was eben mit vielen Unterfunktionen etc. arbeitet was auch etwas dokumentiert ist.
Wenn ich den Aufbau und die Logik dahinter sehe komme ich schneller voran

Hier mal ein kurzes Beispielprogramm, das einmal pro Minute die Temperatur "mißt" (die Messung wird nur durch eine Zufallsfunktion simuliert) und alle 10 Minuten den PH-Wert.

Das Programm zeigt, wie ich an so etwas herangehe:
Code:
void setup() {
  Serial.begin(9600);
}

float temperatur;
#define TEMPINTERVALL 60*1000L // 60 Sekunden
float phWert;
#define PHINTERVALL 10*60*1000L // 10 Minuten

void eingabeTemperatur()
{
  static unsigned long letzteMessung=-TEMPINTERVALL;
  unsigned long now=millis();
  if (now-letzteMessung>TEMPINTERVALL)  // 1 Minute
  {
    temperatur=20+random(50)/10.0; // Test only: Zufallswert "messen"
    letzteMessung=now;
    Serial.println("Debug-Meldung: Temperatur gemessen");
  }
}

void eingabePH()
{
  static unsigned long letzteMessung=-PHINTERVALL;
  unsigned long now=millis();
  if (now-letzteMessung>PHINTERVALL)  // 60 Minuten
  {
    phWert=7+random(10)/10.0; // Test only: Zufallswert "messen"
    letzteMessung=now;
    Serial.println("Debug-Meldung: PH-Wert gemessen");
  }
}


void verarbeitung()
{
  // nichts
}

void ausgabe()
{ // einmal pro Sekunde den Wert in der Anzeige aktualisieren
  static unsigned long letzteAnzeige=0;
  unsigned long now=millis();
  if (now-letzteAnzeige>1000) // 1 Sekunde
  {
    Serial.print("Temp: ");Serial.print(temperatur);Serial.print('\t');
    Serial.print("PH: ");Serial.print(phWert);Serial.println();
    letzteAnzeige=now;
  }
}

void loop() {
  eingabeTemperatur();
  eingabePH();
  verarbeitung();
  ausgabe();
}

Jedes Programm wird in verschiedene "Tasks" (= Funktionen) aufgeteilt, die in der loop-Funktion reihum immer wieder abgearbeitet werden. Eine sinnvolle Aufteilung der Tasks erfolgt nach dem "EVA-Prinzip":
- Eingabe
- Verarbeitung
- Ausgabe
Die EVA-Trennung ist deshalb so sinnvoll, weil sie die spätere Wartbarkeit und Erweiterung des Programms sehr vereinfacht.  So könnte man Eingaben von Tastaturbedienung auf Drehgeber umstellen. Oder auf Infrarot-Fernbedienung. Oder die Ausgabe erstmal für Serial programmieren und später ein LCD-Textdisplay umschreiben. Oder auf die Ausgabe per Netzwerk auf einem Webbrowser, der die Daten abruft.

Nur "Debug-Ausgaben" auf Serial, um sich während der Programmentwicklung zwischendurch mal etwas auf Serial ausgeben zu lassen, um den Stand von Variablen zu prüfen, sind außen vor, und können überall im Code eingestreut werden.

Der Trick dabei, dass scheinbar "alles gleichzeitig" abläuft, liegt darin:
a) Aufrufe der "delay" Funktion mit langen delay-Zeiten bei interaktiven Programmen stets vermeiden!
b) Jede Task-Funktion so programmieren, dass sie in kürzester Zeit abgearbeitet ist

So können dann die Schritte Eingabe-Verarbeitung-Ausgabe viele tausend mal pro Sekunde ablaufen und im Programm "passiert" tatsächlich eigentlich nur dann etwas, wenn die Zeit reif dafür ist, z.B. einmal pro Sekunde, einmal pro Minute oder einmal alle 10 Minuten.
48  International / Deutsch / Re: Windmesser auslesen on: April 11, 2014, 05:56:30 am
In welchem Format der Sensor(Windmesser) sendet kann ich leider nicht sagen, da ich an keinerlei Daten rankomme.

Dann wage ich mal die Prognose:

Deine Aussage "Das serielle Auslesen des Windmessers funktioniert schon mal (siehe Bild)." ist FALSCH!

Du liest mit Deinem Code zwar irgendwas, aber das ist nicht das, was der Sensor sendet.

Zum Auslesen nutze ich einen RS232 auf TTL Wandler und von dort gehe ich auf die Serielle Schnittstelle des DUE.

Du Kurzschluß-Bastler! Du riskierst es gerade, Deinen Due und oder auch den Windmesser gleich mit zu zerstören!

Die serielle Schnittstelle "Serial" ist spätestens ab der Zeile "Serial.begin(9600)" mit Deinem PC verbunden!
Dieselbe Schnittstelle darfst Du nich nochmal woanders anschließen!

Eine serielle Schnittstelle stellt eine Point-to-Point-Verbindung dar und es darf immer nur EIN serielles Gerät mit EINEM anderen serielle Gerät verbunden werden!

Du hast gerade an der seriellen Schnittstelle Deines DUE ZWEI serielle Geräte angeschlossen:
- den PC mit dem "Seriellen Monitor"
- den Windmesser über den RS232-TTL Adapter

Ich würde als erstes mal diesen Kurzschluss in Deiner Schaltung beseitigen und den Windmesser über den RS232-TTL-Adapter an einem ANDEREN SERIELLEN ANSCHLUSS Deines DUE anschließen.

Also schließe den Windmesser an Pin 0 und 1 ab, und schließe ihn beispielsweise an Serial1 an. Ich habe zwar keinen DUE, aber ich lese in der Beschreibung:
Code:
The Arduino Due hat drei zusätzliche Serial Ports: Serial1 an den Pins 19 (RX) und 18 (TX),
Also den TTL-Adapter  des Windmessers an 19 und 18 (Serial1) wäre möglich.

Achte auch auf die Pegel Deines Adapters: Der DUE verträgt nur 3.3 Volt!
Also keinen Adapter mit 5 Volt TTL-Pegeln verwenden!

Bzw. wenn Du nur Daten vom Windmesser auslesen möchtest, brauchst Du nur den TX-Sendepin des Windmessers mit dem RX-Pin 19 von Serial1 zu verbinden. (Empfangen braucht der Windmesser ja wohl nur, wenn er umprogrammiert werden soll, aber er sendet wohl vermutlich von alleine, ohne dazu einen Sendebefehl zu benötigen).

Und dann teste erstmal mit einem solchen Sketch:
Code:
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {
  while (Serial1.available()) Serial.write(Serial1.read());  
}

49  International / Deutsch / Re: Probleme beim Öffnen einer Datei auf einem SD-Kartenleser on: April 11, 2014, 05:33:23 am
Nur mal der Vollständigkeit halber: Wie hätte ich es denn machen müssen, wenn ich nicht snprintf() nutzen würde?

Viele Möglichkeiten zum Zusammenbasteln des Strings. Zum Beispiel:
Code:
  char filename[13]="gpslg";
  int number=7;
  if (number<100) strcat(filename,"0");
  if (number<10) strcat(filename,"0");
  itoa(number,&filename[strlen(filename)],10);
  strcat(filename,".log");
  Serial.println(filename);

Du müßtest Dir auch mal über den Unterschied zwischen "char" und "char array" klarwerden.

Ein einzelnes Zeichen ist ein "char" und wird als Konstante zwischen EINZELNE HOCHKOMMAS gesetzt. Zum Beispiel:
Code:
char c='x';

Ein char-Array hat eine bestimmte Größe (Anzahl Zeichen plus eins extra als "Stringende-Zeichen") und wird als Konstante zwischen DOPPELTE HOCHKOMMAS gesetzt:
Code:
char filename[13]="gpslg";  // String definiert für Maximallänge 12 und abschließendes Nullzeichen
Das abschließende Nullzeichen in Stringkonstanten wird automatisch eingefügt, das braucht nicht geschrieben werden.

Aber ein char-Array ("C-String") ist eben etwas grundlegend anderes als ein "char".
Insbesondere kannst Du chars mit dem Pluszeichen addieren:
Code:
  char Buchstabe='A'+1;
Das ergibt den Buchstaben 'B', weil 'B' um genau eine Stelle hinter 'A' im ASCII-Alphabet kommt.
Aber ein "char plus irgendwas" ergibt immer nur einen einzelnen char und niemals einen String.

Um char-Arrays ("C-Strings") miteinander zu verbinden, muss eine Funktion aufgerufen werden: strcat
50  International / Deutsch / Re: Windmesser auslesen on: April 11, 2014, 04:28:56 am
Nur komme ich nicht drauf, wie ich den Wert, in diesem Fall 0.0, verarbeiten kann.

Das "Anzeigen der Daten auf dem seriellen Monitor" fällt bei Dir wohl nicht unter "verarbeiten", oder?

Dann erkläre doch mal: Was genau verstehst Du unter "verarbeiten", wenn es "anzeigen der Daten" nicht ist?

Und erkläre mal genau das serielle Datenformat, das Dein Sensor sendet!
Dein Sensor sendet offenbar Daten über eine serielle Schnittstelle an Deinen Arduino, und Du zeigst die Daten offenbar auch im seriellen Monitor an (mit welchem Sketch?), aber was genau sendet der Sensor (hat der eine Modellbezeichnung, Beschreibung, Datenblatt?) und wie möchtest Du es "verarbeiten"?

Bei Sensoren, die ein ASCII-Klartextformat mit einem Zeilenende-Zeichen senden, wäre das generelle Vorgehen so:
- Immer eine Zeile vom Sensor in ein char-Array einlesen
- die eingelesene Zeile in die verschiedenen Bestandteile zerlegen (Tokenisierung)
- die einzelnen Bestandteile zur weiteren Verarbeitung in numerischen Variablen abspeichern
51  International / Deutsch / Re: Temperatursteuerung bremst Arduino uno aus - Warum? on: April 11, 2014, 03:45:32 am
Das ist mein erstes Projekt mit dem Arduino und der Code ist bestimmt nicht der schönste.

Der Code ist ja hübsch häßlich!

Leider etwas unübersichtlich.

Außerdem steckt ein Teil des Codes in einer Library, die Du nicht benennst, wo Du sie her hast.
Es gibt bestimmt ein Dutzend verschiedene DHT-Libraries, bei denen die Include-Dateien teils dieselben Namen haben.

Um auszuschließen, dass es die Temperaturmessung im Library-Code ist, die Deinen Sketch ausbremst, kannst Du ja mal statt:
Code:
float h = dht.readHumidity();
  float t = dht.readTemperature();
den Code testweise ändern auf:
Code:
float h = 66.0;
  float t = 22.5;

Macht das einen Unterschied? Oder ergibt sich damit keine Änderung?
52  International / Deutsch / Re: Probleme beim Öffnen einer Datei auf einem SD-Kartenleser on: April 11, 2014, 02:52:12 am
Um im empfohlenen 8.3 Dateinamen zu bleiben, möchte ich gerne folgende Dateien erstellen:

gpslg001.log

Statt 001 wird ein Zähler raufgezählt

Code:
  char filename[13];
  int number=7;
  snprintf(filename,sizeof(filename),"gpslg%03d.log",number);

"snprintf" ist die "sichere" Variante der Funktion "sprintf" zur Ausgabeformatierung:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#ga53ff61856759709eeceae10aaa10a0a3

Wie das mit der Formatierung über Formatierungsparameter funktioniert, kannst Du Dir in jedem C-Tutorial ansehen, in dem es anhand der Funktion "printf" (für Bildschirmausgabe eines Computerprogramms, also für Mikrocontroller so nicht direkt verwendbar) erklärt wird. "sprintf" bzw "snprintf" formatieren stattdessen Variablen im RAM, verwenden aber dazu dieselben Formatierungsparameter.
53  International / Deutsch / Re: "UNO" Bootloader im ATMEGA8 / 168 ??? on: April 10, 2014, 03:30:55 pm
Wo liegt das Problem?

Wahrscheinlich wolltest Du in der boards.txt statt:
Code:
optia8.build.variant=standard
eher schreiben
Code:
opti8.build.variant=standard
54  International / Deutsch / Re: HC-SR04 Sensor fehlt da was? on: April 10, 2014, 03:29:38 pm
Gibt es da Lösungsansätze zur Programmierung?

Kooperatives Multitasking mit der loop-Funktion als Scheduler.

Beispiel: in einer Schleife muss/will ich nur alle 10 Minuten was auslesen und eine Aktion ausführen. ZB. beim Temp-Sensor
in der anderen Schleife möchte ich 1 mal pro Std was ausführen z.B. PH messen usw usw.

irgendwie geht das aber bestimmt oder?

Die Arduino-Software startet automatisch einen Timer, der Dir einen mit der Funktion "millis()" auslesbaren Millisekundentakt bereitstellt. Davon abgeleitet kannst Du Dir natürlich auch eigene Funktionen basteln, die nur alle 10 Minuten laufen. Alle 10 Minuten wäre also 10 * 60 Sekunden * 1000 Millisekunden = 600000. Also mußt Du immer, wenn millis() um 600000 weitergezählt hat, einmal Deine Funktion laufen lassen.
55  International / Deutsch / Re: HC-SR04 Sensor fehlt da was? on: April 10, 2014, 02:42:27 pm
Wie muss ich mir das Abspeichern der Sketche auf dem Arduino vorstellen.
Haben da mehrere Sketche Platz?

Nein. Beim "Upload" wird immer der vorhandene Sketch gelöscht und der neue Sketch hochgeladen.

wieviel MG passen da drauf?

Was soll MG bedeuten? Megabytes?
Ein Arduino UNO hat 32 KB Flash-Speicher, also 0,032 MB.  Oder in Gigabytes ca. 0,000032 GB.

wenn ich einen Sketch nicht mehr brauche wie bring ich den wieder runter oder lösche diesen?

Der alte wird automatisch gelöscht, bevor der neue hochgeladen wird.
56  International / Deutsch / Re: HC-SR04 Sensor fehlt da was? on: April 10, 2014, 02:19:07 pm
Hier mal die neuen Bilder Vorder und Rückseite.

Das Layout Deiner Platine scheint etwas anders zu sein als bei dem Foto-Link, den ich gesendet hatte.

Aber trotzdem sollten sich beim angeschlossenen Schwingquarz zwei Kondensatoren befinden, auf dem von mir verlinkten Foto C6 und C7 direkt am Quarz angeschlossen und auf Deinem Foto C1 und (sieht aus wie) C5 in unmittelbarer Nähe. Dort sind auf Deinem Foto nur zwei leere Bestückungsplätze für die beiden Kondensatoren zu sehen.

Für mich sieht es auch auf der anderen Platinenseite unvollständig bestückt aus.
57  International / Deutsch / Re: Datalogger + WifiWebServer - Problem bei Client anfragen! on: April 10, 2014, 02:09:36 pm
Hätte jemand eine Idee wie so ein Problem codetechnisch zu lösen wäre? :-)

Was für ein Signal gibt der Windsensor?

Ist das ein Reedkontakt, der wie bei einem Fahrradtacho einmal pro Umdrehung einen kurzen Schließ-Impuls liefert?
58  International / Deutsch / Re: Umrechnung AnalogWert -> % on: April 10, 2014, 01:28:23 pm
vari = (100 - ((100 / 1023) * var));    // Zeile 13

Das ist eine Ganzzahlrechnung mit Integern und Ganzzahldivision.
Der Divisionsrest bei einer Ganzzahldivision fällt weg, d.h. (100 / 1023) ergibt stets Null!

Wenn das eine Gleitkommadivision werden soll, müßte entweder der Dividend oder der Divisor auch eine Gleitkommazahl sein, z.B.:
Code:
vari = (100 - ((100 / 1023.0) * var));    // Zeile 13
59  International / Deutsch / Re: HC-SR04 Sensor fehlt da was? on: April 10, 2014, 01:19:24 pm
Dein  Code funktioniert nicht.

Was soll das denn?

Der Code funktioniert!
Habe es gerade nochmal selbst getestet.
Der Code in Reply #32 funktioniert und auch der Code im Ausgangsposting mit dem überlangen Trigger-Impuls funktioniert mit dem HC-SR04.

Aber: Wenn auf der einen Seite der Platine ein Bauteil (der Schwingquarz) fehlt, könnte es natürlich sein, dass auf der anderen Seite der Platine auch ein oder mehrere Bauteile fehlen. Auf der Seite, die bisher nicht als Foto gezeigt wurde, sitzen ja noch viel mehr Bauteile.

Vielleicht auch mal kontrollieren, ob auf der anderen Platinenseite alle Bauteile bestückt sind:
http://www.robodino.de/wp-content/gallery/arduino-sensoren/img_6517.jpg
60  International / Deutsch / Re: LCD 14x2 Große Zahl, zb.: 4 -> über 2 Zeilen anzeigen on: April 10, 2014, 06:39:33 am
Hi , ich möchte gern auf einem 14x2 LCD Display große Zahlen anzeigen.  smiley-grin   Die Zahl sollte aus den beiden Zeilen erstellt werden, so das sie eine ganze ergibt. Geht das überhaupt?

Ungefähr so?


Auf einem nur 14 Zeichen schmalen LCD bringst Du dann aber nur drei Ziffern unter.
Pages: 1 2 3 [4] 5 6 ... 164