Show Posts
Pages: 1 ... 60 61 [62] 63 64 ... 95
916  International / Deutsch / Re: Char - String Operationen on: July 17, 2012, 12:37:35 pm
Jetzt hab ich nur noch ein Problem: Wie krieg ich aus 'hour' und 'minute' so etwas: "hh:mm"
Der einfachste Weg wäre, das erste Komma gleich durch ein ":" zu ersetzen, dann ist

char* &buffer[0] (was übrigens dann das gleiche ist wie einfach nur buffer die Uhrzeit im Format "hh:mm".

Mario.
917  International / Deutsch / Re: Server Client als Kombination nutzen on: July 17, 2012, 12:22:01 pm
Irgendwie kommt mir ein Teil vom Code bekannt vor  smiley

Dein Problem ist, das Du die Variable "client" global definierst und zweimal parallel verwendest, denn innerhalb der Funktion die als Webserver Daten empfängt rufts Du die Funktion dbQuery() auf. Dort wird zusätzlich das Ethernetshield nochmal initialisiert, was sicher bei schon bestehenden Verbindungen keine gute Idee ist. Als Fausregel gilt -> Initialisierungen gehören in die setup() Funktion, nicht in die loop() (seltene Ausnahmen sicher ausgenommen). Innerhalb von dbQuery() wird dann client.connect(serverName, 80) aufgerufen und damit die Verbdindung die client bereits aus webInput() hat überschrieben.
Ich würde hier zumindest schon mal mit 2 verschiedenen Variablen arbeiten. 
918  International / Deutsch / Re: Arduino aus dem Internet erreichen on: July 17, 2012, 12:14:14 pm
Am Ende ist sowas immer eine Kostenfrage. Zum Einen in der Anschaffung und zum Anderen bei den laufenden Kosten (Strom). Bei beidem liegt der Raspberry super im Rennen, denn für 35 Euro eine Linuxbüchse (wenn auch eine kleine) die kaum Strom braucht ist kaum zu schlagen. Aber auch bei einem eigenen Server sollte man wissen was man macht, wenn man nach außen Dienste exportiert. Alles was von außen erreichbar ist, ist potentiell gefährdet. Also sind hier regelmäßige Updates und eine gute Konfig Pflicht.

@Voralpenkreuz:
Die Variante, das der Arduino aktiv mit einem externen Webserver kommuniziert geht natürlich auch. Allerdings hat man, je nach Auslastung des Arduino und wie oft er Zeit für einen Webrequest hat (plus den Aufwand den man für DNS, timeouts, Fehlertolleranz etc. treiben muss), immer einen zeitlichen Versatz zwischen Befehl auf der Weboberfläche anklicken und der Reaktion des Arduino. Es ging ja darum, den Arduino von außen zu steuern.
Wer einen guten Router hat, kann aber beider kombinieren. Portforwarding von public-IP des Routers nach innen auf den Arduino. Firewall des Routers blockt alle Anfragen auf diesem Port außer von der IP des Webservers. Bei shared Hostern ist das zwar nicht 100%ig, schränkt aber die Zahl der möglichen "Täter" massiv ein :-)
Leider können sowas nicht alle Router, die Fritzbox z.B. nicht (zumindest meine 7270 nicht). Mein Vigor Router könnte das z.B.
 
919  International / Deutsch / Re: Arduino One das richtige für mich? on: July 17, 2012, 10:48:26 am
ja, war ein vertipper. ist aber *100# glaub ich, nicht *101#
920  International / Deutsch / Re: Arduino One das richtige für mich? on: July 17, 2012, 09:59:53 am
Hmm, falscher Ansatz würde ich sagen.

1) Loop läuft immer, nicht nur einmal. Sonst müßtest Du ja nach jeder Meldung einen Reset machen.

