SMART CUBE:あなたの家をコントロールする新しい方法
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 5 | ||||
| × | 5 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要なツールとマシン
> |
| |||
|
アプリとオンラインサービス
> |
| |||
|
このプロジェクトについて
SMART CUBEとは何ですか?
Smart Cubeは、スマートホームデバイス用のコントローラーです。
今日、私たちの家のすべてのデバイスをよりスマートな方法で管理することは、緊急事態になりつつあります。 。 シンプルが必要です および直感的 使用します。 スマートキューブ 解決策になる可能性があります。 Arduino101 を搭載したポータブルデバイスです。 ボードといくつかのセンサー スマートホームのアプライアンスやアクチュエーターと通信します。
このリモートコントローラーの革新は、Arduino101ボードの革新に関連しています。 Bluetooth(BLE)を使用します 照明、温度、テレビを制御し、スマートフォンと同期することもできます 。しかし、主要な革新は、スマートキューブとの対話方法です。 ジャイロスコープと加速度計を使用してジェスチャーで。立方体には 6つの面があり、それぞれが特定の機能を制御します 。 上面を認識するジャイロスコープのおかげで、使いたい機能が検出されます。 たとえば、「ライトフェイス」を上の位置に置いて立方体を配置するだけで、自分がいる部屋のライトを開くことができます。 。ライトをオフにしたい場合は、キューブを振るだけです。
顔が UP の場合 2秒以上動かない場合は、関連する機能が有効になります。この遅延 回転して立方体を操作し、必要な顔を見つける時間を確保できるように作られています 誤って他の機能をアクティブにすることなく。キューブを2秒以上振ると、最後にアクティブ化された機能が閉じます。
このプロジェクトは、スマートコントローラーの構築を支援することを目的としています 。 このデバイスにはレシーバーが必要です (写真のスマートセントラリン)データを解釈する および機能の管理 あなたのスマートホームの。メインの出力 of the cubeはBLE信号であり、さまざまな方法で使用できます。たとえば、キューブをスマートフォンアプリに接続できます。 (または自分で作成する)、または別のArduinoでステーションを構築する BLEデータを収集し、家の電化製品を直接制御します。さまざまなケースがあるため、この部分は緊急性によって異なります。このガイドでは、スマートキューブを作成する方法と、それをパーソナライズする方法を学びます。
<図>
機能:
コードの構造はパーソナライズが簡単です (後でコードを分析します)これにより、制御する関数を決定できます。これらは私が制御することに決めた機能です:
<図>ライト : UP のこの顔 ライトを開く位置 あなたがいる部屋の。立方体を振ると、ライトがオフになり、黄色の LED この顔でアクティブになっているので、暗闇の中で立方体を見つけることができます。 コミュニケーション ランプは101ボードのBLEで作られています。
温度 :この顔 UP エアコンを(BLE経由で)アクティブ化する 暑い場合や暖房 寒いなら熱センサーを使用して温度を検出します 青いLED を開きます コンディショナーがオン(スノーフレーク)または赤の場合 暖房が作動している場合は1つ(太陽)。
タイマー :この顔 UP LCDディスプレイに表示されるタイマーを開始します。 アラームとして機能するブザーがあります カウントダウンが終了したとき。振るとタイマーが止まり、残り時間がわかります。カウントダウンが終了すると、LCDの色が青から赤に変わり、ブザーが3回鳴ります。
テレビ :この顔 UP テレビを開きます。キューブはリモートコントローラーになります あなたのテレビのために。 ボタンパネルがあります 偶発的な接触を避けるために、この顔が上にある場合にのみアクティブになる番号を使用します。プッシュした番号は、BLEを介してテレビに接続されているセントラルコントローラーに送信されます。キューブを振ってテレビを閉じます。
サウンド :この顔 UP 部屋の騒音レベルに基づいた明るさのLEDをアクティブにします。ノイズはサウンドセンサーのおかげで検出されます。立方体を振ると、この関数が閉じます。 (必要に応じて、手をたたく個人的な機能をアクティブにすることができます。)
オフ 顔:立方体を振らない場合、この顔はニュートラルポジションのようになります。 何も変わらない。 閉じる場合 すべてがオフ面を上にしてキューブを配置し、それを振ります。このジェスチャーは、すぐに終了したい場合に押すスマートフォンのホームボタンのようなものです。 赤いLED があります 暗い場合にキューブを見つけることができるようにします。
コンセプトとの違い:
当初の計画では、 IR通信も使用する予定でした。 テレビをキューブに直接接続します。 Arduino 101は(今のところ)IR信号を管理するライブラリをサポートしていないため、BLEを介してこのライブラリを管理できるステーション(Arduino UNOなど)に情報を送信することにしました。この問題のため、ラジオ関数を削除しました (テレビの顔に非常に似ています)、サウンドセンサーの顔に置き換えます。この顔は、何かをアクティブにするために大きなノイズ(手拍子など)を認識するために使用できます。最大の変更点は、資料にあります。 キューブの。最初は 3Dプリンターで構築しました しかし、それから私はレーザーカッターを使用することにしました 。このようにすると、置換が簡単になります。 機能を変更したい場合は顔。たとえば、タイマーフェイスを削除して、猫のボウルを自動的に埋めるフェイスに変更できます。 モジュラーであること 構造全体を再構築する必要はありません!
<図>
構築しましょう:
この手順に従って、独自のスマートキューブを作成します。 ハードウェアから始めます 、電子機器の組み立て 最初にコンポーネント、次にMDFで作られた立方体のレーザーカットボディ。この操作の後、コードの仕組みについて説明します。 パーソナライズする方法 。 Arduino 101にコードをアップロードしたら、アプリをダウンロードできます。 キューブのBLE出力を確認するか、スマートホームに直接接続してください!
<図>
ハードウェア-電子機器:
Arduino101の作成を始めましょう。これはフリッツです。 従うべきスキーム:
<図>グローブベースシールドを取り付けます ボード上で接続から始めます。
<図> <図>キーパッド :ピンに接続するには、ワイヤを接続する必要があります:10、8、7、6、5、4、2。
<図> <図> <図>LED接続 :
まず、LEDを準備する必要があります:
-LED(アノード)の長い脚を220オームの抵抗に接続し、次に赤いワイヤーに接続します(これはピンに接続するためのケーブルです)
-短い脚(陰極)を白いワイヤーに接続します(これはグランドに行きます)
-部品をはんだ付けし、電気テープで覆います
-すべての白いケーブルを1本の白いケーブルに接続し(これはアースに接続されます)、すべてをはんだ付けします
次に、赤いワイヤーをArduinoに接続します。緑はピン9に、黄色はピン11に、赤はピン12に、青はピン13に、最後の赤はピンA2に接続します。
<図> <図> <図> <図>
グローブセンサー :
グローブセンサーをシールドに接続します(アタッチメントのスキームを参照)。
ブザーをD3に、LCD RGBをI2Cに、温度センサーをA0に、サウンドセンサーをA1に。
<図>さて、これですべての電気を接続しました 部品。次に、ケースが必要です 。
ハードウェア-ボックス
スケッチをダウンロードできます レーザーで切る立方体の。スケッチの赤い線は顔のシンボルであり、刻印するだけです。 彼ら。黒い線はカットする必要があります。 立方体の内部寸法は 9 cm 。 3mmの素材を使用すればスケッチは問題ありません 、別の厚さを使用する場合は、それを変更する必要があります(このWebサイトを使用できます:http://www.makercase.com/)。
私が選んだ素材は MDF (中密度繊維板)しかし、あなたはあなたが望むものを使うことができます。
こちらがレーザーカットの写真です :
<図> <図> <図> <図>
次に、組み立てる必要があります。 。
接着 LEDの厚さを作るための段ボールのいくつかの部分。このようにして、それらは表面に位置合わせされます 。
<図> <図> <図>次に、キーパッドをマウントします 。穴に挿入して粘着フィルムをはがし、ピンを再接続します。
<図> <図> <図>今 RGB LCD 。これは穴に完全にフィットします。
<図> <図>バッテリーコネクタを準備しましょう :
古い変圧器のプラグを切り、バッテリークリップに接続しました。このようにして、ボックス内のスペースを節約します。
<図> <図> <図>この時点で、それが必要です:
<図>これで、バッテリーを接続する必要があります。 、コードをアップロード キューブを閉じる !
ヒント:キューブを振ったときに安定するように、ボードとバッテリーをケースに固定します。
<図>
コード
コードは添付ファイルにあります 。 Arduino IDE を使用してボードにアップロードします (Arduino 101との互換性のためにソフトウェアを更新することを忘れないでください)。
コメントしました コードのほぼすべての行を、私が理解できるようにするために。 500以上の行を恐れないでください。構造はそれほど複雑ではありません。
最初に、ライブラリとすべての変数宣言があります 。
この部分には、BLE サービスの定義もあります。 および特性 。 Automation IO を使用しました サービス。 デジタルを使用しました 光と温度の特性(これは2ビットを使用するため、成文化する可能性のある4つのケース)とアナログ TV用(キーパッドのすべてのコードを送信するため)。
次に、セットアップ 。このパットは 1回だけ実行されます 最初に。ここでは、コンポーネントを入力または出力として初期化し、101ボードのBLEとジャイロを初期化します。
主要部分はループです 。それは4つの部分に分かれています:
- 1 最初の部分はArduinoウェブサイトチュートリアルからコピーされています:(https://www.arduino.cc/en/Tutorial/Genuino101CurieIMUAccelerometerOrientation)この部分は常に実行されます 向きを返します ボードの。
- 2 2番目の部分は顔をアクティブにする 2秒以上上にある場合のみ 。 ミリスを使用します 時間をカウントする関数。位置が変わるとミリ秒の値が記憶され、向きが同じ場合は、間隔(2秒)後に、選択した顔が真になったifゾーンに入ります(4番目の部分)。
- 3 3番目の部分は、キューブが振られた場合にのみアクティブになります。 一定の強度で2秒以上。 最後にアクティブ化された 顔の機能は閉じています 顔は false に設定されています 。顔が偽の場合、第4部に入ることができません。
- 4 4番目の部分は true 専用です 顔。ここにスマートキューブの機能のコアがあります。 この部分では、ループ内で真の面のみが常に実行されます。
変更できます 顔はコードのいくつかの変更で機能します。 主な構造 説明されているようにする必要があります。 if条件内でパーツを変更できます すべての顔の。
if(face2 ==true){//温度face //ここで変更を開始digitalWrite(LEDOFF、LOW); //この面がtrueの場合、LEDのオフ面はLOWになりますif(central.connected()==true){//キューブがBLE接続されている場合//温度値を読み取りますint val =analogRead(pinTemp); //アナログ値を取得resistance =(float)(1023-val)* 10000 / val; //抵抗温度を取得=1 /(log(resistance / 10000)/B+1/298.15)-273.15; //温度を計算します//アクティブ化の条件if(temperature> tooHot){//エアコンをアクティブ化しますdigitalWrite(LEDhot、LOW); //加熱を閉じるdigitalWrite(LEDcold、HIGH); //オープンエアコンLEDtermoChar.setValue(1); // BLEを介して条件1 =コールドオン-ホットオフ} if(temperature tooCold &&温度
(前のコードのように)「true」の部分と、キューブが振られたときの「false」の部分をコーディングする必要があります。
// TEMPERATURE deactivation if(lastFUNCTION ==2){// TEMPERATURE face // START CHANGING HERE //セントラルがペリフェラルに接続されている場合:if(central.connected()==true){digitalWrite (LEDhot、LOW); //温度を下げる赤のLEDdigitalWrite(LEDcold、LOW); //温度を閉じる青のLEDtermoChar.setValue(0); //温度BLE信号:0 =コールドオフ-ホットオフ//ここで終了} Serial.println( "TEMPERATURE false --CLOSE"); face2 =false; // TEMPERATURE面がfalseになりました}
顔をfalseに設定することを忘れないでください 振ると。
アプリ:
キューブBLEの出力を確認するには、ダウンロードできます。 このアプリ: nRF Connect
https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=it
開いたら、検索するだけです デバイスと接続の場合 「smartcubesketch」で。次に、3つの[自動化IO]タブが表示されます。それらをクリックして、連続データコレクターをプッシュします。
一部の機能(照明、温度、テレビ)は、キューブが接続されている場合にのみ実行されるため、キューブを接続することが重要です。
仕組み:ビデオ
コードをアップロードし、バッテリーを挿入し、ボックスを閉じて...
...これで SMART CUBEができました!
キューブのすべての機能とその使用方法を紹介するビデオを作成しました。
結論
このプロジェクトは最初のステップにすぎません スマートホームへ。私の目的は、 Arduino 101 を使用することでした 何か新しいものを作成する可能性 。 加速度計だと思います およびジャイロスコープ 機動性の観点から取締役会に新しい機会を与える BLE を使用すると、 ポータブルであることに加えて、接続も簡単です 。
これは、私が自分のプロジェクトの1つを具体的に実現する最初の時間です(つまり、プロトタイプが機能していることを意味します)。大変で、道のりも大変でしたが、最終的にはたくさんのことを学び、結果に満足しています。このガイドを読んだすべての人が私の仕事から何かを学び、このプロジェクトを自分たちのニーズに合わせて変更することを願っています。 。英語が下手で申し訳ありませんが、画像がお役に立てば幸いです。
将来 このプロジェクトの centraline を作成する予定です これは、スマートキューブとアクチュエーター(ライト、温度、テレビなど)の間の架け橋のようなものです。このセントラリンはキューブからBLE信号を受信し、この情報を使用して家で賢いことをします。
Arduino 101 を使用できることをとてもうれしく思います。 およびグローブキット (キットは非常にシンプルでプロトタイピングが高速です)。
このようにボードを使用することが、インスピレーションになることを願っています。 あなたのプロジェクトのために。 必要に応じてパーソナライズできます :どの関数を作成し、どのようなコンテキストで使用するのか知りたいです!
これは革命ではないかもしれませんが、あなたの家と交流するための新しい方法 。
このチュートリアルが気に入っていただければ幸いです。
今度はあなたの番です :キューブに手を置いてハックしてください!
コード
- SMARTCUBE-コメント付きの完全なコード
SMARTCUBE-コメント付きの完全なコード Arduino
これは、Arduino 101にアップロードするコードです。このコードをそのまま使用することも、必要に応じてカスタマイズすることもできます。コメントに従って、その動作を理解してください。// Libraries#include "CurieIMU.h" // Acelerometer&Gyroscope#include// Bluetooth Low Energy#include #include "rgb_lcd .h "// LCD#include // Keypadrgb_lcd lcd; // LCDの初期化// Bluetoothの初期化:BLEPeripheral blePeripheral; // BLEペリフェラルデバイス(プログラミングしているボード)// BLE ServicesBLEService LightsService( "1815"); // BLE Automation IO(1815)-ライト情報BLEService termoService( "1815"); // BLEオートメーションIO-温度情報BLEServiceTVService( "1815"); // BLEオートメーションIO-テレビ情報// BLE特性BLEUnsignedCharCharacteristiclightsChar( "2A56"、// BLE特性デジタル(2A56)-ライトBLERead | BLENotify); BLEUnsignedCharCharacteristic termoChar( "2A56"、// BLE特性デジタル-温度BLERead | BLENotify ); BLEUnsignedCharCharacteristic TVChar( "2A58"、// BLE特性アナログ(2A58)-tv BLERead | BLENotify); //定数および変数declaration://面の向きとシェイク関数:intlastOrientation =--1; //前の向き(比較用)unsigned long previousMillis =0; //前回updateunsignedlong interval =2000; //顔がアクティブになる前に上の位置で待機する時間unsignedlong SHAKEpreviousMillis =0; //前回updateunsignedlong SHAKEinterval =2000; //顔の非アクティブ化を振る間待つ時間booleankeep =false; //これは、顔の向きが変更された回数を1回だけカウントするために使用されますint lastFUNCTION =-1; //これは前の方向を知るために使用されます//面の初期化:最初はすべての面がfalseboolean face0 =false; boolean face1 =false; boolean face2 =false; boolean face3 =false; boolean face4 =false; boolean face5 =false; // LIGHTS faceconst int LEDlights =11; //ピン11:黄色のLED // TEMPERATURE faceconst int pinTemp =A0; //ピンA0:温度センサーconst int LEDhot =12; //ピン12:赤いledconst int LEDcold =13; //ピン13:青いledfloat温度; //温度値の記憶intB =3975; //サーミスタフロート抵抗のB値; //抵抗値の暗記floattooHot =26.0; //エアコンが作動する温度[SET] float tooCold =23.0; //ヒーターが作動する温度[SET] // TIMER faceint BUZZER =3; //ピン3:buzzerboolean KEEPtime =false; //これは、顔の向きの変更を1回だけカウントするために使用されます(カウント中に再起動しない)int TIMERmillis =0; //以下はカウントダウン決定用ですintprevSHOWsecond =0; int CountdownInMillis =0; int SHOWmillis =0; //ミリ値の計算結果intSHOWminute =0; // countdownintのモニターに表示する分の値SHOWseconds =0; // countdownconstのモニターに表示する秒の値intSETminute =2; // 2分のタイマーを設定します[SET] const int SETsecond =30; // 30秒のタイマーを設定します[SET] // SOUND faceconst int soundLED =9; //ピン9:緑色のLED const int soundSENSOR =A1; //ピンA0:サウンドセンサーの明るさ=0; //緑色のLED輝度の初期化// TVfaceconstバイトROWS =4; // 4行keypadconstバイトCOLS =3; // 3列keypadcharkeys [ROWS] [COLS] ={{'1'、 '2'、 '3'}、{'4'、 '5'、 '6'}、{'7'、 '8' 、 '9'}、{'*'、 '0'、 '#'}}; //キーパッドボタンの値byterowPins [ROWS] ={10,8,7,6}; //ピン10、8、7、6:キーパッドバイトの行ピン配置に接続しますcolPins [COLS] ={5,4,2}; //ピン5、4、2:キーパッドの列ピン配置に接続キーパッドkeypad =Keypad(makeKeymap(keys)、rowPins、colPins、ROWS、COLS); //キーパッドの初期化// OFF faceconst int LEDOFF =A2; //ピンA2:赤ledvoid setup(){pinMode(LEDlights、OUTPUT); //すべてのLEDは出力として設定されますpinMode(LEDhot、OUTPUT); pinMode(LEDcold、OUTPUT); pinMode(soundLED、OUTPUT); pinMode(LEDOFF、OUTPUT); Serial.begin(9600); //シリアル通信を初期化しますCountdownInMillis =(SETminute * 60 + SETsecond)* 1000; //これは、lcd.begin(16、2);を設定して、分と秒から対応する値をミリ単位で計算します。 // LCDの初期化lcd.setRGB(0、0、0); // LCDRGBは最初はオフです//デバイスを初期化しますSerial.println( "IMUデバイスを初期化しています..."); CurieIMU.begin(); //加速度計の範囲を2GCurieIMU.setAccelerometerRange(2);に設定します。 //衝撃検出を有効にしますCurieIMU.setDetectionThreshold(CURIE_IMU_SHOCK、7000); // 7.0g =7000 mg(この値は衝撃の強さを設定します)CurieIMU.setDetectionDuration(CURIE_IMU_SHOCK、2000); // 2000ms(この値はショックの持続時間を設定します)CurieIMU.interrupts(CURIE_IMU_SHOCK); // BLEセットアップの初期化blePeripheral.setLocalName( "SmartCubeSketch"); //プロジェクトの名前blePeripheral.setAdvertisedServiceUuid(lightsService.uuid()); //ライトサービスを追加しますUUIDblePeripheral.addAttribute(lightsService); // BLEライトサービスを追加しますblePeripheral.addAttribute(lightsChar); // BLEライトの特性lightsChar.setValue(3);を追加します。 //この特性の初期値=3 // BLEライト値の意味:0 =ライトオフ、1 =ライトオン、3 =初期状態、4 =未使用blePeripheral.setAdvertisedServiceUuid(termoService.uuid()); //温度サービスを追加しますUUIDblePeripheral.addAttribute(termoService); // BLE温度サービスを追加しますblePeripheral.addAttribute(termoChar); // BLE温度特性を追加termoChar.setValue(0); //初期値は0です:コールドオフ-ホットオフ// BLE用語の意味:0 =コールドオフ-ホットオフ、1 =コールドオン-ホットオフ、2 =コールドオフ-ホットオン、3 =未使用blePeripheral.setAdvertisedServiceUuid (TVService.uuid()); // TVサービスを追加しますUUIDblePeripheral.addAttribute(TVService); // BLE TVサービスを追加しますblePeripheral.addAttribute(TVChar); // TV特性を追加しますTVChar.setValue( 'x'); //この特性の初期値(xは何も意味しません)// BLE TV値の意味:#numberは押されたボタンに対応し、C:TVを閉じる、O:TVを開く、x:初期状態blePeripheral.begin(); Serial.println( "Bluetoothデバイスがアクティブで、接続を待機しています..."); } // endvoid loop()を設定します{BLECentral center =blePeripheral.central(); // BLE接続unsignedlong currentMillis =millis(); //ミリ秒単位の現在の時間値//次のコードはwww.arduino.cc/en/Tutorial/Genuino101CurieIMUccelerometerOrientationから取得されます//ボードの向きを検出するために使用されますintorientation =--1; //ボードの向きStringorientationString; //方向の説明を印刷するための文字列//加速度計を読み取ります:int x =CurieIMU.readAccelerometer(X_AXIS); int y =CurieIMU.readAccelerometer(Y_AXIS); int z =CurieIMU.readAccelerometer(Z_AXIS); //絶対値を計算して、最大のintを決定しますabsX =abs(x); int absY =abs(y); int absZ =abs(z); if((absZ> absX)&&(absZ> absY)){// Zに基づく方向if(z> 0){orientationString ="up";向き=0; } else {orientationString ="down";向き=1; }} else if((absY> absX)&&(absY> absZ)){// Yに基づく方向if(y> 0){orientationString ="デジタルピンアップ";向き=2; } else {orientationString ="アナログピンアップ";向き=3; }} else {// Xに基づく方向if(x <0){orientationString ="connector up";向き=4; } else {orientationString ="コネクタダウン";向き=5; }} //チュートリアルコードの終わり。 //この時点で、ボードの向きの値は常に更新されています:/ *ボードの向き:0:フラット、プロセッサを上に向ける(TIMER)1:フラット、プロセッサを下に向ける(TV)2:横向き、アナログピン下(TEMPERATURE)3:横向き、アナログピン上(OFF)4:縦向き、USBコネクタ上(LIGHTS)5:縦向き、USBコネクタ下(SOUND)* / //このプロジェクトでは、顔が変わったかどうかを知る必要があります前の面関数から[lastFUNCTION!=direction] //ただし、この情報は、面が[interval]時間以上//かつ1回だけ[keep]上にある場合にのみ出力されます(必要ありません)顔を常にアクティブにするには、一度だけ必要です)//向きの値は常に更新されるため、向きが変わったときに時間をカウントし始める必要があります[orientation!=lastOrientation] if(orientation!=lastOrientation){// if向きが変更されました。時間をカウントし始めますlastOrientation =orien tation; //顔の現在の向きを記憶しますpreviousMillis =currentMillis; //顔が変わった時間を記憶しますkeep =false; } else if(currentMillis --previousMillis> interval &&keep ==false &&lastFUNCTION!=direction){//この条件は、顔が一定間隔だけ上にある場合にのみ方向を出力します//そして一度だけ(keep)//そして顔が前のループと異なる場合のみSerial.println(orientationString); //向きを印刷します//現在の顔[orientation]はtrueに設定されます(つまり、face関数がアクティブに設定されます)if(orientation ==1){// TV face face1 =true; // TVの顔が真になりますlastFUNCTION =direction; //このアクティベーションを[lastFUNCTION]に記憶しますSerial.println( "TV true"); //アクティブ化された顔を印刷しますTVChar.setValue( 'O'); // O:テレビ信号を開く(BLE):テレビは1回だけ開く} if(orientation ==4){// LIGHTS face face4 =true; lastFUNCTION =方向; Serial.println( "LIGHTS true"); } if(orientation ==3){// OFF face face3 =true; lastFUNCTION =方向; Serial.println( "OFF true"); } if(orientation ==5){// SOUND face face5 =true; lastFUNCTION =方向; Serial.println( "SOUND true"); } if(orientation ==2){// TEMPERATURE face face2 =true; lastFUNCTION =方向; Serial.println( "TEMPERATURE true"); } if(orientation ==0){//タイマーface face0 =true; lastFUNCTION =方向; Serial.println( "TIMER true"); if(KEEPtime ==false){//タイマーは、最初のサイクルであるか、停止されている場合にのみアクティブになりますTIMERmillis =currentMillis; //時間のカウントを開始します}} keep =true; // [keep]値を変更して、次のループで、顔が変更されない場合はこの条件に入ることができないようにします(同じ顔をもう一度アクティブにすることは避けてください)} //この条件はシェイク機能用です:[SHAKEinterval]時間を超えて振ると、顔が非アクティブになりますif(CurieIMU.getInterruptStatus(CURIE_IMU_SHOCK)&¤tMillis --SHAKEpreviousMillis> SHAKEinterval){Serial.println( "SHAKE"); //揺れが検出された場合は「SHAKE」を出力します//最後にアクティブ化された顔[lastFUNCTION]はfalseに設定されます(つまり、顔機能が非アクティブ化されます)// TV非アクティブ化if(lastFUNCTION ==1){// TV顔TVChar .setValue( 'C'); // C:TV BLE信号を閉じますSerial.println( "TV false --CLOSE"); //閉じた面を印刷しますface1 =false; // TVフェイスがfalseになります} // LIGHTS非アクティブ化if(lastFUNCTION ==4){// LIGHTSフェイスif(central.connected()==true){//セントラルがペリフェラルに接続されている場合:lightsChar.setValue(0 ); // BLE信号をオフに点灯digitalWrite(LEDlights、HIGH); //黄色のLEDを開いて、暗闇の中で立方体を確認します} Serial.println( "LIGHTS false --CLOSE"); face4 =false; // LIGHTS面がfalseになります} // OFF if(lastFUNCTION ==3){// OFF面// OFF面が揺れています:すべてが閉じており、赤色LEDが開いていますdigitalWrite(LEDOFF、HIGH); //キューブが閉じられると赤いLEDがオンになります//アクティブ化されたすべての関数を閉じます:// CLOSE TV TVChar.setValue( 'C'); // C:TV BLE信号を閉じますSerial.println( "TV false --CLOSE"); face1 =false; //ライトを閉じるSerial.println( "LIGHTS false --CLOSE"); if(central.connected()==true){lightsChar.setValue(0); digitalWrite(LEDlights、LOW); // OFF面が振られると、LEDライトは閉じます} face4 =false; //サウンドを閉じるanalogWrite(soundLED、LOW); //サウンドLEDを閉じますSerial.println( "SOUND false --CLOSE"); face5 =false; //温度を閉じるif(central.connected()==true){digitalWrite(LEDhot、LOW); digitalWrite(LEDcold、LOW); termoChar.setValue(0); //温度BLE信号:0 =コールドオフ-ホットオフ} Serial.println( "TEMPERATURE false --CLOSE"); face2 =false; // CLOSE TIMER Serial.println( "TIMER false --CLOSE"); lcd.setRGB(0、0、0); // LCD RGBは閉じていますlcd.clear(); KEEPtime =false; face0 =false; //キューブは非アクティブで、OFFLEDのみがアクティブですSerial.println( "OFF false --CLOSE"); face3 =false; // OFF面がfalseになります} // SOUND非アクティブ化if(lastFUNCTION ==5){// SOUND面analogWrite(soundLED、LOW); //サウンドLEDを閉じますSerial.println( "SOUND false --CLOSE"); face5 =false; // SOUND面がfalseになります} // TEMPERATURE非アクティブ化if(lastFUNCTION ==2){// TEMPERATURE面//セントラルがペリフェラルに接続されている場合:if(central.connected()==true){digitalWrite(LEDhot、LOW ); //温度を下げる赤のLEDdigitalWrite(LEDcold、LOW); //温度を閉じる青のLEDtermoChar.setValue(0); //温度BLE信号:0 =コールドオフ-ホットオフ} Serial.println( "TEMPERATURE false --CLOSE"); face2 =false; // TEMPERATURE面がfalseになりました} // TIMERの非アクティブ化if(lastFUNCTION ==0){// TIMER面Serial.println( "TIMER false --CLOSE"); face0 =false; //タイマーの顔が偽になりました//時間が経過しているときに立方体を振ると、LCDが赤になり、カウントダウンまでの残り時間が表示されますlcd.setRGB(180、40、0); // RGBバックライトが赤になりますlcd.clear(); // lcdはクリアされますlcd.setCursor(0、0); lcd.print( "STOP AT"); lcd.setCursor(8、0); lcd.print(SHOWminute); //立方体を振る分を示しますlcd.setCursor(9、0); lcd.print( ":"); lcd.setCursor(10、0); lcd.print(SHOWseconds); //キューブトーンを振る秒数を示します(BUZZER、1000,1000); //短い音の遅延を作ります(2000); lcd.clear(); // LCDをクリアしますlcd.setRGB(0、0、0); // LCDRGBバックライトが閉じているKEEPtime =false; //タイマーの顔が偽になりました} SHAKEpreviousMillis =currentMillis; // [SHAKEinterval]計算の値を記憶します} //次の命令は、面がアクティブ化されている場合にのみループで実行されますif(face1 ==true){// TV面digitalWrite(LEDOFF、LOW); //この面がtrueの場合、LEDのオフ面はLOWになりますif(central.connected()==true){//キューブがBLEに接続されている場合char key =keypad.getKey(); //キーパッドから値を読み取りますif(key &&direction ==1){//何かが押された場合、テレビの顔が上になっている場合のみ(不本意なキーパッドの押下を避けます)if(key =='0'){//押されたキーが0の場合TVChar.setValue(key); // BLE Serial.println(key);を介して[key]値を送信します//押されたボタンを出力します(この情報を表示したくない場合はコメントしてください)} if(key =='1'){TVChar.setValue(key); Serial.println(key); } if(key =='2'){TVChar.setValue(key); Serial.println(key); } if(key =='3'){TVChar.setValue(key); Serial.println(key); } if(key =='4'){TVChar.setValue(key); Serial.println(key); } if(key =='5'){TVChar.setValue(key); Serial.println(key); } if(key =='6'){TVChar.setValue(key); Serial.println(key); } if(key =='7'){TVChar.setValue(key); Serial.println(key); } if(key =='8'){TVChar.setValue(key); Serial.println(key); } if(key =='9'){TVChar.setValue(key); Serial.println(key); } if(key =='*'){TVChar.setValue(key); Serial.println(key); } if(key =='#'){TVChar.setValue(key); Serial.println(key); }}}} if(face4 ==true){// LIGHTS face digitalWrite(LEDOFF、LOW); //この面がtrueの場合、LEDのオフ面はLOWですif(central.connected()==true){//セントラルがペリフェラルに接続されている場合:lightsChar.setValue(1); // LIGHTSがアクティブ化されたBLE信号digitalWrite(LEDlights、LOW); //ホームライトがオンになっているため、黄色のLEDは閉じています}} if(face3 ==true){//オフフェイス//オフフェイスがアップしているときは何も行われませんdigitalWrite(LEDOFF、LOW); // LED OFFは、立方体が振られたときにのみアクティブになるため、LOWになります} if(face5 ==true){// SOUND face digitalWrite(LEDOFF、LOW); //この面が真の場合、オフ面ledはLOWです//サウンドセンサーがアクティブになり、sondによって導かれた明るさが調整されます//このコードは明るさ調整の例から来ていますlong sum =0; for(int i =0; i <32; i ++){sum + =analogRead(soundSENSOR); }合計>> =5;明るさ=(合計* 255)/ 1024; //明るさの値を計算しますanalogWrite(soundLED、brightness); //緑色のLEDの明るさの強度は、ノイズ遅延(50)によって調整されます; //明るさの例を終了} if(face2 ==true){// TEMPERATURE face digitalWrite(LEDOFF、LOW); //この面がtrueの場合、LEDのオフ面はLOWになりますif(central.connected()==true){//キューブがBLE接続されている場合//温度値を読み取りますint val =analogRead(pinTemp); //アナログ値を取得resistance =(float)(1023-val)* 10000 / val; //抵抗温度を取得=1 /(log(resistance / 10000)/B+1/298.15)-273.15; //温度を計算します//アクティブ化の条件if(temperature> tooHot){//エアコンをアクティブ化しますdigitalWrite(LEDhot、LOW); //加熱を閉じるdigitalWrite(LEDcold、HIGH); //オープンエアコンLEDtermoChar.setValue(1); // BLEを介して条件1 =コールドオン-ホットオフ} if(temperature tooCold &&温度
カスタムパーツとエンクロージャー
これは、レーザーカッターにアップロードできるファイル(.dxf)です。 3mmの中密度繊維板(MDF)を使用しました。黒い線を切り、赤い線を刻みます。重要:材料の厚さが異なる場合は、このスケッチを変更する必要があります。 smart_cube_8sVCflFmhM.dxfボックスの同じファイルですが、形式が異なります:.pdf 回路図
これはFritzingスキームの.jpegです(黄色のワイヤーはGroveコンポーネントに接続されています) これはGroveShieldの接続スキームです製造プロセス