Database SQLite e Datalogger in Android

Nel post di oggi andremo ad analizzare nel dettaglio i passi da seguire ai fini di realizzare un DataBase SQLite in Android Studio. In particolare il DB da noi realizzato si occuperà di salvare ad intervalli di tempo regolari informazioni in merito a temperatura e tempo, che verranno poi utilizzati per la creazione di un grafico.
Ma andiamo con ordine, per prima cosa aprite un vostro progetto o createne uno nuovo e aggiungete al suo interno una nuova classe che estenda SQLiteOpenHelper come nell’esempio qua sotto

public class DatabaseHelper extends SQLiteOpenHelper { }

A questo punto il compilatore vi obbligherà ad inserire i metodi della classe SQLiteOpenHelper quali il costruttore, onCreate() e onUpgrade(). Il primo si occuperà di creare il DB fisico locale nonchè l’oggetto DatabaseHelper ( II° parametro vuole in ingresso il nome del DataBase ), il secondo si occuperà di creare la tabella all’interno del DB, mentre il terzo si occuperà di fare alcuni accorgimenti nel caso in cui venga modificato il DB fisico locale ( ma non lo tratteremo in questa guida ). La tabella di nome temperature_table che andremo a realizzare sarà composta da tre colonne:

ID Temperatura Tempo
1 23.285 1597753508
2 23.324 1597753510

Per realizzare il tutto a livello software:

private static final String DB_name = "DB_CHART.db";
private static final String TABLE_name = "temperature_table";
private static final String COL_1 = "ID";
private static final String COL_2 = "Temperature";
private static final String COL_3 = "Time";