Am besten verwendest Du die serielle Schnittstelle (Pin 0 und 1) oder die Soft-Serial Bibliothek (zwei beliebige Pins).
Auf der fragst Du innerhalb der IMMER laufenden loop(), ob neue Zeichen vorhanden sind.

Wenn ja, werden die solange in einen Puffer gelesen, bis die ganze Message gelesen wurde (wie das End-Of-Message erkannt wird, muss sicher noch erforscht werden).
Wenn die Message vollständig ist, wird in einem "Unterprogrammteil" einfach die Liste der Telefonnummern abgeklappert und der Text als SMS verschickt.
Wenn man damit fertig ist, wird wieder "normal" in die loop() verzweigt und das Spielchen geht von vorn los.

Kleines Gimmick, per GSM-Code "*110#" den aktuellen Status der Aufladung der SIM-Karte überwachen (z.B. nach jeder Versandaktion) und bei einem erreichten minimal-Guthaben eine SMS zum Aufladen schicken.

Da das GSM-Shield auch SMS empfangen kann, sollte es einfach sein, neue Telefonnummern zu ergänzen oder alte zu löschen, das muss nur in eine SMS codiert und an das Shield geschickt werden.
921  International / Deutsch / Re: Arduino aus dem Internet erreichen on: July 17, 2012, 09:52:56 am
Was da zwischen Arduino und Internat hängt, ist ja im Prinzip egal. Wie das Kind am Ende heisst auch. Wichtig ist eine zwischengeschaltete Kontrollinstanz, welche für die nötige Sicherheit sorgt. Wie das konkret umgesetzt wird, ist vom Projekt abhängig. Es kann ein Webserver sein z.b. inkl. einer schicken HTML-Steueroberfläche, kann aber auch nur ein einfacher Dienst sein, der als "Durchlauferhitzer" fungiert.

Das es keinen freien dynamich DNS Anbieter mehr geben soll, wundert mich auch ein wenig. Das wäre ja fast mal ein eigenes Projekt wert :-)
922  International / Deutsch / Re: AT89C2051-24PU mithilfe von Arduino programmieren? on: July 17, 2012, 08:44:29 am
Ich befürchte, das wird nicht so einfach funktionieren. Dein Problem ist, das die "normalen" Atmel Chips über ISP (In-System-Programmierung) mit Programmen versorgt werden (Außer beim Bootloader, dann wird seriell auf UART0 übertragen). Das unterstützt der AT89C2051-24PU aber nicht. Außerdem erfolgt die Prorammierung laut Datenblatt mit 12V (min 11,5V - max 12,5V), was zusätzliche externe Komponenten erforderlich macht.
Ich befürchte (allerdings ohne es genau zu wissen), das selbst der OP-Code ein anderer als bei den Atmel ATMega oder ATTinys ist. Hier müßte man sich mal den avr-gcc anschauen, ober der für den Controller HEX-Files erzeugen kann. Aber selbst wenn das geht, fehlt immer noch ein einfacher Weg, die Daten auch den Chip zu bekommen.
Alles in Allem ein sehr großer Aufwand. Ein ATTINY44 oder 84 (14 Pins) oder ATTINY45 oder 85 (8 Pins) kostet zwischen 2 und 3 Euro, selbst ein 328er mit Bootloader kostet ca. 4 bis 5 Euro. Diese Käfer kannst Du direkt über den Arduino programmieren was die Kosten drastisch reduziert.
923  International / Deutsch / Re: Arduino aus dem Internet erreichen on: July 17, 2012, 07:03:25 am
dyndns ist immer noch kostenlos, falls Du keinen der Premiumservices nutzt. Für ein einfaches DNS kostet das nix.
Ich würde aber trotzdem dringend davon abraten, den Arduino direkt aus dem Internet zugänglich zu machen.
Es gibt aufgrund der limitierten Rechenleistung keinerlei Sicherheitsmechanismen. Der i.d.R. verbaute WizNET 5100 Ethernet Chip kann glaub ich maximal 2 parallele Netzwerkverbindungen verarbeiten. Alles was darüber hinaus geht, kann ungewollte Seiteneffekte haben.
Ich weiss ja nicht, was Du da schaltest, aber ich vermute mal es gibt keine Authentifizierung oder einen Passwortschutz. Jeder der Deine öffentliche IP kennt, hat damit Zugriff auf den Arduino. Auch wenn Du die IP keinem sagst, es gibt genug Spambots, die nihcts anderes machen als ganze Netze abzugrasen auf der Suche nach offenen Ports. Da bei solchen Scans auch immer Daten geschickt werden, bekommt Dein Arduino wahllos irgendwelche Bytes geschickt.
Bist Du 100%ig sicher, das Dein Projekt gegen alle falsch gesendeten Daten abgesichert ist?
Im schlimmsten Fall schalten Dir irgendwelche Leute das Licht an- und aus, steuerst Du aber z.B. die Heizung von Aquarium oder Deinem Pool, kann das schnell größere Folgen haben (Stromkosten, gekochte Fische, etc.).
Auch wenn es Dein Projekt drastisch vergrößert, ich würde immer einen Server vor den Arduino hängen, der den Zugriff regelt. Hier kannst Du dann mit Paswortabfragen, HTTPS und was weiss ich nicht alles das Projekt sicher machen. Der Webserver selbst redet dann per lokalem Netzwerk mit dem Arduino. Schau Dir mal das Projekt von Cetax an: Hier haben wir sowas detailliert besprochen. http://arduino.cc/forum/index.php/topic,102817.0.html

