工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

MKR1000を備えたマルチモード環境センサーデッキ

コンポーネントと消耗品

>
Arduino MKR1000
× 1
MOD-1016雷センサー
× 1
DFRobotMQ-9ガスセンサー
× 1
Adafruit湿度および温度センサー
× 1
Adafruitの圧力/高度/温度センサー
× 1
SparkFun ML8511UVセンサー
× 1
chronodot RTC
× 1
SparkFun Photon Weather Shield
× 1
Adafruitネオピクセル
× 1
ブレッドボード(汎用)
× 1
ジャンパー線(汎用)
× 1

このプロジェクトについて

私は天気を見るのが大好きで、それをキャプチャしてグラフ化してみたかったのです。自宅の気象観測所では、「今」の詳細を確認でき、過去1時間または1日の集計を行うこともあります。もっとやりたかったので、Arduinoを使って仕事をしました。誰もが温度と湿度、時には気圧から始めますが、もっと欲しかったのです!風速と雨量の測定には、それぞれハードウェア入力が必要でした。 i2cを使いこなすと、AS3935 LightningDetectorのようなものが見つかりました。そして、悲しみが始まりました...基本的なArduinoで仕事をするのに十分なハードウェア割り込みがありませんでした。 SparkfunにはPhoton用の気象センサーボードもありますが、それでも制限があります。私は選択しなければならないでしょう、そしていくつかのセンサーなしでやらなければなりません。 :-(

それから私は MKR1000 を見ました 、そして私は最高の機能を見つけました、それは8つのハードウェア割り込みを持っています!今、私はそれをすべて持つことができました!

<図>

センサーの選択

センサーには3つの基本的なフレーバーがあります;

  • アナログ :光(IRおよびUVを含む)、風向、ガス、ロードセル...
  • I2C :温度、湿度、気圧、加速度計、ジャイロ...
  • 割り込み :レインティッパー、風速、稲妻、タイマー...(シリアル、PWM、時計、サーボなどの機能はタイミング割り込みを使用します)

MKR1000には、これらすべてに対応する十分なI / Oがあります!

I2Cおよび割り込みでのI / Oに必要な電圧に注意してください。たとえば、MKR1000、Photon、およびArduinoの多くのフレーバーは、5vではなく3.3v I / Oを使用します。 CPUと必要なセンサーが異なる電圧を使用する場合は、それらのデバイス間でレベルシフターも使用する必要があります。

私が使用しているすべてのセンサーは十分に一般的で、Adafruit、SparkFun、Element-14などから入手でき、通常は5〜10ドル(米国)の費用がかかります。ガスセンサーは通常10ドルから20ドルかかります。雷検知器(AS3935チップ)には、Embedded Adventures MOD-1016を選択しました。これは、アンテナをボードに搭載するために26ドル(米国)です。私はPhotonを持っているので、Sparkfun Photon Weather Shieldも購入しました。おそらく、それらの「気象計」(風速と風向計)を購入するでしょう。 MKR1000をどこに取り付けるかが決まったら、土壌水分センサーを追加するかもしれません。一部のセンサーは、長いリードを持つことを好みません。

センサーをピンに割り当てます

必要なセンサーがわかれば、必要な入力のタイプがわかります。次のステップは、どのセンサーがどのピンに配置されるかを決定することです。私は紙から始めますが、リマインダーとして、このリストをコードのブロックコメントとして追加します。

センサーデッキ用に作成したMKR1000のピン割り当ては次のとおりです。

  • A0 (後でDACが必要になった場合に備えて、A0を保存しています...)
  • A1 ML8511UVセンサー
  • A2 可視光センサー
  • A3 TMP36ローカル温度センサー
  • A4 MQ-9ガスセンサー
  • A5 水分センサー
  • A6 風速センサー?
  • 0 (HW INT)プッシュボタン
  • 1 (HW INT)AS雷検知器
  • 2 (HW INT)風速風速計(1回転ごとに中断)
  • 3 (HW INT)レインティッパー…
  • 4
  • 5
  • 6 (オンボードLEDと共有)
  • 7 NeoPixel出力…

はじめに...

初心者の方は、使用する各センサーから1つずつ開始し、サンプルコードをロードして、必要なライブラリをインストールすることから始めることをお勧めします。センサーピンを変更して、選択したピン割り当てに一致させ、デモコードのコピーをプロジェクトフォルダーに保存することを忘れないでください。

テストコードを実行し、シリアルモニターから結果を読み取ることができたら、別のコードを追加してみる準備ができています。そして、各センサーのテストが完了すると、すべてのセンサーが配線され、より大きなスケッチの作成を開始できるようになります。

センサーをいじくり回した元々は、i2cベースのリアルタイムクロック(RTC)を使用していたので、SDメモリカードにログインできました。 MKR1000には独自のRTCとバッテリーがありますが、バッテリーだけでは時間を計ることができなかったので、ChronoDot v2.1 i2cRTCも維持します。

下の画像のブレッドボードを見ると、さまざまなジャンパーが使用されていることがわかります。オレンジは各センサーへの3.3v電源用であるため、センサーを操作する準備ができたときにのみプラグを差し込むことができます。 (オレンジ色のジャンパーを抜くと、センサーを簡単に無効にできます。)

<図>

ライブラリに関する注意

インストールできるライブラリの一部は、MKR1000やArduino.cc IDEバージョン1.6.7で完全に機能しないことがわかりました。センサーの古さによっては、調整が必要になる場合があります。は。この一例は、古い AVR libc の古いATOMIC_ *マクロです。 ライブラリ(Arduino IDE 1.6.5で削除されました)、およびArduino.ccのフォーラムスレッドに問題と提案された解決策に関するすばらしいスレッドがあります。提案された変更のいくつかを行うことは、中級のArduinoハッカーにとっては何かですが、新しいハッカーにとっては恐らく恐ろしいことでしょう。また、少し古いライブラリの場合、元の作成者がライブラリを更新して依存関係を排除するために周りにいない可能性があります。

残念ながら、通常、センサーを購入してテストする前に、どのライブラリを調整する必要があるかを知ることはできません。その時点で、スケッチを注意深くアップロードしようとするとオレンジ色で表示されるエラーメッセージを確認し、コードの変更を開始する前に、問題がコードにあるのかライブラリにあるのかを確認することをお勧めします。ライブラリにある場合は、「arduino」のWeb検索とエラーメッセージを実行します。解決策が見つからない場合は、作成者にメールを送信してエラーについて知らせてください。そうすれば、ライブラリが更新される可能性があります。

私はお金を節約しようとして、個々のチップを購入しました。準備が整い、自分で回路基板を作成できるようになるまで(おそらく、EagleCADとOSHParkを使用して)、ライブラリにパッチを適用しておくのに優れているため、AdafruitとSparkFunからセンサーモジュールを購入する方が簡単だと判断しました。

WiFiと暗号化について少し

また、気象センサーをWebサイトに報告させるためのwifiについても考えました。 MKR1000には暗号化エンジンも搭載されており、インターネットを介したデータの転送を安全に保つことができます。しかし、それは私がこの最初のプロジェクトでできる以上のものです。モノのインターネットにとってデータセキュリティを設計の一部にすることが重要であるため、これは私のリストに含まれていますが、MKR1000コンテストへのエントリを追加する時間が不足しています。このプロジェクトの私の「バージョン2」に注意してください。これは、ボードの心臓部であるSAMDモジュールのブロック図です。

<図>

オンボードWiFiを使い始めるためのヒントを1つ紹介します。 WiFi101ライブラリの最新バージョンを使用していることを確認してください! そうしないと、スケッチはWi-Fiモジュールを認識せず、Wi-Fiスケッチは、Wi-Fiモジュールへの呼び出しでエラーチェックがあった場合にのみ報告します。) Charif Mahmoudi <に感謝する必要があります。 / em> ここハックスターの彼の素晴らしい「MKR1000入門」チュートリアルでそれを指摘してくれてありがとう!私がハッキングしたとき、WiFi101Githuibはここにありました。

