Pages: [1]   Go Down
Author Topic: come iniziare con arduino,wifi e android  (Read 2678 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 2227
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.


Logged

Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 141
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 148
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

intendo una lan wifi con tcp-ip
Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 148
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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();
    
  }
  
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

wow , grazie mille! smiley-grin
Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 148
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Pages: [1]   Go Up
Jump to: