come iniziare con arduino,wifi e android

Salve a tutti ,
Aproffito di questo post per presentarmi. Programmo in c e java da molti anni e da un pò meno tempo programmo applicazioni per android NON con appinventor ma con eclipse etc... Sono sempre stato molto interessato anche all'elettronica ma sono solo agli inizi.

Ma veniamo al punto , vorrei creare un progetto con arduino mega adk,per implementarlo con un applicazione su android, e uno shield wifi questo dovrebbe catturare tutti i pacchetti e inviarli al cellulare . Vorrei sapere di preciso se qualcuno ha una mezza idea su come programmare la scheda arduino con lo shield e come dovrebbe ricevere i dati il cellulare.
Grazie a tutti in anticipo!

Ciao

vorrei creare un progetto con arduino mega adk,per implementarlo con un applicazione su android, e uno shield wifi questo dovrebbe catturare tutti i pacchetti e inviarli al cellulare . Vorrei sapere di preciso se qualcuno ha una mezza idea su come programmare la scheda arduino con lo shield e come dovrebbe ricevere i dati il cellulare.

innanzitutto se vuoi comunicare con Android via wifi, una MEGA ADK non ti serve. Ti basta una UNO o una MEGA.
Che pacchetti dovrebbe catturare, lo shield wifi?

Perchè il telefono possa ricevere i dati, deve esserci un servizio attivo e in ascolto su una determinata porta.
Viceversa potresti strutturare la tua app in modo che con una certa regolarità richiede tali info.

Io ho usato una wireless shield ufficiale e un modulo rn-xv della sparkfun..trovato molto bene..altrimenti usa i moduli zigbee..cosa devi farci? Devi mandare molti dati?

Vorrei crare una cosa simile a questa http://www.kismetwireless.net/kisbee/ solo che non so bene come programmare l' hardware e la parte su android

ciao, x wifi tu cosa intendi? una lan wifi su cui usare tcp/ip oppure wifi con altri protocolli come zigbee?

intendo una lan wifi con tcp-ip

be allora anche se l'arduino non è wifi ma è collegato ad un router con ap tu puoi raggiungerlo tramite wifi dal cellulare e poi raggiungere l'arduino collegato tramite cavo ethernet. quindi basta comprare una UNO + eth shield e poi ti basta usare delle richieste GET come http://iparduino/?comandixarduino e poi fai "stampare" dall'arduino la risposta che può essere in html oppure in JSON. credo che l'ultimo sia migliore visto che esistono parser JSON x qualunque linguaggio

cmq, ho postato nel forum un esempio di configurazione

andrea86:
Per impostare il termostato su ON e impostare la temperatura di 20°C: http://192.168.2.232/?11120
Per impostare il termostato su ON e non variare la temperatura: http://192.168.2.232/?11000
Per variare la temperatura a 15°C: http://192.168.2.232/?00115
Per avere lo stato del termostato non variare nulla: http://192.168.2.232 oppure http://192.168.2.232/?00000

Così facendo in un sito web anche un semplice link ( i.e. ON ) può gestire una funzione

#include <SPI.h>

#include <Ethernet.h>
#include <EEPROM.h>

#define relayPin 2    // il pin a cui è collegato il relay
#define sensorPin 0   // il pin a cui è collegato il sensore di temperatura
#define isteresi 2    // isteresi impostata per lo spegnimento caldaia
#define tMax 25      // temperatura massima impostabile
#define tMin 10      // temperatura minima impostabile
#define defMode 0     // default value: 0 summer / 1 winter

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xFF, 0x41 };
byte ip[] = { 192, 168, 2, 232 };
byte gateway[] = { 192, 168, 2, 1 };
byte subnet[] = { 255, 255, 255, 0 };

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

// { write modalità, modalità, write temp. impostata, decine impostata, unità impostata }
int buffer[6];
int tempMis; // contiene la temperatura ambientale
int tempImp; // contiene la temperatura voluta
int mode;

