Show Posts
Pages: 1 ... 70 71 [72] 73 74 ... 94
1066  International / Deutsch / Re: Arduino GSM shield http Get Verbindung on: April 20, 2012, 11:52:55 am
Das ist in der Tat ein seltsames Verhalten.
Ich hatte mir folgende Lib heruntergeladen:
http://code.google.com/p/gsm-shield-arduino/downloads/detail?name=GSM_Shield_GPRS_Ver_3_08_%28IDE100%29.zip&can=2&q=
Das ist Version 3.08 für die IDE 1.0 vom 15.03.2012. Also ziemlich aktuell.
Evtl. probierst Du es mal mit der.
1067  International / Deutsch / Re: Temperatur Logger, mit DS18B20... Brauche Hilfe bitte... on: April 20, 2012, 07:36:01 am
Ok, ich hab mir den Code gerade nochmal angesehen. Welcher Teil ist von Dir und was ist von dem Beispiel das Du gefunden hast? Denn es gibt bereits zwei Funktionen zum Sensor-Lesen und Daten-Senden. Allerdings verwenden die noch einen analogen Sensor und schicken einen Key mit im Request, vermutlich zur Authentifizierung beim PHP-Script.
Wie in einem anderen Thread schon geschrieben, finde ich es ungünstig, fremden Code 1:1 zu übernehmen und auf die eigenen Bedürfnisse anzupassen. Lieber eigenen Code schreiben und einzelne Teile oder Funktionen aus anderem Code übernehmen. Das ist strukturierter und übersichtlicher.
Wenn es nicht auf Anhieb klappt, dann zerlege die Aufgabe in einzelne Teilaufgaben, die Du unabhängig voneinander löst.

z.B.
1) HTTP-Request an ein PHP-Script auf dem NAS schicken. Dazu einfach zwei fixe Werte in loop() einmal pro Minute an das Script schicken und dort auswerten.
2) Wenn 1 funktioniert, dann Deinen Code zum Auslesen der Temperaturen (am besten als eigene Funktion) in den Code mit einbauen. Dann die bisher fixen Werte durch die gemessene Temperatur ersetzen und wieder mit dem PHP-Script verarbeiten
3) Ergänzen weiterer Funktionen die Du noch haben willst.

Btw. ich habe keine zusätzliche Wetterstation, der Arduino IST die Wetterstation :-)
Mario.
1068  International / Deutsch / Re: Temperatur Logger, mit DS18B20... Brauche Hilfe bitte... on: April 20, 2012, 07:20:19 am
Code:
client.println("GET http://192.168.178.111/senddata.php?temp1=10.3&temp2=23) HTTP/1.0");
stimmt schon fast.

Code:
client.print("GET /senddata.php?temp1=");
client.print(temp1);
client.print("&temp2=");
client.print(temp2);
client.print(" HTTP/1.0\n");
client.println("Host: 192.168.178.111\n");
Ist richtig. Du gibts hinter dem GET nur den relativen Pfad an. Solltest Du für den Webservice einen Domainnamen verwenden und nicht nur die IP, dann musst Du den Parameter "Host:" anpassen. Akutell sollte es aber erstmal so gehen.
Das obige Beispiel geht davon aus, das Du zwei Variablen temp1 und temp2 hast, welche die gemessene Temperatur as float enthalten.
Du brauchst dann auf dem NAS ein PHP-Script das unter http://192.168.178.111/senddata.php aufrufbar ist. In diesem Script hast Du dann zwei Werte im globalen Array $_GET[] für temp1 und temp2, die Du dann z.B. in eine Datei schreiben kannst. Idealerweise ergänzt um den aktuellen Timestamp.

Allerdings ist Dei Code noch durcheinander. Das Senden an den Server soll ja regelmäßig passieren, also muss das in die loop(). Dafür muss der Server-Kram aus der loop() raus, da Du den nicht mehr brauchst. Am einfachsten definierst Du Dir eine Funktion sendHTTP(float temp1, float temp2) die den HTTP-Request kapselt, dann wird Dein Programm übersichtlicher.
1069  International / Deutsch / Re: Lesetipp: c't - Arduino im AVR-Studio programmieren on: April 20, 2012, 02:44:01 am
Das macht die Datei "main.cpp" welche die IDE mitbringt:
Code:
#include <Arduino.h>

