Lab3-task1

Fork of ADCandticker_sample by William Marsh

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 
00002 // LAB 3 SAMPLE PROGRAM 1
00003 //   Revised for mbed 5
00004 
00005 #include "mbed.h"
00006 
00007 
00008 
00009 Ticker tick;                // Ticker for reading analog
00010 AnalogIn ain(A0) ;          // Analog input
00011 DigitalOut led1(LED_RED);
00012  
00013 DigitalOut lede1(PTD4) ;          // Extend LED
00014 DigitalOut lede2(PTD5) ;  
00015 DigitalOut lede3(PTD2) ;  
00016 DigitalOut lede4(PTD3) ;
00017 DigitalOut lede5(PTD1) ;  
00018 
00019 
00020 InterruptIn button(PTD0); //add button
00021 volatile int pressEvent = 0 ;
00022 
00023 void buttonCallback()
00024 {   
00025    pressEvent = 1;
00026 }
00027 
00028 Serial pc(USBTX, USBRX); // tx, rx, for debugging
00029 
00030 // Message type
00031 typedef struct {
00032   uint16_t analog; /* Analog input value */
00033 } message_t;
00034 
00035 // Mail box
00036 Mail<message_t, 2> mailbox;
00037 
00038 // Function called every 10ms to read ADC
00039 // Low pass filter  
00040 // Every 10th value is sent to mailbox
00041 volatile int samples = 0 ;
00042 volatile uint16_t smoothed = 0 ; 
00043 void readA0() {
00044     smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ;
00045     samples++ ;
00046     if (samples == 10) {
00047         // send to thread
00048         message_t *mess = mailbox.alloc() ; // may fail but does not block
00049         if (mess) {
00050             mess->analog = smoothed ;
00051             mailbox.put(mess); // fails but does not block if full
00052         }
00053         samples = 0;
00054     }       
00055 }
00056 
00057 // Write voltage digits
00058 //   v  Voltage as scale int, e.g. 3.30 is 330
00059 void vToString(int v, char* s) {    
00060     s[3] = '0' + (v % 10) ;
00061     v = v / 10 ;
00062     s[2] = '0' + (v % 10) ;
00063     v = v / 10 ;
00064     s[0] = '0' + (v % 10) ;
00065 }
00066 
00067 // Main program
00068 //   Initialise variables
00069 //   Attach ISR for ticker
00070 //   Procss messages from mailbox    
00071 int main() {
00072     button.mode(PullUp);  
00073     button.fall(&buttonCallback); 
00074     
00075     led1 = 1 ; // turn off 
00076  //   led2 = 0;
00077     int volts = 0.0 ;
00078   //  const int vToString = 100 ;
00079    // const int threshold = 55;
00080  //   const std::array <int,6>threshold{55,110,165,220,275,330};
00081     int threshold[6] = {55,110,165,220,275,330};
00082     int counter = 0 ;
00083     char vstring[] = "X.XX\r\n" ;
00084 
00085 
00086     tick.attach_us(callback(&readA0), 10000); // ticks every 10ms
00087     
00088  //   tick1.attach_us(callback(&readA0), 10000); // ticks every 10ms
00089     while (true) {
00090         if (pressEvent == 1)
00091         {   
00092             for(int i =0;i<6;i++)
00093             {
00094                 threshold[i] = (volts/6)*(i+1);
00095               
00096                 pressEvent = 0;
00097             }
00098         }   
00099              
00100         osEvent evt = mailbox.get(); // wait for mail 
00101         if (evt.status == osEventMail) {
00102             message_t* mess = (message_t*)evt.value.p ;
00103             volts = (mess->analog * 330) / 0xffff ;
00104             mailbox.free(mess) ;  // free the message space
00105      
00106            if (volts<=(threshold[0]))
00107             {
00108                 led1 = 1 ;
00109                 lede1 = 0;
00110                 lede2 = 0;
00111                 lede3 = 0;
00112                 lede4 = 0;
00113                 lede5 = 0;
00114             }
00115            
00116            if ((volts<=threshold[1])&&(volts>threshold[0]))
00117             {
00118                 led1 = 1 ;
00119                 lede1 = 1;
00120                 lede2 = 0;
00121                 lede3 = 0;
00122                 lede4 = 0;
00123                 lede5 = 0;
00124             }
00125             if ((volts<=threshold[2])&&(volts>threshold[1]))
00126                 {
00127                 led1 = 1 ;
00128                 lede1 = 1;
00129                 lede2 = 1;
00130                 lede3 = 0;
00131                 lede4 = 0;
00132                 lede5 = 0;
00133             }
00134              if ((volts<=threshold[3])&&(volts>threshold[2]))
00135                 {
00136                 led1 = 1 ;
00137                 lede1 = 1;
00138                 lede2 = 1;
00139                 lede3 = 1;
00140                 lede4 = 0;
00141                 lede5 = 0;
00142             }
00143               if ((volts<=threshold[4])&&(volts>threshold[3]))
00144             {
00145                 led1 = 0 ;
00146                 lede1 = 1;
00147                 lede2 = 1;
00148                 lede3 = 1;
00149                 lede4 = 1;
00150                 lede5 = 0;
00151             }
00152                 if ((volts<=threshold[5])&&(volts>threshold[4]))
00153             {
00154                 led1 = 0 ;
00155                 lede1 = 1;
00156                 lede2 = 1;
00157                 lede3 = 1;
00158                 lede4 = 1;
00159                 lede5 = 1;
00160             }
00161             vToString(volts, vstring) ;
00162 //            vToString(threshold[5], vstring1) ;
00163             counter++ ;
00164             if (counter == 10) {  // limit bandwidth of serial
00165                 {
00166                     pc.printf(vstring);
00167  //               
00168                   
00169                 }
00170             counter = 0 ;
00171             }
00172         }
00173 
00174     }
00175 }