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@3:3a79211b1009, 2018-12-07 (annotated)
- Committer:
- pinofal
- Date:
- Fri Dec 07 17:06:17 2018 +0000
- Revision:
- 3:3a79211b1009
Open Day
Who changed what in which revision?
User | Revision | Line number | New 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 |