Code Demonstrate most of the feature of application board/ /like LED, Speaker,RGB,Joystick,LCD,POT,Accelerometer,temperature sensor/ /by using component of real time operating system such as Mutex, Threads/ Signals,Queue and Memory pool Video at https://www.youtube.com/watch?v=c0pRzfZGfV0

Dependencies:   C12832_lcd LCD_fonts LM75B MMA7660 MMA7660FC mbed-rtos mbed

main.cpp

Committer:
embeddednerd
Date:
2014-11-02
Revision:
0:9641fb66f65a

File content as of revision 0:9641fb66f65a:


/************Author embedded nerd**********************/
/*********www.embedded.zettamonk.com*******************/
/**************Free to use Lic************************/
/*************Date 28 Aug 2014***********************/
/* Code Demonstarte most of the feature of application board/
/like LED, Speaker,RGB,Joystick,LCD,POT,Accelomenter,temprature sensor/
/by using component of real time oprating system such as Mutex, Threads/
Signals,Queue and  Memorypool//////////////////////////////////////////*/

/////////////////////////////////////////Header Files//////////////////////
#include "mbed.h"
#include "rtos.h"    // real time os
#include "Small_6.h"  // LCD
#include "Small_7.h"  // LCD
#include "Arial_9.h"   // LCD
#include "stdio.h"     
#include "C12832_lcd.h"   // LCD
#include "LM75B.h"      // temprature 
#include "MMA7660FC.h"  
#include "MMA7660.h"    // Axix
#include <string>
#define SET 1
#define RESET 0 
#define ADDR_MMA7660 0x98  //// I2C SLAVE ADDR MMA7660FC


/****************************Defination and Object Creation*****************************/
C12832_LCD LCD;  // LCD object
BusOut leds(LED1,LED2,LED3,LED4); // Led decration 
AnalogIn Pot1(p19);              // Analog pin name decration 
AnalogIn Pot2(p20);              // Analog pin name decration
BusIn Up(p15);                   //Joy stick
BusIn Down(p12);                 //Joy stick
BusIn Left(p13);                    //Joy stick
BusIn Right(p16);                //Joy stick 
BusOut Reset(p14);              //Joy stick
PwmOut spkr(p26);              //Speaker 
PwmOut r (p23);                //RGB red  
PwmOut g (p24);                //RGB green
PwmOut b (p25);                // RGB blue 
LM75B sensor(p28,p27);          // I2c  
MMA7660FC Acc(p28, p27, ADDR_MMA7660);      //sda, scl, Addr
MMA7660 MMA(p28, p27);
/*****************************************************************************************/
//r.period(0);  

                            //     0      1        2       3       4       5     6        7
const string display_menu[]   = {"     ","LED  ","POT  ","Temp ","Axix ","Spker","RGB ","POT2"}; // aray to display modules on LCD
unsigned char oprate_menu[] =   {0,       0,      0,      0,       0,     0,       0,     0};     // Store Flags for module


typedef struct {
    float    voltage;  
    float    current;   
    uint32_t counter;   
} message_t;
MemoryPool<message_t, 16> mpool;
Queue<message_t, 16> queue;
                                 

//Mutex decleration of LCD
Mutex lcd_mutex;

// Semaphore Declearation of Calcualtion with two slots 
Semaphore calculate(2);
int count= 0,menu = 0;
/*////////////////////// Thread led/////////////////////////
Input:
Output: LED 
 if module flag is set than it will turn led on from 0X00 to 0X0F 
 //////////////////////////////////////////////////////////*/
void led(void const *args)
{
    
    char out =0;
    while(true) {       // thread loop
                 if (oprate_menu[1] == SET)     // Checking flag for module 
                 {
                     leds = out;                 // Turning LEd on   
                     out++;
                     if(out>16) out = 0;         // Reseting count  
                 }
                 else  leds = 0;                // If flag not set than turn of the module 
                 Thread::wait(100);             // Thread wait .1s
                }
               
}  // thread close 

/*////////////////////// Thread menu_sel/////////////////////////
Input: Joustick
Output: Set flag in oprate_menu
By using left right key user in enable to change module and by up
cown key user is able to set module on or off bye pressinf enter key 
 //////////////////////////////////////////////////////////*/