アナログセンサーのヒント

ほとんどの「アナログ出力」センサーモジュールは、単純なアナログ電圧出力を生成します。これは、 analogRead を使用して簡単に読み取ることができます。 センサーピンの。しかし、それが何を意味するのかを知る必要があります。通常、マップを使用する必要があります コマンド、またはあなたは少し数学を実行する必要があるかもしれません。抵抗素子は通常、いくつかの追加の回路を必要とします。ポテンショメータを追加して、電圧を「微調整」することをお勧めします。

その他の場合、出力電圧を人間が理解できるものに変えるための方程式が必要になります。 TMP36 温度センサーは、このよく文書化された例の1つです。この部分は摂氏で読み取るように設計されているため、電圧を測定し、Cを取得するためにいくつかの計算を行う必要があります。華氏が必要な場合は、CをFに変換する必要があります。コンポーネントのデータシートを読み取ると、パーツがどのように機能するかを説明しますが、経験を積み重ねるにつれて、他の人の足跡をたどるのが簡単になります。

さらに他のセンサーは、ADCが高から低までの良好な範囲を取得するのに十分な大きさの小さな電圧振幅を作るために、増幅器を必要とします。これらのタイプのセンサー(ロードセル、水分、加速度計)は、お金をかけて、すでにアンプを備えたモジュールと、出力の範囲を理解するのに役立つライブラリを購入するのが最善だと思います。

I2Cデバイスを使用するためのヒント

I2Cは、データ信号だけでなくクロック信号も必要なため、「2線式インターフェース」と呼ばれることもあります。 (「マスター」と「スレーブ」が交互にデータを送信するため、必要なデータワイヤは1本だけです。)もちろん、I2Cセンサーにもアースと電源リードが必要です。アース線はCPUに接続する必要があります。