public DatabaseHelper(@Nullable Context context) {
  super(context, DB_name, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
   String CreationQuery = "CREATE TABLE "+TABLE_name+" ( " +
    COL_1 + " INTEGER PRIMARY KEY AUTOINCREMENT," +
    COL_2 + " REAL," +
   COL_3 + " INTEGER )";
    db.execSQL(CreationQuery);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 db.execSQL("DROP TABLE IF EXISTS "+ TABLE_name);
    onCreate(db);
}

Inseriamo i metodi per la lettura, scrittura e cancellazione ( di tutti i dati all’interno della tabella con ripristino ID al valore iniziale, metodo utile solo in questo contesto ).

/**
 * Metodo per scrivere sulla table del Database
 * @param Temperature : temperatura ( double )
 * @param Time : tempo trascorso ( long integer ) - timestamp unix
 * @return true se l'operazione è andata a buon fine, false altrimenti
*/
public boolean saveNewRow(double Temperature, long Time){
    boolean getResult;
    //Ottengo il DB in modalità scrittura
SQLiteDatabase mioDB = this.getWritableDatabase();
//Creo una nuova mappa di valori, in cui i nomi delle colonne sono le chiavi
ContentValues cv = new ContentValues();
//nomeColonna / valore
cv.put("Temperature",Temperature);
cv.put("Time",Time);
//Eseguo l'inserimento nella tabella
try{
mioDB.insert(TABLE_name,null,cv);
getResult = true;
}catch(SQLException sqle){
//Caso in cui l'inserimento non è andato a buon fine
sqle.printStackTrace();
getResult = false;
}
//Chiudo il db ( aperto in modalità scrittura )
   mioDB.close();
    return getResult;
}

/**
* Metodo per ottenere tutti i dati presenti all'interno della tabella temperature_table
* ( anche se alla fine tengo conto solo delle colonne Time e Temperature )
* @return : DataPoint[]
*/
public DataPoint[] getAllData(){
//Ottengo il DB in modalità lettura
SQLiteDatabase mioDB = this.getReadableDatabase();
//Creo un oggetto Cursor per selezionare tutti i dati all'interno della tabella
Cursor mioCursor = mioDB.rawQuery("SELECT * FROM "+TABLE_name,null);
//Istanzio DataPoint di dimensione pari a mioCursore.getCount() ( ovvero pari al numero di
// righe )
DataPoint[] mieiDataPoint = new DataPoint[mioCursor.getCount()];
//Con questo ciclo creo i vari datapoint (x,y) e prendo min e max di entrambi gli assi
for(int i = 0; i < mioCursor.getCount(); i++){
mioCursor.moveToNext();
if (i == 0){
MinX = mioCursor.getInt(mioCursor.getColumnIndex("Time"));
MinY = mioCursor.getDouble(mioCursor.getColumnIndex("Temperature"));
}
if(i == (mioCursor.getCount()-1)){
MaxX = mioCursor.getInt(mioCursor.getColumnIndex("Time"));
MaxY = mioCursor.getDouble(mioCursor.getColumnIndex("Temperature"));
}
mieiDataPoint[i] = new DataPoint(mioCursor.getInt(mioCursor.getColumnIndex("Time")),mioCursor.getDouble(mioCursor.getColumnIndex("Temperature")));
}
//Chiudo il db ( aperto in modalità lettura )
mioDB.close();
return mieiDataPoint;
}

/**
 * Metodo per cancellare tutte le righe del database, riporta anche l'autoincrement ( ID ) al
 * valore iniziale
 */
public void eraseEverything(){
//Ottengo il DB in modalità scrittura
SQLiteDatabase mioDB = this.getWritableDatabase();
//Elimino tutte le righe
mioDB.execSQL("DELETE FROM "+TABLE_name);
//Ripristino ad 1 l'autoincrement ID
mioDB.execSQL("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='"+TABLE_name+"'");
//Chiudo il DB ( aperto in modalità scrittura )
mioDB.close();
}

Nel nostro caso con il metodo getAllData() estraiamo i dati e li passiamo ad un vettore di DataPoint[ ] in quanto il loro utilizzo è limitato solo alla creazione di un grafico, nulla vieta che i dati possano essere estratti e passati a variabili di altro tipo. Il consiglio è quello di non passare mai l’oggetto Cursor ( anche se l’applicativo funzionerebbe comunque ). Ricordarsi sempre di chiudere il DB ( aperto in modalità lettura/scrittura ).
Adesso non rimane altro che creare l’oggetto DatabaseHelper dove vi serve per avere accesso a tutti i metodi.

//Creazione oggetto mioDBHelper nell'onCreate() della main activity
mioDBHelper = new DatabaseHelper(this);

How to use Relay on Ltouch43

In our Ltouch43 Android HMI  there are 4 Relays and all the relays are in exchange contact. They have 24Vdc coil and max 5A contact current. All RELAY outputs are high quality relay and protected by varistors, all connectors are removable.

BMTouchGP12 – Relay R2

BMTouchGP13 – Relay R4

BMTouchGP14 – Relay R1

BMTouchGP15 – Relay R3

Before using them we must in the onCreate method :

instantiate the library BMtouch::

  • tmp = BMTouch.LIBsetup(BMTouch.EN12 + BMTouch.EN13 + BMTouch.EN14 + BMTouch.EN15);

Set PIN (GP–) as output, sets the pin (pin) indicated as output and sets its logical level as value::

    • val[0]= 0;
    • BMTouch.GPIOSetupOut(BMTouch.GP12, val[0]);
    • BMTouch.GPIOSetupOut(BMTouch.GP13, val[0]);
    • BMTouch.GPIOSetupOut(BMTouch.GP14, val[0]);
    • BMTouch.GPIOSetupOut(BMTouch.GP15, val[0]);

To switch the output by activating it or not, use this command::

    • tmp=BMTouch.GPIOWrite(BMTouch.GP13, val[0]);

where val [0] corresponds to:

  • 0 relay OFF
  • 1 relay ON

Websoket with server inside Android HMI Ltouch

In 2018 eight out of ten people have a smartphone, so it is a great achievement to share data acquired by our Android HMI Ltouch
(such as the measure of a temperature) over a wireless network and look at it with a web browser.

Let’s see how using an Ltouch 7, there are only 2 steps:

Step 1
Install an http server to provide the webpage with measures; in our tests we used Http Server by Tautvydas Andrikys, it is very interesting
because it can support php after the installation of Server for PHP by the same author. Once installed these apks, tap “server address and port” to set
an http port ,default is 8000, you can change but do not use privileged ports (ports below 1024 , see for example ), then choose ip address 0.0.0.0 to answer on each ip assigned to the Ltouch.

Enable php support:

CGI setting -> enable com.esminis.server.php (Server for PHP)

Finally enable start on boot.

Copy webpage index2.html to /mnt/sdcard/htdocs/public :
adb push index2.html /mnt/sdcard/htdocs/public
Copy configuration files for php server php.ini to /mnt/sdcard/www/config :
adb push index2.html /mnt/sdcard/www/config
Copy configuration files for http server: certificate.cert / certificate.key / httpd.conf to: /mnt/sdcard/htdocs/config
adb push certificate.cert /mnt/sdcard/htdocs/config
adb push certificate.key /mnt/sdcard/htdocs/config
adb push http.conf /mnt/sdcard/htdocs/config

Reboot touch.

However you can use any http server.
Enable hotspot in the settings of Ltouch: settings -> more -> portable hotspot , here we can setup wifi parameters : network name and
password, then tap on portable hotspot to enable it

Step 2
install the apk available in the download area; it’s a simple app which uses modbus library by Biemme to read the measure of a temperature
provided by an external device and connected to the rs485 port of the touch

Now using your pc or smartphone, you can connect to the wifi network just created: open a browser and type http://192.168.43.1:8000/index2.html
in the address bar, note that you must use the port set in the http server in the address, we are using 8000, if you set another value use that
instead of 8000.

Moreover, the duo webpage/application allow us to handle input/output pins handled by Android kernel on the side of Ltouch, the ones provided
by expansion boards are handled with modbus calls and are excluded.

Source codes are available in our download area

Libreria Android IO per BieMme Pltouch

In uno dei nostri articoli precedenti, abbiamo presentato il Pltouch, un touch screen HMI basato su Android con uno speciale set di I/O direttamente indirizzabili dal codice Java. 

In questo articolo, vi vogliamo presentare quali sono i principi di funzionamento della libreria Pltouch, libreria fornita gratuitamente con ogni Pltouch. Questa libreria Android si pone come ponte tra il mondo Android e quello più a basso livello dell’I/O.

Entrando più in dettaglio, dopo aver importato la libreria nel workspace di Eclipse ci sono due modalità con cui il codice del progetto principale può essere strutturato. In entrambi i casi, bisogna:

  • Creare un’istanza della libreria I/O
  • Memorizzare questo riferimento per esempio in un campo privato/pubblico dell’activity Android
  • Inizializzazare la libreria fornendo i parametri necessari

Ora prendiamo in rassegna ogni singolo punto e lo analizziamo attraverso dei semplici esempi.

Continue reading

Automazione Industriale con Android: un’introduzione al Pltouch

Pltouch processors schemaI progetti di automazione industriale e domotica utilizzano un ampio spettro di prodotti, come per esempio sensori, pannelli touch screen, moduli esterni, PLC, moduli HMI per risolvere problemi specifici e gestire vincoli stringenti in termini di affidabilità e precisione. Il panorama attuale mostra una netta distinzione tra i componenti che gestiscono la logica e quelli che si preoccupano dell’interfaccia utente, molto spesso utilizzando un bus comune per la comunicazione e l’aggionamento di stato. 

Sulla base di questo stato dell’arte, il nostro research and development lab, ha creato e sviluppato un nuovo prodotto con l’intento di unire alcuni dei prodotti di cui sopra, con il fine di ridurre la complessità finale, proporre un’interfaccia utente avanzata ma soprattuto diminuire il costo. 

Continue reading

Automazione Industriale con Android: Acquisizione di 6 sonde pt100

Il video che vi vogliamo presentare in questo post riguarda un esempio di Automazione Industriale con Android. In particolare, vi faremo vedere un progetto che abbiamo realizzato in cui un touch HMI AndroidLtouch F, equipaggiato di un microprocessore Cortex A8 a 1Ghz controlla un’espansione RS485 analogica, nello specifico ho usato un modulo espansione bm6PTI.

Dall’interfaccia touch screen Android è possibile:

Acquisire distintamente 6 sonde di temperatura mod. PT100 classe B attraverso un’ espansione in RS485 utilizzando una comunicazione modbus ad una velocità di 19200 bps

Volendo è possibile estendere l’applicazione aggiungendo altri moduli di espansione fino ad un totale di 250 bm6PTI con un’ acquisizione di 1500 sonde di temperatura.

Continue reading

Automazione Industriale Sviluppi Futuri

Industrial Automation remote I/O module

C’è un forte dibattito in merito alla fattibilità di utilizzare Android in installazioni industriali. Le grandi aziende che si contendono il mercato molto spesso costringono i propri clienti ad utilizzare software proprietario.

Il mondo sta cambiando ed Internet è uno dei fattori che permette agli utenti di beneficiare della disponibilità pressochè infinita di informazioni, specifiche tecniche ed anche di persone che gratuitamente condividono la propria esperienza.

La nostra visione è che a breve, sempre più applicazioni industriali beneficeranno dei suggerimenti e sforzi di communità on line e questo sarà la base per una nuova idea di automazione.

In questo post, vi mosterò come l’integrazione di Android in progetti industriali è possibile, e di facile realizzazione.

Continue reading

Comunicazione Android Arduino via Modbus TCP

Arduino ethernet modbus tcp

Il progetto che vi voglio parlare in questo post riguarda la comunicazione tra Arduino e Android attraverso Modbus TCP.

Questo articolo appartiene ad un gruppo di post step-by-step che hanno come scopo fondamentale quello di comprendere:

  1. Come Arduino comunica con device Android (smartphone, tablet, multi touch devices) non solamente attraverso USB
  2. La semplicità con cui sia Arduino che Android possano utilizzare il protocollo modbus per comunicare tra di loro
  3. Come due implementazioni leggermente differenti del modbus, cioè il modbus TCP ed il modbus RTU, possono essere utilizzati per le applicazioni industriali e di domotica

Se sei interessato alla comunicazione modbus su rs

Il mio consiglio è di leggere l’articolo che vi spiega come far comunicare Android con qualche altro dispositivo che supporti modbus RTU (per es. PLC) attraverso RS485, se il vostro progetto richiede esplicitamente questa caratteristica.
Continue reading

Touch android

Ltouch touch screen boardAbbiamo realizzato un sistema di controllo che utilizza un nuovo pannello touch screen con sistema operativo Android (foto di destra). Quest’ultimo si interfaccia, attraverso rs485 ad una serie di slave Arduino. Dai nostri test, il protocollo modbus è risultato il più affidabile e leggero per comunicare con device Arduino. Inoltre, sono stati impiegati chip max485 al fine di convertire il segnale seriale TTL dell’Arduino in 485. La resistenza di terminazione da 120 Ohm è stata utilizzata al fine di limitare il rumore nel canale di comunicazione. Continue reading