Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2017:meteostation

Meteostanice se senzory tlaku, teploty, vlhosti a O2

Zadáním tohoto projektu předmětu MPOA je naprogramovat meteostanici se výše uvedenými senzory. Původně měly být veličiny zobrazovány na LCD displeji, avšak z důvodu že použitý displej byl pouze pro 5V logiku a deska KL25Z pracuje na 3V3 logice (a během programování nebyl k dispozici převodník logické úrovně), jsou nakonec hodnoty posílány přes seriovou linku do PC, kde jsou v terminálu zobrazeny.


Použitý HW a SW

  • Senzor O2 FLUX 25%
  • Senzor tlaku MS5611-01BA03
  • Senzor teploty a rel. vlhkosti SHT-75
  • deska FRDM-KL25Z
  • MBed OS 5.0
  • PUTTY terminal

Senzor teploty a reativní vlhkosti

Jako senzor teploty a vlhkosti byl vybrán senzor SHT-75 od firmy Sensirion Datasheet. V porovnání s ostatními digitálními čidly na trhu, dosahuje nejlepší přesnosti měření při vysoké relativní vlhkosti a má dostatečný rozsah měřených hodnot. Velkou výhodou oproti ostatním snímačům teploty je, že měří nejen teplotu, ale i relativní vlhkost. Senzor komunikuje po SW definované dvouvodičové sběrnici SENSI-BUS, která připomíná I2C, avšak není s ní kompatibilní.

Zde je uveden zdrojový kód pro práce s SHT-75. Byla využita mbed knihovna „sht7X.h“. Nejprve jsou načteny surová data teploty, ty jsou výpočtem zpřesněny a násldeně jsou načtena data vlhkosti, které jsou korigována naměřenou teplotou - dle datasheetu.

void sht75_meas(void)
{
    float temperature;                    // temperature -40 to 120 deg C
    float humidity;                       // relative humidity 1% to 100%
    float humi_f,rh_lin,rh_true;           // working registers for Illustration purposes
    int t;                                // temporary store for the temp ticks
    int h;                                // temp store for the humidity ticks
 
    sht.readTempTicks(&t);
    temperature = ((float)(t) * 0.01) - 39.61;
 
    sht.readHumidityTicks(&h);
    humi_f = (float)(h);
    rh_lin = C3 * humi_f * humi_f + C2 * humi_f + C1;
    rh_true=(((temperature/100)-25)*(T1+T2*humi_f)+rh_lin);
    if(rh_true>100)rh_true=100;                             //cut if the value is outside
    if(rh_true<1)rh_true=1;                                 //the physical possible range
    humidity = rh_true;
    pc.printf("Teplota: %2.2f C Rel. vlhkost: %2.2f %%\n\r",temperature, humidity);
    wait(2.0);
}

Senzor atmosférického tlaku

Jako senzor atmosférického tlaku byl vybrán senzor MS5611-01BA03 firmy TE Connectivity Datasheet Jako senzor pro snímání atmosférického tlaku byl vybrán MS5611-01BA03 firmy TE Connectivity. Tento senzor se vyznačuje vysokou přesností měření až ±1,5 hPa a má 24 bitový AD převodník, díky čemuž dosahuje rozlišení 0,012 hPa což je adekvátní změně výšky o pouhých 10 cm. Nabízí také nejvyšší pracovní rozsah měření tlaku ze všech srovnávaných senzorů. Se senzorem je možné komunikovat po I2C nebo SPI sběrnici. Samozřejmostí je teplotní kompenzace vestavěným teplotním čidlem.

Práce se senzorem je následující: Senzor je připojen přes I2C sběrnici s uzeměným CSB pinem, který ovlivňuje poslední bit adresy (GND pro 0/ VDD pro 1). Interní paměť PROM obsahuje 6 kalibračních koeficentů, které musí být vyčteny. Následuje reset A/D převodníku, vyčtení dat teploty a tlaku a následně kalkulace a zobrazení dat.