すべてのI2Cデバイスには、バス上に16進数のアドレスがあります。同じアドレスで複数のデバイスを使用することは避けるのが最善です。 (複数を使用する場合は、通信する回路を「有効」にするために、追加の回路でそれらを管理する必要があります。その後、通信を有効にする前に、通信が終了したら無効にします。)ドキュメントデバイスがどのアドレスになり得るかを教えてくれるはずです。 ( I2Cバス上に同じアドレスの2つのデバイスがあり、両方に「有効」または「シャットダウン」ピンがある場合、もう一方が起動している間、一方を無効にすることができます。ただし、センサーがSDAピンとSCLピンから電力を取得する可能性があり、そのアドレスの読み取り値が正しくなくなる可能性があるため、vddピンの電源をオフにすることはできません。 I2Cのエラーチェックは、このケースを検出/修正するには十分ではありません。

I2C仕様では、ワイヤ上で最も遠いセンサーのクロックとデータリードの両方に「強力な」プルアップ抵抗を配置する必要があることが示されています。このため、一部のセンサーモジュールにはすでに抵抗が搭載されており、ジャンパーを2つ追加するだけでよい場合があります。そのため、モジュールのドキュメントを必ずお読みください。

「バス終端抵抗」に加えて、データ(SDA)とクロック(SCL)の両方のリード線に抵抗をインラインで追加するという、あるハッカーからのヒントも見つけました。これにより、いくつかのセンサーからのデータ読み取りの信頼性が大幅に向上しました。 MKR1000では、3.3v信号を使用して、220オームの抵抗を使用しています。 5ボルトのCPUでは、330オームを試してみることをお勧めします。配置の違いを確認するには、以下の概略図を参照してください。

<図>

データをどうしますか?

今、私はそれをシリアルモニターに送っています。 LCDを追加できます。 SDカードを追加するつもりでしたが、wifiが組み込まれているので、データをクラウドにアップロードしたいと思います...これらのセンサーデッキをいくつか持っていて、緯度と経度を知っていて、特定の落雷に対する各ステーションからの電力測定値を比較することにより、落雷を三角測量します!

ASIDE :2017-11-29; MKR1000でハードウェア割り込みを動作させることができませんでした。私は9年生のクラス(13〜14歳)のメモとセンサーの実験を行っています。スケッチがおもしろいと思うかもしれません。このクラスはAdaloggerM0ボードを中心に構築されており、データをSDカードに保存しますが、WiFiモジュール用のピンはまだたくさんあります。 http://arduinoclass.pbworks.com

センサーの作業をしているときに、IKEAでSODERSVIKランプフィクスチャも見つけました(下の画像を参照)。このランプ内の白色LEDを20ネオピクセルに交換し、IRリモートレシーバーを追加することを想像してみてください。吹く風は雲が転がっているように見え、色は気温を示している可能性があります。リモコンは、過去12時間の気温の変化など、他の情報を一時的に表示することもできます。

<図>

何を監視して表示しますか?

コード

  • モニタリングスケッチ全体
  • 平均的なアナログ読み取りを行う
  • I2Cバススキャナー
  • ML8511デモコード
モニタリングスケッチ全体 Arduino
このスケッチには多くのセンサーが報告されており、ライブラリは連携して機能しています。ただし、AVR-libcの従来の割り込みロック方法はArduino IDEの最近のバージョンで削除されており、NeoPixelおよびLightningセンサーのライブラリが無効になっています。これは今年中に解決されると思いますが、最終的なスケッチから除外したことを意味します。
 / * RTC-Weather-Sensors_v6_MKR1000 by Zonker Harris Spring 2016 * Hooray! 2つ以上のハードウェア割り込みを備えた小さなボード! *さらにWiFi、*および*暗号(IoTアプリケーションには非常に必要です!)* *新しいハッカーへの注意:ご覧のとおり、コードに多くのコメントを入れています。 * [アップロード]をクリックすると、*コメントは無視されます*。メモリを消費しないでください。 *変更や追加を行うときは、*何ヶ月も前に行ったことをなぜ行ったかを思い出せるように、コメントもたくさん追加することをお勧めします。 *彼らはまたあなたの後に来る人々が1つか2つのことを学ぶのを助けます。 * *これで、ライブラリはプログラムメモリに対して* DO *カウントされます... * /#include  #include  #include  #include  //ネオピクセルを含むプレースホルダーとして、ただしライブラリ割り込みベクトルを更新する必要があります。//Adafruit_NeoPixelライブラリをインクルードしますhttps://github.com/adafruit/Adafruit_NeoPixel //#include  // const int numLeds =1; //文字列内のネオピクセルはいくつですか? NeoPixelライブラリの設定に使用//パラメータ1 =ストリップ内のピクセル数//パラメータ2 =ピン番号(ほとんどが有効)//パラメータ3 =ピクセルタイプフラグ、必要に応じて追加:// NEO_RGBピクセルはRGB用に配線されていますビットストリーム// NEO_GRBピクセルはGRBビットストリーム用に配線されています// NEO_KHZ400 400 KHzビットストリーム(例:FLORAピクセル)// NEO_KHZ800 800 KHzビットストリーム(例:高密度LEDストリップ)// Adafruit_NeoPixelストリップ=Adafruit_NeoPixel(numLeds、6、NEO_GRB + NEO_K / * BMP085_Uドライバーは、Adafruit統合センサーライブラリ(Adafruit_Sensor)を使用します。これは、センサーデータといくつかのヘルパー関数に共通の「タイプ」を提供します。 (BMP180はこのライブラリと互換性があり、同じ出力を提供しますが、ライブラリはBMP180をBMP085として識別します。)このドライバーを使用するには、Adafruit_Sensorライブラリをダウンロードし、ライブラリフォルダーに含める必要があります。また、Adafruit Sensor APIで使用するために、このセンサーに一意のIDを割り当てて、データログなどでこの特定のセンサーを識別できるようにする必要があります。一意のIDを割り当てるには、以下のコンストラクターで適切な値を指定するだけです(12345はこの例ではデフォルトで使用されます)。 * / Adafruit_BMP085_Unified bmp =Adafruit_BMP085_Unified(10180); / *このスケッチは、AdafruitのHTU21D-Fセンサーでも動作するように設計されています----> https://www.adafruit.com/products/1899 * / Adafruit_HTU21DF htu =Adafruit_HTU21DF (); / * Macetech Chronodot v2.1バッテリーバックアップリアルタイムクロック(RTC)... http://docs.macetech.com/doku.php/chronodot(私のMKR1000のバッテリーはそうではないようです)オンボードRTCを存続させます)Adafruitリアルタイムクロック(RTC)ライブラリ情報https://learn.adafruit.com/adafruit-data-logger-shield/using-the-real-time-clock Analog Devices TMP36 analog校正済み温度センサー。これには、いくつかの計算が必要ですhttps://learn.adafruit.com/tmp36-temperature-sensor http://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf ML8511UVセンサー...このセンサーは、280〜390nmの光を最も効果的に検出します。これは、UVB(燃焼光線)スペクトルとほとんどのUVA(日焼け光線)スペクトルの一部として分類されます。 MOD-1016(AS3935ライトニングセンサー)i2cアドレス0x03-AS3935ライトニングセンサーAdafruitには、DC電圧出力(0.4-2.0v)を提供するアネモメーターがありますhttps://www.adafruit.com/products/1733 http:// www。 instructables.com/id/Breezefinder-Citizen-Science-Windpower-Tool/step2/Build-the-housing/土壌水分検出器(YL-69センサーなど)にはアナログ入力が必要です... http://www.instructables.com / id / Arduino-LCD-Soil-Moisture-Sensor / step3 / Connect-moisture-sensor / My MKR1000 Connections(すべてのセンサーは3.3vシグナリングである必要があります!)===========* / int UVOUT =A1; // MV8511UVセンサーからの出力intlightOut =A2; // TEMT6000可視光センサーからの出力inttmp36out =A3; // TMP36ローカル温度センサーからの出力intmq9out =A4; // DFrobot MQ-9 CO /可燃性Gsセンサーからの出力/ * A5水分センサーA6風速センサー? 0(HW INT)押しボタン1(HW INT)AS雷検知器2(HW INT)風速風速計? (1回転ごとの割り込み)3(HW INT)レインティッパー…4 5 * / intsounderPin =6; //ピエゾサウンダー出力(オンボードLEDと共有)//(ジャンパーを使用してサウンダーを無効にすることができますが、オンボードLEDは点滅します)int neopixelPin =7; //シフトレジスタベースのLEDを使用した視覚化用のNeoPixel出力/ * 11i2c SDA 12 i2c SCL * / // Chronodot i2cRTCの変数のデカール... int addrRTC =(0x68); // RTC i2caddressint秒; // RTCからのBCDの組み合わせ(00h)int seconds1; // 0-9int seconds10; // 0-5int分; // RTCからのBCDの組み合わせ(01h)int minutes1; // 0-9int minutes10; // 0-6int時間; // RTCからのBCDの組み合わせ(02h)int hours1; // 0-9 int hours10; // 0-2int日; // 1-7(03h)int date; // 01-31(04h)int月; // 01-12(05h)int年; // 0-99; (06h)int a1secs; //(07h)アラームを取得1秒int a1mins; //(08h)アラームを取得1分inta1hrs; //(09h)アラームを取得1 hoursint a1daydate; //(0Ah)アラーム1日と日付を取得bitsint a2mins; //(0Bh)アラームを取得2minutesint a2hrs; //(0Ch)アラームを取得2 hoursint a2daydate; //(0Dh)アラーム2日と日付を取得bitsint rtcstatus; //(0Eh)RTCステータスを取得bitsint aginginfo; //(0Fh)エージングオフセット情報を取得// 10hとは?inttemprtc; // RTCからのBCDの組み合わせ(11h)int tempfrtc; // RTCからのBCDの組み合わせ(12時間)/ *************************************** *********************************** /// Arduinoセットアップ機能(起動時に自動的に呼び出されます)/ ** ************************************************** ********************** / void setup(void){Serial.begin(9600); delay(1000); Serial.println( "i2cセンサーデッキ"); //入力ピンと出力ピンを設定することを忘れないでください! pinMode(UVOUT、INPUT); // ML8511 UVセンサーpinMode(lightOut、INPUT); // TEMT6000可視光センサーpinMode(tmp36out、INPUT); // Analog Devices TMP36温度センサーpinMode(sounderPin、OUTPUT); // HIGHは、サウンダーにノイズを放出させますpinMode(neopixelPin、OUTPUT); //ストリップにインラインで220オームの抵抗を使用します/ * BMP085 / BMP180センサーを初期化します* / if(!bmp.begin()){/ * BMP085 / 180の検出に問題がありました...接続* / Serial.print( "おっと、BMP085 / 180が検出されません...配線またはI2CADDDRを確認してください!"); while(1); } / *このセンサーに関する基本情報を表示します。BMP180はBMP085として報告します* / displaySensorDetails(); / * HTU21Dセンサーを初期化します* / if(!htu.begin()){Serial.println( "HTU21が見つかりませんでした-DFセンサー! "); while(1); } // Chronodot RTCクロックを初期化します//(値を変更し、コメントを解除してから、アップロードして時刻を設定し、再度コメントアウトします)/ *秒=0;分=41;時間=20;日=7;日付=3;月=1;年=16; initChrono(); * /} void loop(void){beep(50、2); //サウンダーでループの開始をアナウンスします//ネオピクセルをティールに設定します... // int red =0; int green =45; int blue =30; //strip.setPixelColor(0、(red、green、blue)); //strip.show(); / ***************************************** ***************************** // *クロノット情報i2cアドレス0x68をプルします-DS1307RTC * // *ボード情報:http ://docs.macetech.com/doku.php/chronodot * // * DS3231データシート:http://datasheets.maxim-ic.com/en/ds/DS3231.pdf * // ******* ************************************************** ************* / int temprtc; / *新しいタイムスタンプを取得します* / Wire.beginTransmission(0x68); // 0x68はDS3231デバイスアドレスですWire.write((byte)0); //レジスタ0から開始Wire.endTransmission(); Wire.requestFrom(0x68、13); // 19バイトを要求します(バイト数はDECまたはHEXですか?)//(秒、分、時間、日、日付、月、時間、// a1secs、a1mins、a1hrs // a1secs、a1mins、a1hrs //エージングオフセット、一時整数、一時分数)while(Wire.available()){秒=Wire.read(); //(00h)秒を取得分=Wire.read(); //(01h)分を取得時間=Wire.read(); //(02h)get hours day =Wire.read(); //(03h)曜日を取得date =Wire.read(); //(04h)月の日付を取得month =Wire.read(); //(05h)月を取得し、世紀ビット年=Wire.read(); //(06h)年を取得int a1secs =Wire.read(); //(07h)アラームを取得1秒int a1mins =Wire.read(); //(08h)アラームを取得1分int a1hrs =Wire.read(); //(09h)アラームを取得1時間int a1daydate =Wire.read(); //(0Ah)アラーム1日と日付ビットを取得int a2mins =Wire.read(); //(0Bh)アラームを取得2分int a2hrs =Wire.read(); //(0Ch)アラームを取得2時間int a2daydate =Wire.read(); //(0Dh)アラーム2の日付と日付のビットを取得しますint rtcstatus =Wire.read(); //(0Eh)RTCステータスビットを取得int aginginfo =Wire.read(); //(0Fh)エージングオフセット情報を取得temprtc =Wire.read(); //(11h)tempの整数部分を取得し、tempfrtc =Wire.read();に署名します。 //(12h)tempの小数部分を取得します//ビットを読み取り、先行ゼロのパディングでデータを正規化します//注:Chronodotは夏時間について知りません、コードをシャウドしますか? seconds10 =((seconds&0b11110000)>> 4); seconds1 =((seconds&0b00001111)); // BCDを10進数に変換しますminutes10 =((minutes&0b11110000)>> 4); minutes1 =(minutes&0b00001111); // BCDを10進数に変換しますhours10 =(((hours&0b00100000)>> 5)* 2 +((hours&0b00010000)>> 4)* 1); hours1 =(hours&0b00001111); // BCDを10進数に変換します(24時間モードを想定)years =(years + 2000); temprtc =((temprtc&0b01111111)+(((tempfrtc&0b11000000)>> 6)* 0.25)); } get_date(); //これは、Dayligh SavingsTimeの決定を追加して時間を変更できる場所の1つです... Serial.print( "ChronoDot-"); Serial.print(hours10); Serial.print(hours1); Serial.print( ":"); Serial.print(minutes10); Serial.print(minutes1); Serial.print( ":"); Serial.print(seconds10); Serial.print(seconds1); Serial.print( "20"); Serial.print(年); Serial.print( ""); Serial.print(月); Serial.print( ""); Serial.print(日付); Serial.print( "\ t"); Serial.print(temprtc); Serial.println( "C"); delay(100); //次のセンサーが停止した場合に備えて、これで印刷が終了します/ ************************************* ************************************ // * BMP180データi2cアドレス0x77を取得-BMP180BaroPresおよび一時* // *データ:http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf * // ******************* ************************************************** * / sensor_event_tイベント; bmp.getEvent(&event); / *まず、BMP085 / BMP180から現在の温度を取得します* / float BMPtemperature; bmp.getTemperature(&BMPtemperature); float BMPtempF =(BMPtemperature * 1.8 + 32); Serial.print( "Temp:"); Serial.print(BMPtemperature); Serial.print( "C("); Serial.print(BMPtempF); Serial.print( "F)\ t"); / *結果を表示します(気圧はhPaで測定されます)* / if(event.pressure){/ * hPaで大気圧を表示します* / Serial.print( "BMP180-Pres:"); Serial.print(event.pressure); Serial.print( "hPa \ t"); / *妥当な精度で高度を計算するには、圧力**データが変換された時点での位置の海面気圧**と、摂氏での周囲温度が必要です。これらの値がない場合は、「generic」値* * 1013.25 hPaを使用できます(sensors.hではSENSORS_PRESSURE_SEALEVELHPA * *として定義されます)が、これは理想的ではなく、1日から可変**の結果が得られます。次へ。 * * * *通常、現在のSLP値は、天気**のWebサイトまたは主要空港近くの環境情報センターから確認できます。 * * **水銀柱インチの変換http://www.csgnetwork.com/pressinmbcvt.html* * *たとえば、フランスのパリの場合、現在の平均* *気圧と海面はhttp:// bitで確認できます。 .ly / 16Au8ol * / / *次に、大気圧とSLPを高度に変換します* / / *より良い結果を得るために、この次の行を現在のSLPで更新します* / float seaLevelPressure =SENSORS_PRESSURE_SEALEVELHPA; Serial.print( "Alt:"); Serial.print(bmp.pressureToAltitude(seaLevelPressure、event.pressure)); Serial.println( "m"); delay(100); //次のセンサーが停止した場合に備えて、これで印刷が終了します} else {Serial.println( "Sensor error"); } / ************************************************ ********************** / * HTU21-DFデータi2cアドレス0x40を取得-湿度および温度センサー* / *次に、大気圧とSLPを高度に変換します* / *より良い結果を得るために、この次の行を現在のSLPで更新します* / * https://learn.adafruit.com/adafruit-htu21d-f-temperature-humidity-sensor/overview/********* ************************************************** *********** / float HTUtemperature =htu.readTemperature(); float HTUtempF =(HTUtemperature * 1.8 + 32); Serial.print( "HTU21-DF-温度:"); Serial.print(HTUtemperature); Serial.print( "C("); Serial.print(HTUtempF); Serial.print( "F)\ tHum:"); Serial.print(htu.readHumidity()); Serial.println( "%"); delay(100); //次のセンサーが停止した場合に備えて、これで印刷が終了します/ ********************************** ************************************ / *アナログデバイセズの由緒あるTMP36精密温度センサー/ *これには出力を読み取った後のちょっとした計算... / * https://learn.adafruit.com/tmp36-temperature-sensor/using-a-temp-sensor/ ************** ************************************************** ****** ///温度センサーからの電圧読み取り値の取得intreading =averageAnalogRead(tmp36out); // 0.0032258064516129は、3.3vフロートのDACユニットですtmp36voltage =0.0032258064516129 *読み取り; //電圧を出力しますSerial.print( "TMP36 --temp:"); float tmp36temperatureC =(tmp36voltage --0.5)* 100; // 500mVオフセットで1度あたり10mvから度に変換((電圧-500mV)×100)Serial.print(tmp36temperatureC); Serial.print( "C \ t"); //華氏に変換しますfloattmp36temperatureF =(tmp36temperatureC * 9.0 / 5.0)+ 32.0; Serial.print(tmp36temperatureF); Serial.print( "F、out:"); Serial.print(tmp36voltage); Serial.println( "v"); delay(100); //次のセンサーが停止した場合に備えて、これで印刷が終了します/ ********************************** ************************************ * VishayTEMT6000可視光センサー-アナログ読み取り* https:// www.sparkfun.com/products/8688/ ********************************************** ****************************** / int vLevel =averageAnalogRead(lightOut); // 0.0032258064516129は(3.3v(DAC参照電圧)\ 1023 * uvLevel)float newVOutVolts =0.0032258064516129 * vLevel; Serial.print( "TEMT6000 out:"); Serial.println(vLevel); delay(100); //次のセンサーが停止した場合に備えて、これで印刷が終了します/ ************************************* ************************************ * ML8511UVセンサー-アナログ読み取り* https:// learn。 sparkfun.com/tutorials/ml8511-uv-sensor-hookup-guide * / ********************************* ************************************* / int uvLevel =averageAnalogRead(UVOUT); // 0.0032258064516129 is (3.3v (the DAC ref voltage) \ 1023 * uvLevel) float newOutVolts =0.0032258064516129 * uvLevel; //Convert the voltage to a UV intensity level float uvIntensity =mapfloat(newOutVolts, 0.99, 2.8, 0.0, 15.0); Serial.print("ML8511 UV out:"); Serial.print(uvLevel); Serial.print(" / UV Intensity (mW/cm^2):"); Serial.println(uvIntensity); delay(100); // so this will finish printing, in case the next sensor is stalled/********************************************************************** * DFrobot MQ-9 CO/Combustable Gas sensor - analog reading * http://www.dfrobot.com/wiki/index.php/Analog_Gas_Sensor(MQ9)_(SKU:SEN0134) * https://www.pololu.com/category/83/gas-sensors There are many available * But, deciphering what the output levels mean is an exercise for the buyer. :-(/**********************************************************************/ int MQ9volts =analogRead(mq9out); // Read Gas value from the MQ-9 sensor Serial.print("MQ-9 Gas:"); Serial.println(MQ9volts,DEC); delay(100); // so this will finish printing, in case the next sensor is stalled Serial.println(""); delay(3500); // looking to time the loop at about 5 seconds... // End of the main loop...}/**************************************************************************//* The code below are supporting subroutines */**************************************************************************//* Chronodot-related subroutines * * initChrono, set_date, get_date, set_time, get_time, get_temp, * * setHour, SetMinutes, decToBcd, bcdToDec *//**************************************************************************/void initChrono(){ set_time(); set_date();}void set_date(){ Wi re.beginTransmission(104); Wire.write(4); Wire.write(decToBcd(day)); Wire.write(decToBcd(date)); Wire.write(decToBcd(month)); Wire.write(decToBcd(years)); Wire.endTransmission();}void get_date(){ Wire.beginTransmission(104); Wire.write(3);//set register to 3 (day) Wire.endTransmission(); Wire.requestFrom(104, 4); //get 4 bytes(day,date,month,year); day =bcdToDec(Wire.read()); date =bcdToDec(Wire.read()); month =bcdToDec(Wire.read()); years =bcdToDec(Wire.read());}void set_time(){ Wire.beginTransmission(104); Wire.write((byte)0); Wire.write(decToBcd(seconds)); Wire.write(decToBcd(minutes)); Wire.write(decToBcd(hours)); Wire.endTransmission();}void get_time(){ Wire.beginTransmission(104); Wire.write((byte)0);//set register to 0 Wire.endTransmission(); Wire.requestFrom(104, 3);//get 3 bytes (seconds,minutes,hours); seconds =bcdToDec(Wire.read() &0x7f); minutes =bcdToDec(Wire.read()); hours =bcdToDec(Wire.read() &0x3f);}void get_temp(){ Wire.beginTransmission(104); Wire.write((byte)0); //set register to 0 Wire.endTransmission(); Wire.requestFrom(104, 3);//get 3 bytes (seconds,minutes,hours); seconds =bcdToDec(Wire.read() &0x7f); minutes =bcdToDec(Wire.read()); hours =bcdToDec(Wire.read() &0x3f);}void setHour(){ hours++; if (hours> 23) { hours =0; seconds =0; minutes =0; } set_time();}void setMinutes(){ minutes++; if (minutes> 59) { minutes =0; } seconds =0; set_time();}byte decToBcd(byte val){ return ( (val / 10 * 16) + (val % 10) );}byte bcdToDec(byte val){ return ( (val / 16 * 10) + (val % 16) );}/**************************************************************************//* Displays some basic information on this sensor from the unified sensor API sensor_t type (see Adafruit_Sensor for more information) *//**************************************************************************/void displaySensorDetails(void){ sensor_t sensor;// bmp.getSensor(&sensor); Serial.println("------------------------------------"); Serial.print ("Sensor:"); Serial.println(sensor.name); Serial.print ("Driver Ver:"); Serial.println(sensor.version); Serial.print ("Unique ID:"); Serial.println(sensor.sensor_id); Serial.print ("Max Value:"); Serial.print(sensor.max_value); Serial.println(" hPa"); Serial.print ("Min Value:"); Serial.print(sensor.min_value); Serial.println(" hPa"); Serial.print ("Resolution:"); Serial.print(sensor.resolution); Serial.println(" hPa"); Serial.println("------------------------------------"); Serial.println( ""); delay(500);}/**************************************************************************//* Takes an average of readings on a given pin, Returns the average */* used for the TMP36 and ML8511 UV Sensor readings./**************************************************************************/int averageAnalogRead(int pinToRead){ byte numberOfReadings =8; unsigned int runningValue =0; for(int x =0; x  
Taking an Average Analog ReadingArduino
This was a clever hack I found in the SparkFun library for the ML8511 UV Sensor, but I'm calling it out specifically, since you can use it for any analog read! If you ever meet Nathan Seidl, please buy him a beer (it's a Beerware license.)
//Takes an average of readings on a given pin//Returns the averageint averageAnalogRead(int pinToRead){ byte numberOfReadings =8; unsigned int runningValue =0; for(int x =0; x  
I2C bus scannerArduino
If you don't know the base address for your i2c devices, use this to scan the range of valid addresses. It knows about the sensors that I've been working with. You can add sections for your other sensors.
// --------------------------------------// i2c_scanner//// Found at http://playground.arduino.cc/Main/I2cScanner?action=sourceblock&num=1// 26 OCT 2015//// Version 1// This program (or code that looks like it)// can be found in many places.// For example on the Arduino.cc forum.// The original author is not know.// Version 2, Juni 2012, Using Arduino 1.0.1// Adapted to be as simple as possible by Arduino.cc user Krodal// Version 3, Feb 26 2013// V3 by louarnold// Version 4, March 3, 2013, Using Arduino 1.0.3// by Arduino.cc user Krodal.// Changes by louarnold removed.// Scanning addresses changed from 0...127 to 1...119,// according to the i2c scanner by Nick Gammon// http://www.gammon.com.au/forum/?id=10896// Version 5, March 28, 2013// As version 4, but address scans now to 127.// A sensor seems to use address 120.//// This sketch tests the standard 7-bit addresses// Devices with higher b it address might not be seen properly.//// Zonker Harris added device descriptions, comments. OCT 10 2015// #include void setup(){ Wire.begin(); Serial.begin(9600); Serial.println("\nI2C Scanner");}void loop(){ byte error, address; int nDevices; Serial.println("Scanning..."); nDevices =0; for(address =1; address <127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error =Wire.endTransmission(); if (error ==0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); // Serial.print(address); If needed, print the address in decimal // // Now, detail sensors that we know about or expect... if (address ==3) { // DEC 3 =0x03 HEX =AS3935 Lightning Sensor Serial.print(" - AS3935 Lightning Sensor"); } if (address ==64) { // DEC 64 =0x40 HEX =HTU21D Humidity and Temp Sensor Serial.print(" - HTU21D Humidity and Temp Sensor"); } if (address ==104) { // DEC 104 =0x68 HEX =DS1307 (Chrono-Dot?) RTC Serial.print(" - DS1307 RTC (Chrono-Dot?)"); } if (address ==119) { // DEC 119 =0x77 HEX =BMP180 Barometric Pressure and Tem Sensor Serial.print(" - BMP180 Barometric Pressure and Tem Sensor"); } Serial.println(" "); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); if (address ==3) { // DEC 3 =0x03 HEX =AS3935 Lightning Sensor Serial.print(" - AS3935 Lightning Sensor"); } if (address ==64) { // DEC 64 =0x40 HEX =HTU21D Humidity and Temp Sensor Serial.print(" - HTU21D Humidity and Temp Sensor"); } if (address ==104) { // DEC 104 =0x68 HEX =DS1307 (Chrono-Dot?) RTC Serial.print(" - DS1307 RTC (Chrono-Dot?)"); } if (address ==119) { // DEC 119 =0x77 HEX =BMP180 Barometric Pressure and Tem Sensor Serial.print(" - BMP180 Barometric Pressure and Tem Sensor"); } } } if (nDevices ==0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan}/* The output looks like this... * * Scanning... * I2C device found at address 0x03 - AS3935 Lightning Sensor * I2C device found at address 0x40 - HTU21D Humidity and Temp Sensor * I2C device found at address 0x68 - DS1307 RTC (Chrono-Dot?) * I2C device found at address 0x77 - BMP180 Barometric Pressure and Tem Sensor * done * */
ML8511 Demo CodeArduino
Modified for use with a 3.3v-native CPU (for DAC reference units).
/* * From https://learn.sparkfun.com/tutorials/ml8511-uv-sensor-hookup-guide 19 MAR 2016 * (Adapted for MKR1000 by Zonker Harris, MAR 2016) ML8511 UV Sensor Read Example By:Nathan Seidle SparkFun Electronics Date:January 15th, 2014 License:This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license). The ML8511 UV Sensor outputs an analog signal in relation to the amount of UV light it detects. Connect the following ML8511 breakout board to Arduino:3.3V =3.3V OUT =A1 GND =GND EN =3.3V * The Sparkfun demo presumes 5v VCC, but the MKR1000 is 3.3v native. * Because of this, the second reference voltage value will always be "1023". * As a result of testing, I cut that part out... -Z- Test your sensor by shining daylight or a UV LED:https://www.sparkfun.com/products/8662 This sensor detects 280-390nm light most effectively. This is categorized as part of the UVB (burning rays) spectrum and most of the UVA (tanning rays) spectrum. There's lots of good UV radiation reading out there:http://www.ccohs.ca/oshanswers/phys_agents/ultravioletradiation.html https://www.iuva.org/uv-faqs *///Hardware pin definitionsint UVOUT =A1; //Output from the sensorvoid setup(){ Serial.begin(9600); pinMode(UVOUT, INPUT); Serial.println("ML8511 example");}void loop(){ int uvLevel =averageAnalogRead(UVOUT); float newOutVolts =0.0032258064516129 * uvLevel; // This is 3.3v \ 1023 * uvLevel float uvIntensity =mapfloat(newOutVolts, 0.99, 2.8, 0.0, 15.0); //Convert the voltage to a UV intensity level Serial.print("ML8511 out:"); Serial.print(uvLevel); Serial.print(" / UV Intensity (mW/cm^2):"); Serial.print(uvIntensity); Serial.println(); delay(100);}//Takes an average of readings on a given pin//Returns the averageint averageAnalogRead(int pinToRead){ byte numberOfReadings =8; unsigned int runningValue =0; for(int x =0; x  

回路図

I'm too new to Fritzing, and couldn't find many parts in the library, so I made this mock-up instead.

製造プロセス

  1. センサーフュージョンは複数のメリットをもたらします
  2. センサーデータとRaspberryPiマイクロプロセッサーの統合
  3. RPiを備えたライントラッキングセンサー
  4. RPiを使用した環境センサーAPI
  5. ラズベリーパイと湿度センサーを備えたエアロポニックス
  6. PIRモーションセンサーを備えたRaspberryPi GPIO:最高のチュートリアル
  7. RaspberryPiでのA111パルスレーダーセンサーの使用
  8. HC-SR501PIRモーションセンサーとRaspberryPiのインターフェース
  9. Googleスプレッドシートを使用したPython / MicroPythonセンサーロガー
  10. Raspberry Pi2上のWindows10 IoT Core –Adafruitセンサーデータ
  11. スリープモードのラズベリーパイシャットダウン回路