Show Posts
Pages: 1 ... 62 63 [64] 65 66 ... 95
946  International / Deutsch / Re: DS1337 RTC Batterie Backup (Solved) on: July 03, 2012, 06:45:19 am
Wieso betreibst Du die RTC eigentlich mit einem 16MHz Quarz? Eigentlich sind das doch 32,xx kHz?
947  International / Deutsch / Re: Gibt es ein LDR Matrix on: July 02, 2012, 12:31:22 pm
Also, unter der Annahme das das Kreuz rechtwinklich ist, ist es egal ob das Ziel quadratisch oder "nur" ein Rechteck ist. Auch wenn das Kreuz verdreht ist, macht das nix da es immer nur eine Drehung um den Mittelpunkt ist. Der Rest ist einfache Geometrie, bzw. simple Realschulmathematik. Aus den jeweils gegenüberliegenden zwei Punkten bekommst Du die "Steigung" beider lienarer Funktionen. Der Rest ist die einfache Berechnung des Schnittpunktes beider Geraden. Wenn das Kreuz nicht gedreht ist, ist es noch einfacher. Dann geben die Randpunkte (je zwei sind ja dann identisch) gleich die Koordinate an.

50ms sind wie Du schon schreibst eine 20stel Sekunde und das bekommt man als Fotograf nicht mehr aus der Hand geschossen, bzw. können das nur wenige. Bis zu einer 60stel geht wohl noch so. Da man aber vom ungünstigsten Fall ausgehen muss, würde ich eher 10ms als sinnvoll ansehen.

Mario.
948  International / Deutsch / Re: Gibt es ein LDR Matrix on: July 02, 2012, 08:39:46 am
Das Problem das ich beim multiplexen sehe ist, das die "Beschussdauer" länger sein muss, als ein kompletter Durchlauf durch alle Zeilen und Spalten. Je länger der Beschuss aber dauert, desto größer ist die Gefahr das durch das natürliche Zittern/Wackeln des Schützen wieder mehrere Stellen getroffen werden können.
Das typische Problem aller Fotografen, bei welcher Belichtungszeit man noch unverwackelte Bilder hinbekommt.

Eine weitere Idee wäre die Verwendung einer Laserdiode, die keinen Punkt, sondern ein Kreuz liefert (gibts bei Ebay für wenige Euro aus China). Dann braucht man keine gefüllte Matrix mehr, sondern nur noch den äußeren Rand. Wird ein Punkt innerhalb der Matrix getroffen, bekommt man 4 Punkte am Rand (auf jeder Seite einen), aus denen man recht einfach die Koordinate des Mittelpunktes (Schnittpunkt) berechnen kann. Man braucht aber für eine 10x10 Matrix keine 100, sondern nur 40 (bzw. eigentlich nur 36) Fototransistoren, ohne an Genauigkeit zu verlieren.
949  International / Deutsch / Re: Gibt es ein LDR Matrix on: July 02, 2012, 08:02:13 am
Wenn es um eine Zielscheibe geht, wo nur die Entfernung zur Mitte, aber nicht die genaue Trefferposition benötigt wird, ginge das vermutlich sogar ohne multiplexen.
Man baut die Zielscheibe in der Mitte z.b. mit 4 Fototransistoren, die alle auf dem gleichen digitalen Eingang liegen, egal welcher Transistor getroffen wird, er setzt den Eingang auf HIGH.
Das gleiche macht man mit X Fototransistoren die als Ring um die Mitte angeordnet sind, die wieder gemeinsam auf einen zweiten digitalen Eingang geschaltet werden. Jenachdem wieviele Ringe man baut, braucht man mehr oder weniger Pins. Wählt man diese noch so geschickt aus, das z.B. die 8 verwendeten Pins (1x Mitte plus 7 Ringe) auf einem der Input-Ports liegen, muss man nur ein Byte einlesen und kann anhand des Wertes (0,1,2,4,8,16,..,128) sofort erkennen ob und wenn ja welcher Ring getroffen wurde.

