Marco333

Temp logging and plotting

Nov 12th, 2014
218
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* #rogosprojects
  2. #  Temp logging and plotting (ver.2)
  3. #
  4. #  Creato il 9/11/14
  5. #  Autore: Gianmarco Rogo
  6. #  https://plus.google.com/+GianmarcoRogo
  7. */
  8.  
  9. #include <SD.h>                //libreria per scrittura su MicroSD
  10. #include "MegunoLink.h"       //libreria per MLP
  11. #include <SoftwareSerial.h>  //libreria per il modulo bluetooth
  12.  
  13. // On the Ethernet Shield, CS is pin 4. Note that even if it's not
  14. // used as the CS pin, the hardware CS pin (10 on most Arduino boards,
  15. // 53 on the Mega) must be left as an output or the SD library
  16. // functions will not work.
  17. const int chipSelect = 4;
  18.  
  19. const int led_rosso=7;
  20. const int led_verde=8;
  21. int temp_pin=A0;    //colegamento del sensore di temperatura all'analogico A0
  22. int asse_x_BT=1;    //asse delle ascisse per comunicazione bluetooth
  23. int asse_x_FILEW=1;  //asse delle ascisse per scrittura su file
  24. boolean firstWrite;    //identifica la prima scrittura
  25. long LastSent, LastSent2;
  26. const unsigned IntervalloScrittura = 60*1000; // [ms] tempo per file logging
  27. const unsigned IntervalloBluetooth = 10*1000; // [ms] tempo per comunicazione bluetooth
  28.  
  29. SoftwareSerial G(2, 3); //pin per comunicazione blueetoothe: (ricezione RXD, trasmissione TXD)
  30.  
  31. XYPlot MyPlot("Temperatura");  //definisce il nome del plot a cui stiamo inviando i dati su MLP
  32.  
  33. void setup(){
  34.   Serial.begin(9600);
  35.   firstWrite=true;
  36.  
  37.   Serial.println("Inizializzazione SD card..");
  38.   pinMode(10, OUTPUT);
  39.  
  40.  //verifica se la SDcard è presente e pronta alla lettura
  41.   if (!SD.begin(chipSelect)) {
  42.     Serial.println("Errore lettura o scheda non presente");
  43.     return;
  44.   }
  45.   Serial.println("Inizializzazione completata.");
  46.  
  47.   //-------------------MEGUNOLINK------
  48.  
  49.   LastSent = millis();
  50.  
  51.   MyPlot.SetTitle("Misurazione temperatura");
  52.   MyPlot.SetXlabel("Tempo [s]");
  53.   MyPlot.SetYlabel("Temperatura [C]");
  54.   MyPlot.SetSeriesProperties("temp", Plot::Red, Plot::Solid, 2, Plot::Square);  //proprièta della serie "temp"
  55.  
  56.   //--------------bluetooth------
  57.   G.begin(9600);
  58.   G.println("Inizializzazione BLE...");
  59.  
  60.   //--------led------
  61.   pinMode(led_rosso, OUTPUT);
  62.   pinMode(led_verde, OUTPUT);
  63. }
  64.  
  65. void loop()
  66. {
  67.   //calcolo della temperatura
  68.   int value = analogRead(temp_pin);
  69.   float millivolts = (value /1024.0) *5000;
  70.   float celsius = millivolts /10;
  71. /*  Serial.print("Celsius: ");
  72.   Serial.println(celsius); utilizzato solo per scopo di testing */
  73.  
  74.   //------scrittura dei dati con frequenza IntervalloScrittura
  75.   if ((millis() - LastSent) > IntervalloScrittura){    
  76.     LastSent = millis();
  77.    
  78.     Serial.print("TEMPERATURA = ");
  79.     Serial.print(celsius);
  80.     Serial.println(" C");
  81.  
  82.     //lampeggia per 100ms il led verde
  83.     blinkLED(led_verde, 100);
  84.  
  85.     //apertura del file "templog.csv" per successiva scrittura
  86.     File dataFile = SD.open("templog.csv", FILE_WRITE);
  87.  
  88.     //se il file è disponibile, scrivi..
  89.     if (dataFile) {
  90.  
  91.       if(firstWrite){   //alla prima scrittura inserisco una stringa per indentificare l'inzio del file
  92.         dataFile.println("START");
  93.         Serial.println("File start recording...");  //comunico l'inzio della scrittura anche al moniotor seriale..
  94.         G.println("File start recording...");       //..e al mio dispositivo bluetooth
  95.         firstWrite=false;  //la prima scrittura è avvenuta con successo
  96.       }
  97.  
  98.       dataFile.print(asse_x_FILEW);    //scrivo nel file il valore dell'ascissa
  99.       dataFile.print(",");            //separatore
  100.       dataFile.println(celsius);      //ordinate
  101.       dataFile.close();              //chiudo il file per successiva riscrittura
  102.      
  103. //stampo i dati anche sul monitor seriale USB per leggerli con MLP
  104.       MyPlot.SendData("temp", asse_x_FILEW,celsius); //millis() goes on the xaxis, DataValue goes on the yaxis
  105.      
  106.       asse_x_FILEW++; //incremento delle ascisse, successivo campione
  107.     }  
  108.  
  109. //se non è possibile scrivere sul file, restituisci un errore
  110.     else {
  111.       Serial.println("Errore di apertura file");
  112.     }
  113.   }
  114.  
  115.   //------invio dati via bluetooth con frequenza IntervalloBluetooth
  116.   if ((millis() - LastSent2) > IntervalloBluetooth){
  117.     LastSent2 = millis();
  118.  
  119.     G.print("{XYPLOT|DATA|Temperatura|");  //stampa via bluetooth (formattazione per MLP)
  120.     G.print(asse_x_BT);        //asse x per dati bluetooth (diverso da quello usato per la scrittura!!)
  121.     G.print("|");            //separatore per MLP
  122.     G.print(celsius);        //ordinate
  123.     G.println("}");
  124.     asse_x_BT++;        //incremento
  125.    
  126.     //lampeggio led rosso
  127.     blinkLED(led_rosso, 100);
  128.   }
  129. }
  130.  
  131. //funzione per accendere / spegnere led
  132. void blinkLED(int pin, int duration)
  133. {
  134.   digitalWrite(pin, HIGH); // turn LED on
  135.   delay(duration);
  136.   digitalWrite(pin, LOW); // turn LED off
  137.   delay(duration);
  138. }
RAW Paste Data