Go Down

Topic: Qualcuno programma in android? (Read 2733 times) previous topic - next topic

andrea86

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?


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

critical

Ciao andrea86

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.

andrea86

#3
Apr 25, 2012, 11:45 am Last Edit: Apr 25, 2012, 11:59 am by andrea86 Reason: 1
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 :P

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

Testato

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH


pablos



x iscrizione


a cosa?


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

ciao
no comment

lesto

i programmi scritti in processing (latop PC) sono facilmente portabili in android (leggi: in automatico).
java rulez
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

andrea86


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

Testato

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

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

bigjohnson

#10
Apr 25, 2012, 10:48 pm Last Edit: Apr 26, 2012, 12:27 pm by bigjohnson Reason: 1
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

supergiox

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

pablos

#12
Apr 26, 2012, 11:27 am Last Edit: Apr 26, 2012, 11:36 am by pablos Reason: 1

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 :)
ciao
no comment

supergiox

#13
Apr 26, 2012, 07:49 pm Last Edit: Apr 26, 2012, 07:54 pm by supergiox Reason: 1
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...

andrea86

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  :smiley-roll:
alla fine tutto questo per me è solo un passatempo e arduino con la facilità x reperirlo e renderlo minimamente operativo è il massimo :D

Go Up