Wird die genaue Trefferposition benötigt, dann muss man vermutlich eine Matrix bauen. Also z.b. 10 x 10 Fototransistoren die man dann aber nicht mehr direkt abfragen kann, da man keine 100 Eingänge hat. Das Prinzip ist aber das Gleiche wie bei diversen X x Y Tasten-Matrix Tutorials: http://arduino.cc/playground/Main/KeypadTutorial
Wenn man es geschickt anstellt, bekommt man mit 8 Bit (8 digitalen Pins / 4x Reihe und 4 x Spalte) eine 16*16 Matrix ausgelesen. Das wären dann 256 Fototransistoren und schon eine recht ordentliche Zielscheibe.
950  International / Deutsch / Re: array mit variablen on: July 01, 2012, 07:12:15 am
Vor den voids bedeutet vermutlich vor der Definition von "void setup()" und "void loop()".
951  International / Deutsch / Re: array mit variablen on: July 01, 2012, 06:22:29 am
die Werte m[0][0] etc. verändern sich im Laufe einer Stunde. Also es sind nicht die gleichen Werte.
Was meinst du mit kopieren? Mach ich das nicht indirekt indem ich irgendwo im code m[0][0] = 12345 definiere?
Nein, machst Du nicht. Bei der Zuweisung der Daten in Dein Array PWMchannel[][] werden die aktuellen Werte aus m[][] und s[] an die Stellen kopiert. Der Wert existiert dann zwei Mal im Speicher. Einmal an der Stelle wo z.B. das Array s[] ihn speichert und einmal an der Stelle wo das Array PWMchannel[][] ihn speichert. Änderst Du nun einen der Werte, hat das keinen Einfluss auf den anderen Wert.

Mit Kopieren meine ich folgendes. Du definierst Dir eine Funktion "void fillPWMchannel()" der Du die beiden aktuellen Arrays s[] und m[][] übergibst (am besten als Zeiger oder Referenz, wegen des Speicherverbrauchs) und das dann Deine bisher "statische" Zuweisung entsprechend ausführt und die Werte von s[] und m[][] an die passenden Stellen von PWMchannel[][] schreibt.
952  International / Deutsch / Re: array mit variablen on: July 01, 2012, 12:19:23 am
Sind denn die Werte von m[0][0] oder ss[0] schon vorher definiert? Dann sollten auch in PWMchannel[][] die gleichen Werte drin stehen.
Falls Du aber willst, das m[0][0] oder ss[0] in der Definition von PWMchannel[][] quasi Verweise auf Werte sind, die an einer anderen Stelle definiert sind, funktioniert das so nicht.

Du hast zwei Möglichkeiten. Entweder Du verwendest im Array PWMchannel[][] Zeiger die auf die tatsächlichen Werte zeigen, dann musst Du aber anders auf die Werte zugreifen (Stichwort dereferenzieren), oder Du kopierst die Werte bei jeder Änderung im Deinen Arrays m[][] und s[] auch gleichzeitig wieder an die passende Stelle in PWMchannel[][].
Mario.
953  International / Deutsch / Re: RTC - gemerkte Zeit anzeigen on: July 01, 2012, 12:13:53 am
Warum verwendest Du nicht die anderen Membervariablen, die in der Referenz beschrieben sind?
Code:
  //Wochentage
  const char* dayofweek["So","Mo","Di","Mi","Do","Fr","Sa"];

  //erstmal die aktuelle Zeit aus der DS1337 lesen
  RTC.getTime();

  // das Jahr ausgeben
  Serial.println(RTC.year, DEC);
  // den Monat ausgeben
  Serial.println(RTC.month, DEC);
  // den Tag ausgeben
  Serial.println(RTC.day, DEC);

  //Stunde
  Serial.println(RTC.hour, DEC);

  //Minute
  Serial.println(RTC.minute, DEC);

  //Sekunde
  Serial.println(RTC.second, DEC);

  //Tag der Woche
  Serial.println(dayofweek[RTC.dow]);

