従来の電気対流をワイヤレスに変える

背景



私の家は電気対流によって熱せられています。 それらについてのすべては良いです:インストールと自動温度制御の両方、昼/夜モードと50%の電力モードの両方。 しかし、マイナスもあります-空気温度センサーはコンベクター本体に直接取り付けられているため、加熱されて冷却されます。 このため、コンベクターは必要以上に頻繁にオン/オフになります。部屋に希望の気温を設定することは不可能です。 実際の値は5度低くなり、コンスタントスイッチングリレーの信頼性は信頼性に悪影響を及ぼします。 もちろん、温度センサーを長くして取り去ることもできますが、これは私たちの方法ではありません。 なぜなら 私は長い間ワイヤレス技術に携わっており、いくつかの成果があります。コンベクタにワイヤレス温度センサーを装備することにしました。 これにより、部屋のどこにでも配置でき、ワイヤーを引っ張らずに、必要に応じて、1つではなく複数のセンサーを使用して、部屋の平均温度を計算できます。 (カット画像の下)



変更



私が言ったように、私は多くのワイヤレスの仕事をしており、このトピックに関していくつかの仕事をしています。 ZigBeeはさまざまなセンサーの監視に最適であり、ZigBeeマイクロコントローラーとして、私はJennicのJN5148(NXPで購入)を長い間使用しています。 モックアップをすばやく作成するために、このマイクロコントローラーでいくつかのモジュールを作成しました。





モジュール図(クリック可能):

画像

マイクロコントローラー自体、その外部プログラムメモリ(JN5148に必要なコンポーネント)、水晶、電力線に沿ったコンデンサー、アンテナ付きのRF部品がモジュール回路に含まれています。 クイックスタートのために必要なのは、プログラミングコネクタと3.3 V電源だけです。seeedstudioでスカーフを安くて怒って注文しました。 すぐに素晴らしいものを積み重ねるために。

温度センサーも前もって作られ、翼で待っていました。





センサー回路(クリック可能):



温度計として、Texas InstrumentsのTMP102チップを使用しました。 チップは非常に安価で、-25 .. + 85の範囲で0.5度の精度で温度を測定します。アクティブモードで10μA、スリープモードで1μAの消費電流を持ち、非常にコンパクトで、1.4〜3.6 Vの供給電圧の範囲でも動作します。単一のリチウム電池で駆動する場合に重要です。 それ以外の場合、センサー回路は、バッテリー、その電圧を測定するための分周器、電源スイッチ、プログラミングコネクタの存在によってモジュール回路と異なります。

アイロンを終了して実際の変更に進むには、まず実行して、最初に温度を測定し、それをコンベクターに渡し、ネイティブセンサーの代わりにマイクロコントローラーに何らかの方法でスリップしたかったと言います。 その後、PCからリモートで温度しきい値を設定するというアイデアが生まれました。 このために、同じJN5148でUSBホイッスルを使用しました。



スキーム(クリック可能):



ホイッスル回路には、前述のモジュールの回路と、マイクロコントローラーのプログラマーでもあるFT232Rチップ上のUSB-UARTコンバーターが含まれます。

それでは、リバースエンジニアリングに進みましょう。 電子制御システムを備えた1000 Wの出力を持つBalluコンベクターを被験者として使用しました。 コンベクターを分解すると、2つのボードが見つかりました。電源ボードと制御ボードです。



パワーボード:





制御盤:





電源ボードには、主電源、電圧レギュレータ+ L7805の5V、500W(50%)または1000W(100%)の負荷とブザーを含む2つのリレーがあります。 別々に配置された温度ヒューズと空気イオナイザー。 制御ボードには、マイクロコントローラー、ボタン、7セグメント温度インジケーターがあります。

検査の結果、温度を測定するために半導体ダイオードが使用されていることがわかりました。ご存知のように、温度に対する直接電圧降下の直線的な依存性があります。 ダイオードは分圧器の上アームに含まれており、分圧器からの電圧はマイクロコントローラーのADCの入力に供給されます。



この測定方式に基づいて、温度センサーをエミュレートする最も簡単な方法は、JN5148に搭載されているDACからコンベクターのADCに電圧を印加することです。 なぜなら コンベクター内のコントローラーの電源電圧(および同時に基準ADC)は5 Vであり、DACの基準-2.4では、オペアンプを使用してDACからの電圧を約2倍上げる必要があります。 これに基づいて、温度センサーエミュレーターの図を作成します(クリック可能)。





モジュールに加えて、オペアンプアンプ、JN5148に電力を供給するための5 V-3.3 Vコンバータ、およびプログラミングコネクタが含まれています。 次に、鉄、毒、ドリル、錫、はんだの板を作ります。









ボードを所定の位置に取り付けて、コーディングを開始します。 ところで、制御ボードが電源ボードから切り離されているという事実は非常に便利であることが判明しました。 +5 Vを印加するだけで十分に自律的に動作するため、システムを完全にデバッグした後、convectorにインストールしました。



プログラミング



経験的に、ADCの入力の電圧に対するコンベクタによって測定された温度の依存性を取り除きました。



範囲の中央では、実際の特性と理想的な特性の差は約1度であることがわかります。そのため、対応するDACコードをアレイに書き込み、温度に応じて、アレイから目的のコードを取得してDACに送信することにしました。



プログラミングの基礎として、Jennicのテンプレート-JN-AN-1123-ZBPro-Application-Templateを使用しましこちらからダウンロードできます 。 ZigBeeネットワークのすべての基本機能を実装します。ZigBeeネットワークは、マイクロコントローラ用のJennicの独自開発であるJenOSオペレーティングシステムに基づいて動作します。 興味のある人はテンプレートをダウンロードして見ることができますが、ここでは最も重要なコードのみを提供します。

