HaaSEDUシナリオベースのアプリケーション学習-温度計と湿度計

1.実験の紹介

この実験では、主に温度計と湿度計の実現を紹介します。この製品には、温度と湿度のセンサーSI7006が搭載されています。センサーは温度だけでなく相対湿度も測定できます。

この実験では、haas1000を使用してSI7006デジタル温度および湿度センサーを読み取り、周囲温度や相対湿度などの情報を取得し、OLEDモジュールに温度と湿度の値を表示する方法を示します。

学習を始める前に、次の図に示すように、表示効果を見てみましょう。

 

 

2.知識ポイントを含む

  • I2C通信原理
  • SI7006照明および近接センサーの原理
  • OLED図面
     

2.1、I2C通信原理

IICバスは、もともとPHILIPSによって開発された2線式シリアルバスであり、マイクロコントローラとその周辺機器を接続するために使用されます。データラインSDAとクロックSCLで構成され、データを送受信できるシリアルバスです。CPUと被制御IC間、およびICとIC間で双方向伝送を行います。高速IICバスは一般に400kbps以上に到達します。

I2Cバスには、データを送信する過程で、開始信号、終了信号、応答信号の3種類の信号があります。

開始信号:SCLがHighの場合、SDAはHighからLowにジャンプし、データの送信を開始します。

終了信号:SCLがハイレベルの場合、SDAはローレベルからハイレベルにジャンプし、データ送信を終了します。

応答信号:8ビットデータを受信した後、データ受信ICは特定の低レベルパルスをデータ送信ICに送信して、データが受信されたことを示します。CPUは、被制御ユニットに信号を送信した後、被制御ユニットが応答信号を送信するのを待ち、応答信号を受信した後、実際の状況に応じて信号を送信し続けるかどうかを決定します。応答信号が受信されない場合は、制御ユニットが故障していると判断されます。

波形は次のとおりです。

 

2.2SI7006センサーの概要

  SI7006は、Silicon Labが発売した相対湿度および温度センサーです。工場で校正された湿度および温度センサー要素、アナログ-デジタルコンバーター、信号処理、およびI2Cホストインターフェイスを組み合わせています。業界標準の低K誘電性ポリマーを使用することで、優れた精度と長期安定性を実現し、ドリフトとヒステリシスを低減します。同時に、その革新的なCMOS設計により、消費電力を非常に低く抑えることができます。

特徴:

  • 相対湿度センサー:
  • ±5%RH(最大)@ 0-80%RH
  • 温度センサー:
  • ±1.0°Cの精度(最大)@ -10〜 + 85°C
  • 0〜100%RHの動作範囲
  • 最大-40〜 + 125°Cの動作範囲
  • 広い動作電圧範囲(1.9〜3.6V)
  • 低消費電力:2.2μWの平均電力は3.3V、1秒あたり1サンプル
  • I2Cホストインターフェース
  • オンチップ統合ヒーター
  • 3mm x 3mmQFNパッケージで利用可能
  • 優れた長期安定性
  • 工場校正をサポート
  • 逆流時および動作寿命中の保護
  • 汚染されたほこり、汚れ、家庭用化学薬品、その他の液体を防ぎます

 

応用:

  • 資産と貨物の追跡
  • 自動車の空調と曇り止め
  • ベビーモニター
  • 持続的気道陽圧法(CPAP)マシン
  • 洪水と水の検出
  • ガス、火災、煙探知器
  • 携帯電話/スマートフォン
  • 産業用HVAC / R
  • ラップトップ/タブレット
  • レーザープリンター
  • 微小環境/データセンター
  • PLCおよびIOモジュール
  • リモートテレメトリデバイス
  • タブレット
  • テストと測定
  • 一定温度/一定湿度
  • 換気および空調システム
  • 気象台
  • 風力インバーター
  • フロントガラスとバックミラーシステム
  • 無線基地局
  • ワイヤレスセンサーネットワーク

 

2.3、OLED図面

前の実験を参照してください。

 

3.ソフトウェアおよびハードウェア環境の準備

3.1、ハードウェア

  • 1台の開発用コンピューター
  • 1つのHaaSEDU K1開発ボード(開発ボードにはSI7006センサーが組み込まれています)
  • USBType-Cデータケーブル1本

 

3.2ソフトウェア

温度計」機能はedu_demoアプリケーションに含まれており、リリースバージョンに含まれています。システムを再起動して画面を切り替えるたびに、温度や相対湿度などの情報を確認できます。

3.2.1、ファームウェアバージョン

バージョン番号:VER 1.0.0

 

3.2.2、コードパス

コードをダウンロード

git clone https://github.com/alibaba/AliOS-Things.git -b dev_3.1.0_haas

国内ユーザーの場合、githubからのダウンロードが遅くなるのを避けるために、giteeからダウンロードできます。

git clone https://gitee.com/alios-things/AliOS-Things.git -b dev_3.1.0_haas

 

コンパイル

AliOS-Thingsなどのコードの最上位ディレクトリを入力してコンパイルします。デモアプリは、application / example /ディレクトリ、または自分で開発したアプリで直接コンパイルできます。以下の例として、helloworld_demoをコンパイルします。

aos make edu_demo@haaseduk1 -c config

aos make

 

ホーム画面で必要なファイルの相対パスは次のとおりです。

application/example/edu_demo/k1_apps/homepage/homepage.c