954  International / Deutsch / Re: Arduino<->Webserver-Kommunikation? on: June 30, 2012, 04:38:10 am
Wenn es aufs Timing ankommt, stimme ich die zu. Da eine TLC-Kette eh einen Bitstream erwartet, kann man die auch gleich passend übertragen. Ich denke aber, das es bei eine Poolsteuerung nicht auf die Millisekunde ankommt. :-)
Es gilt halt immer das KISS-Prinzip. Je einfacher man die Sache strickt, desto besser versteht man auch noch nach einem halben Jahr was man da gebaut hat. Dazu kommt, das man ggf. eine solche Lösung für andere Projekte wiederverwenden kann.
Mario.
955  International / Deutsch / Re: Arduino<->Webserver-Kommunikation? on: June 30, 2012, 04:18:01 am
Schau Dir mal folgenden Thread an, da hat Cetax mit ein wenig Hilfe etwas vergleichabres gebaut, was recht gut funktioniert. In einzelne Bits würde ich die Argumente gar nicht zerlegen, das vergrößert den Aufwand auf beiden Seiten (PHP und Ardunio) nur und mit steigender Komplexität steigt auch die Fehlerrate beim Umsetzen. Argumente als Bytes zu senden macht sich aber recht einfach und die Verarbeitung auf dem Arduino ist sogar einfacher als das Zerlegen von Strings.

http://arduino.cc/forum/index.php/topic,102817.0.html

Mario.
956  International / Deutsch / Re: Ausgang per Uhrzeit/Datum schalten on: June 27, 2012, 01:49:21 pm
Keine Panik, das war auch wirklich nur als Scherz gemeint.
Und Unwissenheit nervt nicht. Wenn jemand etwas nicht weiss, ist das erstmal nicht schlimm. Schlimm ist es erst, wenn sich jemand weigert etwas zu lernen.

Zerleg am besten erstmal die aktuelle Aufgabe wieder in Teilaufgaben, dann wird es überschaubarer.

Mario.
957  International / Deutsch / Re: Ausgang per Uhrzeit/Datum schalten on: June 27, 2012, 12:11:25 pm
Ich dachte schon Du hast genug von meinen "ständigen Nörgelein" an Deinem Code  smiley-mr-green

OK, im Ernst. An diversen Stellen steht immer noch das "NUMTIMER" statt des aktuell zu testenden timers.
Den Block den ich "moniert" habe einfach nur an eine andere Stelle zu kopieren reicht leider auch nicht.

Der ehemalige millis() Teil der durch die einzelnen Timer geht und prüft, was gemacht werden muss, der muss umgebaut werden.
Die Schleife die durch die einzelnen Timer wandert bleibt erhalten, denn Du willst ja trotzdem alle Timer prüfen. Theoretisch kannst Du sogar das millis() lassen. Damit wird ja auch jede Sekunde geprüft. Da Du ja die Zeiten auf Minuten Genauigkeit verwendest, ist das völlig ausreichend. Innerhalb der Schleife musst Du nur noch die einzelnen Werte der Timer vergleichen und entweder den Ausgang ein- oder ausschalten.

-------------

Ergänzung / Verbesserung:

Wenn Du das PHP-Script die Schaltzeiten (ein- und aus) berechnen läßt und gleich als time2000 Wert übergibst, brauchst Du nur noch zwei Arrays timeron[NUMTIMER] und timeroff[NUMTIMER]. (long)(now.timer2000 / 60) sind dann die Minuten seit 01.01.2000. Damit reduzierst Du die Genauigkeit des Vergleichswert auf Minuten. Auch die Wert timeron[xx] muss dann beim Vergleich durch 60 geteilt werden. Sollte mal durch welche Gründe auch immer der millis() Vergleich nicht gleich in der ersten Sekunde eine neuen Minute erfolgen (z.B. durch timeout beim lauschen auf der netzwerkverbindung), dann verpasst Dein Sketch nicht die Schaltzeit.
958  International / Deutsch / Re: dtostrf() hängt mir immer ein A an den String an on: June 26, 2012, 12:33:27 am
Was passiert denn, wenn Du direkt den StrBuffer per Serial.println() ausgibst?
959  International / Deutsch / Re: Ausgang per Uhrzeit/Datum schalten on: June 25, 2012, 11:33:17 pm
Code:
     pumpday[NUMTIMER] = client.read();      // Wochentag
     pumphour[NUMTIMER] = client.read();     // Uhrzeit Stunde
     pumpminute[NUMTIMER] = client.read();   // Uhrzeit Minuten
     timerlength[TI] = client.read();        // zeit für ventil öffnung