int main(void)
{
        init();

#if defined(USBCON)
        USB.attach();
#endif

        setup();

        for (;;) {
                loop();
                if (serialEventRun) serialEventRun();
        }

        return 0;
}
Die kapselt das eigentliche main() und einige spezielle Setup-Geschichten.
1070  International / Deutsch / Re: Temperatur Logger, mit DS18B20... Brauche Hilfe bitte... on: April 20, 2012, 02:28:24 am
Dafür ist ja die SD-Karte da, dort werden die Daten lokal gespeichert. Der Zugriff selbst kann auch wieder indirekt erfolgen. z.B. durch aufrufen eine URL http://<synologyIP>/service.php
Das kann der Arduino regelmäßig pollen und dort stehen z.B. Befehle wie
"send 2012-04-19.csv" drin. Damit kann der Arduino in einer "Messpause" die Datei von der SD-Karte per HTTP-Post an den Webserver hochladen.
Das kann man sicher auch alles anders lösen. Es gibt immer verschiedene Wege zum Ziel. Bei meiner Lösung war mir wichtig, das der Arduino Wetterdaten sammelt und nicht die meiste Zeit damit verbringt auf einen HTTP-Request zu warten, oder von einem Request im ungünsitgen Zeitraum erwischt wird.
1071  International / Deutsch / Re: VirtualWire on: April 19, 2012, 11:29:56 pm
Aber das ist genau der Punkt. Du überträgst ein struct von einem System auf ein anderes. Die Wahrscheinlichkeit, das Du auf dem 2. System das gleiche Speicherlayout hast und damit der Pointer aus dem struct auf Deine eigene Memory-Page zeigt ist verschwindend gering. Somit hättest Du gute Chancen, das der Speicherschutz zuschlägt, sobald Du den String aus dem struct verwenden willst.
Beim Arduino gibt es keine Pages, der Speicher wird linear adressiert. Dazu kommt, das bei den meisten µControllern eine Harvard-Architektur eingesetzt wird, also getrennter Programm und Datenspeicher. Beim Arduino / Atmel ist das Flash-Ram für den Code und SRAM für die Daten. Moderne PCs setzen auf die von Neumann-Architektur, bei der Programm und Daten in einem gemeinsamen Speicher liegen. Somit kann man sich durch falsche Pointer auf dem Arduino zumindest nicht den eigenen Programmcode zerstören.
1072  International / Deutsch / Re: Temperatur Logger, mit DS18B20... Brauche Hilfe bitte... on: April 19, 2012, 11:23:14 pm
Dann mach doch aus dem Arduino einen Webclient, keinen Webserver.
Der Arduino misst die Temperatur und ruft auf Deinem Webserver eine URL (z.B. http://<synology-IP>/senddata.php?temp1=10.3&temp2=23) auf. Der Synology-Webserver kann auch PHP, Du kannst dort also ohne Probleme die Daten verarbeiten und in eine Datei schreiben. Außerdem sparst Du Dir so den Cronjob auf dem NAS das alle X Minuten den Arduino abfragt. Meine Arduino-Wetterstation funktioniert auf diese Weise sehr stabil seit einem halben Jahr. Ich habe mir sogar die RTC gespart und frage einmal täglich über eine spezielle URL von Webserver die Zeit ab. Das spart den Code für eine NTP-Funktion, denn ein HTTP-Get musste ich ja eh bauen.
Ein weiterer Vorteil ist, das der Arduino den Zeitpunkt zum Senden der Daten bestimmen kann und nicht immer auf ankommende Requests warten muss.
1073  International / Deutsch / Re: Temperatur Logger, mit DS18B20... Brauche Hilfe bitte... on: April 19, 2012, 02:04:56 pm
Ja, der Code wäre sicher hilfreich. Aber bitte in "#" Tags. Evtl. auch als Anhang, denn ich vermute mal das ist nicht wenig :-)
Evtl. kann man ja das eine oder andere optimieren, damit der Webservice auch noch mit dazu passt.
1074  International / Deutsch / Re: Arduino GSM shield http Get Verbindung on: April 19, 2012, 02:00:08 pm
Ich habe mir gerade mal den Code der aktuellen Version der GSM-Lib angesehen. Beim httpGet() wird der "Host:" Parameter mitgesendet. Welche Version der Lib setzt Du ein? Evtl. fehlt das ja bei Deiner Version.
1075  International / Deutsch / Re: Arduino GSM shield http Get Verbindung on: April 19, 2012, 01:49:03 pm
Mehrere Sachen in Deinem Code fallen mir auf.

