es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Necesito ayuda para obtener datos de dos sensores distintos utilizando el lenguaje de programación C.

Entonces básicamente tengo un sensor de temperatura y un fotoresistor y estoy tratando de averiguar cómo separar los valores que estoy obteniendo. Esto es lo que he hecho hasta ahora:

#define type_temp 0 

#define type_photo 1

typedef struct AMESSAGE{

    char        type;
    uint8_t     adc;

} AMESSAGE;

Intenté definir dos tipos diferentes de datos y asignar eso a cada ADC en mi proyecto. Luego intenté llamar a estos dos tipos diferentes en mi proyecto y no funcionó. Me pregunto qué estoy haciendo mal. Mi mejor suposición es que estoy creando la estructura de forma incorrecta.

void MyTask1(void *pvParameters)
{

    AMESSAGE    xMessage;
    uint8_t     adc;
    uint8_t     adc1;
    int16_t     vin;
    int16_t     vin1;
    char        str[80];

    ADC_StartConvert();
    ADC1_StartConvert();

    while(1){
        if (ADC_IsEndConversion(ADC_RETURN_STATUS)){ //ADC_WAIT_FOR_RESULT) ){
            adc = ADC_GetResult8();
            vin = ADC_CountsTo_mVolts(adc);   
            xMessage.adc = adc;            

        while ( xQueueSendToBack(xQueue, &xMessage.adc, pdMS_TO_TICKS(10)) != pdPASS){};

        } 
        vTaskDelay( pdMS_TO_TICKS(20)); // Retraso de 20ms  


    if (ADC1_IsEndConversion(ADC1_RETURN_STATUS)){ //ADC_WAIT_FOR_RESULT) ){
        adc1 = ADC1_GetResult8();
        vin1 = ADC1_CountsTo_mVolts(adc1);   
        xMessage.adc = adc1;            

        while ( xQueueSendToBack(xQueue, &xMessage.adc, pdMS_TO_TICKS(10)) != pdPASS){};

        } 
        vTaskDelay( pdMS_TO_TICKS(20)); // Retraso de 20ms  
        }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que solo estás asignando el valor ADC a la estructura AMESSAGE y no el tipo de datos (temperatura o foto). Deberías modificar tu código para incluir el tipo al crear el mensaje:

    if (ADC_IsEndConversion(ADC_RETURN_STATUS)){ //ADC_WAIT_FOR_RESULT) ){
        adc = ADC_GetResult8();
        vin = ADC_CountsTo_mVolts(adc);
        xMessage.adc = adc;
        xMessage.type = type_temp; // Establece el tipo como temperatura
        while ( xQueueSendToBack(xQueue, &xMessage, pdMS_TO_TICKS(10)) != pdPASS){};
    }
    

    De manera similar, para el fotoresistor:

    if (ADC1_IsEndConversion(ADC1_RETURN_STATUS)){ //ADC_WAIT_FOR_RESULT) ){
        adc1 = ADC1_GetResult8();
        vin1 = ADC1_CountsTo_mVolts(adc1);
        xMessage.adc = adc1;
        xMessage.type = type_photo; // Establece el tipo como fotoresistor
        while ( xQueueSendToBack(xQueue, &xMessage, pdMS_TO_TICKS(10)) != pdPASS){};
    }
    

    Luego, al recibir mensajes de la cola, puedes verificar el tipo de datos antes de procesarlo:

    AMESSAGE rxMessage;
    while ( xQueueReceive(xQueue, &rxMessage, portMAX_DELAY ) != pdPASS ){};
    
    if(rxMessage.type == type_temp){
      // Procesar datos de temperatura
    } else if (rxMessage.type == type_photo){
      // Procesar datos del fotoresistor
    }
    

Comments are closed.