2017-09-23 10 views
2

Actuellement, je développe un prototype de dispositif de surveillance de la qualité de l'air en utilisant Arduino. L'appareil intégré avec trois capteurs de gaz qui enverra les données sur le module Bluetooth HC-05 à mon application Android. Je suis en mesure de recevoir les valeurs en temps réel et de l'afficher en utilisant textview mais je n'ai aucune idée de devoir enregistrer les données dans l'appareil Android lui-même en utilisant la base de données SQL. J'ai essayé tous les didacticiels que j'ai trouvés ailleurs, mais il enregistre seulement les données sur un clic, mais même en essayant la méthode buttonclick, l'application plante (à la place, je veux enregistrer les données en continu, chaque fois que l'application démarre). Je suis très nouveau pour le développement Android, s'il vous plaît aidez-moi.Comment enregistrer les données reçues de la carte Arduino dans Android en utilisant la base de données SQL?

Actuellement, je dois enregistrer (date/heure, coordonnées GPS, données du capteur1, données du capteur2, données du capteur3, qualité globale de l'air).

Je suis désolé, déjà supprimé la partie de stockage SQL, voici le code pour obtenir des données en temps réel à partir d'Arduino.

//data received from Arduino as #data+data+data+~ 
    bluetoothIn = new Handler() { 
     public void handleMessage(Message msg) { 
      if (msg.what == handlerState) { //if message is what we want 
       String readMessage = (String) msg.obj; // msg.arg1 = bytes from connect thread 
       recDataString.append(readMessage); //keep appending to string until ~ 
       int endOfLineIndex = recDataString.indexOf("~"); // determine the end-of-line 
       if (endOfLineIndex > 0) { // make sure there data before ~ 
        String dataInPrint = recDataString.substring(0, endOfLineIndex); 

        if (recDataString.charAt(0) == '#') //if it starts with # we know it is what we are looking for 
        { 

         dataInPrint = dataInPrint.substring(1, dataInPrint.length() - 1); //remove the Hash tag symbol 
         StringTokenizer st = new StringTokenizer(dataInPrint,"+"); 
         String sensor0 = st.nextToken(); 
         String sensor1 = st.nextToken(); 
         String sensor2 = st.nextToken(); 


         showMq135.setText(sensor0); //update the textviews with sensor values 
         showMq9.setText(sensor1); 
         showDust.setText(sensor2); 


         p1 = (ProgressBar) findViewById(R.id.progressBarMq135); 
         int p135 = Integer.parseInt(sensor0); 
         p1.setMax(100); 
         p1.setProgress(p135); 




         p2 = (ProgressBar) findViewById(R.id.progressBarMq9); 
         int p9 = Integer.parseInt(sensor1); 
         p2.setMax(100); 
         p2.setProgress(p9); 




         p3 = (ProgressBar) findViewById(R.id.progressBarDust); 
         int pDust = Integer.parseInt(sensor2); 
         p3.setMax(100); 
         p3.setProgress(pDust); 




         if (p135 >= 51 || p9 >= 51 || pDust >= 51) { 

          showAirQuality.setTextColor(Color.RED); 
          showAirQuality.setText("Hazardous/Very unhealthy"); 
          sound.start(); 
         } 

         else { 
          showAirQuality.setTextColor(Color.BLUE); 
          showAirQuality.setText("Normal/Intermediate"); 
         } 


        } 
        recDataString.delete(0, recDataString.length());//clear all string data 

       } 
      } 
     } 
    }; 
+0

Je vous suggère d'inclure du code pour un [minimal, Exemple complet et vérifiable] (https://stackoverflow.com/help/mcve). Cela devrait inclure, l'erreur par l'extrait pertinent du logcat, le code relavant de l'activité et le databasehelper (c'est-à-dire la classe qui est une sous-classe de SQLiteOpenHelper) ou toute autre méthode que vous utilisez pour créer la base de données code que vous utilisez pour stocker les données. – MikeT

+0

Concernant SQL, voulez-vous dire que vous voulez sauvegarder les données dans une base de données SQLite? Si vous n'êtes pas sûr, alors je vous suggère de lire [Utilisations appropriées pour SQLite] (https://www.sqlite.org/whentouse.html), il y a une liste de vérification utile en bas. SQL lui-même n'est pas un système de gestion de base de données mais plutôt un langage utilisé pour accéder aux bases de données. par exemple. SQLite utilise SQL, MySQL utilise SQL et ainsi de suite. – MikeT

Répondre

1

Ok voici quelque chose que vous pouvez adapter, il montre comment créer la base de données et une table (s) et comment insérer des données et aussi une façon de faire une vérification de vérifier que les données existent.

La quasi-totalité du code est dans la sous-classe SQLiteOpenHelp, qui pour ma commodité, je l'ai appelé so46375780DBHelper (vous auriez très probablement renommer ce) cela devrait être dans un fichier nommé so46375780DBHelper.java: -

public class so46375780DBHelper extends SQLiteOpenHelper { 

    public static final String DBNAME = "airquality"; 
    public static final int DBVERSION = 1; 
    public static final String READINGS_TBL = "air_readings"; 
    public static final String READINGID_COL = "_id"; 
    public static final String READINGTIMESTAMP_COL = "timestamp"; 
    public static final String READINGLOCATION_COL = "location"; 
    public static final String READINGSENSOR1_COL = "sensor1"; 
    public static final String READINGSENSOR2_COL = "sensor2"; 
    public static final String READINGSENSOR3_COL = "sensor3"; 
    public static final String READINGAIRQLTY_COL = "airquality"; 

    SQLiteDatabase db; 

    // SQL to create the table 
    String tblcrtsql = "CREATE TABLE " + READINGS_TBL + "(" + 
      READINGID_COL + " INTEGER PRIMARY KEY, " + // unqiue identifier 
      READINGTIMESTAMP_COL + " INTEGER, " + 
      READINGLOCATION_COL + " TEXT, " + 
      READINGSENSOR1_COL + " TEXT, " + 
      READINGSENSOR2_COL + " TEXT, " + 
      READINGSENSOR3_COL + " TEXT, " + 
      READINGAIRQLTY_COL + " TEXT" + 
      ")"; 

    // Database Helper Constructor 
    so46375780DBHelper(Context context) { 
     super(context, DBNAME, null, DBVERSION); 
     db = this.getWritableDatabase(); // Open the database 
    } 

    @Override 
    // Called when Database is openbed when it doesn't already exist 
    // ^^^^^^^^ IMPORTANT to note ^^^^^^^^ 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(tblcrtsql); // Create the table(s) 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldversion, int newversio) { 

    } 

    public boolean insertReading(String location, 
           String sensor1, 
           String sensor2, 
           String sensor3, 
           String airquality) { 
     ContentValues cv = new ContentValues(); 
     cv.put(READINGTIMESTAMP_COL, 
       Long.toString(
       System.currentTimeMillis() 
       ) 
     ); 
     cv.put(READINGLOCATION_COL,location); 
     cv.put(READINGSENSOR1_COL,sensor1); 
     cv.put(READINGSENSOR2_COL,sensor2); 
     cv.put(READINGSENSOR3_COL,sensor3); 
     cv.put(READINGAIRQLTY_COL,airquality); 
     return (db.insert(READINGS_TBL,null,cv) < 1); 
    } 

    public void showAllDataToLog() { 

     //get all rows eqv to SELECT * FROM air_readings; 
     Cursor csr = db.query(READINGS_TBL,null,null,null,null,null,null); 
     // Traverse the cursor 
     while (csr.moveToNext()) { 
      String rowinfo = "Row " + 
        csr.getPosition() + 
        " of " + 
        csr.getCount() + "."; 
      for (int i=0; i < csr.getColumnCount();i++) { 
       rowinfo = rowinfo + 
         "\n\t Column=" + csr.getColumnName(i) + 
         "\t Value=" + csr.getString(i); 
      } 
      Log.d("DBINFO",rowinfo); 
     } 
     csr.close(); // Should always close cursor when finished with them 
    } 
} 

En bref, vous avez les

  • déclarations variables de classe,
  • les contructor
  • méthodes overidden onCreate et onUpgrade (à la fois nécessaire, mais pas nécessairement tenu de faire quoi que ce soit)
  • méthode insertReadings qui utilise la méthode SQLite update, qui utilise un objet contentValues ​​pour les paires colonne/valeur. Cette méthode renvoie une valeur de 1 ou plus (l'attribut rowid qui correspond à la colonne _id), si l'insertion a réussi.
  • showAllDataToLog juste là pour vérifier les données existent.

Ensuite, il suffit de 2 étapes pour activer l'insertion de données, ces étapes sont placées dans la classe (ou les classes) où les données seront insérées.

  • 1 Créez une instance de la sous-classe SQLiteOpenHelper, par exemple. : -

    so46375780DBHelper dbhlpr = new so46375780DBHelper(this); 
    
  • 2 Utilisez la méthode de insertReading pour insérer des données, par exemple : -

    // Insert a row 
    dbhlpr.insertReading(
         "001,345",   //coords 
         "76.5",    // sensor 1 reading 
         "57.3",    // sensor 2 reading 
         "12.6",    // sensor 2 reading 
         "LOUSY"    // air quality 
    ); 
    

Remarque! inventées, vous pouvez aussi modifier la méthode pour utiliser des types plus pertinents (notez que SQlite est extrêmement flexible avec les types, avec peu de limitations, vous pouvez stocker n'importe quel type si valeur dans n'importe quel type de colonne).Cependant, quand il s'agit d'extraire les données d'un curseur, vous devez choisir la méthode get????? la plus appropriée (ci-dessous seulement la méthode getString est utilisée, ce qui est correct pour vérifier l'existence).

Le code suivant la liste des données dans le journal, il ne vise à ré-assurance initiale que les inserts travaillent: -

// Check data (writes to the log) 
    dbhlpr.showAllDataToLog(); 
+0

Cela fonctionne parfaitement, j'ai du mal à faire fonctionner ce travail pendant plus d'un mois, vous l'avez résolu en une heure. Sérieusement apprécier votre aide MikeT. Tu es mon sauveur, je ne suis parti qu'avec 3 mois pour compléter mon projet de fin d'année. – kampungboboi

+0

@kampungboboi génial à entendre. – MikeT