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
Diff: StripLed-ProxSensor.cpp
- Revision:
- 10:fe07fdd23dec
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/StripLed-ProxSensor.cpp Fri Dec 07 17:02:54 2018 +0000
@@ -0,0 +1,162 @@
+
+/* mbed specific header files. */
+#include "mbed.h"
+
+// TimeOut in [microsec] per verificare la presenza del sensore prossimità. Se il sensore non è presente il timer supera TIMEOUTPROXSENSOR
+#define TIMEOUTPROXSENSOR 1000 //tempo in [microsec]
+
+// seriale, pulsante Blu e LED verde su scheda
+Serial pc(USBTX, USBRX);
+DigitalOut myLed (LED2);
+DigitalIn myButton(USER_BUTTON);
+
+
+//AnalogOut OutRed(PA_0);
+//AnalogOut OutBlue(PA_1);
+//AnalogOut OutGreen(PA_4);
+
+DigitalOut OutRed(PA_0);
+DigitalOut OutBlue(PA_1);
+DigitalOut OutGreen(PA_4);
+
+// Pin su cui è collegato il sensore di prossimità
+DigitalInOut InOutProxSensor (PC_0, PIN_OUTPUT, PullDown, 0); // Pin di tipo In-Out per la gestione del segnale Sig del Sensore di prossimità a ultrasuoni
+
+// Indici per i cicli
+int nIndex, nIndexBlue, nIndexRed, nIndexGreen;
+
+// Timer per il calcolo dei tempi del sensore di prossimità
+Timer TimerProxSensor;
+
+// distanza in cm dell'ostacolo
+double fDistance;
+
+// tempo inizio intermedio e fine del timer che misura la distanza con il sensore ultrasuoni
+int nTimerStart, nTimerCurrent, nTimerStop, nTimerTillNow;
+
+
+
+
+
+/********/
+/* Main */
+/********/
+int main()
+{
+ // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
+ pc.baud(921600); //921600 bps
+
+ // Inizializza LED con sequenza
+ OutRed=0;
+ OutBlue=0;
+ OutGreen=0;
+ //OutGreen.write_u16(0);
+
+ wait_ms(500);
+ OutRed = 1;
+ wait_ms(500);
+ OutGreen = 1;
+ wait_ms(500);
+ OutBlue = 1;
+ wait_ms(500);
+
+
+ OutRed = 0;
+ wait_ms(300);
+ OutGreen = 0;
+ wait_ms(300);
+ OutBlue = 0;
+ wait_ms(500);
+
+
+
+
+ while(true)
+ {
+ //++++++++++++++ INIZIO Acquisisci distanza ostacoli +++++++++
+ //inizializza misura di distanza
+ fDistance=0.0;
+ // Fissa come Output il pin InOutProxSensor
+ InOutProxSensor.output();
+ // Poni 'L' sul Pin e mantienilo per qualche microsecondo
+ InOutProxSensor.write(0);
+ wait_us(5);
+ // Poni 'H' sul Pin e mantienilo per qualche microsecondo
+ InOutProxSensor.write(1);
+ wait_us(10);
+ // Poni 'L' sul Pin e mantienilo per qualche microsecondo
+ InOutProxSensor.write(0);
+ // Attendi assestamento e Fissa come Input il pin InOutProxSensor
+ wait_us(5);
+ InOutProxSensor.input();
+ InOutProxSensor.mode(PullDown); // se non è presente il sensore, il pin rimane a '0'
+
+ // attende la risposta del sensore di prossimità per un tempo fissato da TIMEOUTPROXSENSOR. Dopo tale tempo dichiara inesistente il sensore
+ TimerProxSensor.start();
+ nTimerStart = TimerProxSensor.read_us();
+ nTimerTillNow=(TimerProxSensor.read_us()-nTimerStart);
+ while((InOutProxSensor ==0) && (nTimerTillNow< TIMEOUTPROXSENSOR))
+ {
+ nTimerCurrent = TimerProxSensor.read_us();
+ nTimerTillNow=nTimerCurrent-nTimerStart;
+ myLed=1; // se rimane nel while il LED rimane acceso
+ //pc.printf("sono qui 2 \r\n"); //scopi diagnostici
+ }
+ TimerProxSensor.stop(); // spegne il timer che serve per misurare il timeout quando assente il sensore di prossimità
+ //pc.printf("\r\nUscita dal while, nTimerTillNow = %d\r\n", nTimerTillNow); //scopi diagnostici
+ // se nTimerTillNow è inferiore al TIMEOUT, il sensore è presente e quindi misura la distanza dell'ostacolo
+ if(nTimerTillNow < TIMEOUTPROXSENSOR)
+ {
+ // riattiva il timer per misurare la distanza dell'ostacolo
+ TimerProxSensor.start();
+ nTimerStart = TimerProxSensor.read_us();
+ while(InOutProxSensor == 1)
+ {
+ myLed=1; // se rimane nel while il LED rimane acceso
+ }
+ TimerProxSensor.stop();
+ nTimerStop = TimerProxSensor.read_us();
+
+ //pc.printf("\r\nSensore Presente, nTimerTillNow = %d\r\n", nTimerTillNow); //scopi diagnostici
+
+ // velocità del suono = 343 [m/s] = 0.0343 [cm/us] = 1/29.1 [cm/us]
+ // tempo di andata e ritorno del segnale [us] = (TimerStop-TimerStart)[us]; per misurare la distanza bisogna dividere per due questo valore
+ // distanza dell'ostacolo [cm] = (TimerStop-TimerStart)/2 [us] * 1/29.1[cm/us]
+ fDistance = (nTimerStop-nTimerStart)/58.2;
+ // invia il dato al PC
+ pc.printf("Distanza dall'ostacolo = %f0.2\r\n", fDistance);
+ }
+ else
+ {
+ // quando esce dai while bloccanti, il LED si spegne
+ myLed=0;
+ pc.printf("\r\nTimeOut\r\n");
+ }
+ //++++++++++++++ FINE Acquisisci distanza ostacoli +++++++++
+
+ //++++++++++++++ INIZIO pilota accensione delle strip LED +++++++++++++++++++++++++
+ //escludi le misure oltre il max
+ if((fDistance <= 50.0) && (fDistance >= 3))
+ {
+ OutRed = 1;
+ wait_ms(300);
+ //OutGreen.write_u16(32767);
+ OutGreen =1;
+ wait_ms(300);
+ OutBlue = 1;
+ wait_ms(300);
+ }
+ else
+ {
+ OutRed = 0;
+ wait_ms(300);
+ //OutGreen.write_u16(0);
+ OutGreen =0;
+ wait_ms(300);
+ OutBlue = 0;
+ wait_ms(300);
+ }
+ //++++++++++++++ FINE pilota accensione delle strip LED +++++++++++++++++++++++++
+ wait_ms(200);
+ }// while(true)
+}