INTERNET <-----> | Router | <----> Webserver  <----> Arduino

Edit: Ein solcher Server könnte z.B. der Raspberry Pi sein, da läuft ein "normales" Linux drauf und für wenig Last sollte die Performance auf alle Fälle reichen. Außerdem kann die Kist per USB mit Strom versorgt werden und ist entsprechend sparsam. Mit etwas Geschick kann man sich sogar den Arduino-Ethernet oder das Ethernet-Shield sparen, wenn man Raspberry und Arduino über eine serielle Schnittstelle miteinander reden läßt.
924  International / Deutsch / Re: Char - String Operationen on: July 17, 2012, 03:56:39 am
atoi() und atof() kommen aus den Lib-C (bzw. aus dem Pendant für die AVRs: http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html).
C-Strings müssen Null-Terminiert sein, also der Wert "0" (nicht das Zeichen '0' markieren das Ende eines Strings. Im Prinzip ist ein C-String ja nur ein array of char.

Durch das Ersetzen der "," durch  '\0' (also den Wert 0) "zerstückelst Du Deinen C-String (char-array) in einzelne Häppchen, die Du dann den Funktionen übergeben kannst. Aus

"12,34,01234,777.88" wird dann "12\034\001234\0777.88"
Der Zugriff erfolgt dann jeweils über einen Pointer auf das erste Zeichen des jeweiligen Teilstrings:
Code:
char buffer[19] = "12\034\001234\0777.88";

char* hour = &buffer[0];
char* minute = &buffer[3];
char* intvalue = &buffer[6];
char* floatvalue = &buffer[11];


Etwas komplizierter wird es, wenn die Kommas an unterschiedlichen Stellen auftauchen, also die Teilstrings unterschiedliche Längen haben können.

Ich weiss ja nicht, wie Du die Daten aus der Ethernetschnittstelle einliest, aber vielleicht kann man das ja schon beim Lesen parsen und in passende Variablen speichern.

925  International / Deutsch / Re: Char - String Operationen on: July 17, 2012, 01:39:23 am
Ob Du nun char oder byte einliest, macht keinen Unterschied. Die Daten bleiben ja trotzdem die gleichen.

Schau Dir mal die Funktionen atoi() und atof() an, die wandeln Strings in Integer und Float um. Wenn der String immer gleich groß ist, also die Trenner (,) immer an der gleichen Stelle sind, könntest Du Dir jeweils den Anfang (erstes Zeichen) des Integer und des Float merken, die "," jeweils durch '\0' ersetzen und dann atoi() und atof() jeweils mit den Zeigern auf die Anfangszeichen füttern.
Mario.
926  International / Deutsch / Re: Solved! RTC mit UDP-NTP synchronisieren on: July 16, 2012, 11:42:11 pm
Schön, das es geklappt hat. Als kleine Fingerübung wäre es klasse, das in eine oder zwei Funktionen zu packen, die man dann einfach in andere Projekte übernehmen kann.
Mario.
927  International / Deutsch / Re: nette Anfängerfrage on: July 16, 2012, 11:26:42 pm
Dein Problem ist, das client.println() nicht so funktioniert, wie ein "printf()". (siehe auch http://arduino.cc/en/Reference/ClientPrintln)
Du musst erst den vollständigen String erzeugen und den dann mit client.println() ausgeben.
Beispiel:

Code:

int pin = 13;
int statuslevel = 1;

char buffer[50]; //muss gross genug sein für den kompletten String inkl. der Integerwerte als String

//umwandeln
sprintf(buffer,"GET /datei.php?pin=%d&status=%d HTTP/1.0",pin,statuslevel);

client.println(buffer);
928  International / Deutsch / Re: Char - String Operationen on: July 16, 2012, 09:34:25 pm
Dazu erstmal eine Frage. Wie werden die Daten gesendet?
Also tatsächlich als String, oder als tatsächliche Werte?
Gemeint ist folgendes: (Beispiel Uhrzeit)
1) Es werden die Zeichen  '1' '2' ',' '3' '4' gesendet, das wären dann die Byte-Werte 49,50,44,51,52
2) Es werden die Bytewerte gesendet, also 1,2,',',3,4