このシステムは、ZigBeeネットワーク内のすべてのタイプのデバイス(コーディネーター(コンベクター)、ルーター(USBホイッスル)、およびスリープ状態の端末デバイス(センサー))を提示します。 最もシンプルなものから始めましょう-USBホイッスルを使って。 彼は、コンピューターからのバイトをUARTでスキャンし、受信したバイトをコーディネーターに送信することにコミットしています。

スキャン機能は、50ミリ秒ごとに実行されるオペレーティングシステムタスクです。 コマンドが到着したかどうかをチェックし、メインタスクによって処理されるメッセージキューに到着したすべてのコマンドを発行します。

OS_TASK(APP_CommandScan) { APP_tsEvent sCommandEvent; int16 word; //    word=i16Serial_RxChar(E_AHI_UART_0); //  if(word != -1) { //      sCommandEvent.eType = APP_E_EVENT_COMMAND; sCommandEvent.sCommand.u8Value = (uint8)word; OS_ePostMessage(APP_CommandEvent, &sCommandEvent); } //   OS_eContinueSWTimer(APP_tmrCommandScan, APP_TIME_MS(50), NULL); }
      
      





メインループでは、すべての着信コマンドがコーディネーターに送信されます。

 //        if (APP_E_EVENT_COMMAND == sAppEvent.eType) { //  APDU PRIVATE PDUM_thAPduInstance s_hAPduInst = PDUM_INVALID_HANDLE; // APDU    s_hAPduInst = PDUM_hAPduAllocateAPduInstance(apduCommand); //  APDU    PDUM_u16APduInstanceWriteNBO(s_hAPduInst, 0, //    "b", // ,    (b) sAppEvent.sCommand.u8Value); //  APDU  1  PDUM_eAPduInstanceSetPayloadSize(s_hAPduInst, 1); // ,   ,      u8Status = ZPS_eAplAfUnicastDataReq(s_hAPduInst, MYPROFILE_MYCLUSTER_CLUSTER_ID, USBSTICK_MYENDPOINT_ENDPOINT, THERMOSTAT_MYENDPOINT_ENDPOINT, 0x0000, //  (   ) ZPS_E_APL_AF_UNSECURE, 0, &u8SeqNum); }
      
      





温度センサーは毎秒1回起動し(時間はもちろん調整可能です)、バッテリーの温度と電圧を測定し、すべてをコンベクターに送信し、再びスリープ状態になります。

 PRIVATE void vSendSensorData() { uint8 u8Status; uint8 u8SeqNum; //     SensorData NewSensorData; //     NewSensorData.TempValue = TempMeasurement(); NewSensorData.BattValue = BatVoltageMeasurment(); //       //   ,      uint32 MacH, MacL; MacH = MacAddr.u32H; MacL = MacAddr.u32L; //  APDU PRIVATE PDUM_thAPduInstance s_hAPduInst = PDUM_INVALID_HANDLE; // APDU    s_hAPduInst = PDUM_hAPduAllocateAPduInstance(apduTemperature); //  APDU    PDUM_u16APduInstanceWriteNBO( s_hAPduInst, 0, //    "wwbh", //  (    //   32-  (ww) // 8- (b)   16- (h) MacH, MacL, NewSensorData.TempValue, NewSensorData.BattValue); //      11  PDUM_eAPduInstanceSetPayloadSize(s_hAPduInst, 11); //           u8Status = ZPS_eAplAfBroadcastDataReq(s_hAPduInst, MYPROFILE_TEMPERATURE_CLUSTER_ID, TEMPSENSOR_TEMPSENSORENDPOINT_ENDPOINT, 0xFF, ZPS_E_BROADCAST_ZC_ZR, ZPS_E_APL_AF_UNSECURE, 0 , &u8SeqNum); }
      
      





次に、コーディネーターはデータの送信元を決定し、それが温度である場合、DAC出力に対応する電圧を設定し、コンピューターからのコマンドである場合、温度設定ボタンにパルスを出力します(押すことをエミュレートします)。

温度設定機能:

 void SetTemp(int8 temp) { //,       if(temp > 33) temp = 33; else if(temp < 0) temp = 0; //  ,    vAHI_DacOutput(E_AHI_AP_DAC_1, temp_levels[temp]); }
      
      





データの受信:

 //      if(MYPROFILE_TEMPERATURE_CLUSTER_ID == sStackEvent.uEvent.sApsDataIndEvent.u16ClusterId) { // PDUM_u16APduInstanceReadNBO(sStackEvent.uEvent.sApsDataIndEvent.hAPduInst, 8, "bh", &ReceivedTempSensorData); //  SetTemp(ReceivedTempSensorData.TempValue); } else //   USB  { // PDUM_u16APduInstanceReadNBO(sStackEvent.uEvent.sApsDataIndEvent.hAPduInst, 0, "b", &Command); // ,       if(Command== '+') { vAHI_DioSetOutput(0, (1 << PLUS)); vDelay(50); vAHI_DioSetOutput((1 << PLUS), 0); } if(Command== '-') { vAHI_DioSetOutput(0, (1 << MINUS)); vDelay(50); vAHI_DioSetOutput((1 << MINUS), 0); } }
      
      







そして最後に、システムのビデオ:





便利なリンク:

JenOSオペレーティングシステムの説明

ZigBee Proスタックの説明

周辺機能の説明JN5148

プロジェクトでアーカイブする

スキームでアーカイブする



それでも、この記事は5月7日に公開されたので、Radio Dayをお持ちの皆さん!



All Articles