void menu_sel(void const *args)
{
    int k;
    while(true) {       // thread loop
        //LCD.locate(0,5);LCD.printf("                 ");
        
        LCD.set_font((unsigned char*) Small_7);
        if (Left)              // Checking keys 
           {
            count = 0 ;
            menu--;       // manipulating menue number as per key response 
            if(menu<1){ menu = 7;}  //
            lcd_mutex.lock();
            LCD.locate(50,10);
            LCD.printf(" %s",display_menu[menu]);    // displaying menue on LCD
            lcd_mutex.unlock(); 
             wait(1); 
           }           
        if (Right)
           {
            count = 0 ;
            menu++;
            if(menu>7) {menu = 1;}
            
            lcd_mutex.lock();
            LCD.locate(50,10);
            LCD.printf(" %s",display_menu[menu]); 
            lcd_mutex.unlock();
             wait(1); 
           //while(Right); 
           }    
         if(Up) 
                 {
                        count = 1 ;           // Manipulating flag as per selection from user 
                     LCD.set_font((unsigned char*) Small_7);
                         lcd_mutex.lock();
                         LCD.locate(50,20);
                         LCD.printf(" ON "); 
                         lcd_mutex.unlock(); 
                 }
                if(Down)
                 {
                     count = 0;
                      LCD.set_font((unsigned char*) Small_7);
                        lcd_mutex.lock();
                         LCD.locate(50,20);
                         LCD.printf(" OFF"); 
                         lcd_mutex.unlock(); 
                 }                  
        if (Reset)
            {
                     LCD.set_font((unsigned char*) Small_7);
                        lcd_mutex.lock();
                         LCD.locate(50,20);
                         LCD.printf("   "); 
                         lcd_mutex.unlock(); 
               oprate_menu[menu] = count;
               //if menu = 1 thread.signal_set(0x1);
            }    
        
        Thread::wait(10); // wait 0.5s
    }
}


/*////////////////////// Thread spk/////////////////////////
Input: 
Output: Turn on speaker on board 
Turn on PWM on speaker pin for specific period of time 
 //////////////////////////////////////////////////////////*/
void spk(void const *args)
{
   while (1) {
        if (oprate_menu[5] == SET)
        {
                for (float i=2000.0; i<10000.0; i+=500) {
                    spkr.period(1.0/i);
                    spkr=0.5;
                    wait(0.1);}
            }
        else {spkr.period(0); spkr=0;}
        Thread::wait(50);   
        }
    
}


/*////////////////////// Thread pot/////////////////////////
Input: Analog in
Output: 
Read the analog value and manupulate it for further use
 //////////////////////////////////////////////////////////*/
void pot(void const *args)
{
    int k;
    while(true)   // thread loop
    {         
      if (oprate_menu[2] == SET)
       {
            k = Pot1.read_u16();  // get the value of poti 2
            k = k >> 5;          // we need only 6 bit for contrast
             lcd_mutex.lock();
             LCD.set_font((unsigned char*) Small_6);
             LCD.locate(0,10);
             LCD.printf("Pot: %d",k);
             lcd_mutex.unlock();
            //Thread::wait(500);    // wait 0.5s
       }    
       else 
       {
           lcd_mutex.lock();
             LCD.set_font((unsigned char*) Small_6);
             LCD.locate(0,10);
             LCD.printf("        ");
             lcd_mutex.unlock();
       }     
       Thread::wait(50);      
}
}
/*////////////////////// Thread pot/////////////////////////
Input:
Output: PWM output to RGB led Pin 
Multicolor LED display diffrent colors as per PWM cycle in set
 //////////////////////////////////////////////////////////*/
void rgb(void const *args)
{
      while(1) {
        if (oprate_menu[6] == SET)
        {
                
                       r = 0.5 + (rand() % 11)/20.0;
                        g = 0.5 + (rand() % 11)/20.0;
                        b = 0.5 + (rand() % 11)/20.0;
       
        }    
        
        else {r =.1;g=0;b=0;}
        Thread::wait(500); 
    }
}

/*////////////////////// Thread temp/////////////////////////
Input:
Output: PWM output to RGB led Pin 
Multicolor LED display diffrent colors as per PWM cycle in set
 //////////////////////////////////////////////////////////*/

