Amaldi / Mbed 2 deprecated Amaldi_18_Exercise_Light_Temp-Control

Dependencies:   mbed

Committer:
pinofal
Date:
Fri May 18 13:34:28 2018 +0000
Revision:
2:2b7dc4f24d04
Amaldi Exercise 8

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pinofal 2:2b7dc4f24d04 1 // Tested: NUCLEO-F207ZG
pinofal 2:2b7dc4f24d04 2 #include "mbed.h"
pinofal 2:2b7dc4f24d04 3
pinofal 2:2b7dc4f24d04 4 // numero di acqusizioni su cui effettuare la media della luminosità
pinofal 2:2b7dc4f24d04 5 #define NUMSAMPLE 300
pinofal 2:2b7dc4f24d04 6
pinofal 2:2b7dc4f24d04 7 AnalogIn InWave(PF_3);
pinofal 2:2b7dc4f24d04 8 Serial pc(USBTX, USBRX);
pinofal 2:2b7dc4f24d04 9
pinofal 2:2b7dc4f24d04 10
pinofal 2:2b7dc4f24d04 11 // Output LED di diagnostica
pinofal 2:2b7dc4f24d04 12 DigitalOut led1(LED1); // verde
pinofal 2:2b7dc4f24d04 13 DigitalOut led2(LED2); // blu
pinofal 2:2b7dc4f24d04 14 DigitalOut led3(LED3); // rosso
pinofal 2:2b7dc4f24d04 15
pinofal 2:2b7dc4f24d04 16
pinofal 2:2b7dc4f24d04 17 // ticker per l'acquisizione dell'onda con ADC
pinofal 2:2b7dc4f24d04 18 Ticker SamplingTicker;
pinofal 2:2b7dc4f24d04 19
pinofal 2:2b7dc4f24d04 20 // carattere in arrivo dal PC ed equivalente numerico
pinofal 2:2b7dc4f24d04 21 volatile char cReadChar;
pinofal 2:2b7dc4f24d04 22 volatile int nReadChar;
pinofal 2:2b7dc4f24d04 23
pinofal 2:2b7dc4f24d04 24 // flag che diventa true quando si vuole fermare l'acquisizione
pinofal 2:2b7dc4f24d04 25 volatile bool bStop;
pinofal 2:2b7dc4f24d04 26
pinofal 2:2b7dc4f24d04 27 // valore letto dall'ADC e corrispondente in tensione
pinofal 2:2b7dc4f24d04 28 volatile unsigned short usReadADC;
pinofal 2:2b7dc4f24d04 29 volatile float fReadVoltage;
pinofal 2:2b7dc4f24d04 30
pinofal 2:2b7dc4f24d04 31 // valore di luminosità letto dall'ADC
pinofal 2:2b7dc4f24d04 32 volatile float fLight;
pinofal 2:2b7dc4f24d04 33
pinofal 2:2b7dc4f24d04 34 //***************************
pinofal 2:2b7dc4f24d04 35 // Acquisizione da ADC
pinofal 2:2b7dc4f24d04 36 //***************************
pinofal 2:2b7dc4f24d04 37 void Sampling()
pinofal 2:2b7dc4f24d04 38 {
pinofal 2:2b7dc4f24d04 39 // indice per i cicli
pinofal 2:2b7dc4f24d04 40 int nIndex;
pinofal 2:2b7dc4f24d04 41 // valore medio della Luminosità su NUMACQUISISIONI acquisizioni
pinofal 2:2b7dc4f24d04 42 float fAvgLight;
pinofal 2:2b7dc4f24d04 43
pinofal 2:2b7dc4f24d04 44 // se è stato inviato il comando Stop, non fare niente fino a nuovo comando
pinofal 2:2b7dc4f24d04 45 if(bStop)
pinofal 2:2b7dc4f24d04 46 {
pinofal 2:2b7dc4f24d04 47 }
pinofal 2:2b7dc4f24d04 48 else // se non è stato inviato il comando di bStop continua
pinofal 2:2b7dc4f24d04 49 {
pinofal 2:2b7dc4f24d04 50 // inizializza il valore medio della Luminosità
pinofal 2:2b7dc4f24d04 51 fAvgLight=0.0;
pinofal 2:2b7dc4f24d04 52 for(nIndex=0; nIndex < NUMSAMPLE; nIndex++)
pinofal 2:2b7dc4f24d04 53 {
pinofal 2:2b7dc4f24d04 54 // acquisisce dato da ADC
pinofal 2:2b7dc4f24d04 55 usReadADC = InWave.read_u16();
pinofal 2:2b7dc4f24d04 56 fReadVoltage=(usReadADC*3.3)/65535.0; // converte in Volt il valore numerico letto dall'ADC
pinofal 2:2b7dc4f24d04 57 //fReadVoltage=InWave.read(); // acquisisce il valore dall'ADC come valore di tensione in volt
pinofal 2:2b7dc4f24d04 58 fLight= fReadVoltage; //ATTENZIONE Visualizza il valore grezzo letto dall'ADC
pinofal 2:2b7dc4f24d04 59 fAvgLight+=fLight;
pinofal 2:2b7dc4f24d04 60 }
pinofal 2:2b7dc4f24d04 61 // calcola valore medio su NUMSAMPLE acquisizioni
pinofal 2:2b7dc4f24d04 62 fAvgLight/= NUMSAMPLE;
pinofal 2:2b7dc4f24d04 63
pinofal 2:2b7dc4f24d04 64 // accendi LED in base a superamento soglie
pinofal 2:2b7dc4f24d04 65 if (fAvgLight <= 21845.0)
pinofal 2:2b7dc4f24d04 66 {
pinofal 2:2b7dc4f24d04 67 // accendi LED Blu sotto 0.3*valore massimo (65535)
pinofal 2:2b7dc4f24d04 68 led1=0;
pinofal 2:2b7dc4f24d04 69 led2=1;
pinofal 2:2b7dc4f24d04 70 led3=0;
pinofal 2:2b7dc4f24d04 71 }
pinofal 2:2b7dc4f24d04 72 else
pinofal 2:2b7dc4f24d04 73 {
pinofal 2:2b7dc4f24d04 74 if(fAvgLight >= .0)
pinofal 2:2b7dc4f24d04 75 {
pinofal 2:2b7dc4f24d04 76 // accendi LED Rosso 0.6*valore massimo
pinofal 2:2b7dc4f24d04 77 led1=0;
pinofal 2:2b7dc4f24d04 78 led2=0;
pinofal 2:2b7dc4f24d04 79 led3=1;
pinofal 2:2b7dc4f24d04 80 }
pinofal 2:2b7dc4f24d04 81 else
pinofal 2:2b7dc4f24d04 82 {
pinofal 2:2b7dc4f24d04 83 // accendi LED verde (0.3 e 0.6)*valore massimo
pinofal 2:2b7dc4f24d04 84 led1=1;
pinofal 2:2b7dc4f24d04 85 led2=0;
pinofal 2:2b7dc4f24d04 86 led3=0;
pinofal 2:2b7dc4f24d04 87 }
pinofal 2:2b7dc4f24d04 88 }
pinofal 2:2b7dc4f24d04 89
pinofal 2:2b7dc4f24d04 90
pinofal 2:2b7dc4f24d04 91
pinofal 2:2b7dc4f24d04 92
pinofal 2:2b7dc4f24d04 93 // invia il dato al PC
pinofal 2:2b7dc4f24d04 94 //pc.printf("\n\r--- Voltage= %.1f [Volt]; Brightness= %.1f [Celsius] ---\n\r", fReadVoltage, fLight);
pinofal 2:2b7dc4f24d04 95 pc.printf("\n\r--- Digital= %d [Volt]; Brightness= %.2f [Celsius] ---\n\r", usReadADC, fLight);
pinofal 2:2b7dc4f24d04 96
pinofal 2:2b7dc4f24d04 97
pinofal 2:2b7dc4f24d04 98
pinofal 2:2b7dc4f24d04 99 /*
pinofal 2:2b7dc4f24d04 100 // prepara il pacchetto di dati acquisiti da restituire al PC
pinofal 2:2b7dc4f24d04 101 caTxPacket[nSampleInCount]= (char)(usReadADC&0xFF);
pinofal 2:2b7dc4f24d04 102 //+++caTxPacket[nSampleInCount]= 'a';
pinofal 2:2b7dc4f24d04 103 nSampleInCount++;
pinofal 2:2b7dc4f24d04 104 caTxPacket[nSampleInCount] = (char)((usReadADC>>8)&0xFF);
pinofal 2:2b7dc4f24d04 105 //++++caTxPacket[nSampleInCount]= 'b';
pinofal 2:2b7dc4f24d04 106 */
pinofal 2:2b7dc4f24d04 107
pinofal 2:2b7dc4f24d04 108 }
pinofal 2:2b7dc4f24d04 109 }
pinofal 2:2b7dc4f24d04 110
pinofal 2:2b7dc4f24d04 111
pinofal 2:2b7dc4f24d04 112
pinofal 2:2b7dc4f24d04 113
pinofal 2:2b7dc4f24d04 114 //*******************
pinofal 2:2b7dc4f24d04 115 // Loop Principale
pinofal 2:2b7dc4f24d04 116 //*******************
pinofal 2:2b7dc4f24d04 117 int main()
pinofal 2:2b7dc4f24d04 118 {
pinofal 2:2b7dc4f24d04 119 // periodo di campionamento
pinofal 2:2b7dc4f24d04 120 int nDeltaT;
pinofal 2:2b7dc4f24d04 121
pinofal 2:2b7dc4f24d04 122 // inizializza variabili
pinofal 2:2b7dc4f24d04 123 bStop=true;
pinofal 2:2b7dc4f24d04 124
pinofal 2:2b7dc4f24d04 125 // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
pinofal 2:2b7dc4f24d04 126 pc.baud(921600); //921600 bps
pinofal 2:2b7dc4f24d04 127
pinofal 2:2b7dc4f24d04 128 // messaggio di benvenuto
pinofal 2:2b7dc4f24d04 129 pc.printf("\r\nHallo Amaldi Students - Exercise 8 \r\n");
pinofal 2:2b7dc4f24d04 130 pc.printf("\r\n*** Light Acquisition ***\r\n");
pinofal 2:2b7dc4f24d04 131
pinofal 2:2b7dc4f24d04 132 // test dei LED
pinofal 2:2b7dc4f24d04 133 led1=1; //Verde
pinofal 2:2b7dc4f24d04 134 wait_ms(1000);
pinofal 2:2b7dc4f24d04 135 led1=0;
pinofal 2:2b7dc4f24d04 136 led2=1; // Blu
pinofal 2:2b7dc4f24d04 137 wait_ms(1000);
pinofal 2:2b7dc4f24d04 138 led2=0;
pinofal 2:2b7dc4f24d04 139 led3=1; //Rosso
pinofal 2:2b7dc4f24d04 140 wait_ms(1000);
pinofal 2:2b7dc4f24d04 141 led3=0;
pinofal 2:2b7dc4f24d04 142
pinofal 2:2b7dc4f24d04 143
pinofal 2:2b7dc4f24d04 144
pinofal 2:2b7dc4f24d04 145 while(true)
pinofal 2:2b7dc4f24d04 146 {
pinofal 2:2b7dc4f24d04 147 // verifica se è arrivato un carattere dalla seriale del PC
pinofal 2:2b7dc4f24d04 148 if(pc.readable())
pinofal 2:2b7dc4f24d04 149 {
pinofal 2:2b7dc4f24d04 150 cReadChar = pc.getc(); // Read hyperterminal
pinofal 2:2b7dc4f24d04 151
pinofal 2:2b7dc4f24d04 152 if((cReadChar == 'S') || (cReadChar == 's')) // blocca acquisizione se riceve 'S' oppure 's'
pinofal 2:2b7dc4f24d04 153 {
pinofal 2:2b7dc4f24d04 154 bStop= true;
pinofal 2:2b7dc4f24d04 155 pc.printf("\n\r--- Acquisition Stopped ---\n\r");
pinofal 2:2b7dc4f24d04 156 }
pinofal 2:2b7dc4f24d04 157 if((cReadChar >= '0') && (cReadChar <='9'))
pinofal 2:2b7dc4f24d04 158 {
pinofal 2:2b7dc4f24d04 159 bStop = false;
pinofal 2:2b7dc4f24d04 160 nReadChar = cReadChar -'0'; //converte il carattere acquisito dal PC nel corrispondente valore numerico
pinofal 2:2b7dc4f24d04 161 nDeltaT = nReadChar; // sampling Period in sec
pinofal 2:2b7dc4f24d04 162 pc.printf("\n\r--- Acquisition Started DeltaT = %c ---\n\r", cReadChar);
pinofal 2:2b7dc4f24d04 163 SamplingTicker.attach(&Sampling,nDeltaT);
pinofal 2:2b7dc4f24d04 164 }
pinofal 2:2b7dc4f24d04 165
pinofal 2:2b7dc4f24d04 166 } //lettura da pc
pinofal 2:2b7dc4f24d04 167 } // while(true)
pinofal 2:2b7dc4f24d04 168 }
pinofal 2:2b7dc4f24d04 169
pinofal 2:2b7dc4f24d04 170
pinofal 2:2b7dc4f24d04 171
pinofal 2:2b7dc4f24d04 172
pinofal 2:2b7dc4f24d04 173
pinofal 2:2b7dc4f24d04 174
pinofal 2:2b7dc4f24d04 175
pinofal 2:2b7dc4f24d04 176
pinofal 2:2b7dc4f24d04 177
pinofal 2:2b7dc4f24d04 178
pinofal 2:2b7dc4f24d04 179
pinofal 2:2b7dc4f24d04 180
pinofal 2:2b7dc4f24d04 181
pinofal 2:2b7dc4f24d04 182