application/example/edu_demo/k1_apps/homepage/homepage.h

application/example/edu_demo/app_entry.c

 

燃焼方法

開発環境の章を参照してください

 

3.2.3、始めましょう

実験結果は以下のとおりです。

最初の行は摂氏で温度を示し、2番目の行は%で湿度値を示します

以下に示すように:

 

4.ハードウェア設計

この実験では、SI7006がマザーボードに取り付けられ、中央のI2CがMCUと通信します。回路図は次のとおりです。

EDUSI7006の部分的な概略図

5.ソフトウェア設計

5.1、アプリケーションコード部分

ファイルパスは次のとおりです。

application / example / edu_demo / k1_apps / humiture / humiture.c

application / example / edu_demo / k1_apps / humiture / humiture.h

        si7006_getTempHumidity(&hump, &temp);

        sprintf(temp_str, "T:%5.1fC", temp);

        sprintf(hump_str, "H:%5.1f%%", hump);



        OLED_Icon_Draw(14, 4, &icon_thermometer_24_24, 0);

        OLED_Icon_Draw(14, 36, &icon_hygrometer_24_24, 0);



        OLED_Icon_Draw(2, 24, &icon_skip_left, 0);

        OLED_Icon_Draw(122, 24, &icon_skip_right, 0);



        OLED_Show_String(42, 8, temp_str, 16, 1);

        OLED_Show_String(42, 40, hump_str, 16, 1);



        OLED_Refresh_GRAM();

        aos_msleep(500);

5.2、駆動部

ファイルパスは次のとおりです。

コンポーネント/周辺機器/センサー/drv/drv_temp_humi_si_si7006.c

全体的なドライバーコードは、主に3つの部分に分かれています。

  • 製品IDを取得する
  • 温度値を取得する
  • 湿度値を取得する
void si7006_getID(uint8_t *id_buf)

{

    uint8_t reg[4]  = {Si7006_READ_ID_LOW_0,Si7006_READ_ID_LOW_1,Si7006_READ_ID_HIGH_0,Si7006_READ_ID_HIGH_1};



    hal_i2c_master_send(&i2c_dev, i2c_dev.config.dev_addr, reg, 2, 1000);

    aos_msleep(30);

    hal_i2c_master_recv(&i2c_dev, i2c_dev.config.dev_addr, id_buf, 4, 1000);



    hal_i2c_master_send(&i2c_dev, i2c_dev.config.dev_addr, &reg[2], 2, 1000);

    aos_msleep(30);

    hal_i2c_master_recv(&i2c_dev, i2c_dev.config.dev_addr, &id_buf[4], 4, 1000);



    return;

}



bool si7006_getTemperature(float *temperature)

{

    uint8_t reg  = Si7006_MEAS_TEMP_NO_MASTER_MODE;

    uint8_t read_data[2] = {0};

    unsigned int value;



    hal_i2c_master_send(&i2c_dev, i2c_dev.config.dev_addr, &reg, 1, 1000);

    aos_msleep(30);

    hal_i2c_master_recv(&i2c_dev, i2c_dev.config.dev_addr, read_data, 2, 1000);

    value = (read_data[0] << 8) | read_data[1];

    LOGI("APP", "%0x -- %0x -->0x%x\n", read_data[0],read_data[1],value);

    // A temperature measurement will always return XXXXXX00 in the LSB field.

    if (value & 0xFFFC)

    {

        *temperature = (175.72f * (float)value) / 65536.0f - 46.85f;

        LOGI("APP", "temperature: %2f \n", *temperature);

    }

    else

    {

        LOGI("APP", "Error on temp\n");

        return 1;

    }

    return 0;

}



/*

i2c – the i2c device

dev_addr – device address

mem_addr – mem address

mem_addr_size – mem address

data – i2c master send data

size – i2c master send data size

*/

bool si7006_getHumidity(float *humidity)

{

    uint8_t reg  = Si7006_MEAS_REL_HUMIDITY_NO_MASTER_MODE;

    uint8_t read_data[3] = {0};

    unsigned int value;



    hal_i2c_master_send(&i2c_dev, i2c_dev.config.dev_addr, &reg, 1, 1000);



    aos_msleep(30);



    hal_i2c_master_recv(&i2c_dev, i2c_dev.config.dev_addr, read_data, 2, 1000);

    value = (read_data[0] << 8) | read_data[1];

    LOGI("APP", "%0x -- %0x -->0x%x\n", read_data[0],read_data[1],value);

    if (value & 0xFFFE)

    {

        *humidity = ((125.0f * (float)value ) / 65535.0f) - 6.0f;

        LOGI("APP", "humidity: %f \n", *humidity);

    }

    else

    {

        LOGI("APP", "Error on humidity\n");

        return 1;

    }

    return 0;

}



//get temp and humidity

void si7006_getTempHumidity(float *humidity, float *temperature)

{

    si7006_getTemperature(temperature);

    si7006_getHumidity(humidity);

}

6.開発者のテクニカルサポート

さらにテクニカルサポートが必要な場合は、DingTalk開発者グループに参加するか、WeChatパブリックアカウントをフォローしてください。

テクノロジーとソリューションの詳細については、AliyunAIoTホームページhttps://iot.aliyun.com/をご覧ください。

おすすめ

転載: blog.csdn.net/HaaSTech/article/details/114004725