LinkedIn YouTube Facebook
Szukaj

Wstecz
IoT

ISIX-RTOS – przykłady w języku C: termometr z wyświetlaczem LED-RGB

List. 3. Funkcja tempsensor_get()

static int tempsensor_get(float *t) 
{ 
        static const unsigned char temp_reg = MCP9800_TEMP_REG; 
        static char temp[2]; 
        int ecode; 
        //Read the temperature 
        ecode = i2cm_transfer_7bit(TEMPSENSOR_I2CADDR,&temp_reg,sizeof(temp_reg),temp,sizeof(temp)); 
        //Convert to integer 
        if(ecode>=0) 
        { 
                *t = (float)temp[0] + (temp[1]>>4)/16.0f; 
        } 
        return ecode; 
}

Tak wyliczona wartość jest przekazywana do struktury msg i przesyłana do kolejki FIFO. Za wizualizację temperatury odpowiedzialny jest wątek display_srv_task, który odbiera informację o aktualnej temperaturze z kolejki FIFO i wizualizuje ją na diodzie RGB (list. 4).

 

List. 4. Wątek odpowiadający za odbiór danych o aktualnej temperaturze z kolejki FIFO i jej wizualizację na diodzie RGB

#define COLD_VALUE 24.0f        /* Cold value */ 
#define HOT_VALUE 30.0f         /* Hot Value */
#define PWM_MAX 255             /* Maximum pwm value */ 
#define PWM_MAX_F 255.5
#define A_VALUE -0.1f           /* A value of quadratic equation */ 
#define FAIL_AMBER_VAL 200      /* Fail amber 4 PWM ratio */
 
/** Display server task */
static ISIX_TASK_FUNC(display_srv_task, entry_params) 10.{ 
        fifo_t *temp_fifo = (fifo_t*)entry_params; 
  
        struct msg msg;                 //Message structure 
        //If init rgb fail terminate task 
        if(rgb_init()<0) 
        { 
                isix_task_delete(NULL); 
        } 
        unsigned pcolor = 0; 
        for(;;) 
        { 
                //Read data from fifo 
                if(isix_fifo_read( temp_fifo, &msg,ISIX_TIME_INFINITE )==ISIX_EOK) 
                { 
                        //Display temp or error 
                        if(msg.errno>=0) 
                        { 
                                //Calculate saturation 
                                int b = PWM_MAX_F * (HOT_VALUE - msg.t)/ (HOT_VALUE-COLD_VALUE); 
                                int g = PWM_MAX_F * (A_VALUE * (msg.t-COLD_VALUE) * (msg.t-HOT_VALUE)); 
                                int r = PWM_MAX_F * (msg.t-COLD_VALUE)/ (HOT_VALUE-COLD_VALUE); 
                                if(b<0) b=0; else if(b>PWM_MAX) b=PWM_MAX; 
                                if(r<0) r=0; else if(r>PWM_MAX) r=PWM_MAX; 
                                if(g<0) g=0; else if(g>PWM_MAX) g=PWM_MAX; 
                                //Calculate color 
                                unsigned color = RGB(r,g,b); 
                                //Update britness only if color changed value 
                                if(color!=pcolor) 
                                        rgb_set_color(color); 
                                pcolor = color; 
                        } 
                        else    // If fail enable only amber 
                                rgb_set_color( RGBA( 0, 0, 0, FAIL_AMBER_VAL)); 
                } 
        } 
}