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
Light_Temp-Control.cpp
- Committer:
- pinofal
- Date:
- 2018-12-07
- Revision:
- 3:3a79211b1009
File content as of revision 3:3a79211b1009:
// 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) }