Amaldi / Mbed 2 deprecated Amaldi_18_Exercise_Light_Temp-Control

Dependencies:   mbed

Committer:
pinofal
Date:
Fri Dec 07 17:06:17 2018 +0000
Revision:
3:3a79211b1009
Open Day

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pinofal 3:3a79211b1009 1 // Tested: NUCLEO-F401RE
pinofal 3:3a79211b1009 2 #include "mbed.h"
pinofal 3:3a79211b1009 3
pinofal 3:3a79211b1009 4 // numero di acqusizioni su cui effettuare la media della luminosità e della temperatura
pinofal 3:3a79211b1009 5 #define NUMSAMPLELIGHT 300
pinofal 3:3a79211b1009 6 #define NUMSAMPLETEMP 300
pinofal 3:3a79211b1009 7
pinofal 3:3a79211b1009 8 // 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
pinofal 3:3a79211b1009 9
pinofal 3:3a79211b1009 10
pinofal 3:3a79211b1009 11 // seriale per la comunicazione con il PC su USB
pinofal 3:3a79211b1009 12 Serial pc(USBTX, USBRX);
pinofal 3:3a79211b1009 13
pinofal 3:3a79211b1009 14 // Output LED di diagnostica
pinofal 3:3a79211b1009 15 DigitalOut myLED(LED2); // verde
pinofal 3:3a79211b1009 16
pinofal 3:3a79211b1009 17
pinofal 3:3a79211b1009 18 // sensore di luminosità
pinofal 3:3a79211b1009 19 AnalogIn InLight (PA_0);
pinofal 3:3a79211b1009 20
pinofal 3:3a79211b1009 21 // sensore di temperatura
pinofal 3:3a79211b1009 22 AnalogIn InTemp (PA_1);
pinofal 3:3a79211b1009 23
pinofal 3:3a79211b1009 24 // relay per accendere/spegnere le luci
pinofal 3:3a79211b1009 25 DigitalOut LightRelay (PB_0);
pinofal 3:3a79211b1009 26
pinofal 3:3a79211b1009 27 // relay per accendere/spegnere il termoventilatore
pinofal 3:3a79211b1009 28 DigitalOut HeaterRelay (PC_1);
pinofal 3:3a79211b1009 29
pinofal 3:3a79211b1009 30 // ticker per l'acquisizione dell'onda con ADC
pinofal 3:3a79211b1009 31 //Ticker SamplingTicker;
pinofal 3:3a79211b1009 32
pinofal 3:3a79211b1009 33 // carattere in arrivo dal PC ed equivalente numerico
pinofal 3:3a79211b1009 34 char cReadChar;
pinofal 3:3a79211b1009 35 int nReadChar;
pinofal 3:3a79211b1009 36
pinofal 3:3a79211b1009 37 // flag che diventa true quando si vuole fermare l'acquisizione
pinofal 3:3a79211b1009 38 bool bStop;
pinofal 3:3a79211b1009 39
pinofal 3:3a79211b1009 40 // valore letto dall'ADC di luminosità e temperatura e corrispondenti valori in tensione
pinofal 3:3a79211b1009 41 unsigned short usReadLightADC;
pinofal 3:3a79211b1009 42 float fReadLightVoltage;
pinofal 3:3a79211b1009 43 unsigned short usReadTempADC;
pinofal 3:3a79211b1009 44 float fReadTempVoltage;
pinofal 3:3a79211b1009 45
pinofal 3:3a79211b1009 46
pinofal 3:3a79211b1009 47 // valore di luminosità letto dall'ADC
pinofal 3:3a79211b1009 48 double fLight;
pinofal 3:3a79211b1009 49
pinofal 3:3a79211b1009 50 // valore di temperatura letto dall'ADC
pinofal 3:3a79211b1009 51 double fTemp;
pinofal 3:3a79211b1009 52
pinofal 3:3a79211b1009 53 // indice per i cicli di calcolo temperatura e luminosità
pinofal 3:3a79211b1009 54 int nTempIndex;
pinofal 3:3a79211b1009 55 int nLightIndex;
pinofal 3:3a79211b1009 56
pinofal 3:3a79211b1009 57 // valore medio della Luminosità e della temperatura su NUMACQUISISIONI acquisizioni
pinofal 3:3a79211b1009 58 double fAvgLight;
pinofal 3:3a79211b1009 59 double fAvgTemp;
pinofal 3:3a79211b1009 60
pinofal 3:3a79211b1009 61
pinofal 3:3a79211b1009 62 //*******************
pinofal 3:3a79211b1009 63 // Loop Principale
pinofal 3:3a79211b1009 64 //*******************
pinofal 3:3a79211b1009 65 int main()
pinofal 3:3a79211b1009 66 {
pinofal 3:3a79211b1009 67 // periodo di campionamento
pinofal 3:3a79211b1009 68 int nDeltaT;
pinofal 3:3a79211b1009 69
pinofal 3:3a79211b1009 70 // inizializza variabili
pinofal 3:3a79211b1009 71 HeaterRelay = 0; // spegne inizialmente il termoventilatore
pinofal 3:3a79211b1009 72 LightRelay = 0; // spegne inizialmente le luci
pinofal 3:3a79211b1009 73
pinofal 3:3a79211b1009 74 // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
pinofal 3:3a79211b1009 75 pc.baud(921600); //921600 bps
pinofal 3:3a79211b1009 76
pinofal 3:3a79211b1009 77 // messaggio di benvenuto
pinofal 3:3a79211b1009 78 pc.printf("\r\n Hallo Amaldi Students - Exercise 18 \r\n");
pinofal 3:3a79211b1009 79 pc.printf("\r\n*** Light and Temperature Control ***\r\n");
pinofal 3:3a79211b1009 80
pinofal 3:3a79211b1009 81 // test dei LED
pinofal 3:3a79211b1009 82 myLED=1; // Verde
pinofal 3:3a79211b1009 83 wait_ms(1000);
pinofal 3:3a79211b1009 84 myLED=0;
pinofal 3:3a79211b1009 85
pinofal 3:3a79211b1009 86
pinofal 3:3a79211b1009 87
pinofal 3:3a79211b1009 88 while(true)
pinofal 3:3a79211b1009 89 {
pinofal 3:3a79211b1009 90
pinofal 3:3a79211b1009 91 //++++++++++++++ INIZIA ACQUISIZIONE DELLA LUMINOSITA +++++++++++++++++++++
pinofal 3:3a79211b1009 92 // inizializza il valore medio della Luminosità
pinofal 3:3a79211b1009 93 fAvgLight=0.0;
pinofal 3:3a79211b1009 94 for(nLightIndex=0; nLightIndex < NUMSAMPLELIGHT; nLightIndex++)
pinofal 3:3a79211b1009 95 {
pinofal 3:3a79211b1009 96 // acquisisce dato da ADC
pinofal 3:3a79211b1009 97 usReadLightADC = InLight.read_u16();
pinofal 3:3a79211b1009 98 fReadLightVoltage=(usReadLightADC*3.3)/65535.0; // converte in Volt il valore numerico letto dall'ADC
pinofal 3:3a79211b1009 99 //fReadVoltage=InWave.read(); // acquisisce il valore dall'ADC come valore di tensione in volt
pinofal 3:3a79211b1009 100 fLight= fReadLightVoltage; //ATTENZIONE Visualizza il valore grezzo letto dall'ADC
pinofal 3:3a79211b1009 101 fAvgLight+=fLight;
pinofal 3:3a79211b1009 102 }
pinofal 3:3a79211b1009 103 // calcola valore medio su NUMSAMPLE acquisizioni
pinofal 3:3a79211b1009 104 fAvgLight/= NUMSAMPLELIGHT;
pinofal 3:3a79211b1009 105
pinofal 3:3a79211b1009 106 // accendi Luce in base a superamento soglie.
pinofal 3:3a79211b1009 107 if (fAvgLight <= 0.7) // aumentando la luminosita, si riduce il valore di tensione acquisito da ADC
pinofal 3:3a79211b1009 108 {
pinofal 3:3a79211b1009 109 LightRelay = 0; // spegni la luce
pinofal 3:3a79211b1009 110 }
pinofal 3:3a79211b1009 111 else
pinofal 3:3a79211b1009 112 {
pinofal 3:3a79211b1009 113 if(fAvgLight >= 1)
pinofal 3:3a79211b1009 114 {
pinofal 3:3a79211b1009 115 LightRelay =1; // accendi la luce
pinofal 3:3a79211b1009 116 }
pinofal 3:3a79211b1009 117 }
pinofal 3:3a79211b1009 118
pinofal 3:3a79211b1009 119 // invia il dato di luminosità al PC
pinofal 3:3a79211b1009 120 //pc.printf("\n\r--- Voltage= %.1f [Volt]; Brightness= %.1f [Celsius] ---\n\r", fReadVoltage, fLight);
pinofal 3:3a79211b1009 121 pc.printf("\n\r--- Digital= %d [Volt]; Brightness= %.2f [Lux] ---\n\r", usReadLightADC, fLight);
pinofal 3:3a79211b1009 122 //+++++++++++++ FINE ACQUISISCE DA SENSORE LUMINOSITA ++++++++++++++++
pinofal 3:3a79211b1009 123
pinofal 3:3a79211b1009 124 //+++++++++++++ INIZIO ACQUISISCE DA SENSORE TEMPERATURA ++++++++++++
pinofal 3:3a79211b1009 125 // inizializza il valore medio della temperatura
pinofal 3:3a79211b1009 126 fAvgTemp=0.0;
pinofal 3:3a79211b1009 127 for(nTempIndex=0; nTempIndex < NUMSAMPLETEMP; nTempIndex++)
pinofal 3:3a79211b1009 128 {
pinofal 3:3a79211b1009 129 // acquisisce dato da ADC
pinofal 3:3a79211b1009 130 usReadTempADC = InTemp.read_u16();
pinofal 3:3a79211b1009 131 fReadTempVoltage=(usReadTempADC*3.3)/65535.0; // converte in Volt il valore numerico letto dall'ADC
pinofal 3:3a79211b1009 132 //fReadVoltage=InWave.read(); // acquisisce il valore dall'ADC come valore di tensione in volt
pinofal 3:3a79211b1009 133 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
pinofal 3:3a79211b1009 134 fAvgTemp+=fTemp;
pinofal 3:3a79211b1009 135 }
pinofal 3:3a79211b1009 136 // calcola valore medio su NUMSAMPLE acquisizioni
pinofal 3:3a79211b1009 137 fAvgTemp/= NUMSAMPLETEMP;
pinofal 3:3a79211b1009 138
pinofal 3:3a79211b1009 139 if(fAvgTemp < 23) // accende il riscaldamento se la temperatura è inferiore a 25°C
pinofal 3:3a79211b1009 140 {
pinofal 3:3a79211b1009 141 HeaterRelay = 1; // accende il relay del riscaldamento
pinofal 3:3a79211b1009 142 myLED=1; // scopi diagnostici
pinofal 3:3a79211b1009 143 }
pinofal 3:3a79211b1009 144 else
pinofal 3:3a79211b1009 145 {
pinofal 3:3a79211b1009 146 if(fAvgTemp > 25)
pinofal 3:3a79211b1009 147 {
pinofal 3:3a79211b1009 148 HeaterRelay = 0; // spegne il relay del riscaldamento
pinofal 3:3a79211b1009 149 myLED=0; // scopi diagnostici
pinofal 3:3a79211b1009 150 }
pinofal 3:3a79211b1009 151 }
pinofal 3:3a79211b1009 152
pinofal 3:3a79211b1009 153
pinofal 3:3a79211b1009 154 // invia il dato al PC
pinofal 3:3a79211b1009 155 //pc.printf("\n\r--- Voltage= %.1f [Volt]; Temperature= %.1f [Celsius] ---\n\r", fReadVoltage, fTemp);
pinofal 3:3a79211b1009 156 pc.printf("\n\r--- Digital= %d [Volt]; Temperature= %.2f [Celsius] ---\n\r", usReadTempADC, fTemp);
pinofal 3:3a79211b1009 157
pinofal 3:3a79211b1009 158 //+++++++++++++ FINE ACQUISISCE DA SENSORE TEMPERATURA ++++++++++++++
pinofal 3:3a79211b1009 159
pinofal 3:3a79211b1009 160 } // while(true)
pinofal 3:3a79211b1009 161 }
pinofal 3:3a79211b1009 162
pinofal 3:3a79211b1009 163
pinofal 3:3a79211b1009 164
pinofal 3:3a79211b1009 165
pinofal 3:3a79211b1009 166
pinofal 3:3a79211b1009 167
pinofal 3:3a79211b1009 168
pinofal 3:3a79211b1009 169
pinofal 3:3a79211b1009 170
pinofal 3:3a79211b1009 171
pinofal 3:3a79211b1009 172
pinofal 3:3a79211b1009 173
pinofal 3:3a79211b1009 174
pinofal 3:3a79211b1009 175