Der Code sieht schon mal seltsam aus. Das "NUMTIMER" sollte eigentlich ein "TI" sein an der Stelle. Du willst ja das übergebene Datum für den aktuellen Timer speichern.

Code:
// Start Ventil   RTC.dow
  if (int (RTC.dow) == pumpday[NUMTIMER] && int(RTC.hour) == pumphour[NUMTIMER] && int(RTC.minute) == pumpminute[NUMTIMER] && int(RTC.second) == pumpsecond)
  {
    digitalWrite(timerpin[TI],pinvalue);
    timenow = RTC.time2000;
  }
 
  // Stop Ventil
  if (RTC.time2000 - timenow == timerlength[NUMTIMER])
  {
    digitalWrite(timerpin[TI], LOW);
  }
Dieser Code steht an der falschen Stelle im Programm, denn dort wo es steht würde es nur dann ausgeführt, wenn gerade das Kommando "T" gesendet wird. Dieser allgemeine Teil muss den Teil im Programm ersetzen / ergänzen, wo vorher mit Hilfe von millis() die Zeit bestimmt wurde, um ein Ventil zu schalten. Durch die RTC hast Du ja jetzt ständig eine aktuelle Zeit und kannst auf das "millis()"-Gerechne verzichten.

Zum PHP Teil. Dort stehen doch Kommentare. Damit ist klar, in welcher Reihenfolge Du die einzelnen Parameter übergibst. Die zusätzlichen Parameter werden einfach, wie Du es schon getan hast, hinten an die Übertragung angehängt. Wenn Du im PHP-Code (bzw. im HTML-Formular) die Uhrzeit "zerlegst", kannst Du eine select-Box mit der Stunde machen (0-23) und eine select-Box mit den Minuten (0,15,30,45) oder (0,5,10,15...). Beide Parameter übergibst Du als separate Werte in der Sende-Funktion. Entsprechende einzelne Variablen hast Du ja auf der Arduinoseite schon. (pumphour, pumpminute). Du kannst z.B. zusätzlich noch aus der Schaltdauer und der Einschaltzeit noch die Ausschaltzeit berechnen und als zusätzliche Werte mit übergeben, das macht es dann auf der Arduinoseite leichter. (Also 6 Arrays pumpday_on[NUMTIMER],pumphour_on[NUMTIMER],pumpminute_on[NUMTIMER],pumpday_off[NUMTIMER],pumphour_off[NUMTIMER],pumpminute_off[NUMTIMER]) Damit kann dann das Ein- und Ausschalten auch über die Tagesgrenze gehen.

Was Du auf alle Fälle anpassen musst ist die Auswertung im Sketch. Ich würde am Anfang der Loop immer erstmal die aktuelle Zeit holen. Danach dann schauen ob die Einschaltzeit für ein Ventil gekommen ist und das Ventil noch nicht geöffnet ist. Wenn ja, wird der Ausgang geschaltet. Danach wird geprüft ob bei irgendeinem Timer die Ausschaltzeit gekommen ist und das Ventil noch offen ist, wenn ja wird wieder abgeschaltet. Das sollte es eigentlich schon sein.

Du solltest in Deinem Sketch evtl. noch Funktionen bauen, die bei Änderungen an den Timern deren Werte in den EEPROM schreiben und beim Starten daraus lesen. Somit kann dem Arduino zwischendrin auch mal der Strom ausgehen, ohne das danach alle eingestellten Zeiten weg sind.

Mario.

 
960  International / Deutsch / Re: POE vom Ethernet-Shield funktioniert nicht? on: June 24, 2012, 06:46:35 am
Es gibt sogenannte POE Injectoren, mit denen man einen "normalen" Ethernet-Anschluss im POE erweitern kann. Gibts bei Amazon ab 18 Euro für einen einzelnen Port. Damit kann dann ein POE fähiges Geräte über ein bis zu 100m langes Ethernetkabel mit Daten und Strom versorgt werden.
Mario.
Pages: 1 ... 62 63 [64] 65 66 ... 95