void setup()
{
 
 // start the Ethernet connection and the server:
 Ethernet.begin(mac, ip, gateway, subnet);
 server.begin();
 
 mode = EEPROM.read(0);  // legge da memoria se estate o inverno da indirizzo 0
 
 if (mode < 0 || mode > 1) // controllo dato salvato in memoria
 {
   
   mode = defMode;
   EEPROM.write(0, mode); // scrivo in memoria se estate o inverno su indirizzo 0 valore di default
   
 }
 
 tempImp = EEPROM.read(1); // legge da memoria il valore della temperatura voluta da indirizzo 1
 
 if (tempImp < tMin || tempImp > tMax) // controllo dato salvato in memoria
 {
   
   tempImp = tMin;
   EEPROM.write(1, tempImp);  // scrive in memoria il valore della temperatura voluta su indirizzo 1 valore di default
   
 }
 
 pinMode(relayPin, OUTPUT);
 
}

void loop()
{
         
 tempMis = (analogRead(sensorPin) * 500) / 1024; // legge dal sensore LM35 la temperatura ambientale
 
 if (tempMis < tempImp && mode == 1)
   
   digitalWrite(relayPin, HIGH);
 
 else if (tempMis >= tempImp + isteresi || mode == 0) // isteresi serve a ridurre le accensioni/spegnimenti della caldaia
 
   digitalWrite(relayPin, LOW);
 
 // listen for incoming clients
 EthernetClient client = server.available();
 
 if (client)
 {
   
   // an http request ends with a blank line
   boolean currentLineIsBlank = true; // ad ogni loop è inizializzata a "true"
   int x = 0; // ad ogni loop è inizializzata a 0 e serve per popolare l'array
   
   while (client.connected())
   {
     
     if (client.available())
     {
       
       char c = client.read();
       
       // if you've gotten to the end of the line (received a newline
       // character) and the line is blank, the http request has ended,
       // so you can send a reply
       
       if (x > 5 && x < 11) // i primi 5 caratteri sono: "GET/? " e il 10° carattere è l'ultimo da inserire nell'array
       
         buffer[x - 6] = int(c) - 48; // In ASCII "0" = 48 e "9" = 57 e poi si ricicla x riportandola a 0 + n' ciclo
         
       x++;
       
       if (c == '\n' && currentLineIsBlank)
       {
         
         // se deve essere variata la modalità
         if (buffer[0] == 1)
         {
           
           buffer[0] == 0; // resetto il write modalità
             
           if (buffer[1] >= 0 && buffer[1] <= 1)
           {
             
             mode = buffer[1];
             EEPROM.write(0, mode); // scrivo in memoria se estate o inverno su indirizzo 0
           
           }
             
         }
             
         // se deve essere variata la temperatura impostata
         if (buffer[2] == 1)
         {
           
           buffer[2] == 0; // resetto il write temp. impostata
           x = buffer[3] * 10 + buffer[4]; // riutilizzo cnt ora non più utilizzata
           if (x >= tMin && x <= tMax)
           {
             
             tempImp = x;
             EEPROM.write(1, tempImp);  // scrive in memoria il valore della temperatura voluta su indirizzo 1
             
           }
           
         }

// send a standard http response header
         client.println("HTTP/1.1 200 OK");
         client.println("Content-Type: text/html");
         client.println("Connnection: close");
         client.println();
         client.print("{"temp_r":"");
         client.print(tempMis);
         
         if (mode == 0)
         
           client.print("","mode":"off","temp_i":"");
           
         else
         
           client.print("","mode":"on","temp_i":"");
           
         client.print(tempImp);
         client.println(""}");

break;
         
       }
       
       if (c == '\n')
       {
         
         // you're starting a new line
         currentLineIsBlank = true;
         
       }
       
       else if (c != '\r')
       {
         
         // you've gotten a character on the current line
         currentLineIsBlank = false;
         
       }
       
     }
     
   }
   
   // give the web browser time to receive the data
   delay(1);
   // close the connection:
   client.stop();
   
 }
 
}

wow , grazie mille! :smiley:

tu sei in grado di far effettuare la richiesta restful verso l' arduino dall' applicazione in android? poi per la risposta userai un parser JSON? hai pensato alla sicurezza?