Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Revision 3:3a79211b1009, committed 2018-12-07
- 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) +} + + + + + + + + + + + + + +