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 20:dd351590581d, committed 2019-03-22
- Comitter:
- francesco01
- Date:
- Fri Mar 22 11:57:01 2019 +0000
- Parent:
- 19:eb21b7baa88b
- Commit message:
- messaggio temperatura
Changed in this revision
RobotFinale5.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/RobotFinale5.cpp Wed Mar 20 12:46:02 2019 +0000 +++ b/RobotFinale5.cpp Fri Mar 22 11:57:01 2019 +0000 @@ -5,6 +5,9 @@ // mbed specific header files. #include "mbed.h" +// numero di acqusizioni su cui effettuare la media della temperatura +#define NUMSAMPLE 300 + // include suono del motore #include "SampledSoundGurgle.h" // rumore del motore da fermo durante gli spsotamenti #include "SampledSoundWelcomeDizione.h" // messaggio di benvenuto @@ -119,6 +122,32 @@ // sensore di prossimità. '1' = Sensore Presente, '0' = Sesnore Assente int nProximitySensorPresent; + + +//*************************** +// Acquisizione da ADC +//*************************** + + // 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 temperatura letto dall'ADC +volatile float fTemp; + +/*********************************************/ +/*********************************************/ + // pin di pilotaggio Motore DC DigitalOut OutMotorA (PB_0); @@ -134,7 +163,7 @@ DigitalOut LedRPD (PA_13); DigitalOut LedRPS (PA_14) ; DigitalOut LedYRAll (PC_7); // Con questo pin si pilotano contemporaneamente i Led: YLD1, YLD2, YLD3, YLD4, YLS1, YLS2, YLS3, YLS4, RPD1, RPS1 - +AnalogIn InWave(PC_0); // Input/Output Digitali usati per interfaccia RPI DigitalIn InShearRPI (PB_11, PullDown); // arriva un segnale alto su questo input quando Raspberry Invia un comando di apertura/chiusura cesoie. Collegato a Raspberry GPIO17 @@ -339,6 +368,10 @@ wait_us(57); } //++++++++++++ FINE generazione messaggio di Arrivederci +++++++++++++++++ + + + + //++++++++++++ INIZIO Spegni tutti i LED in sequenza +++++++++++++++++ // spegni tutti i LED @@ -363,10 +396,89 @@ } +/****************************************/ +/*Genera messaggio temperatura*/ +/****************************************/ + +void Sampling() +{ + // indice per l'array di DontTouch message + int nDontTouchMsgIndex; + // parametri per generare il messaggio di DontTouch + double fAmpDontTouchSound; + //double fFreqDontTouchSound; + //double fDeltaTDontTouchSound; + //++++++++++++ INIZIO generazione messaggio di Don't Touch +++++++++++++++++ + fAmpDontTouchSound = 1.0; // fissa l'amplificazione per il messaggio di DontTouch. Valori da 0[min] a 1[max] + //fFreqDontTouchSound=nSamplePerSecDontTouch/nUnderSampleFactorDontTouch;// campioni per secondo del DontTouch message da generare = nSamplePerSec/nUnderSampleFactor + //fDeltaTDontTouchSound = (1.0/fFreqDontTouchSound); // fFreq dipende dal periodo di campionamento e dal fattore di sottocampionamento + + // indice per i cicli + int nIndex; + // valore medio della temperatura su NUMACQUISISIONI acquisizioni + float fAvgTemp; + + // 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 temperatura + fAvgTemp=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 + fTemp= ((fReadVoltage-0.25)*100.0)/(3.05-0.25); //applica la formula della retta tra i valori minimo e massimo del sensore + fAvgTemp+=fTemp; + } + // calcola valore medio su NUMSAMPLE acquisizioni + fAvgTemp/= NUMSAMPLE; + + // accendi LED in base a superamento soglie + if (fAvgTemp <= 30.0) + { + // mette in output un campione della forma d'onda del DontTouch message moltiplicato per l'amplificazione fAmp + OutWave.write_u16(naInputSoundWaveDontTouch[nDontTouchMsgIndex]*fAmpDontTouchSound*fSoundGain); + + // tra un campione e l'altro attendi un periodo pari al periodo di campionamento + //wait(fDeltaTDontTouchSound); + wait_us(57); + } + else + { + } + + + + + // 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", usReadADC, fTemp); + + + + /* + // 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'; + */ + + } + + + /**************************************/ /* Genera Messaggio di Don't Touch Me */ /**************************************/ -void DontTouchMessage() +void DontTouchMessage(); + { // indice per l'array di DontTouch message int nDontTouchMsgIndex; @@ -375,7 +487,7 @@ //double fFreqDontTouchSound; //double fDeltaTDontTouchSound; - + //++++++++++++ INIZIO generazione messaggio di Don't Touch +++++++++++++++++ fAmpDontTouchSound = 1.0; // fissa l'amplificazione per il messaggio di DontTouch. Valori da 0[min] a 1[max] @@ -433,7 +545,7 @@ /* Genera il suono di una motosega. */ /* Attivo quando arriva il comando di spostamento Cesoie da Raspberry */ /***********************************************************************/ -void ShearSoundGeneration() +void ShearSoundGeneration(); { // indice per l'array di suono Shear int nShearSoundIndex; @@ -460,11 +572,11 @@ -} + /***********************************************************************/ /* generazione suoni con i sample da file di campioni in SoundSample.h */ /***********************************************************************/ -void SampleOut() +void SampleOut(); { // interrompi il suono del motore per generare altri suoni. '1' = interrompi i suoni if(bEngineSoundStop == 0) @@ -482,7 +594,7 @@ /**************************************************************************************/ /* Routine di gestione Interrupt associata al fronte di salita del segnale di encoder */ /**************************************************************************************/ -void riseEncoderIRQ() +void riseEncoderIRQ(); { nCountRiseEdge++; } @@ -490,7 +602,7 @@ /********/ /* Main */ /********/ -int main() +int main(); { // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto pc.baud(921600); //921600 bps @@ -928,11 +1040,15 @@ fSoundGain = 0.0; } // fine if(nStandByRPI == 1) - } // fine ciclo while(true) + }; // fine ciclo while(true) //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++++ FINE CICLO OPERATIVO++++++++++++++++++++++++++++++++ //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -} + + + + +