Go Down

Topic: come iniziare con arduino,wifi e android (Read 3485 times) previous topic - next topic

zErO000cOOl

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!

pitusso

Ciao

Quote
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.



mancio

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?

zErO000cOOl

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

andrea86

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


andrea86

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



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. <a href="http://192.168.2.232/?11000">ON</a> ) può gestire una funzione

Code: [Select]
#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();
   
 }
 
}



andrea86

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?

Go Up