void temp(void const *args)
{
    
  int k;
    while(true)   // thread loop
    {  
        if (oprate_menu[3] == SET)       
           {
             lcd_mutex.lock();
            LCD.set_font((unsigned char*) Small_6);
            LCD.locate(0,20);
            LCD.printf("Temp:%.1f", (float)sensor);
            lcd_mutex.unlock();
            Thread::wait(50);
           }
         else 
           {
              lcd_mutex.lock();
             LCD.set_font((unsigned char*) Small_6);
             LCD.locate(0,20);
            LCD.printf("          ");
            lcd_mutex.unlock();
            Thread::wait(50);
           }       
     
     
    Thread::wait(50);    // wait 0.5s
}
}

/*////////////////////// Thread AXIX/////////////////////////
Input: I2C data 
Output: 
Draw a circle and a buble in it. Buble move with respond to 
change in axix of board 
 //////////////////////////////////////////////////////////*/
void axix(void const *args)
{
   // Acc.init(); 
   float x=0, y=0, z=0;
    while(1)
    {   
        //int x=0,y=0;
        if (oprate_menu[4] == SET) 
        {    
            
             Acc.read_Tilt(&x, &y, &z); 
            lcd_mutex.lock();
            x = (x + MMA.x() * 32.0)/2.0;
        y = (y -(MMA.y() * 16.0))/2.0;
       // if(y>25) y = 0; //else if(y<0) y = 0;
        if(y>8) y =8; if(y<-8) y =-8; if(x>8) x =8; if(x<-8) x =-8; // confining 
        LCD.fillcircle(x+115, y+17, 2, 1); //draw bubble
        LCD.circle(115, 17, 8, 1);
        wait(.1); //time delay
        LCD.fillcircle(x+115, y+17, 2, 0); //erase bubble
           
            lcd_mutex.unlock();
           // LCD.locate(0,3);
            wait_ms(100); 
        }
        else 
        {
             lcd_mutex.lock();
              LCD.circle(115, 17, 8, 0);
             // LCD.locate(0,3);
            lcd_mutex.unlock();
          }
          Thread::wait(10);  
    }
}
 
/*////////////////////// Memory pool example and Semaphore///////////////
Output: 

 //////////////////////////////////////////////////////////*/ 
void calci(void const *args) {
    uint32_t i = 0;
    while (true) {
        calculate.wait();  //semaphore 
        i = Pot2.read_u16();; 
        i = (i>>5)/2;
        message_t *message = mpool.alloc();
        message->voltage = (i * 3.3) / 1024; 
        message->current = ((i * 3.3) / 2048);
        message->counter = i;
        queue.put(message);
        calculate.release();
        Thread::wait(100000);
    }
}          

// print the actual contrast 
int main()
{
    int j;
  //  r =0; b=0;g=0;
    LCD.cls();
     LCD.set_font((unsigned char*) Small_7);
    LCD.locate(0,0);
    LCD.printf("  embedded.zettamonk.com");
   /////////////////////////////Threads///////////////////
    Thread t1(led); //start thread1
    Thread t2(menu_sel); //start thread2
    Thread t3(spk); //start thread3
    Thread t4(pot); //start thread4
    Thread t5(rgb); //start thread4
    Thread t6(temp); //start thread4
    Thread t7(axix);
    Thread t8(calci);
    Thread t9(calci);
  ////////////////////////////////////////////////  
    while(true) {       // main is the next thread
         
         if (oprate_menu[7] == SET)
         {
                     LCD.set_font((unsigned char*) Small_7);
                    LCD.locate(0,0);
                    
                    osEvent evt = queue.get();
                    if (evt.status == osEventMessage) {
                        message_t *message = (message_t*)evt.value.p;
                        lcd_mutex.lock();
                        LCD.printf("   V:%.2fv"   , message->voltage);
                        LCD.printf(" I:%.2fA"     , message->current);
                        LCD.printf(" R: %u  ", message->counter);
                        lcd_mutex.unlock();
                        mpool.free(message);
                  
                    
                    // wait(.2);
         }
         else 
          {          LCD.set_font((unsigned char*) Small_7);
                    LCD.locate(0,0);
                    lcd_mutex.lock();
                    LCD.printf("embedded.zettamonk.com");
                     lcd_mutex.unlock(); 
          }         
         
         Thread::wait(100);   // wait 0.5s
    }
}
}