1.) Du definierst ein Array char msg[20], übergibst aber beim Aufruf "numdata=inet.httpGET("www.google.de", 80, "/", msg, 50);" eine Puffergröße von 50 Bytes, statt der 20 Bytes des Arrays. Damit überschreibt die Funktion alle 30 Bytes hinter dem Array im Speicher. Das kann zu sehr spannenden Ergebnissen führen.

2.) Die Ausgabe der empfangenen Zeichen ist deutlich mehr als 50 Zeichen, von welchem Code werden die denn ausgegeben?

3.) Warum sollte das Programm mit DNS nicht klar kommen? Du bekommst eine Antwort vom Google-Webserver, also klappt DNS doch, sonst würde gar nix zurück kommen. Die Antwort ist ein HTTP 302 Redirect auf http://www.google.de. Das passiert z.B.  auch wenn man einen HTTP-Request per telnet simuliert:
Quote
telnet www.google.de 80
Trying 209.85.147.94...
Connected to www-cctld.l.google.com.
Escape character is '^]'.
GET /   HTTP/1.0

HTTP/1.0 302 Found
Location: http://www.google.de/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=be4d6a2fb8e1fc75:FF=0:TM=1334861125:LM=1334861125:S=lkBvT9ZrB0NjYAxk; expires=Sat, 19-Apr-2014 18:45:25 GMT; path=/; domain=.google.com
Set-Cookie: NID=58=to_a07wmRSi1obtjhkconKlD46PR7rgfSwy1T4kgZVbztkFfyPWgozoACZ1fvEh5GzrZ9s8sBewpmsbGGK5PcV6RQp8Cowl-C6y4aQao16a6CdLXU_DTxlaLjBbIz3hc; expires=Fri, 19-Oct-2012 18:45:25 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Date: Thu, 19 Apr 2012 18:45:25 GMT
Server: gws
Content-Length: 218
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.de/">here</A>.
</BODY></HTML>
Das passiert deshalb, weil beim HTTP-Request der Parameter "Host: www.google.de" nicht mitgesendet wird. Damit anwortet Google mit dem Redirect. Was bei Deinem Beispiel fehlt ist ein Teil vom HTTP-Header, da bei Dir nach 20 Zeichen Schluss ist. Mach mal den msg[] Puffer deutlich größer und übergib bei inet.httpGET() die Größe die der Puffer hat.
Mario.
1076  International / Deutsch / Re: Arduino GSM shield http Get Verbindung on: April 19, 2012, 01:29:22 pm
Ich hab den Code mal in die passenden Tags gepackt, sonst kann das ja keiner lesen.
Code:
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"

InetGSM inet;

char msg[20];
int numdata;
char inSerial[50];
int i=0;
boolean started=false;

void setup()
{
  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;
  }
  else Serial.println("\nstatus=IDLE");
 
  if(started){
    //GPRS attach, put in order APN, username and password.
    //If no needed auth let them blank.
    if (gsm.attachGPRS("internet.eplus.de", "eplus", "internet"))
      Serial.println("status=ATTACHED");
    else Serial.println("status=ERROR");
    delay(1000);
   
    //Read IP address.
    gsm.SimpleWrite("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is empty.
    gsm.WhileSimpleRead();
 
    //TCP Client GET, send a GET request to the server and save the reply.
    numdata=inet.httpGET("www.google.de", 80, "/", msg, 50);
    //Print the results.
    Serial.println("\nNumber of data received:");
    Serial.println(numdata);
    Serial.println("\nData received:");
    Serial.println(msg);
  }
};

void loop()
{
  //Read for new byte on serial hardware,
  //and write them on NewSoftSerial.
  serialhwread();
  //Read for new byte on NewSoftSerial.
  serialswread();
};

