Qualcuno programma in android?

Ciao, il tutto nasce da una idea malsana di farsi un termostato ip... e questo è fatto e funziona. Il problema è che vorrei fare una applicazione per comandare questo termostato. Solo che non so proprio da dove iniziare con la parte dell' applicazione android... c' è qualcuno che può darmi una mano?

Il principio di funzionamento è che la parte "intelligente" è su arduino e poi tramite diversi "strumenti" si può andare a variare il funzionamento dell' arduino. Per raggiungere la massima flessibilità ho pensato che i comandi utente -> arduino devono essere richieste HTTP di tipo GET composte da una sequenza di caratteri ( non si fa uso di stringhe, ma si usano i singoli byte per byte! ed è possibile con una singola richiesta GET di qualche carattere fare più operazioni contemporaneamente ). Invece, sempre in una ottica di massima flessibilità, la risposta è codificata con JSON. Così la risposta in JSON può essere usata dall' applicazione per informare l' utente di cosa sta accadendo ( ho visto che ci sono parser JSON per tutti i linguaggi di programmazione ) ma può anche essere usata da un possibile sito PHP per popolare un possibile DB, etc...

So che può sembrare molto simile ad un progetto di un altro utente ( che è fatto molto bene e già pronto all' uso ) ma la logica di funzionamento è diversa. L' applicazione lanciata dal cellulare è solo uno dei modi per interagire con arduino, allo stesso tempo si può usare il sito web o la stessa app ma da un altro cellulare. Il tutto sta nel creare una richiesta del tipo "http://ip_arduino/?abcdef" e per come è stato programmato arduino, con "abcdef" si possono impartire 3 comandi diversi con una sola richiesta GET ( cosa che con il normale confronto di stringhe è più difficile ). Invece, per la sola interrogazione dello stato di arduino, basta inviare "http://ip_arduino" e già con questo ti viene inviato il JSON di risposta.

La parte in C che deve girare sull' arduino è stata scritta anche in una versione che utilizza il protocollo UDP per comunicare con l' utente. Il vantaggio è nella maggiore rapidità di interazione e nel minore traffico di rete ( tipo la parte per l' instaurazione del TCP e poi il pacchetto per ogni singolo carattere di tutta la richiesta HTTP... ) però poi l' utilizzo di un sito web come metodo alternativo alla app non è più possibile...

A qualcuno interessa come cosa e può darmi una mano con la app in android?

L'idea è interessante ma non ho capito se tu vuoi imparare a programmare android o cerchi qualcuno che scriva questa app.
Nel primo caso posso aiutarti o almeno provarci...

Ciao andrea86

supergiox:
L'idea è interessante ma non ho capito se tu vuoi imparare a programmare android o cerchi qualcuno che scriva questa app.
Nel primo caso posso aiutarti o almeno provarci...

Anch'io come supergiox posso aiutarti.

Io preferirei imparare qualcosina ( almeno un domani posso fare altre app che mi potrebbero servire ), però mi mancano proprio le basi per fare una applicazione del genere... qualcuno non è che ha tipo uno sketch ( se si usano anche in android ) da cui prendere spunto?

Posto il codice, magari può essere utile a qualcuno, se notate qualche errore però ditemelo :stuck_out_tongue:

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

x iscrizione

Testato:
x iscrizione

a cosa?

andrea86:

Testato:
x iscrizione

a cosa?

Niente voleva dire che e' iscritto al partito della Lega :smiley: :smiley: :smiley: :smiley: :smiley:
Per iscrizione, significa che segue il treadh e che è interessato :slight_smile:

ciao

i programmi scritti in processing (latop PC) sono facilmente portabili in android (leggi: in automatico).
java rulez

lesto:
i programmi scritti in processing (latop PC) sono facilmente portabili in android (leggi: in automatico).
java rulez

sarà perché di java nn ne so nulla, ma non capisco... nn è che hai un esempio?

alla fine penso che l' applicazione appena lanciata deve:

  1. creare un tot di variabili char
  2. fare la richiesta http
  3. con la risposta fare il parser e popolare le variabili del punto 1
  4. visualizzare lo stato dell' arduino con label, slider e bottoni
  5. se l' utente ha voglia può modificare qualche slider o bottone
  6. inviare una seconda richiesta http, stavolta passandogli qualcosa
  7. si ritorna al punto 3 e così via...

processing e' il miglior compagno di arduino
anche io ho iniziato con rpocessing, ed ora sto' proprio lavorando su questo per il mio attuale progetto,
la cosa interessante e che appunto ti sputa fuori in un click l'applicazione windows,windows64bit,linux,linux64,android
quindi l'applicazione dovrebbe funzionare dappertutto

Ciao,
da quello che ho capito vuoi fare un applicazione arduiniana che funzioni su android, ma non è detto che devi realizzarla con i sistemi di sviluppo per android, basta fare una paginetta http da visualizzare sul browser di android tipo questa
http://www.arifidenza.it/forum/topic.asp?TOPIC_ID=179563
Se ti può servire ti segnalo le prove che avevo fatto con javascript json html
http://arduino.cc/forum/index.php/topic,76032.60.html circa a metà pagina jsonduino, tuta la parte più complessa viene eseguita dal browser, arduino invia solo una volta la pagina html e poi aggiorna i dati in json.
Se poi vuoi veramente scrivere l'applicazione nativa per android, che possa acedere a tutti i sensori e device del telefono, ti consiglio http://www.appinventor.mit.edu/ che ha un approccio alla programmazione tipo mattoncini lego.
La possibilità successiva in ordine di complessità, è usare processing, io non l'ho mai fatto, ma è sicuramente più semplice di java.
Io ho provato a programmare android con eclipse e sdk, il setup non è molto complesso, ma poi per fare applicazioni decenti bisogna leggere tanta roba ed è sicuramente essenziale sapere programmare bene in java.
Per brevità non ho inserito la possibilità di fare programmi android con framework mobili multi piattaforma, ce ne sono un baziliardo, e scegliere quello "giusto" è già un impresa.

Alberto

Le modifiche al post sono in rosso

Mettiamo le cose in chiaro... spesso come ha detto bigjohnson conviene utilizzare una pagina web su arduino e creare un'interfaccia mobile per android o in generale per uno smarphone con un browser.
E' un'ottima soluzione nel caso in cui si devono inviare comandi da android ad arduino e/o monitorare ad esempio i dati ricevuti da dei sensori.

Per sfruttare però a pieno le potenzialità di uno smartphone android bisogna programmare nel suo linguaggio nativo, cioè java (con l'sdk android).
Per farti un esempio potresti voler utilizzare l'accelerometro per regolare la posizione di un servo o la velocità di un motore DC, oppure potresti fare in modo che quando un sensore su Arduino rileva una determinata condizione (di luce, di temperatura, ecc...) lo smartphone invia un sms, o avvia una registrazione o chi più ne ha più ne metta...

In tutto questo c'è processing che è un buon compromesso tra i due perchè è più potente della web app ed è più intuitivo e versatile dell'app android.
Devi capire cosa vuoi/vorrai fare per decidere quale delle 3 strade prendere

bigjohnson:
Ciao,
da quello che ho capito vuoi fare un applicazione arduiniana che funzioni su android, ma non è detto che devi realizzarla con i sistemi di sviluppo per android, basta fare una paginetta http da visualizzare sul browser di android tipo questa
http://www.arifidenza.it/forum/topic.asp?TOPIC_ID=179563
Se ti può servire ti segnalo le prove che avevo fatto con javascript json html
http://arduino.cc/forum/index.php/topic,76032.60.html circa a metà pagina jsonduino, tuta la parte più complessa viene eseguita dal browser, arduino invia solo una volta la pagina html e poi aggiorna i dati in json.
Se poi vuoi veramente scrivere l'applicazione nativa per android ti consiglio http://www.appinventor.mit.edu/ che ha un approccio alla programmazione tipo mattoncini lego.
Io ho provato a programmare android con eclipse e sdk, il setup non è molto complesso, ma poi per fare applicazioni decenti bisogna leggere tanta roba ed è sicuramente essenziale sapere programmare bene in java.

Alberto

+1 pienamente d'accordo

Aggiungo come detto in altri post, che il programmare android ti limita solo a questo tipo di smatphone, mentre una pagina html può essere aperta con qualsiasi pc fisso, notebook, palmari, smartphone...... e con quasi tutti i browser.
Dopo che hai lavorato 2-3 mesi a fare la tua applicazione bellissima ti dirò: Fantastica!!! Sono disposto anche a pagartela bene, ma può funzionare sul mio iphone?
a te la risposta :slight_smile:
ciao

Dimenticavo AppInventor. E' senz'altro il modo più semplice e veloce per programmare Android, è gratuito e rispetto alla WebApp ti garantisce il controllo dei sensori. Ovviamente non ha le stesse potenzialità del linguaggio nativo, e non mi piace la personalizzazione dell'interfaccia grafica... è molto limitata e ad esempio non puoi posizionare liberamente un elemento. Inoltre ho notato che i file apk generati occupano più spazio di quelli "nativi".. Per un programma anche molto piccolo si supera il megabyte, ma questo è un problema secondario...
Lo ritengo comunque un ottimo strumento e i possessori di uno smartphone Android dovrebbero ritenersi fortunati ad averlo.
Esiste un'alternativa compatibile anche con iPhone, Illumination Software Creator, ma è a Shareware e sinceramente non l'ho mai provato...

devo ammettere che all' inzio c' era un paginetta web, ma poi era troppo limitata in fruibilità e in uscita non potevo fornire un JSON pulito ma un intero sito web ( e così si suppone che ci sia un utente in carne/ossa dall' altra parte ). poi sono passato ad una specie di webapp per avere tipo gli slider x impostare la temperatura, subito abbandonata per questioni di spazio ( vorrei evitare di usare la SD x mantenere il codice snello x eventuali implementazioni ). ma soprattutto il limite del sitarello web è che si può gestire un arduino alla volta, mentre un app per assurdo può puntare a diversi arduini

poi è arrivata una app in IOS ( il cell personale è un iphone3 e quello del lavoro è android ), fa abbastanza schifo da vedere e ha qualche casino, ma funziona. il problema è stato android che mi risulta praticamente ostile :~ e java l' ho sempre trovato strano...

il fatto è che le idee sono tante e il tempo libero poco, sono un po' indeciso se imbarcarmi in android :roll_eyes:
alla fine tutto questo per me è solo un passatempo e arduino con la facilità x reperirlo e renderlo minimamente operativo è il massimo :smiley:

il fatto è che le idee sono tante e il tempo libero poco, sono un po' indeciso se imbarcarmi in android smiley-roll
alla fine tutto questo per me è solo un passatempo e arduino con la facilità x reperirlo e renderlo minimamente operativo è il massimo

E' il mio stesso pensiero, d'accordissimo con te, ma se posso fare un appunto, arduino è un oggettino molto valido e una buona idea per dare lo start a molti amatori, ma ritengo che un 16Mhz che pilota degli shield siano troppo pochi per gestire sd, webserver e quindi un flusso semi importante di dati. Oggi anche una semplice paginetta un po' elegante è a livello software piuttosto pesantuccia ci vuole velocità e memoria che mancano. C'è da dire che qualsiasi cosa tu voglia fare con arduino trovi tutto e questo ne fa il suo punto di forza amatoriale e soprattutto economico per chi lo ha immesso sul mercato, ma ci sono altre piattaforme molto più potenti e scarsamente documentate. Non ci mettere su il cuore, rischi di costruire un bellissimo castello e poi quando devi fare la strada per raggiungerlo ti accorgi che puoi solo fare un sentiero.

ciao

pablos il tuo discorso è verissimo. a scuola anni fa abbiamo usato un pic della texas e mi ricordo che non c'erano problemi di memoria od altro, e costava un decimo, meno di 1 euro. Però ti dovevi comprare il programmatore, ti dovevi sbattere anche solo per accenderlo e non aveva un mega sito come quello di arduino.

è un po' come la cosa della programmazione in IOS e android. da una parte hai la massima flessibilità e tanti strumenti, dall'altra parte è mamma apple ad importi praticamente quasi tutto, però anche solo dai loro esempi ti puoi fare la tua applicazione!!