Dein  Beispiel mit dem Integer legt nahe, das Du die einzelnen Ziffern als jeweiligen Byte-Wert, nicht als Zeichen sendest, sonst würde nämlich bei input[6]*10000 + input[7]*1000 + input[8]*100 + input[9]*10 + input[10]*1 Blödsinn rauskommen. Dann wäre es bei der Uhrzeit aber auch (char(input[0]+49) + char(input[1]+49) + ":" + char(input[3]+49) + char(input[4]+49)).
Mario.
929  International / Deutsch / Re: Pins abfragen on: July 15, 2012, 06:37:59 am
Um die ursprüngliche Frage zu beantworten. Ja, man kann den Wert eines als OUTPUT deklarierten Pins, das mittels digitalWrite() gesetzt wurde auch wieder mittels digitalRead() bestimmen.
Letztendlich steht ein HIGH oder LOW für ein bestimmtes Pin immer im gleichen Register, egal ob es als Input oder Output verwendet wird. Entscheidend ist nur, das bei einem Eingang der Wert am Eingang der Wert des Bits bestimmt und bei einem Ausgang der Wert des Bits den Wert am Ausgang.
930  International / Deutsch / Re: RTC mit UDP-NTP synchronisieren on: July 14, 2012, 02:21:56 am
So ganz verstehe ich Dein Programm nicht. Das Datum setzt Du hart kodiert im Sketch und nur die Uhrzeit wird mit der NTP Zeit gesetzt. Nachdem Du die NTP-Zeit geholt hast, wartest Du eine Sekunde, ehe Du die Zeit der RTC setzt. Damit geht doch Deine Uhr automatisch schon mal eine Sekunde nach. Außerdem machst Du es Dir ziemlich kompliziert. Du bekommst Doch per NTP schon die Zeit in Sekunden seit 1900. Theroretisch brauchst Du da nur noch "100" Jahre drauf rechnen und hast die Zeit im time2000-Format mit dem Du die RTC simple setzen kannst.
Mario.
Pages: 1 ... 60 61 [62] 63 64 ... 95