Amaldi / Mbed 2 deprecated Amaldi_18_Exercise_Light_Temp-Control

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
pinofal
Date:
Fri Dec 07 17:06:17 2018 +0000
Parent:
2:2b7dc4f24d04
Commit message:
Open Day

Changed in this revision

LightSensor.cpp Show diff for this revision Revisions of this file
Light_Temp-Control.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/LightSensor.cpp	Fri May 18 13:34:28 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,182 +0,0 @@
-// Tested: NUCLEO-F207ZG
-#include "mbed.h"
-
-// numero di acqusizioni su cui effettuare la media della luminosità
-#define NUMSAMPLE 300
-
-AnalogIn InWave(PF_3);
-Serial pc(USBTX, USBRX);
-
-
-// Output LED di diagnostica
-DigitalOut led1(LED1); // verde
-DigitalOut led2(LED2); // blu
-DigitalOut led3(LED3); // rosso
-
-
-// ticker per l'acquisizione dell'onda con ADC
-Ticker SamplingTicker;
-
-// carattere in arrivo dal PC ed equivalente numerico
-volatile char cReadChar;
-volatile int nReadChar;
-
-// flag che diventa true quando si vuole fermare l'acquisizione
-volatile bool bStop;
-
-// valore letto dall'ADC e corrispondente in tensione
-volatile unsigned short usReadADC;
-volatile float fReadVoltage;
-
-// valore di luminosità letto dall'ADC
-volatile float fLight;
- 
-//***************************
-// Acquisizione da ADC
-//***************************
-void Sampling() 
-{
-    // indice per i cicli
-    int nIndex;
-    // valore medio della Luminosità su NUMACQUISISIONI acquisizioni
-    float fAvgLight;
-    
-    // se è stato inviato il comando Stop, non fare niente fino a nuovo comando
-    if(bStop)
-    {
-    }
-    else // se non è stato inviato il comando di bStop continua
-    {
-        // inizializza il valore medio della Luminosità 
-        fAvgLight=0.0;
-        for(nIndex=0; nIndex < NUMSAMPLE; nIndex++)
-        {
-            // acquisisce dato da ADC
-            usReadADC = InWave.read_u16();
-            fReadVoltage=(usReadADC*3.3)/65535.0; // converte in Volt il valore numerico letto dall'ADC
-            //fReadVoltage=InWave.read(); // acquisisce il valore dall'ADC come valore di tensione in volt
-            fLight= fReadVoltage; //ATTENZIONE Visualizza il valore grezzo letto dall'ADC
-            fAvgLight+=fLight;
-        }   
-        // calcola valore medio su NUMSAMPLE acquisizioni 
-        fAvgLight/= NUMSAMPLE;
-        
-        // accendi LED in base a superamento soglie
-        if (fAvgLight <= 21845.0)
-        {
-            // accendi LED Blu sotto 0.3*valore massimo (65535)
-            led1=0;
-            led2=1;
-            led3=0;
-        }
-        else
-        {
-            if(fAvgLight >= .0)
-            {
-                    // accendi LED Rosso 0.6*valore massimo
-                    led1=0;
-                    led2=0;
-                    led3=1;
-            }
-            else
-            {
-                // accendi LED verde (0.3 e 0.6)*valore massimo
-                led1=1;
-                led2=0;
-                led3=0;
-            }
-        }
-        
-        
-        
-        
-        // invia il dato al PC
-        //pc.printf("\n\r--- Voltage= %.1f [Volt]; Brightness= %.1f [Celsius] ---\n\r", fReadVoltage, fLight);
-        pc.printf("\n\r--- Digital= %d [Volt]; Brightness= %.2f [Celsius] ---\n\r", usReadADC, fLight);
-        
-        
-        
-        /*
-        // prepara il pacchetto di dati acquisiti  da restituire al PC
-        caTxPacket[nSampleInCount]= (char)(usReadADC&0xFF);
-        //+++caTxPacket[nSampleInCount]= 'a';
-        nSampleInCount++;
-        caTxPacket[nSampleInCount] = (char)((usReadADC>>8)&0xFF);
-        //++++caTxPacket[nSampleInCount]= 'b';
-        */
-          
-     }
-}
-
-
-
-
- //*******************
- // Loop Principale
- //*******************  
-int main()
-{
-    // periodo di campionamento
-    int nDeltaT;
-    
-    // inizializza variabili
-    bStop=true;
-    
-     // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
-    pc.baud(921600); //921600 bps
-    
-    // messaggio di benvenuto
-    pc.printf("\r\nHallo Amaldi Students - Exercise 8 \r\n");
-    pc.printf("\r\n*** Light Acquisition ***\r\n");
-    
-    // test dei LED
-    led1=1; //Verde
-    wait_ms(1000);
-    led1=0;
-    led2=1; // Blu
-    wait_ms(1000);
-    led2=0;
-    led3=1; //Rosso
-    wait_ms(1000);
-    led3=0;
-    
-   
-    
-    while(true) 
-    {
-        // verifica se è arrivato un carattere dalla seriale del PC
-        if(pc.readable())
-        {
-            cReadChar = pc.getc(); // Read hyperterminal
-                    
-            if((cReadChar == 'S') || (cReadChar == 's')) // blocca acquisizione se riceve 'S' oppure 's'
-            {
-                bStop= true;
-                pc.printf("\n\r--- Acquisition Stopped ---\n\r");
-            }    
-            if((cReadChar >= '0') && (cReadChar <='9'))
-            {
-                bStop = false;
-                nReadChar = cReadChar -'0'; //converte il carattere acquisito dal PC nel corrispondente valore numerico
-                nDeltaT = nReadChar; // sampling Period in sec
-                pc.printf("\n\r--- Acquisition Started DeltaT = %c ---\n\r", cReadChar);
-                SamplingTicker.attach(&Sampling,nDeltaT);
-            }
-                    
-        } //lettura da pc    
-    } // while(true)
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Light_Temp-Control.cpp	Fri Dec 07 17:06:17 2018 +0000
@@ -0,0 +1,175 @@
+// Tested: NUCLEO-F401RE
+#include "mbed.h"
+
+// numero di acqusizioni su cui effettuare la media della luminosità e della temperatura
+#define NUMSAMPLELIGHT 300
+#define NUMSAMPLETEMP 300
+
+// soglie massime e minime per azionamento relè. L'attuatore si spegne se viene superata la soglia massima e si accende se si scende sotto la soglia minima
+
+
+// seriale per la comunicazione con il PC su USB
+Serial pc(USBTX, USBRX);
+
+// Output LED di diagnostica
+DigitalOut myLED(LED2); // verde
+
+
+// sensore di luminosità
+AnalogIn InLight (PA_0);
+
+// sensore di temperatura
+AnalogIn InTemp (PA_1);
+
+// relay per accendere/spegnere le luci
+DigitalOut LightRelay (PB_0);
+
+// relay per accendere/spegnere il termoventilatore
+DigitalOut HeaterRelay (PC_1);
+
+// ticker per l'acquisizione dell'onda con ADC
+//Ticker SamplingTicker;
+
+// carattere in arrivo dal PC ed equivalente numerico
+char cReadChar;
+int nReadChar;
+
+// flag che diventa true quando si vuole fermare l'acquisizione
+bool bStop;
+
+// valore letto dall'ADC di luminosità e temperatura e corrispondenti valori in tensione
+unsigned short usReadLightADC;
+float fReadLightVoltage;
+unsigned short usReadTempADC;
+float fReadTempVoltage;
+
+
+// valore di luminosità letto dall'ADC
+double fLight;
+
+// valore di temperatura letto dall'ADC
+double fTemp;
+
+// indice per i cicli di calcolo temperatura e luminosità
+int nTempIndex;
+int nLightIndex;
+
+// valore medio della Luminosità e della temperatura su NUMACQUISISIONI acquisizioni
+double fAvgLight;
+double fAvgTemp;
+ 
+
+ //*******************
+ // Loop Principale
+ //*******************  
+int main()
+{
+    // periodo di campionamento
+    int nDeltaT;
+    
+    // inizializza variabili
+    HeaterRelay = 0; // spegne inizialmente il termoventilatore
+    LightRelay = 0; // spegne inizialmente le luci
+    
+     // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
+    pc.baud(921600); //921600 bps
+    
+    // messaggio di benvenuto
+    pc.printf("\r\n  Hallo Amaldi Students - Exercise 18 \r\n");
+    pc.printf("\r\n*** Light and Temperature Control ***\r\n");
+    
+    // test dei LED
+    myLED=1; // Verde
+    wait_ms(1000);
+    myLED=0;
+    
+    
+    
+    while(true) 
+    {
+    
+        //++++++++++++++ INIZIA ACQUISIZIONE DELLA LUMINOSITA +++++++++++++++++++++
+        // inizializza il valore medio della Luminosità 
+        fAvgLight=0.0;
+        for(nLightIndex=0; nLightIndex < NUMSAMPLELIGHT; nLightIndex++)
+        {
+            // acquisisce dato da ADC
+            usReadLightADC = InLight.read_u16();
+            fReadLightVoltage=(usReadLightADC*3.3)/65535.0; // converte in Volt il valore numerico letto dall'ADC
+            //fReadVoltage=InWave.read(); // acquisisce il valore dall'ADC come valore di tensione in volt
+            fLight= fReadLightVoltage; //ATTENZIONE Visualizza il valore grezzo letto dall'ADC
+            fAvgLight+=fLight;
+        }   
+        // calcola valore medio su NUMSAMPLE acquisizioni 
+        fAvgLight/= NUMSAMPLELIGHT;
+        
+        // accendi Luce in base a superamento soglie.
+        if (fAvgLight <= 0.7) // aumentando la luminosita, si riduce il valore di tensione acquisito da ADC
+        {
+            LightRelay = 0; // spegni la luce
+        }
+        else
+        {
+            if(fAvgLight >= 1)
+            {
+                LightRelay =1; // accendi la luce
+            }
+        }
+        
+        // invia il dato di luminosità al PC
+        //pc.printf("\n\r--- Voltage= %.1f [Volt]; Brightness= %.1f [Celsius] ---\n\r", fReadVoltage, fLight);
+        pc.printf("\n\r--- Digital= %d [Volt]; Brightness= %.2f [Lux] ---\n\r", usReadLightADC, fLight);
+        //+++++++++++++ FINE ACQUISISCE DA SENSORE LUMINOSITA ++++++++++++++++
+        
+        //+++++++++++++ INIZIO ACQUISISCE DA SENSORE TEMPERATURA ++++++++++++
+        // inizializza il valore medio della temperatura 
+        fAvgTemp=0.0;
+        for(nTempIndex=0; nTempIndex < NUMSAMPLETEMP; nTempIndex++)
+        {
+            // acquisisce dato da ADC
+            usReadTempADC = InTemp.read_u16();
+            fReadTempVoltage=(usReadTempADC*3.3)/65535.0; // converte in Volt il valore numerico letto dall'ADC
+            //fReadVoltage=InWave.read(); // acquisisce il valore dall'ADC come valore di tensione in volt
+            fTemp= ((fReadTempVoltage-0.25)*100.0)/(3.05-0.25); //applica la formula della retta che passa per i punti estremi del range del sensore
+            fAvgTemp+=fTemp;
+        }   
+        // calcola valore medio su NUMSAMPLE acquisizioni 
+        fAvgTemp/= NUMSAMPLETEMP;
+        
+        if(fAvgTemp < 23) // accende il riscaldamento se la temperatura è inferiore a 25°C
+        {
+            HeaterRelay = 1; // accende il relay del riscaldamento
+            myLED=1; // scopi diagnostici
+        }
+        else
+        {
+            if(fAvgTemp > 25)
+            { 
+                HeaterRelay = 0; // spegne il relay del riscaldamento
+                myLED=0; // scopi diagnostici
+            }
+        }
+            
+        
+        // invia il dato al PC
+        //pc.printf("\n\r--- Voltage= %.1f [Volt]; Temperature= %.1f [Celsius] ---\n\r", fReadVoltage, fTemp);
+        pc.printf("\n\r--- Digital= %d [Volt]; Temperature= %.2f [Celsius] ---\n\r", usReadTempADC, fTemp);
+       
+        //+++++++++++++ FINE ACQUISISCE DA SENSORE TEMPERATURA ++++++++++++++  
+     
+    } // while(true)
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+