void serialhwread(){
  i=0;
  if (Serial.available() > 0){           
    while (Serial.available() > 0) {
      inSerial=(Serial.read());
      delay(10);
      i++;     
    }
   
    inSerial='\0';
    if(!strcmp(inSerial,"/END")){
      Serial.println("_");
      inSerial[0]=0x1a;
      inSerial[1]='\0';
      gsm.SimpleWrite(inSerial);
    }
    //Send a saved AT command using serial port.
    if(!strcmp(inSerial,"TEST")){
      gsm.SendATCmdWaitResp("ATE0", 500, 50, "OK", 5);
             
      Serial.println("SIGNAL QUALITY");
      gsm.SimpleWrite("AT+CSQ");

    }
   
    //Read last message saved.
    if(!strcmp(inSerial,"MSG")){
      Serial.println(msg);
    }
   
    else{
      Serial.println(inSerial);
      gsm.SimpleWrite(inSerial);
    }   
   
    inSerial[0]='\0';
  }
}

void serialswread(){
  gsm.SimpleRead();
}
1077  International / Deutsch / Re: VirtualWire on: April 19, 2012, 01:06:48 pm
Quote
und da auch bei modernen Betriebssystemen normalerweise malloc nicht direkt den Speicher vom Betriebssystem anfordert, sondern seine eigene Speicherverwaltung implementiert, ist das auch dort nicht unbedingt gewährleistet.
Das bezweifle ich aber mal ganz stark. Das wäre ja das Sicherheitsloch, um als normales Programm auf den Speicher anderer Prozesse zugreifen zu können. Für den "Schutz" des Speichers sorgt die libc, soweit ich weiss.
Schaut man sich z.B. unter Linux den Ablauf des folgenden simplen Programms an, sieht man z.B. die "mprotect()" Aufrufe:
Code:
#include <stdlib.h>
#define MEMSIZE 102400
void main(int argc, char** argv) {
    void* pdata = malloc(MEMSIZE);
}

Quote
strace ./memtest
execve("./memtest", ["./memtest"], [/* 14 vars */]) = 0
brk(0)                                  = 0x8758000
uname({sys="Linux", node="c473s06", ...}) = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f2000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=20200, ...}) = 0
mmap2(NULL, 20200, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb76ed000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220o\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1442372, ...}) = 0
mmap2(NULL, 1448456, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb758b000
mmap2(0xb76e7000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15c) = 0xb76e7000
mmap2(0xb76ea000, 10760, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb76ea000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb758a000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb758a6c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
open("/dev/urandom", O_RDONLY)          = 3
read(3, "\23\341\276", 3)               = 3
close(3)                                = 0
mprotect(0xb76e7000, 8192, PROT_READ)   = 0
mprotect(0x8049000, 4096, PROT_READ)    = 0
mprotect(0xb7710000, 4096, PROT_READ)   = 0
munmap(0xb76ed000, 20200)               = 0
brk(0)                                  = 0x8758000
brk(0x8792000)                          = 0x8792000
exit_group(141918216)                   = ?
1078  International / Deutsch / Re: VirtualWire on: April 19, 2012, 11:38:05 am
Aber du hast ja schon schön vorgemacht, wie man Strings als char[] mit fester Länge speichern kann - das sollte eigentlich ausreichen.
Das ist richtig, aber ein "char* text" ist auch in einem struct schnell geschrieben, weil man das halt immer so macht. Dann später den Fehler zu finden ist um so schwerer. Zumal es beim Arduino kein Memoryprotection gibt und der Zeiger auf dem empfangenden Arduino zwar in die Wüste zeigt, aber durchaus gültig ist.
Mario.
1079  International / Deutsch / Re: Arduino GSM shield http Get Verbindung on: April 19, 2012, 07:14:52 am
Dann poste doch mal das Programm, dann sehen wie weiter.
1080  International / Deutsch / Re: Arduino GSM shield http Get Verbindung on: April 19, 2012, 12:20:44 am
Poste doch mal Dein Programm, das macht es etwas leichter Dein Problem zu analysieren.
Ist das evtl. ein DNS Problem? Versuchmal einfach auf eine IP-Adresse, statt eines Domainnamens zuzugreifen. Evtl. klappt ja nur die Namensauflösung nicht.
Also statt auf "http://google.de" mal nur auf "http://173.194.69.94" zugreifen. Evtl. klappt das ja schon.
Mario.
Pages: 1 ... 70 71 [72] 73 74 ... 94