void ms5611::calcPT() {
    int32_t D2 = cmd_adc(MS5611_CMD_ADC_D2 + MS5611_CMD_ADC_4096); // read D2
    int32_t D1 = cmd_adc(MS5611_CMD_ADC_D1 + MS5611_CMD_ADC_4096); // read D1
    int64_t dT = D2 - ((uint64_t)C[5] << 8);
    int64_t OFF  = ((uint32_t)C[2] << 16) + ((dT * (C[4]) >> 7));     //was  OFF  = (C[2] << 17) + dT * C[4] / (1 << 6);
    int64_t SENS = ((uint32_t)C[1] << 15) + ((dT * (C[3]) >> 8));     //was  SENS = (C[1] << 16) + dT * C[3] / (1 << 7);
    int32_t TEMP = 2000 + (int64_t)dT * (int64_t)C[6] / (int64_t)(1 << 23);
    T = (double) TEMP / 100.0;
 
    if(TEMP < 2000) { // if temperature lower than +20 Celsius
        int64_t T1 = ((int64_t)TEMP - 2000) * ((int64_t)TEMP - 2000);
        int64_t OFF1  = (5 * T1) >> 1;
        int64_t SENS1 = (5 * T1) >> 2;
 
        if(TEMP < -1500) { // if temperature lower than -15 Celsius
            T1 = ((int64_t)TEMP + 1500) * ((int64_t)TEMP + 1500);
            OFF1  +=  7 * T1;
            SENS1 += 11 * T1 >> 1;
        } 
        OFF -= OFF1;
        SENS -= SENS1;
    }
    P = (double)(((((int64_t)D1 * SENS ) >> 21) - OFF) / (double) (1 << 15)) / 100.0;
}

Senzor koncentrace O2

Většina dostupných senzorů koncentrace O2 na trhu fungují pouze jako signalizátory plyn je přítomen/nepřítomen. Modul UV Flux 25% se senzorem CM-0201 firmy CO2 Meter Datasheet, však měří koncentraci O2 v rozmezí 0 až 25 %. Senzor pracuje, na rozdíl od většiny elektrochemických senzorů koncentrace plynů, na principu měření útlumu UV fluorescence kyslíkem. Uvnitř senzoru je nejčastěji kov např. ruthenium, který po ozáření UV světlem fluoreskuje. Pokud známe intenzitu UV záření zdroje a porovnáme ji s detekovaným fluorescenčním zářením, je útlum úměrný koncentraci kyslíku. Tento útlum je závislý na okolní teplotě a tlaku. Senzor proto měří i tyto veličiny, aby bylo měření nezávislé na okolních podmínkách a na základě toho určí parciální tlak kyslíku, ze kterého se dá určit i jeho koncentrace v okolní atmosféře. Výhodou senzorů založených na tomto optickém principu je, že mají životnost mnohonásobně delší, než elektrochemické senzory.

Senzor obsahuje vestavěný mikrokontrolér a komunikuje po UART sběrnici. Ihned po připojení napájení se nachází v tzv. Stream módu, kdy každou vteřinu posílá řetězec 40 znaků obsahující data teploty, tlaku, koncentrace O2 a chybové hlášení. V řetězci jsou jednotlivé data odděleny identifikátory T P % e

Cílem tedy je z řetězce „vykousnout“ pouze data koncentrace O2 je je uvedeno na následujícím obrázku

void o2_meas(void)
{
    char concentration[6];//array for concentration
    char message[40]; //array for data form sensor
    char c;
    uint8_t m=0;//counter
    uint8_t i=0;//counter
    uint8_t n=0;//counter
 
    while (c!='\n') {
        if(o2_flux.readable()) {
            c=o2_flux.getc();//load characters from sensor to be shure to start from beggining of array
        }
    }
    while (i<38) { 
        if(o2_flux.readable()) {
            message[i]=o2_flux.getc();//load 50 characters from sensor to array
            i++;
        }
    }
    message[i+1]='\0';//insert end char
    while (message[m]!='%') m++; //find % separator for 02 concentration
        m=m+3; //skip % and space
        for(n=0; n<4; n++) concentration[n]=message[m+n]; //load data to another array
        concentration[n+1]='\0';//insert end char
        pc.printf("Koncentrace O2: %s %%\r\n", concentration); //display array
        pc.printf("------------------------------------\r\n"); 
        wait(1.0);
}

Závěr

Byl vytvořen obslužný program v online prostředí Mbed OS 5 pro desku FRDM-KL25Z. Během vývoje se ovšem vyskytlo několik problémů, asi největší byl ten, že i přes aktualizaci Bootloaderu i FW desky nebylo možné spolehlivě fungovat na Windows 10 a vývojová deska se samovolně odpojovala od PC. Ani aktualizaci Bootloaderu nelze provést bez pc s Win 7 nebo nižším. To bylo vyřešeno až instalací Win 7, pak již vše fungovalo korektně. Další překážka byla displej na 5V logice, toto bylo vyřešeno komunikací s deskou přes virtuální sériový port. Výsledkem je program který vyčte data teploty, vlhkosti, tlaku a koncentrace O2 a zobrazí je v aplikaci PuTTY.


Video


Zdrojové soubory

Zdroje

2017/meteostation.txt · Poslední úprava: 2018/01/14 17:53 autor: Václav Kadlček