自分で育てる| GIY
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要なツールとマシン
> |
| |||
|
アプリとオンラインサービス
> |
| |||
|
このプロジェクトについて
はじめに
MITのOpenAgricultureInitiativeのディレクターであるCalebHarperが提供したTEDTalk about Digital Farmingを見て、私は大きな刺激を受けました。このトピックは、このコンピューターは将来あなたの食べ物を育てます 。彼の講演で私に本当にインスピレーションを与えた最も重要な質問は、世界中のどこでも屋内で、栄養価の高いおいしい食べ物を育てることができたらどうなるかということでした。そしてここでアイデアが生まれました!
ですから、私がやろうとしているのは、箱やインキュベーターのようなものです。これは、成長に必要な理想的な気候条件を作り出し、植物が必要とする量の光と栄養素を正確に提供することができます。太陽光エミュレーター、灌漑システム、気候コントローラーを1つのエレガントでモダンなデザインにまとめて構築したいと思います。
<図>次のテクノロジーを実装することで、望ましい結果を達成することを計画しています。
LEDライトを成長させる -植物のクロロフィルは、主に450nmと650nmで表される2つの波長にのみ反応します。私が使用する予定のLEDシステムは、赤と青のLEDライトを組み合わせて、栄養成長と開花成長の両方に役立つ完璧なブレンドを提供します。
超音波アトマイザー (フォグメーカー)-最近自分で見つけた、肥料を注入したミストで植物に水をやるエアロポニックス(FogPonics)と呼ばれる新しい灌漑方法を使用したいと思います。
栄養素の自動投与 -このシステムは、植物が必要なときに正確に栄養素を自動的に投与します。
水検知システム -システムにpHセンサーとTDS(Total Dissolved Solids)センサーを装備して、植物に最適な貯水池のpH値のバランスを維持し、栄養素をいつ投与するかを知って警告したいと考えています。
水交換システム -システムには、自動水交換用のフックアップが装備されている必要があります。このプロセスを簡単にし、ボタンをクリックするだけで制御できるようにしたいと思います。
空気制御システム -システム内の温度と湿度を1度まで正確に制御できます。背後にある技術には、データを受信するためのDHT22やDHT11などの温度/湿度センサーと、それに応じてデータを調整するためのコイル付きファンの使用が含まれます。
モバイルアプリ -人生で初めてアプリを作りたいです!このアプリには、統計を追跡し、ソーシャルメディアで成長の進捗状況を共有するために、pHレベル、温度、湿度、栄養素、ppmなどに関するリアルタイムの情報と経時的なグラフ表現を含める必要があります。また、システムに影響が必要なときに通知するインテリジェントアラートを実装したいと思います。また、携帯電話でデータ表現を受信するだけでなく、システム内の気候条件を設定できるようにしたいです!
残念ながら、私はこの種のアイデアを思いついた最初の人ではありませんが、創造的なアイデアを思いつくための最良の方法は、既存のアイデアを改善することです!
市場にはいくつかの同様のプロジェクトがありますが、個々の利点はありますが、スペースを取りすぎたり、小さすぎたり、高すぎたり、一度に1つの作物しか栽培できないなど、いくつかの欠点もあります。利用可能なプロジェクトの長所と短所を注意深く調査および分析し、市場の反応を考慮して、不利な点を減らし、最高の機能のみを実装する新しい高度なオープンソースシステムを考え出したいと思います。
とても野心的ですね。しかし、試してみましょう
実験
植物を扱うのはとても時間がかかります!彼らは通常、成長するのに数週間から数ヶ月かかるので、私はその準備ができていなければなりません!
最終的なプロジェクトのために何を作りたいかはすでにわかっているので、最後の瞬間にすべてを残しておくのではなく、事前にそれを処理する必要があります。そのため、できるだけ早くテストと実験を開始します!
私が最初に知りたいのは、栄養豊富なミストを使用して植物を育てるという事実です。 および LEDライトの成長 土壌や自然光の中で従来のシステムよりも優れています!理論的にはこれが当てはまるはずですが、試してみるまで何も信じません!
そこで、私は自分の実験を始めることにしました。これには時間がかかります。それは、植物をいくつかのグループに分けることで構成されています。
- (土壌+日光) -このグループは、完全に自然な条件で成長し、土壌に植えられ、窓辺に置かれます。
- (霧+日光) -このグループは、栄養豊富なミストが入ったコンテナに入れられ、同じ窓辺にも置かれます
- (土壌+成長LEDライト) -このグループは土壌になりますが、太陽光の代わりに人工のGrowLEDライトを使用します
- (フォグ+グローLEDライト) -これは HERO であると想定されています グループ)私の将来のシステムでは、LEDライトの成長と栄養豊富な霧の雲という、これら2つの機能が実装されるため、この組み合わせで最良の結果が得られることを期待しています。
地元のドイツの店カウフラントの植物部門で、私は混合ハーブの種子を購入しました。これらは私のテストの赤ちゃんになります:p
<図> <図>私が何かを植えたのは人生で初めてでした:D私が何か間違ったことをしたかどうか私を判断しないでください!)
以前にいくつかのチュートリアルをチェックしましたが、最初に種子を発芽させる必要があることを学びました。プラスチックの容器を手に入れ、そこに種を置き、ペーパータオルで覆いました。この段階では、ほぼ100%の湿度が必要です。そのため、スプレーを使用してペーパータオルに水をまき、容器をビニール袋で覆って、水が蒸発しないようにしました。
<図>種を1.5週間放置しましたが、容器を開けるとびっくりしました!
<図>ほとんどすべての種子が発芽しました!私は子供のように幸せでした)
次に、茎が最も太く、全体的に大きくて見栄えの良い、最高の小さな植物を選択する必要がありました。
<図>私がフォローしていたチュートリアル(YouTubeブロガー)では、その男は、いわゆる「2枚目の葉」ができるまで、小さな植物をあらゆる種類の培地に植えることを勧めました。アマゾンでココナッツコイアペレットを注文しました 。それらは有機的で、土壌と同様の特性を持っています。そしてクールなのは、ペレットに水をやると、サイズが6倍になることです。
植栽専用のセパレーターが入った箱も購入しました!私はたった2ユーロでそれを手に入れました、そしてこれは物事をより組織的にしました。ココナッツペレットを箱のセパレーターの中に入れ、完全に水和するまで水をやり、小さな植物を真ん中に置き、箱キットに付属の透明なプラスチック片で箱を覆いました。
私の小さな温室は次のようになりました:
<図>箱を閉めて一週間放置しました!
そしてまた開けてみるとびっくりしました!彼らは実際に大きくなりました!なんとか植物を育てるなんて想像もできませんでした。自分の面倒を見ることがほとんどできませんでした:D
<図>一週間後、違いが目立ちます!
これで、最初の根が見えたら、それらを土と粘土のボールに入れて、霧の実験を始めることができます!
<図> <図>コンピューター支援設計の週に、私は植物を置くために使用したネットカップを設計しました
<図>また、地元の店で必要な寸法のプラスチック容器を購入し、穴をスケッチしてドリルしました!
<図>そして、これが私の組み立てられたテストシステムで、ココナッツペレットの中に植物があり、粘土球と土壌があります!
<図>正直なところ、結果はもっと良くなる可能性があります:D
私の霧のシステムで生き残った植物はほんのわずかでした。私の推測では、培地が成長しているためです!霧は粘土球を湿らせておくのに十分なほど強くはなく、土もそうではありません。
イースターブレイク!
イースター休暇中、私は何もしませんでした。ラボが閉鎖されていたため、すべてのシステムもオフになりました。だから、私の植物はすべて死んだ
新鮮な気持ちで別のシステムを作ることにしましたが、今回は以前の観察に基づいて別の成長培地を使用しました
私がこのシステムに選んだ成長媒体は Rock Wool
です。 。地元のイケアストアで購入しました。私も彼らの部門からいくつかの種を購入しました
そして、新しい種子をロックウールに入れて1週間発芽させました!
<図>1週間後、チェックボックスをオンにすると、あるタイプのシードが成功し、別のタイプが失敗したことに気付きました。時間が足りなかったので、発芽した種を続けました
<図>その間、私は別のフォグシステムをセットアップし、その作業時間を増やして、フォグを使用して種子を発芽できるかどうかを確認します。フォグのみ!
さまざまなパラメータと設定を試し続け、どこまで到達できるかを確認します!)
エレクトロニクスの設計と製造
最終的なボードの設計に取り掛かる前に、私は座って、ボードが実装して満たす必要のあるすべての機能と要件を紙に描きました。また、より正確に見積もり、最終的なマイクロプロセッサを決定するために、使用されるピンの数を追跡します
ボード上にあるべきもののスケッチは次のとおりです:
<図>使用するボードの最終的な選択は、 satshakit の間でした。 DanieleIngrassiaと FABLEO から ジョナサン・グリナム
satshakitは、100%Arduino IDEとライブラリと互換性があり、ファブ可能でオープンソースのボードであり、Fabkitの改良版でもあります。
Fabkitの主な改善点と機能は次のとおりです。
- 8Mhzではなく16Mhz
- 共振器の代わりに水晶
- コストが安い(7〜9ユーロ対13ユーロ)
- デフォルトのArduinoIDEと100%互換性があります(satshakitはArduino UNOとして認識されます)
- ADC6 / 7が接続されていない代わりにADC6 / 7が接続されている(satshakitレーザーとCNC)
- はんだ付けを容易にするためのより広いスペース(satshakitレーザーおよびCNC)
一方、FabLeoには非常によく似た機能に加えて、ハードウェアUSBがあります。以前にATmega328pをすでに使用していたので、何か新しいことを試してみたかったので、FabLeoデザインを出発点として使用することにしました
私の聖書 この割り当ての#1ガイドは、 ATmega32u4ピン配置でした。
<図>ボードを設計するために、これに使用するソフトウェアは EAGLE です。 (簡単に適用できるグラフィカルレイアウトエディタ)は、柔軟で拡張可能なEDA回路図キャプチャ、PCBレイアウト、オートルーター、およびCAMプログラムです。 EAGLEは、フリーウェアライセンスと、Web上のコンポーネントライブラリの豊富な可用性により、愛好家の間で人気があります。
Eagleには、ボードの設計に同時に使用される2つのウィンドウがあります。
- 回路(.sch) -論理コンポーネント
- ボードレイアウト(.brd) 私たちが製粉する実際のボード用
EAGLEをインストールした後、最初にやりたいことは新しい回路図を作成するです。 。電子機器の回路図は、回路を表す図面です。記号を使用して、実際の電子部品を表します。最も基本的な記号は単純な導体(トレース)で、単純に線で示されています。ワイヤが図で接続されている場合、それらは交点にドットで表示されます。
コンポーネントを回路図面に配置するには、特別なライブラリをダウンロードして使用する必要があります。 。 Eagleには、使用できるコンポーネントのライブラリが多数組み込まれています。ファブネットワークは、常に更新されるライブラリも維持しています:
fab.lbr
ライブラリをインストールするには、EAGLE環境で、上部のツールバーに移動し、 Library
を選択します。 メニュー。次に、 use
を選択します .lbr を開きます ダウンロードしたファイル。
これで、コンポーネントの追加
に移動できます ライブラリを選択して、配置するコンポーネントを選択します。
すべてのコンポーネントを回路図面に配置したら、それぞれをマイクロプロセッサのピンに接続する必要があります。 EAGLEの左側のメニューで、 Net
をクリックします。 、緑色の線を引いてピンを接続できるコマンド。重要なのは、ピンの小さな線から接続を開始することです(写真にマークを付けました)
複数の接続を避けるために、ラベルを使用します。 。 EAGLEの左側のメニューで、 Add Label
を押します 接続線の最後に追加します。 右クリックを押すと 次に、 name
を選択します 、マイクロプロセッサのピンに使用したのと同じ名前のラベルを付けて、この方法で接続できます!
すべてを正しく行うと、次のようなメッセージが表示されます。ラベル(N $ 10)をGNDに接続してもよろしいですか?
<図>この段階で、化学では重要なのはロジックです。 見た目ではなく、すべての接続のすべてのコンポーネントを配置し、論理的な方法で接続した後、次のようになります。
<図>AVRISP を追加しました ピンヘッダー、およびコネクタの順序に従って配置します。これらのピンは、ボードをプログラムするために使用されます。
<図>これが USB の回路図です 水晶と一緒に回路
<図>電圧レギュレータも追加しました 入力12Vを5Vに変換することでボード全体に電力を供給する回路
<図>このボードの重要な機能の1つは、 MOSFET です。 回路を追加しました。そのうちの4つを追加し、3つを入力(12V)に直接接続し、1つを昇圧電圧レギュレーターに接続します。最後のものは、24Vで動作するフォグに電力を供給するために使用されます
<図>
すべての接続を再確認したら、次のステップであるボードレイアウトに進むことができます。 。トップメニューで、 Generate / Switch to Board
を押します 。
私が最初にすることは、グリッドを増やすことです 解決。 表示
に移動します メニューをクリックし、 Grid
を押します 、値を 0.01
に変更します 。これにより、ルートラインを描画する際により正確になります。
驚いたことに、これまでに作成した中で最も複雑なボードのルーティングも最速でした!)私は自分自身を誇りに思っています。ボードを作った経験はスピードの向上に良い影響を与えました。ルーティングが完了した後、これは小さな獣がどのように見えるかです:
<図>このボードでは、以前に学んだトリックも使用しています。コンポーネントの周りにポリゴンを描画し、右クリックを押します。 多角形の線で、名前をGNDに変更します。これにより、ポリゴン内の領域全体が塗りつぶされ、GNDになります。
これにより、時間、スペース、労力を大幅に節約できます
すべてを再確認すると、エクスポートできます .png
としての私のファイル 写真。
表示されるウィンドウで、解像度を 1500 dpi
に上げます。 、 monochrome
をクリックします 、 window
を選択します モード。
.png画像を編集するには、 GIMP で画像を開きます。 、および長方形選択ツール
を使用する 、四方から少しスペースを空けて画像を選択します。 File
を押した後 およびコピー
選択した領域。選択した画像で作業を続けるには、ファイル
をもう一度クリックします 、およびクリップボードから作成
これは私がすべての編集の後に得たものです:
<図>この画像は印刷する準備ができているので、 Inside_Cut と呼びます。
アウトサイドカットのプロセスを準備します 、そしてこれが私が得たものです:
<図>私のボードは両面なので、2つのピースを粉砕してから接着する必要があります。覚えておくべき唯一のことは、下部が水平にミラーリングされている必要があるということです。
<図>下部 Inside_Cut
<図>下部 Outside_Cut
これで、CNCフライス盤に進むことができます。そこで、ここでも FabModules を使用しました .PNGファイルを Gコードに変換します ローランドマシン用。
Fabモジュールの操作を始めましょう。ブラウザウィンドウにIPアドレスを導入すると、最初に表示されるインターフェイスは次のとおりです。
<図>灰色のボタンを押した後入力形式 、.PNG画像をロードするオプションを含む新しいメニューが表示されます。ここでは、内側の彫刻である最初の画像をアップロードします。その後、画像のプレビューがFab Modulesに表示され、他のフィールドや他のパラメーターも表示されます
ウィンドウの右側には、多くの入力パラメーターがあります。機械を動かすには、次のパラメータを入力する必要があります。
<図>
mod_lp.py / dev / usb / lp0
送信コマンドに フィールド
hostname_of_your_machine
サーバーに フィールド(httpまたは/を含まないアドレスのみ)
マシンを移動するには、それぞれのフィールドにx、y、zの位置座標を入力するだけです。マシンを移動する前に、 zjog を確認する必要があります パラメータは、自動的に変更される場合でも、常に0に設定されます。マシンを移動するには、 move to xyz0
を押す必要があります ボタン。
*小さなライフハック マルチメータを使用して、ツールと表面の間に接続があるかどうかを確認します。 PCBを彫刻するためのツールとして、 0.2 mm
からの直径を使用することをお勧めします 以下では、切断には 1 mm
を使用できます 道具。
したがって、最終設定は次のようになります。
<図>外側のカットについては、0.2mmツールを1mmツールに置き換えたため、Z軸の値を除いて設定は同じままです。見た目は次のとおりです:
<図>下部についても同じプロセスを繰り返します 内側と外側の部品を粉砕します:
<図> <図>これがトップの最終結果です パート:
<図>そして下 パート:
<図>そして今、これをはんだ付けしましょう!
すべてを正しくはんだ付けするために、各コンポーネントをはんだ付けした後、マルチメーターを使用しました。 コンポーネントとトレースの間に導電性があるかどうかを確認します。
プロセスの短いアニメーション:
<図>PCBボードを接続してすべてが正常かどうかを確認すると、エラーに気づきました。経験から、エラーは短絡によるものであることがわかっています。これは、VCCとGNDを接続している間は常にコンピューターがArduinoを切断していたためです。したがって、ボードのどこかでVCCとGNDが接続されていると推測し、マルチメータを使用して、自分が正しいことを確認しました。
遅刻したので、私はとても怒ってしまいました。顕微鏡で1時間かけて、その小さな間違いを見つけました。ここにあります:
<図> <図>ナイフで引っかいて、分離を増やして修正しました!
もう1つは、ステップアップ電圧レギュレーターをボードの裏側に配置することです。
<図> <図>事前に寸法を測定し、ピンヘッダーで固定するための穴あけを事前に設計しました。しかし、裏側にはんだ付けする前に、キャリブレーションする必要があります。
ボードに12Vで電力を供給すると、MOSFET回路に接続されている超音波アトマイザーに必要な24Vがステップアップで出力されるという考え方です。
マルチメータを使用して出力電圧を測定するために、固定12Vのベンチ電源を使用しました。
<図>出力を必要な出力(私の場合は24V)に調整したら、ボードの裏側にはんだ付けできます!
また、裏側には、ネットワーキングとコミュニケーションの週に作ったWiFiボードを配置しました!
それで、ここに THE BEAST があります :
<図> <図>簡単で、すべてがスムーズに進んだと思う人のためのヒーロー写真:D
<図>
ファイルのダウンロード:
GIY回路図面(.sch)
GIYレイアウト(.brd)
ボード#1内部カット(.png)
ボード#1外部カット(.png)
ボード#2内部カット(.png)
ボード#2外部カット(.png)
配線および組み込みプログラミング(I / Oデバイス)
ボードをプログラムするために、 Arduino IDE を使用しました 。 tools
で、arduinoボードをUSBハブに接続します メニューは、 File
に移動した後、右側のボード(Arduino Leonardo)とポートを選択します -> 例
Arduino as ISP を開きます スケッチ。コードをアップロードします。
アップロードが完了しましたを確認したら これは、コードがボードにアップロードされていることを意味し、PCからarduinoを切断します。次のステップは、いくつかのワイヤーを使用してPCBボードをArduinoに接続することです。接続スキームは次のとおりです:
- SCLK:シリアルクロック(マスターからの出力)----------> Arduinoピン13
- MOSI:マスター出力スレーブ入力----------> Arduinoピン11
- MISO:マスター入力スレーブ出力----------> Arduinoピン12
- VCC:正の電源電圧----------> Arduino VCC
- GND:グランド----------> Arduino GND
- RST:----------> Arduinoピン10
arduinoボードをUSBハブに接続します。 ツール
の下 適切なボードを選択し、 ISPプログラマーとしてArduinoを選択します。 パラメータを再確認し、ブートローダーの書き込みを押します ボタン。
そして、アップロードが完了しました!が表示されます 良い兆候)
ボードをテストするために、基本的な点滅をアップロードします サンプルコード:
ああ、私はその点滅が大好きです:Dそれではセンサーに行きましょう!
私が最初に使用したいセンサーは DHT11-温度と湿度のセンサーです
<図>これらのセンサーは非常に基本的で低速ですが、基本的なデータロギングを行いたい愛好家には最適です。 DHTセンサーは、静電容量式湿度センサーとサーミスタの2つの部分で構成されています。内部には、アナログからデジタルへの変換を行い、温度と湿度でデジタル信号を吐き出す非常に基本的なチップもあります。デジタル信号は、どのマイクロコントローラーを使用してもかなり読みやすいです。
いくつかの特徴:
- 超低コスト
- 3〜5Vの電源とI / O
- 変換中(データの要求中)の最大電流2.5mA
- 5%の精度で20〜80%の湿度測定に適しています
- 0-50°Cの温度測定値±2°Cの精度に適しています
- 1 Hz以下のサンプリングレート(1秒に1回)
- 本体サイズ15.5mmx 12mm x 5.5mm
- 0.1 "間隔の4つのピン
配線は非常に簡単で、VCC、GND、および任意のデジタルピンだけです!私の場合、このセンサーの接続を事前に設計しました。
それをテストするために、簡単なスケッチをアップロードします。スケッチにはライブラリDHT.hが含まれています
コードは次のとおりです:
// DHT11温度および湿度センサーExample#include "DHT.h" // DHTライブラリを含める#defineDHTPIN 2 //センサーの接続に使用されるピン2をDHTPINとして定義する#defineDHTTYPE DHT11 // define使用するセンサー(DHT11)DHT dht(DHTPIN、DHTTYPE); // DHTvoid setup()のインスタンスを作成します{Serial.begin(9600); //シリアル通信を初期化しますdht.begin(); //シリアル通信を初期化します} void loop(){float h =dht.readHumidity(); //湿度を読み取るfloatt =dht.readTemperature(); //温度を摂氏(デフォルト)として読み取りますSerial.print( "Temperature ="); Serial.println(t、2); //温度を出力しますSerial.print( "Humidity =");; Serial.println(h、2); //湿度遅延を出力します(2000); // 2秒待ちます}
シリアルモニターを開くと、次のように表示されます。
<図>私が使用したいもう1つのセンサーは、 DS18B20-1線式デジタル温度センサーです。
<図>DS18B20は、MaximICの1-Wireデジタル温度センサーです。 -55〜125(+/- 0.5)の9〜12ビットの精度で摂氏で度を報告します。各センサーには固有の64ビットシリアル番号が刻印されており、1つのデータバスで膨大な数のセンサーを使用できます。
これは、接続するのに最も簡単なデジタルセンサーの1つです。電源とアースの他に、事前に設計したデジタルピンに接続するデジタル信号ピンが1つあります。また、信号ピンと電源ピンの間に4.7kのプルアップ抵抗が必要ですが、残念ながらPCBに配置するのを忘れていました。そのため、手動でセンサーケーブルに直接はんだ付けします。
始める前に、ライブラリOneWire.hとDallasTemperature.hをダウンロードする必要があります
次のスケッチをアップロードします:
//最初にライブラリをインクルードします#include #include #define ONE_WIRE_BUS 3 // OneWireインスタンスをセットアップして(Maxim / Dallasだけでなく)任意のOneWireデバイスと通信します温度IC)OneWire oneWire(ONE_WIRE_BUS); // oneWire参照をDallasTemperatureに渡します。 DallasTemperatureセンサー(&oneWire); void setup(void){//シリアルポートを開始Serial.begin(9600); Sensors.begin(); } void loop(void){// Sensors.requestTemperatures()を呼び出して、グローバル温度(バス上のすべてのデバイスへの要求)を発行しますsensors.requestTemperatures(); //温度の読み取り値を取得するコマンドを送信しますSerial.print( "Temperature is:"); Serial.print(sensors.getTempCByIndex(0)); //同じバス上に複数のDS18B20を配置できます。 0はワイヤ遅延(1000)の最初のICを示します。 }
面白いことに、センサーのプログラミングに成功した後、すべてのセンサーを統合している間、センサーが機能しなくなりました。なぜ動かないのかを考えるのにかなりの時間を費やしましたが、時間が限られていたため、ファブラボの在庫にある別のDS18B20センサーを使用して、自分で防水することにしました!
<図>そこで、センサーを取り、データシートを使用してケーブルを適切にはんだ付けし、収縮チューブを使用してケーブルを互いに分離しました。
<図>どうやって防水するのか、ご存知だと思いますよね? :D ママアマエンジニア!
言ってやった!
<図>ええ、私はそれがどのように見えるかを知っています:Dしかし、私はあなたに保証します、それはただの手の防水センサーです。最も重要なのは、それが機能し、水に沈めても漏れないことです!
そして、次のセンサーである LDR =光依存抵抗器に進みます。
<図>LDRは受動電子部品であり、基本的には光の強度に応じて抵抗が変化する抵抗器です。抵抗は暗闇では非常に高く、ほぼ1MΩですが、LDRに光が当たると、抵抗は数KΩ(10〜20kΩ @ 10ルクス、2〜4kオメガ、@ 100ルクス)に低下します。モデル。
LDRは、Vcc(5V)に接続するとアナログ電圧を出力します。これは、入力光強度に正比例して大きさが変化します。つまり、光の強度が大きいほど、LDRからの対応する電圧が大きくなります。 LDRはアナログ電圧を出力するため、Arduinoのアナログ入力ピンに接続されています。次に、ADC(アナログ-デジタルコンバーター)を内蔵したArduinoは、アナログ電圧(0-5V)を(0-1023)の範囲のデジタル値に変換します。その環境またはその表面に十分な光がある場合、LDRからArduinoを介して読み取られた変換されたデジタル値は800-1023の範囲になります。
センサーをテストするためのスケッチコードは次のとおりです。
int SensorPin =A0; / * LDRの入力ピンを選択します* / int SensorValue =0; / *センサーからの値を格納する変数* / void setup(void){Serial.begin(9600); / *シリアルポートを開始します* /} void loop(void){sensorValue =analogRead(sensorPin); //センサーから値を読み取ります//いくつかのしきい値があり、定性的に決定されますSerial.print( "LDR Value ="); Serial.print(sensorValue); if(sensorValue <100){Serial.println( "(Dark)"); } else if(sensorValue <200){Serial.println( "(Dim)"); } else if(sensorValue <500){Serial.println( "(Light)"); } else if(sensorValue <800){Serial.println( "(Bright)"); } else {Serial.println( "(非常に明るい)"); } delay(3000);}
次は水位センサーです
水容器が空になったときにアラームを受信し、水を追加する時間になるように、水位センサーが必要です。事前に考えていなかったし、水位センサーも在庫がなかったので、自分で水センサーを作れることにしました!
<図>入手可能な材料、私の場合は土壌水分センサーを使用することにしました。 。水位センサーの基本原理は、土壌水分センサーと同じ電気伝導率を測定することです。要件を満たすようにセンサーを校正できれば、水分センサーを水位センサーのように使用できると思いました)原則として、これはアナログセンサーであり、読み取るデータは0からの値になります。 1024まで、残りは単なる数学です!
しかし、よくあることですが、現実は少し異なります。センサーが水に触れていないときは、アナログ値は0で、先端だけを沈めると、値は800になります。次のスケッチを使用して値を読み取りました。
/ *アナログピンA4からシリアルモニターに値を出力します* / void setup(){Serial.begin(9600); } void loop(){Serial.println(analogRead(A4)); delay(100);}
値を読み取れた後、センサーを調整して3つの異なる応答を出しました:空! -値が0の場合、 LOW 値が約800の場合、およびフル 値が900を超える場合!
グラフィックLCDディスプレイ <図>
通常、LCDディスプレイは多くのピンを使用するため、128×64画面を別の方法で接続する方法を見つける必要がありました。この方法では、 3つのデジタルピンのみを使用できます。 私は他のもののために残りのピンを必要とするかもしれないので素晴らしいボード上にあり、それはワイヤーの混乱を引き起こしません。 PCBにLCDのピンを事前に作成しました。これが、すべてを接続する方法です。
<図>LCDを接続したら、プログラムします。
まず、 U8glib をダウンロードする必要があります ここからのライブラリ。もう1つの重要なことは、コードで使用される宣言されたピンです。私が使用したものは次のとおりです: U8GLIB_ST7920_128X64 u8g(4、12、6、U8G_PIN_NONE)
「HELLOWORLD」ライブラリの例を使用して、次のテストコードを思いつきました。
#include "U8glib.h" U8GLIB_ST7920_128X64 u8g(4、12、6、U8G_PIN_NONE); void draw(void){//画面全体を再描画するグラフィックコマンドはここに配置する必要がありますu8g.setFont(u8g_font_unifont); u8g.setPrintPos(0、20); //基本クラスからプロシージャを呼び出しますhttp://arduino.cc/en/Serial/Printu8g.print( "GIY Project v1.0!");} void setup(void){//必要に応じて画面を反転します/ / u8g.setRot180();} void loop(void){//画像ループu8g.firstPage(); do {draw(); } while(u8g.nextPage()); //少し遅れて画像を再構築しますdelay(500);}
そして、これが私が得たものです:
<図>私の頭に浮かんだクールなアイデアの1つは、ファブラボのロゴを表示することでした。 数秒間、ディスプレイの電源が入っている間は常に。私はこれを行うのにかなりの時間を費やしましたが、ついにそれを行いました!グラフィックLCDに表示するには、(。bmp)形式の画像を用意し、ビットマップとして表示する必要がありました。
私が最初にしたことは、インターネットからFabLabロゴを(.png)ファイルとしてダウンロードし、サイズを大幅に縮小して、私の小さなLCD境界に収まるようにすることでした。私はそれを行うために次のオンラインサービスを使用しました:LINK
使用した構成は次のとおりです。
<図>次のステップは、私の小さな画像を(.bmp)形式に変換することです。私はそれを行うために次のオンラインサービスを使用しました:LINK
ここで、(。bmp)ファイルを取得した後、それをコードに配置するために、 HEX に変換する必要があります。 配列。 LCDアシスタントという素敵なツールを使用しました 。 LCDアシスタントに画像をロードするには、[ファイル]> [画像のロード]に移動します。画像のプレビューが開き、適切なサイズであることを確認します– 幅128ピクセル、高さ64ピクセル 。また、バイト方向が水平に設定されていることを確認してください サイズのエンディアンは Little に設定されています 。 LCDディスプレイの構成は次のとおりです。
<図>次に、[ファイル]> [出力の保存]に移動して、一時的なテキストを生成します。 ファイル。そのテキストファイルを開いて、私の輝く新しいアレイを見てください。
<図>
pHセンサー <図>
これは私が遊んだすべての中で最もトリッキーなセンサーであることを認めるべきです!私が使用しているセンサーに関する情報を見つけるのは本当に難しいです(ロゴphセンサーv1.1) 、それで私はそれについて詳細な説明をすることにしました!
プローブは、液体に入れると(小さな)バッテリーのようなものになります。 pHに応じて、数ミリボルトの正または負の電圧を出力します。この値は小さすぎ、インピーダンスなどの他の技術的なものにより、Arduinoで直接使用できなくなります。そのため、「オペアンプ」が必要です。オペアンプボードは、プローブのミリボルトをArduinoで許容できる値(0〜5vの正の値)に変換するだけです。
pH測定に使用される3つの一般的な緩衝液があります:pH 4.01、pH 6.86、およびpH 9.18(7.0および10.0が存在します)。液体の代わりに粉末をお勧めします。なぜなら、それは安価で、時間が経つと期限切れになり、粉末が汚染されないからです(ボトルと比較して)。製品の説明を読む必要がありますが、通常はバッグの中身を250mlの水に入れてかき混ぜる必要があります。粉末は正しいpHレベルで水を飽和させるため、平均pH(6〜8)の水を使用できます。私は個人的に水道水(pH 7.4)を使用していますが、蒸留水と脱塩水に違いは見られませんでした。バッファーは時間的に安定していません。これは、ソリューションを数週間または数か月間保持できないことを意味します。
それでは、私が使用しているセンサーについて詳しく話しましょう!
- ピン留め:温度である必要がありますが、機能させることができません
- ピンポー:アナログ入力信号
- ピン留め:温度である必要がありますが、機能させることができません
- Pin Do:高/低3.3v調整可能制限。
- ピンG / GND:プローブグランド。地面がArduinoと同じでない場合に便利です。状況によっては、測定する液体の接地電圧が異なる場合があります。
- ピンG / GND:電源グランド(ボードから直接)。
- ピンV + / VCC:入力電源5V DC(ボードから直接)。
- 青色ポテンショメータ(BNCに近い):pHオフセット。
- 青いポテンショメータ(ピンの近く):限界調整。
それでは、センサーのキャリブレーションを試してみましょう。 「オフセット」値と「ステップ」値の2つの異なるパラメータがあります
オフセット すべてのpH値を特定の電圧範囲にシフトすることです。 pH 7が2.2vの電圧を出力し、pH 8が2.1vの電圧を出力する場合、+ 0.3vのシフトにより、pH 7が2.5vに、pH8が2.4vに移動します。これはボード上またはソフトウェアを介して実行できますが、プローブに依存せず、プログラミングが少ないため、ボード上ではおそらく簡単です。
GND(両方)とVccをArduinoGNDと5vに接続します。プローブを取り外し、小さなBNC穴とBNCの外部部分を短絡させます。電圧計(またはArduino)を配置して、GNDとPoの間の電圧を測定します。出力が2.5vになるまでポットを調整します(BNCを閉じます)。これで、プローブが0ミリボルトを出力するため、pH 7の正確な値は2.5v(analogRead機能では511)になります。
<図>手順を調整するには 必要な範囲と精度に応じて、1つ以上の緩衝液が必要です。理想的には、システムで測定範囲を知ることをお勧めします。私はpH5とpH7の間の水を使用し、次にバッファー4.01(および自分のものを検証するために6.86)を選択します。通常8〜10のpHを測定する場合は、バッファー9.18(最終的には6.86も)を選択します。
(きれいな)プローブを接続してバッファーに入れ、1分間安定させます。上下しても安定していることはわかっています(3.04、3.05、3.03、3.04)。電圧計(またはArduino)の値に注意してください。私の例では、3.05vです。
以上で、以下のコードで使用できるようになりました。
int ph_pin =A7; //これはPovoidsetup()に接続されているピン番号です{Serial.begin(9600);} void loop(){int measure =analogRead(ph_pin); Serial.print( "メジャー:"); Serial.print(メジャー);倍電圧=5 / 1024.0 *測定; //従来のデジタルから電圧への変換Serial.print( "\ tVoltage:"); Serial.print(電圧、3); // PH_step =(電圧@ PH7-電圧@ PH4)/(PH7-PH4)// PH_probe =PH7-((電圧@ PH7-電圧@プローブ)/ PH_step)float Po =7 +((2.5-電圧)/ 0.18); Serial.print( "\ tPH:"); Serial.print(Po、3); Serial.println( ""); delay(2000);}
PH_stepの計算は非常に簡単です。私の例では、2.5v @ pH7と[email protected]の2つの既知の電圧の差を取ります。これは-0.55vです。これは、7〜4.01のpH範囲に相当する電圧範囲であり、2.99pH単位です。電圧をpH単位で少し割ると、pH値あたりのボルト数が得られます(私の場合は0、1839 ...)。
PH_probeは、既知のpH 7電圧(2.5v)を使用して計算されます。ここで、プローブ電圧に一致するようにPH_stepを追加します。これは、pH8の電圧値が2.5v(pH 7)+ 0.1839(1ユニット/ステップ)であることを意味します。その場合、pH9は2.5v + 0.1839 + 0.1839 =2.87vです。
魔法はありません、数学だけです:D
MOSFET 出力:
RGBLEDストライプと超音波アトマイザーをデジタルピンで制御されるMOSFET回路出力に接続しました。 LEDライトについては、セットアップで digitalWrite(LED、HIGH);
と述べました。 、これは、システムの電源が入っているときにLEDが常にオンになることを意味します。フォグメーカーのために、 If関数を作成しました 水位の値によって異なります。水がある場合はフォグメーカーがオンになり、水がない場合はEMPTY !、フォグはオフになります!
さあ、まとめましょう!
ここで最終的なコードを思いつきました:
#include "dht.h" #include "U8glib.h" #include #include #define DHT11_PIN 2 //接続しているデジタルピン#define ONE_WIRE_BUS 3#define WATER_LEVEL A4#define LDR_PIN A3#define PH_PIN A5#define GROW_LIGHT 10#define FOG_PUMP 13int waterLevel; int LightLevel; int pH; dht DHT; OneWire oneWire(ONE_WIRE_BUS); DallasTemperature waterTemp(&oneWire); U8GLIB_ST7920_128X64 u8g(4、12、6、U8G_PIN_NONE); const unsigned char logo [] PROGMEM ={0xFF、0xFF、0xFF、0xFE、0x7F、0xFF、0xFF、0xFF、0x00、0x00 、0x00、0x00、0x00、0x00、0xFF、0xFF、0xFF、0x00、0x00、0xFF、0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xFF、0xF8、0x 、0x1F、0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xFF、0xC0、0x00、0x00、0x03、0xFF、0xFF、0x00、0x00、0x00、0x00、0 、0x00、0x00、0xFF、0xFF、0x00、0x00、0x00、0x00、0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xFE、0x00、0x03、0xC0、0x 、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xF8、0x00、0x07、0xE0、0x00、0x3F、0xFF、0x00、0x00、0x00、0x00、0x00、0x00 、0xFF、0xF0、0x00、0x1F、0xF8、0x00、0x0F、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xE0、0x00、0x3F、0xFE、0x00、0x00 、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xC0、0x00、0 x18、0x1F、0x00、0x03、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0x80、0x00、0x00、0x03、0xC0、0x01、0xFF、0x00、0x00、0x00 0x00、0x00、0x00、0x00、0xFF、0x00、0x00、0x00、0x00、0xF0、0x00、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFE、0x00、0x00、0x00 0x7C、0x00、0x7F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFC、0x00、0x00、0x00、0x00、0x3E、0x00、0x7F、0x00、0x00、0x00、0x00、0x00 0x00、0x00、0xFC、0x03、0x80、0x00、0x00、0x3F、0x80、0x3F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xF8、0x07、0xE0、0x00、0x00、0 0x1F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFC、0x1F、0xF0、0x00、0x00、0x1F、0xF0、0x1F、0x00、0x00、0x00、0x00、0x00、0x00 0xF0、0x3F、0xF0、0x00、0x00、0x1F、0xFC、0x0F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xF0、0xFF、0xF0、0x00、0x00、0x1F、0 0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xE0、0xFF、0xF0、0x00、0x00、0x3F、0xFF、0x07、0x00、0x00、0x00、0x0 0、0x00、0x00、0x00、0x00、0xE0、0xFF、0xF0、0x00、0x00、0x3F、0xFF、0x07、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xC0、0xFF、0x 0x00、0x7F、0xFF、0x03、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xC0、0xFF、0xFC、0x00、0x00、0xFF、0xFF、0x03、0x00、0x00、0x00、0x00 0x00、0x00、0x00、0xC0、0xFF、0xFF、0x00、0x01、0xFF、0xFF、0x03、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xFF、0xFF、0xC0、0x07 0xFF、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0x01、0x00、0x00、0x00、0x00、0x00、0x00 0x00、0x80、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF 0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xFE、0x1F、0xFF、0xFF、0xF0、0x3C、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x 0xF8、0x03、0xFF、0xFF、0xC0、0x10、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xF0、0x01、0xFF、 0xFF、0x80、0x00、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xF0、0x00、0xFF、0xFF、0x00、0x00、0x01、0x00、0x00、0x00、0x00 0x00、0x00、0x00、0x00、0xE0、0x00、0x7F、0xFE、0x00、0x00、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xE0、0x00、0x3F、0 0x00、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xE0、0x00、0x1F、0xFC、0x00、0x00、0x01、0x00、0x00、0x00、0x00、0x00、0x00 0x00、0x80、0xE0、0x00、0x1F、0xF8、0x00、0x00、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xE0、0x00、0x0F、0xF8、0x00 0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xE0、0x00、0x0F、0xF0、0x00、0x00、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x 0xE0、0x00、0x0F、0xF0、0x00、0x01、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xE0、0x00、0x07、0xF0、0x00、0x07、0x01 0x00、0x00、0x00、0x00、0x00、0x00、0xC0、0xF0、0x00、0x07、0xF0、0x00、0x07、0x03、0x00、0x00、0x00、0x00、0x 00、0x00、0x00、0x00、0xC0、0xF0、0x00、0x07、0xF0、0x00、0x0F、0x03、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xC0、0xF8、0x00 0x00、0x0F、0x03、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xC0、0xF8、0x00、0x07、0xF0、0x00、0x1F、0x07、0x00、0x00、0x00、0x00 0x00、0x00、0xE0、0xFC、0x00、0x07、0xF0、0x00、0x1F、0x07、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xE0、0xFE、0x00、0x0F、0xF 0x07、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xF0、0x3E、0x00、0x0F、0xF0、0x00、0x7C、0x0F、0x00、0x00、0x00、0x00、0x00、0x00 0xF0、0x1E、0x00、0x1F、0xF8、0x00、0xF8、0x0F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xF8、0x06、0x00、0x1F、0xFC、0x01、0x01 0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFC、0x00、0x00、0x7F、0xFF、0x0F、0x80、0x3F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x 0x00、0x7F、0xFF、0xFF、0x00、0x3F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFE、0x00、0x00、0x7F、0xFF、 0xFC、0x00、0x7F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0x00、0x00、0x7F、0xFF、0xF0、0x00、0xFF、0x00、0x00、0x00、0x00、0x 0x00、0x00、0xFF、0x80、0x00、0x7F、0xFF、0xC0、0x01、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xC0、0x00、0x7F、0xFF、0xFF 0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xE0、0x00、0x7F、0xFE、0x00、0x07、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00 0xFF、0xF0、0x00、0x1F、0xF8、0x00、0x0F、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xF8、0x00、0x0F、0xF0、0x00、0x 0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xFC、0x00、0x03、0xC0、0x00、0x3F、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x 0x00、0x00、0x00、0x00、0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xFF、0xC0、0x00、0x00、0x03、0xFF、0xFF、0x00、0x00 0x00、0x00、0x00、0x00、0x00、0xFF、0xFF、0xF0、0x00、0x00、0x1F、0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0 x00、0x00、0x00、0xFF、0xFF、0xFE、0x00、0x00、0x7F、0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xFF、0xFF、0xFD、0x3F 0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00}; bool first; float hum =0.0; double T =0.0; void dht_test(float * humPerc); void setup(void){waterTemp。始める(); pinMode(GROW_LIGHT、OUTPUT); pinMode(FOG_PUMP、OUTPUT); digitalWrite(GROW_LIGHT、HIGH);最初=true; //デフォルトの色値を割り当てますif(u8g.getMode()==U8G_MODE_R3G3B2){u8g.setColorIndex(255); //白} else if(u8g.getMode()==U8G_MODE_GRAY2BIT){u8g.setColorIndex(3); //最大強度} else if(u8g.getMode()==U8G_MODE_BW){u8g.setColorIndex(1); //ピクセルオン} else if(u8g.getMode()==U8G_MODE_HICOLOR){u8g.setHiColorByRGB(255,255,255); } //画像ループu8g.firstPage(); do {u8g.drawBitmapP(32、0、16、64、logo); } while(u8g.nextPage()); dht_test(&hum);} void RefreshDisplay(float * humPerc、double * T、int * WL、int * LL、int * pH_value){u8g.setFont(u8g_font_fub11); u8g.setFontRefHeightExtendedText(); u8g.setDefaultForegroundColor(); u8g.setFontPosTop(); u8g.drawStr(4、0、 "ハム%"); u8g.setPrintPos(68、0); u8g.print(* humPerc); u8g.drawStr(4、15、 "Temp"); u8g.setPrintPos(68、15); u8g.print(* T); u8g.drawStr(4、30、 "Wlvl"); if(* WL ==0){u8g.drawStr(68、30、 "EMPTY!"); digitalWrite(FOG_PUMP、LOW); } else {if(* WL <800)u8g.drawStr(68、30、 "LOW"); else {digitalWrite(FOG_PUMP、HIGH); u8g.drawStr(68、30、 "HIGH"); }} if(* LL <100){u8g.drawStr(68、45、 "Dark"); } else if(* LL <200){u8g.drawStr(68、45、 "Dim"); } else if(* LL <500){u8g.drawStr(68、45、 "ライト"); } else if(* LL <800){u8g.drawStr(68、45、 "Bright"); } else {u8g.drawStr(68、45、 "2Bright"); }二重電圧=5.0 / 1024.0 *(* pH_value);フロートPo =7 +((2.5-電圧)/ 0.18); u8g.drawStr(4、45、 "pH"); u8g.setPrintPos(28、45); u8g.print(Po); } void loop(void){waterTemp.requestTemperatures(); T =waterTemp.getTempCByIndex(0); waterLevel =analogRead(WATER_LEVEL); LightLevel =analogRead(LDR_PIN); pH =analogRead(PH_PIN); char status; int chk =DHT .read11(DHT11_PIN); hum =DHT.humidity; dht_test(&hum); if(first){first =false; } else {u8g.firstPage(); do {RefreshDisplay(&hum、&T、&waterLevel、&LightLevel、&pH); } while(u8g.nextPage()); }} void dht_test(float * humPerc){//測定の合間に数秒待ちます。 delay(1000);}
ファイルのダウンロード:
GIY最終コード(.ino)
3Dデザインと3Dプリント
実際、私の最終的なシステムでは、多くの3Dデザインと3D印刷技術を使用しました。 2つの異なるプリンターを使用し、目的の結果が得られるまで設定を何度も試しました。
3Dデザインには、前述したように、私のお気に入りのCADソフトウェアを使用しました。単純な形状を作成し、オブジェクトを押し出す方法の詳細についてはあまり詳しく説明しません。これらはすべて、さまざまなソフトウェアの使用方法を学んだコンピューター支援設計の週と、3Dスキャンと印刷の週で見つけることができます。
<図>主なタスクは、私のシステムの物理的な外観を設計することでした!課題は、セクシーに見せたかったことです!!!
美学は機能性と同様に非常に重要な基準でした!また、システムは組み立て可能である必要があり、これによりさらに困難になります。また、3D印刷、CNCフライス盤、レーザー切断など、学んだスキルを統合したいと思いました。
デジタルの世界でデザインする前に、紙に簡単なスケッチを作りました!ここにあります:
<図> <図> <図> <図>そしてこれが最終的な3Dデザインです:
<図>私のセクシーなお尻システム:D
私が最初にデザインしたのは水容器でした 。ここにあります:
<図>それはいくつかの機能を組み込んでいます!まず、植物が育つだけの十分なスペースがあり、真ん中に超音波アトマイザーを置くための穴を開けました。これは、フォガーをコンテナーと同じ高さにしたかったためです。事は、水位が噴霧器より2cm上にあるべきであるということです、それで噴霧器の高さで平らにされるすべての水は使われません(無駄)!したがって、フォガーをコンテナレベルより下に配置すると、正確に本来あるべきポイントに水位がゼロになります。コンテナの場合はゼロ=フォガーの2cm上になります。このようにして、すべての水が使用されます!
コンテナの高さも考慮しました。実際、コンテナのすべての寸法は実験段階で測定されます!
ご覧のとおり、壁に穴を開けました。これは、水中に配置されたセンサーからのケーブルが電子機器セクションに隠れるために使用されます。コンテナの前面に、グラフィックディスプレイを取り付けるためのスロットを作成しました。また、必要なときにコンテナを簡単に取り外せるように、いくつかのハンドルを設計しました!
<図>この観点から、あなたは電子機器のセクションを見ることができます。今は開いていますが、閉じるための蓋もデザインしました。エレクトロニクスセクションの内側に、電源にアクセスしてボードをプログラムするための穴を設計しました
<図>底面には、システムの残りの部分に取り付けられるスライダーを設計し、必要に応じてコンテナーを簡単に取り外せるようにしました。これは、コンテナーを所定の位置に固定する役割も果たします。
そして今、印刷しましょう!
<図>私が使用するプリンターは BigRep3Dプリンターと呼ばれていることを誇らしげに発表できます。 、FabLabKamp-Lintfortでのみご利用いただけます。 1立方メートルの容量があり、業務用および産業用に最大のFFFビルドボリュームを提供します。
私が使用しているスライシングソフトウェアは Simplify3D 、私の意見では、多くの構成とオプションを備えた最も高度なスライシングツールの1つです。
<図>何かを印刷する正しい方法と間違った方法があるとは思いません。印刷する特定のオブジェクトに最適なオプションが見つかるまで、設定を試してみる必要があります。
このプリンタは新しいため、テストはそれほど多くありません。そのため、設定を試して、試してみて、もう一度試してみる必要がありました...
水容器の印刷に使用する設定を以下に示しますが、一部は直感的です。
<図>
Tool1
を選択します 、BigRepプリンターには2つの異なるフィラメントを持つ2つのノズルがあり、使用するノズル、ノズルの直径、およびその他の設定を指定する必要があるためです。
レイヤー: <図>
追加: <図>
インフィル: <図>
サポート: <図>
温度: <図>
冷却: <図>
その他: <図>
上級: <図>
これらは私が行った変更であり、残りの設定はデフォルトで残したものです。
次に、 Prepare to Print
を押します。 。ソフトウェアがパスを生成します。ここで、 .gcode
を送信する前に、すべてが正常かどうかを確認できます。 マシンに。
プリンタの設定のいくつかについて簡単に説明します。 ノズル温度=205℃
を使用しました 、および Bed Temperature =70 deg.C
。 X、Y、Z軸
を配置した後 、すべての設定を再確認して、ジョブを開始しました!
生のモデルは次のようになります:
<図>サポートを取り外してモデルを掃除し始めたとき、これが ASSの大きな痛み:D であることに気づきました。
お気づきのように、コンテナの端に大きな穴がいくつかあるため、私が使用した設定は完全ではありません。とにかく防水することを考えていました。成形と鋳造のセクションで私がどのように防水したかを見ることができます!
次の3Dプリントパーツはネットポットでした 。これは、成長中の培地に種子を保持するように設計されたカップです。それらの最初のバージョンについての詳細は、私のコンピューター支援設計週間中に見ることができます
今回は、実験段階での観察に基づいて、デザインを少し改善します。主な違いは、空のスペースのサイズが大幅に拡大されていることです。これにより、霧が通過しやすくなり、根が通過しやすくなります。
だから私は古いデザインを変更し、もう1つ追加しました!
<図>
トランジションをスムーズにするために、上部にわずかなフィレットを作成しました。また、下部にボールを追加し、 Move
を使用しました 少し内側に移動し、下部に2〜3mmの構造幅を残すようにコマンドします
ブール減算を使用した後 または Combine
機能し、下部にこの素敵な曲線が表示されます!
それでは、印刷してみましょう!
私が使用した3Dプリンターは Ultimaker 2+ 。 3Dモデルをスライスするには、インターフェイスが簡単で機能的な非常に優れたソフトウェアを使用します。私が使用している素材は PLAフィラメント
です
.stl
をインポートした後 ファイル、これらは私が使用している設定です:
これが私の小さな軍隊です:D
<図>システムの最終設計から、下部も3Dプリントすることにしました。それは大きな作品であり、これにもBigRapを使用します。
<図>水コンテナと同じ設定を使用したので、これについて新しいことは何も言えません。 、そして多かれ少なかれ残りは同じです
印刷物のプレビューは次のとおりです。
<図>私が3D印刷したもう一つのことは、システムの上面の丸い角です。 Ultimaker を使用しました このために、次の設定を使用しました:
<図> <図>ここでの秘訣は、表面を最大限に滑らかにすることでした。かなり良い結果が得られたと思います:
<図>
ファイルのダウンロード:
GIYシステム設計(.f3d)
ネットポットデザイン(.f3d)
2Dデザインとレーザー切断
レーザー切断技術を使用して、アクリル部品
を切断しました これにより、システムの内部がすべてカバーされ、完成した外観になります!
実際にパーツを再設計するのではなく、作成済みのスケッチを Fusion 360 からエクスポートしただけです。 .dxfファイル
として 。ファイルをエクスポートした後、レーザーカットマシンにインポートする前にデザインを編集していました
Fusion360でのスケッチの外観は次のとおりです。
<図>大きな混乱のように見えますが、良い部分はすべてがパラメトリックであるということです!すべてを正しい位置に配置し、後で変更する必要がある場合に備えて、すべてをパラメトリックに保つ必要があるため、面倒に見えます
これは、レーザー切断前のRhinoでの最終的なスケッチの外観です:
<図>有機的な見た目があり、緑の植物とよく調和するので、緑のアクリル片を使用することにしました
表紙と裏表紙は白を使うことにしました。味がすべてです。これが私の見方であり、これが私が好きな方法です。
表紙と裏表紙は非常に似ており、内側のカットを除いて同じ寸法です!フロントカバーにはLCDディスプレイ用の穴があります。ここにあります:
<図>裏表紙には、電源にアクセスしてボードをプログラムするための穴を開けたいです。見た目は次のとおりです:
<図>別のレーザーカットされた部分が上にあります!光を通すために、透明なアクリルパーツを使うことにしました!また、重量を減らし、光が通過するためのスペースを増やすために、いくつかの追加のカットを設計しました!また、RGB LEDストライプの幅も測定し、太陽光と人工光を十分に入れるように取り付けます!
<図>デザインが完成し、レーザーカットしましょう!
<図>ここでファブラボで使用しているレーザーカッターは、1016 x 711mmの作業領域を持つCO2レーザーカッターであるEpilogFusion60Wattです。木材、ボール紙、アクリル、その他の人工プラスチックなどの素材をカットして刻印することができます。
すべてのピースに同じ素材を使用したため、 plexiglass 5mm
、すべて同じ設定を使用しました!
ファイルのダウンロード:
表紙/裏表紙(.dxf)
プラントホルダー(.dxf)
LEDライトホルダー(.dxf)
CNCフライス盤
学んだすべてのスキルとテクニックをシステムに統合したかったので、CNCミルの構造もあります。再設計はしませんでしたが、 .dxfファイル
をエクスポートしました Fusion360スケッチから!
デザインをカットするために、大きなCNCモンスターを使用します。
CNC(コンピューター数値制御)は、非常に高速で回転するカッティングビットを使用して部品から材料を除去する機械です。
マシンは事前にプログラムされたコンピュータファイルを読み取り、どこでどのようにカットするかを指示します。通常は .GCode
ファイル。カッティングビットは、ビットを上下に動かすことができるスピンドルモーターによって非常に高いRPMで回転します。このメカニズムは、クロスアームによって左右、前後に動かされます。したがって、このマシンはX、Y、Z軸上を移動できるため、3軸ルーターとして知られています。この機械は、2次元の切り抜きとエッチング、および3次元のレリーフ作業を行うことができます。
FabLab Kamp-Lintfortには、 e(sign:Easy Worker MasterPro2513。)によるCNCポータルフライス盤があります。
<図>作業エリアは2600x 1400 x 300mmで、真空テーブルが付属しています。私たちは主に木材のフライス盤に使用しますが、HSD Spindel(3.9KW; 24.000U / min)を使用すると、金属を簡単にフライス盤することもできます。
使用する素材は 18mm合板
です。
最初に、CNCベッドに木製のシーツを置き、位置を合わせた後、バキュームをオンにします。 .dxf をエクスポートした後 ファイル、私はそれをマシンCAMソフトウェアにインポートする前にデザインを編集していました。
<図>まず、マシンをホームに移動する必要があります!
X、Y、Zのゼロ位置を設定するには、ソフトウェア(またはリモコン)のホームボタンを押してマシンをホームにします。
<図> <図>最初は、ゼロのXとYをベッドの隅の1つに大まかに揃えて設定できます。これにもレーザーを使用しようとしましたが、プロセスをシミュレートするときは常に、ゼロが作業領域から出ていたため、衝突が発生していました。
<図>次に、マシンに付属の専用ツールを使用してZ軸を見つける必要があります。
<図>重要なのは、それを機械のベッドに置くことです!
これで、彫刻を作成する最初のジョブを開始できます。これらは私が使用した設定です:
<図>
Calculate Toolpath
を押します ジョブをシミュレートし、衝突がないことを確認します。 .GCode を保存した後 、ジョブを起動すると、次のウィンドウが表示されます:
これで、外側のカットを開始できます:
<図> <図>これは私が仕事を終えた後に得られるものです:
<図>私が製粉しなければならなかったもう一つの部品は、成形と鋳造のセクションに使用されます!
水容器を防水するための型を用意しました。デザインは次のとおりです:
<図>
これについては何も新しいことはありません。上記とまったく同じ設定を使用しました。唯一のことは、材料の厚さが 10mm wood
であったことです。 、そして後でそれらを接着して型を準備するために、7つの部分をカットする必要がありました!
ファイルのダウンロード:
構造壁(.dxf)
カビ(.dxf)
成形と鋳造
私はこの技術を使って水容器を準備し、既存の容器を防水しました!簡単に取り外せる薄い材料の層(小さな容器)だと思います!
これは前のセクションCNCフライス盤の結果です
<図>同一のピースを7つカットし、基準穴を使用して位置合わせしました。 ボトム5個の真ん中にも大きな穴を開けました 、エアポンプを内部に配置し、後でキャストを簡単に取り外すため。
すべての部品を接着して固定した後、次のようになります。
<図>接着剤が乾くのを待っている間、私はポンプ用に小さなプラスチックの「もの」(それをどのように呼ぶかわからない:D)を用意しました。アイデアは、それを私の型にねじ込み、いつでも好きなときに取り外すことができるようにすることです!
金型の準備ができたら、次のようになります。
<図>そして裏側:
<図>バキュームキャストの準備ができました!
Formech –手動真空成形機と呼ばれるFabLabKamp-Lintfortで利用可能な真空機を使用しました。
何度もやってみたのですが、キャストを壊さずに型を外せませんでした!数時間の試行の後、私は解決策を思いつきました!まず、材料の薄い層を1層真空キャストし、それを削除せずに、実際のコンテナをその上にキャストします。最初の薄い層は滑りやすく、シリコンをスプレーすると、カビを簡単に取り除くことができます
シリコンを少し乾かした後、実際の層をキャストできます!
そして、ここにいます!!!
簡単だと思う人のためのヒーローショット
<図> <図>
すべてをまとめる
それでは、すべてをまとめましょう!構造を組み立てることから始めます。必要なすべてのツールを私の隣に置いてください:
<図>プロセスの短いアニメーション:
<図>ライトを組み立てるために、RGB LEDストライプを4つにカットし(事前に長さを測定しました)、それに応じてはんだ付けしました!
<図>すべてのセンサーを接続し、配線を管理した後、電子機器セクションでボードを固定しました
<図>そしてここにシステムがあります!!!すべてが組み立てられ、見栄えの良い成長システム GIY
<図>作業中のヒーローショット!
<図>
最終プレゼンテーションビデオ
©2017アルボットディマ。無断複写・転載を禁じます| [email protected]
この作品は、クリエイティブ・コモンズ表示-非営利-継承4.0国際ライセンスの下でライセンスされています。
<図>対象 もっと 詳細 strong> 約 プロジェクト、 お願い 訪問 公式 出典:
http://archive.fabacademy.org/2017/fablabkamplintfort/students/396/final.html
コード
- GIYボード-コード
- GIY BOARD-LCD +ライトコード
GIYボード-CODE Arduino
#include "dht.h" #include "U8glib.h" #include#include #define DHT11_PIN 2 //接続しているデジタルピン#defineONE_WIRE_BUS 3#定義WATER_LEVELA4#define LDR_PIN A3#define PH_PIN A5#define GROW_LIGHT 10#define FOG_PUMP 13int waterLevel; int LightLevel; int pH; dht DHT; OneWire oneWire(ONE_WIRE_BUS); DallasTemperature waterTemp(&oneWire); U8GLIB_ST7920_128X64 u8g(4、12、6、U8G_PIN_NONE); const unsigned char logo [] PROGMEM ={0xFF、0xFF、0xFF、0xFE、0x7F、0xFF、0xFF、0xFF、0x00、0x00 、0x00、0x00、0x00、0x00、0xFF、0xFF、0xFF、0x00、0x00、0xFF、0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xFF、0xF8、0x 、0x1F、0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xFF、0xC0、0x00、0x00、0x03、0xFF、0xFF、0x00、0x00、0x00、0x00、0 、0x00、0x00、0xFF、0xFF、0x00、0x00、0x00、0x00、0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xFE、0x00、0x03、0xC0、0x 、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xF8、0x00、0x07、0xE0、0x00、0x3F、0xFF、0x00、0x00、0x00、0x00、0x00、0x00 、0xFF、0xF0、0x00、0x1F、0xF8、0x00、0x0F、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xE0、0x00、0x3F、0xFE、0x00、0x00 、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xC0、0x00、0 x18、0x1F、0x00、0x03、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0x80、0x00、0x00、0x03、0xC0、0x01、0xFF、0x00、0x00、0x00 0x00、0x00、0x00、0x00、0xFF、0x00、0x00、0x00、0x00、0xF0、0x00、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFE、0x00、0x00、0x00 0x7C、0x00、0x7F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFC、0x00、0x00、0x00、0x00、0x3E、0x00、0x7F、0x00、0x00、0x00、0x00、0x00 0x00、0x00、0xFC、0x03、0x80、0x00、0x00、0x3F、0x80、0x3F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xF8、0x07、0xE0、0x00、0x00、0 0x1F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFC、0x1F、0xF0、0x00、0x00、0x1F、0xF0、0x1F、0x00、0x00、0x00、0x00、0x00、0x00 0xF0、0x3F、0xF0、0x00、0x00、0x1F、0xFC、0x0F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xF0、0xFF、0xF0、0x00、0x00、0x1F、0 0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xE0、0xFF、0xF0、0x00、0x00、0x3F、0xFF、0x07、0x00、0x00、0x00、0x0 0、0x00、0x00、0x00、0x00、0xE0、0xFF、0xF0、0x00、0x00、0x3F、0xFF、0x07、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xC0、0xFF、0x 0x00、0x7F、0xFF、0x03、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xC0、0xFF、0xFC、0x00、0x00、0xFF、0xFF、0x03、0x00、0x00、0x00、0x00 0x00、0x00、0x00、0xC0、0xFF、0xFF、0x00、0x01、0xFF、0xFF、0x03、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xFF、0xFF、0xC0、0x07 0xFF、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0x01、0x00、0x00、0x00、0x00、0x00、0x00 0x00、0x80、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF 0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xFE、0x1F、0xFF、0xFF、0xF0、0x3C、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x 0xF8、0x03、0xFF、0xFF、0xC0、0x10、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xF0、0x01、0xFF、 0xFF、0x80、0x00、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xF0、0x00、0xFF、0xFF、0x00、0x00、0x01、0x00、0x00、0x00、0x00 0x00、0x00、0x00、0x00、0xE0、0x00、0x7F、0xFE、0x00、0x00、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xE0、0x00、0x3F、0 0x00、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xE0、0x00、0x1F、0xFC、0x00、0x00、0x01、0x00、0x00、0x00、0x00、0x00、0x00 0x00、0x80、0xE0、0x00、0x1F、0xF8、0x00、0x00、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xE0、0x00、0x0F、0xF8、0x00 0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xE0、0x00、0x0F、0xF0、0x00、0x00、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x 0xE0、0x00、0x0F、0xF0、0x00、0x01、0x01、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x80、0xE0、0x00、0x07、0xF0、0x00、0x07、0x01 0x00、0x00、0x00、0x00、0x00、0x00、0xC0、0xF0、0x00、0x07、0xF0、0x00、0x07、0x03、0x00、0x00、0x00、0x00、0x 00、0x00、0x00、0x00、0xC0、0xF0、0x00、0x07、0xF0、0x00、0x0F、0x03、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xC0、0xF8、0x00 0x00、0x0F、0x03、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xC0、0xF8、0x00、0x07、0xF0、0x00、0x1F、0x07、0x00、0x00、0x00、0x00 0x00、0x00、0xE0、0xFC、0x00、0x07、0xF0、0x00、0x1F、0x07、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xE0、0xFE、0x00、0x0F、0xF 0x07、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xF0、0x3E、0x00、0x0F、0xF0、0x00、0x7C、0x0F、0x00、0x00、0x00、0x00、0x00、0x00 0xF0、0x1E、0x00、0x1F、0xF8、0x00、0xF8、0x0F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xF8、0x06、0x00、0x1F、0xFC、0x01、0x01 0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFC、0x00、0x00、0x7F、0xFF、0x0F、0x80、0x3F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x 0x00、0x7F、0xFF、0xFF、0x00、0x3F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFE、0x00、0x00、0x7F、0xFF、 0xFC、0x00、0x7F、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0x00、0x00、0x7F、0xFF、0xF0、0x00、0xFF、0x00、0x00、0x00、0x00、0x 0x00、0x00、0xFF、0x80、0x00、0x7F、0xFF、0xC0、0x01、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xC0、0x00、0x7F、0xFF、0xFF 0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xE0、0x00、0x7F、0xFE、0x00、0x07、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00 0xFF、0xF0、0x00、0x1F、0xF8、0x00、0x0F、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xF8、0x00、0x0F、0xF0、0x00、0x 0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xFC、0x00、0x03、0xC0、0x00、0x3F、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x 0x00、0x00、0x00、0x00、0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xFF、0xC0、0x00、0x00、0x03、0xFF、0xFF、0x00、0x00 0x00、0x00、0x00、0x00、0x00、0xFF、0xFF、0xF0、0x00、0x00、0x1F、0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0 x00、0x00、0x00、0xFF、0xFF、0xFE、0x00、0x00、0x7F、0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0xFF、0xFF、0xFF、0xFD、0x3F 0xFF、0xFF、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00}; bool first; float hum =0.0; double T =0.0; void dht_test(float * humPerc); void setup(void){waterTemp。始める(); pinMode(GROW_LIGHT、OUTPUT); pinMode(FOG_PUMP、OUTPUT); digitalWrite(GROW_LIGHT、HIGH);最初=true; //デフォルトの色値を割り当てますif(u8g.getMode()==U8G_MODE_R3G3B2){u8g.setColorIndex(255); //白} else if(u8g.getMode()==U8G_MODE_GRAY2BIT){u8g.setColorIndex(3); //最大強度} else if(u8g.getMode()==U8G_MODE_BW){u8g.setColorIndex(1); //ピクセルオン} else if(u8g.getMode()==U8G_MODE_HICOLOR){u8g.setHiColorByRGB(255,255,255); } //画像ループu8g.firstPage(); do {u8g.drawBitmapP(32、0、16、64、logo); } while(u8g.nextPage()); dht_test(&hum);} void RefreshDisplay(float * humPerc、double * T、int * WL、int * LL、int * pH_value){u8g.setFont(u8g_font_fub11); u8g.setFontRefHeightExtendedText(); u8g.setDefaultForegroundColor(); u8g.setFontPosTop(); u8g.drawStr(4、0、 "ハム%"); u8g.setPrintPos(68、0); u8g.print(* humPerc); u8g.drawStr(4、15、 "Temp"); u8g.setPrintPos(68、15); u8g.print(* T); u8g.drawStr(4、30、 "Wlvl"); if(* WL ==0){u8g.drawStr(68、30、 "EMPTY!"); digitalWrite(FOG_PUMP、LOW); } else {if(* WL <800)u8g.drawStr(68、30、 "LOW"); else {digitalWrite(FOG_PUMP、HIGH); u8g.drawStr(68、30、 "HIGH"); }} if(* LL <100){u8g.drawStr(68、45、 "Dark"); } else if(* LL <200){u8g.drawStr(68、45、 "Dim"); } else if(* LL <500){u8g.drawStr(68、45、 "Light"); } else if(* LL <800){u8g.drawStr(68、45、 "Bright"); } else {u8g.drawStr(68、45、 "2Bright"); }二重電圧=5.0 / 1024.0 *(* pH_value);フロートPo =7 +((2.5-電圧)/ 0.18); u8g.drawStr(4、45、 "pH"); u8g.setPrintPos(28、45); u8g.print(Po); }void loop(void) {waterTemp.requestTemperatures();T =waterTemp.getTempCByIndex(0);waterLevel =analogRead(WATER_LEVEL);LightLevel =analogRead(LDR_PIN);pH =analogRead (PH_PIN);char status;int chk =DHT.read11(DHT11_PIN);hum =DHT.humidity; dht_test(&hum); if(first) { first =false; } else { u8g.firstPage(); do { RefreshDisplay(&hum, &T,&waterLevel, &LightLevel, &pH); } while(u8g.nextPage()); }}void dht_test(float * humPerc) { // Wait a few seconds between measurements. delay(1000);}
GIY BOARD - LCD + LIGHT CODEArduino
#include "U8glib.h"int led =10;U8GLIB_ST7920_128X64 u8g(4, 12, 6, U8G_PIN_NONE);void draw(void) { // graphic commands to redraw the complete screen should be placed here u8g.setFont(u8g_font_unifont); u8g.setPrintPos(0、20); // call procedure from base class, http://arduino.cc/en/Serial/Print u8g.print("GIY Project v1.0!");}void setup(void) { pinMode (led, OUTPUT); digitalWrite (led, HIGH);}void loop(void) { // picture loop u8g.firstPage(); do {draw(); } while(u8g.nextPage()); // rebuild the picture after some delay delay(500);}
回路図
製造プロセス