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

Arduinoバロメーター

コンポーネントと消耗品

>
Arduino Nano R3
× 1
Arduino UNO
ベロボードで使用されるAtmel 328
× 1

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

<図> <図>

Arduino UNOとNanoを使用して、3つのステッピングモーターを使用して12インチ(300m)のアナログディスプレイに気圧を表示します。

モダンとクラシックの2つのダイヤルデザインから選択できます。

hPa(ヘクトパスカル)単位の気圧は大きなメインダイヤルに表示され、10分ごとに更新されます。

2つのセカンダリダイヤルがあり、1つは過去6時間の圧力変化を示し、もう1つは過去3時間の圧力変化を示します。

3時間ダイヤルは、天気予報に使用されるため、解像度が0.5hPa向上しています。 3つのディスプレイすべてに拡張範囲が使用されていることを示すLEDと、3時間のディスプレイから天気予報を示すLEDがあります。

ケース内には、2つの20x4LCD画面に各マイクロプロセッサからの情報が表示されます。

メインの気圧表示と6時間表示はRTCによって制御されます。この時計は、3時間表示用の1時間パルスも提供します。

ステップ1:従来のアナログ気圧計との比較

<図> <図> <図>

ほとんどのアナログ気圧計の写真。 2天気を予測するための指標として気圧を使用するだけで、可動ポインターを設定し、気圧の変化を確認するために設定された時刻をメモする必要があります。

天気は文字盤の周りに書かれ、ポインターから読み取られます。 2番目のポインターを使用し、3時間にわたる変更をメモする必要があるため、予測は少し複雑です。予測を得るには、現在の圧力と上昇/下降圧力の組み合わせを覚えておく必要があります。

私の気圧計は、3時間と6時間にわたって圧力の変化を継続的に監視し、これらの測定値を2つの別々のダイヤルに表示します。

pic.1は、気圧計の天気予報の範囲を示しています。

pic.3は、気象予測LEDのクローズアップを示しています。天気予報は、過去3時間の気圧変化に基づいています。

ステップ2:嵐を予測する気圧計のデモ

<図>

このタイムラプスアニメーションは、気圧計の針と予測LEDが到来する嵐にどのように反応するかを示しています。

ステップ3:拡張範囲ダイヤル

<図> <図> <図>

3つのダイヤルすべてに拡張範囲があります。これにより、通常の天候の場合、ダイヤルに表示される解像度を大きくすることができます。極端な気象条件では、ダイヤルが拡張範囲に切り替わります。

アニメーションpic1。は、拡張範囲が動作しているときにLEDがどのように点灯するかを示しています。読み取り値が+5以上になると、赤いLEDが表示されます。次に、赤い目盛りのレタリングを読みます。緑色のLEDは、読み取り値が-5以下の場合に表示されます。次に、グリーンスケールのレタリングを読みます。読み取り値が拡張範囲を超える場合、たとえば+9または-9を超えるこのダイヤルでは、両方のLEDが点灯してこれを示します。次のセクションを参照してください。

拡張範囲にわたる圧力測定値 Pic.2圧力測定値が拡張範囲+または-を超える場合、両方のLEDが点灯して、極端な測定値または変化が発生したことを警告します。ダイヤルは実際にはまだ測定値を表示します。たとえば、測定値が-10の場合、3時間ダイヤルでは、両方のLEDが点灯した状態でダイヤルが0を指します。 3時間の読み取り値が-11の場合、両方のLEDが点灯している状態で、ダイヤルは-1を指します。読み値に10を加えるだけです。

下のアニメーションでは、3時間の圧力差は0から始まり、圧力差は減少しています。 -5 hPaで、負の拡張範囲が使用中であることを示す緑色のLEDが点灯します。圧力変化は、-10hPaに達するまで低下し続けます。これは拡張範囲を超えているため、赤色LEDも点灯します。その後、圧力は再び-11hPaに低下し、両方のLEDが点灯したままになります。圧力変化は-10hPaまで減少し始めますが、これも拡張範囲を超えているため、両方のLEDが点灯したままになります。圧力変化が-10未満に低下すると、赤いLEDが消灯し、拡張範囲が再び使用されていることを示します。

英国の天気予報を確認した後、ダイヤルに拡張範囲を設定しました。3時間と6時間の拡張範囲が使用されることを期待していましたが、拡張範囲がメインの気圧計ディスプレイで使用されることはないと思いました。

>

Pic.3 2020年1月に気圧計のプロトタイプを作成しているときに、1050hPaの記録的な高値がありました。イングランド南部では、私のメインの気圧計は、赤い1050のポインターと、赤い高距離LEDが点灯した状態で拡張範囲に入りました。

ステップ4:LCD情報ディスプレイ

<図> <図> <図> <図>

3時間

Pic.1&2このディスプレイには、3時間の測定値と3時間ダイヤルの情報が表示されます。また、現在および過去3時間の測定値に基づく天気予報も表示されます。

6時間

写真。 3&4このディスプレイには、メインの気圧計のダイヤルの読み取り値と6時間の読み取り値が表示されます。

ステップ5:天気を予測する

<図> <図> <図> <図> <図> <図> <図> <図> <図> <図>

私の気圧計の天気予報は8個のLEDを使用しています。

過去3時間の現在の気圧と変化率を使用して、LEDで天気を予測します。

アニメーション1は、予測LEDの組み合わせのさまざまな組み合わせを示しています。

私は多くの気象サイトを訪れ、気圧計で天気を予測するために次の情報を収集しました。

気圧計で天気を予測する

より具体的には、hPaの読み取り値を持つ気圧計は次のように解釈できます。

読み取り値が1022hPaを超える場合

気圧の上昇または安定は晴天が続くことを意味します。気圧がゆっくりと下降することは晴天を意味します。気圧が急激に下降することは曇りで暖かい状態を意味します。

1009〜1022hPaの間にある場合

気圧の上昇または安定は、現在の状態が続くことを意味します。気圧の下降が遅いと、天候の変化はほとんどありません。気圧の急激な低下は、雨が降る可能性が高いことを意味します。十分に寒い場合は雪が降る可能性があります。

読み取り値が1009hPa未満の場合

気圧の上昇または安定は晴天と涼しい天候を示します。気圧の緩やかな下降は雨を示します。気圧の急激な下降は嵐が来ていることを示します。

上記の情報を使用して、気圧計は次のロジックを適用して天気を予測します。

ロジックは以下の順序で適用され、結果のLEDが点灯します。

Pic.2気圧<1009hPa

気圧の上昇または安定は、晴天と涼しい天候を示します

気圧<1009.00および3時間の変化> =0

Pic.3気圧<1009hPa

ゆっくりと圧力が下がるのは雨を示しています

気圧<1009.00および3時間の変化<0および3時間の変化> =-1.5

Pic.4気圧<1009hPa

急激に低下する圧力は、嵐が来ていることを示しています。

気圧<1009.00および3時間の変化<-1.5

Pic.5気圧は1009〜1022 hPa

圧力の上昇または安定は、現在の状態が続くことを意味します。

ゆっくりと気圧が下がることは、天候の変化がほとんどないことを意味します。

気圧> =109.00および気圧<=1022.00および3時間の変化> =-1.5および3時間の変化<=1.5

Pic.6気圧は1009〜1022 hPa

気圧が急激に上昇するということは、天気が晴れていることを意味します

気圧> =109.00および気圧<=1022.00および3時間の変化> 1.5

Pic.7気圧は1009〜1022 hPa

気圧が急激に下がるということは、雨が降る可能性が高いことを意味します。十分に寒い場合は雪が降る可能性があります。

気圧> =109.00および気圧<=1022.00および3時間の変化<-1.5

Pic.81022hPaを超える気圧

気圧の上昇または安定は、乾燥した天候を意味します。

気圧> 1022.00および3時間の変化> =0

Pic.91022hPaを超える気圧

ゆっくりと気圧が下がるということは、晴天を意味します。

気圧> 1022.00および3時間の変化<0および3時間の変化> =-1.5

Pic.10 1022hPaを超える気圧

急激に低下する圧力は変化を意味します

気圧> 1022.00 &&3時間の変化<-1.5

ステップ6:気圧計の起動

<図>

最初の電源投入時に、LEDテストが実行されます。

完了すると、針はキャリブレーションの準備ができた初期設定に進みます。

ステップ7:初期起動設定RTC

<図> <図> <図> <図> <図> <図> <図>

Pic.1最初の電源投入時に、Veroボードのコントロールを使用して気圧計を設定する必要があります。

RTC

Pic.2 RTCは正しい時刻に設定する必要があります。UTCに設定しましたが、わざわざ夏時間に変更する必要はありません。時間を調整する前に、この場合は-5の「Disp」値をメモしてください。これは6時間針の値であり、セットアップの後半で必要になります。 「SelectSettingEnable」スイッチをオンの位置にスライドさせます。表示は変わりません。

Pic.3「SelectSetting」ノブを時計回りにゆっくり回すと、メインLCDディスプレイの2列目が変わります。

ディスプレイに「RTCHourRetard」と表示されたら停止します。RTC時間を遅らせたい場合は、赤い「changesetting」ボタンを押します。シングルクリックで時間を遡ります。複数回クリックすると、押されたクリック数が減りますが、RTCの更新には1秒かかります。

Pic.4「SelectSetting」ノブをさらに回すと、表示が「RTCHourAdvance」に変わります

RTC時間を進めたい場合は、赤い「設定変更」ボタンを押してください。シングルクリックで時間を前進させます。複数回クリックすると、押されたクリック数が進みますが、RTCを更新するのに1秒かかります。

Pic.5「SelectSetting」ノブをさらに回すと、表示が「RTCMinRetard」に変わります

RTC分を遅らせたい場合は、赤い「設定の変更」ボタンを押してください。シングルクリックで分が後方に移動します。複数回クリックすると、押されたクリック数が減りますが、RTCの更新には1秒かかります。

Pic.6「SelectSetting」ノブをさらに回すと、表示が「RTCMinAdvance」に変わります

RTC分を進めたい場合は、赤い「設定の変更」ボタンを押してください。シングルクリックで分が進みます。複数回クリックすると、押されたクリック数が進みますが、RTCを更新するのに1秒かかります。

Pic.7 RTC設定またはその他の設定が完了したら、ディスプレイに「オフ」と表示されるまで、「設定の選択」ノブを反時計回りに完全に戻します。

[設定の有効化を選択]スイッチをオフの位置にスライドします。

ノート。黒い「30秒にリセット」ボタンを押すと、いつでも秒を30秒に同期させることができます。電源をオフにすると、RTCに時刻が記憶されるようになります。

ステップ8:初期起動設定6時間針

<図> <図> <図> <図> <図> <図>

6時針の設定

Pic.1 RTCが設定されたら、気圧計と6時間の気圧針を設定する必要があります。

「SelectSettingEnable」スイッチをオンの位置にスライドさせます。表示は変わりません。

「6HrBaroInch Retard」が表示されるまで、「SelectSetting」ノブを時計回りにゆっくり回します。

最初の電源投入時に、6時間針を最も近い桁に調整する必要があります。

最も近い数字が手の後ろにある場合は、赤い「設定の変更」ボタンを押します。シングルクリックで、手を少しずつ後方に動かします。ボタンを押し続けると、手を後方に繰り返しインチします。手が正確に数字になったら、ボタンを放します。

Pic.2手の前の最も近い数字、または上記を使用して手をインチ遅らせた場合は、「6Hr BaroInchAdvn」が表示されるまで「SelectSetting」ノブを時計回りに回します。

赤い「設定変更」ボタンを押します。シングルクリックで、手を少しずつ進めます。ボタンを押し続けると、手を前方に繰り返し動かします。手が正確に数字になったら、ボタンを放します。

Pic.3 6時針が数字に正確に設定されたら、時針を正しい値に設定する必要があります。

RTCを調整する前に、この数値を-5にメモしました。

Pic.46時間表示の針が進んでいる場合。

「6HrBaroRetard」が表示されるまで、「SelectSetting」ノブを時計回りに回します。赤い「設定変更」ボタンを押して放します。この敷居は、6時間針を1ユニット全体後退させます。 6時間針が指定された数値に達したら停止します。

Pic.56時間表示の針が遅れている場合。

「6HrBaroAdvance」が表示されるまで、「SelectSetting」ノブを時計回りに回します。赤い「設定変更」ボタンを押して放します。この敷居は、6時間のハンドフォワード1ユニット全体をステップします。 6時間針が指定された数値に達したら停止します。

Pic.6 6時間表示は、その期間の読み取り値をメモリに保存する必要があるため、正しく表示されるまでに8時間かかることに注意してください。

ロードする前に、いつでも以前の気圧測定値をコードに追加できます。起動から6時間の表示が機能する必要があります。

コードは、H =6の上に表示されているように、時間をH数値に変換します。コード行128で、H6は、現在の時間の読み取り値をhour6の下に置き、前の読み取り値をhour7に、前の読み取り値をhour0などに置くことを意味します。

int hour0 =1015;

int hour1 =1016

; int hour2 =1015;

int hour3 =1016;

int hour4 =1016

; int hour5 =1016;

int hour6 =1012;

int hour7 =1013;

あなたはインターネットからあなたの地元の読みを得ることができるはずです。

気象観測所からページを設定して、気圧計の作成中にこれを確認できるようにしました。

このリンクをクリックして、Kenley SurreyUKの1時間ごとの変更を確認してください。

ステップ9:初期起動設定メイン気圧計ハンド

<図> <図> <図> <図>

メイン気圧計の針を設定する

Pic.1これで、6時間表示が正しくなりました。メインの気圧計の針は、メインLCDの3列目の丸みを帯びた海面気圧に設定する必要があります。

最初に電源を入れると、メインの気圧計の針が最も近い桁に校正する必要があります。 「BaroInchRetard」が表示されるまで、「SelectSetting」ノブを時計回りに回します。

最も近い数字が手の後ろにある場合は、赤い「設定の変更」ボタンを押します。シングルクリックで、手を少しずつ後方に動かします。ボタンを押し続けると、手を後方に繰り返しインチします。手が正確に数字になったら、ボタンを放します。

Pic.2手の前の最も近い数字、または上記を使用して手をインチ遅らせた場合は、「BaroInchAdvn」が表示されるまで「SelectSetting」ノブを時計回りに回します。

赤い「設定変更」ボタンを押します。

シングルクリックで、手を少しずつ進めます。ボタンを押し続けると、手を前方に繰り返し動かします。手が正確に1桁になったら、ボタンを放します。

Pic.3メインの気圧計の針が進んでいる場合。

「気圧計の遅延」が表示されるまで、「設定の選択」ノブを時計回りに回します。

赤い「設定変更」ボタンを押して放します。

これにより、メインの気圧計の針が1ユニット全体後方に移動します。時針が指定された丸みを帯びた海面気圧に達したら停止します。

Pic.4指示された丸みを帯びた海面気圧と比較して、気圧計の主針が遅れている場合。

「バロメーターアドバンス」が表示されるまで、「設定の選択」ノブを時計回りに回します。

赤い「設定変更」ボタンを押して放します。

これにより、メイン気圧計の針が1ユニット全体前進します。手が指定された丸みを帯びた海面気圧に達したら停止します。

ステップ10:初期起動設定3時間針

<図> <図>

3時針の設定。

Oic.1 3時間針の調整は、ベロボードの緑、白、青、黄色の4つのボタンで行います。

最初の電源投入時に、3時間針​​を最も近い単位または半分の単位に校正する必要があります。

Pic.2 3時間針の最も近い単位値が、3時間針​​よりも進んでいる場合は、黄色の「低速Bwd」ボタンを押して、手を後方にインチします。ボタンを押したままにすると、手を後方に繰り返しインチします。

3時間針の最も近い単位値が3時間針の後ろにある場合は、青い「Slow Fwd」ボタンを押して、手を前方にインチします。ボタンを押し続けると、手を前方に繰り返し動かします。

3時間針が正確にユニット/ハーフユニットにあると、3時間LCDディスプレイの値「D」に針を設定できます。

手が値「D」より前にある場合は、白い「3Hr Step Bwd」ボタンを押して、3時間針​​を半分の単位で後方に進めます。

手にある値が「D」未満の場合は、緑色の「3Hr Step Fwd」ボタンを押して、3時間針​​を半分の単位で進めます。

3時間の表示は、その期間の読み取り値をメモリに保存する必要があるため、正しく表示されるまでに4時間かかることに注意してください。

ロードする前に、いつでも以前の気圧測定値をコードに追加できます。起動から機能するには、予測と3時間の表示が必要です。

124行目の3時間表示コード

floathour0は現在の時間です

floathour1は前の時間などです

float hour0 =1036.00;

float hour1 =1036.00;

float hour2 =1036.00;

float hour3 =1036.00;

float hour4 =1036.00;

あなたはインターネットからあなたの地元の読みを得ることができるはずです。

ステップ11:モジュール/コンポーネント

<図> <図> <図> <図> <図> <図> <図> <図>

モジュール

可能な場合、このプロジェクトでは、構築済みのモジュールを使用して、構築と設計の時間を節約します。

マイクロプロセッサ

このプロジェクトでは、2つのマイクロプロセッサAtmega 328(UNO)pic.1とArduino Nanopic.2を使用します。すでに別のプロジェクトから328を構築していて、Vero Boardのスペースが限られているため、Nanoも追加したため、この組み合わせを使用しました。

パワー

気圧計は約65mAを使用します。これは、各モーターが10分から1時間ごとにほんの一瞬だけステップするときに少し増加します

AMS117 pic.3

このプロジェクトのモジュールは3.3vで、BMP180モジュールに電力を供給するために使用されます。

AMS1117シリーズの調整可能および固定電圧レギュレータは、最大1Aの出力電流を供給し、1Vの入出力差動で動作するように設計されています。デバイスのドロップアウト電圧は最大1.3Vが保証されており、負荷電流が低くなると低下します。オンチップトリミングにより、基準電圧が1.5%に調整されます。電流制限は、レギュレータと電源回路の両方の過負荷状態でのストレスを最小限に抑えるように設定されています。このプロジェクトのモジュールは3.3vで、BMP180モジュールに電力を供給するために使用されます。

LM2596降圧DC-DCコンバータ3.0-40Vから1.5-35Vpic.4このモジュールは12v入力を5vに変換します

BMP180圧力センサーモジュール2オフpic.5 BMP180ブレイクアウトは、I2C(「ワイヤー」)インターフェースを備えた気圧センサーです。気圧センサーは、周囲の空気の絶対圧力を測定します。この気圧は、天候と高度の両方によって異なります。データの解釈方法に応じて、天気の変化を監視したり、高度を測定したり、正確な気圧の読み取りが必要なその他のタスクを実行したりできます。

+、-、CL、およびDAピンをArduinoに接続します。

CLはSCLに移動し、DAはSDAに移動します。

重要:電源ピン(+および-)は3.3V電源にのみ接続してください。電圧が高くなると、部品が恒久的に損傷します。I2Cはオープンドレインドライバを使用するため、I2Cピン(DAおよびCL)を5VマイクロプロセッサのI2Cポートに安全に接続できます。

RTCリアルタイムクロックpic.6

このブロメータは、DS3231 AT24C32I2C高精度リアルタイムクロックモジュールを使用しています。

このモジュールは主にタイミングに使用されますが、LCDディスプレイにタイムスタンプを提供します。時間はUTCに設定されており、夏季は変更されません。モジュールには、リチウムイオン充電式バッテリーが付属しています。上の図を参照してください。非充電式バッテリーを使用しているので、モジュールから抵抗R5を取り外しました。詳細については、RTCの変更のセクションを参照してください。

ステッピングモーター3オフ 気圧計は3つのNema17ステッピングモーター1A、13N.cm保持トルク、4リード、1.8°を使用します。ステップが360°に正確に200回適合するため、1.8°モーターを使用しました。必要に応じてNema8モーターを使用できますが、必要な1.8°のステップ角がないため、28BYJ-48-5Vモーターは使用しないでください。

私の気圧計のダイヤルでは正確に360°に分割されるため、1.8°のステップ角が必要です。

LCDディスプレイ2オフ

私は2つの20x4LCDディスプレイを使用しました。1つは気圧計、時計、6時間表示用で、もう1つは3時間表示と予測用です。

ステップ12:モジュール/コンポーネントA4988ステッピングモータードライバー

<図> <図> <図> <図> <図> <図>

A4988マイクロステッピングバイポーラステッピングモータードライバー3オフ

このセクションを注意深くお読みください

私の気圧計は1/16ステップの回転に設定されており、それに応じてコードが調整されます。

A4988マイクロステッピングバイポーラステッピングモータードライバーpic.1ヒートシンク付きおよびpic.2ヒートシンクなし

AllegroのA4988マイクロステッピングバイポーラステッピングモータードライバー用のこのブレークアウトボードは、調整可能な電流制限、過電流および過熱保護、および5つの異なるマイクロステップ解像度(1/16ステップまで)を備えています。

8 V〜35 Vで動作し、ヒートシンクや強制空気流なしで、フェーズごとに最大約1 Aを供給できます(十分な追加冷却を使用すると、コイルあたり2 Aの定格になります)。

ドライバーの主な機能の一部を次に示します。シンプルなステップおよび方向制御インターフェース5つの異なるステップ解像度:フルステップ、ハーフステップ、クォーターステップ、8ステップ、および16ステップ調整可能な電流制御により、最大電流出力を設定できます。ポテンショメータを使用すると、ステッピングモーターの定格電圧を超える電圧を使用して、より高いステップレートを実現できます。正しい電流減衰モード(高速減衰または低速減衰)を自動的に選択するインテリジェントチョッピング制御過熱熱シャットダウン、低電圧ロックアウト、およびクロスオーバー電流保護接地への短絡および負荷短絡保護

電源接続 ドライバには、VDDピンとGNDピンの間にロジック電源電圧(3〜5.5 V)を接続し、VMOTとGNDの間にモーター電源電圧(8〜35 V)を接続する必要があります。これらの電源には、ボードの近くに適切なデカップリングコンデンサが必要であり、期待される電流を供給できる必要があります(モーター電源のピークは最大4 A)。

警告:このキャリアボードは低ESRセラミックコンデンサを使用しているため、特に数インチより長い電源リードを使用する場合、破壊的なLC電圧スパイクの影響を受けやすくなります。適切な条件下では、これらのスパイクはA4988の最大電圧定格35 Vを超え、モーターの供給電圧が12 Vと低い場合でも、ボードに恒久的な損傷を与える可能性があります。 ドライバーを保護する1つの方法このようなスパイクは、大きな(少なくとも47 µF)電解コンデンサをモーター電源(VMOT)の両端に配置し、ボードの近くのどこかに接地することです。

モーター接続

4線式、6線式、および8線式のステッピングモーターは、正しく接続されていればA4988で駆動できます。 警告:ドライバーの電源が入っているときにステッピングモーターを接続または切断すると、ドライバーが破損する可能性があります。 (より一般的には、電源が入っているときに何かを再配線すると、問題が発生します。)

ステップ(およびマイクロステップ)サイズ

表の写真を参照してください。 3ステッパーモーターには通常、フルステップに適用されるステップサイズ仕様(たとえば、1.8°または1回転あたり200ステップ)があります。 A4988などのマイクロステッピングドライバーは、中間のステップ位置を可能にすることでより高い解像度を可能にします。これは、中間の電流レベルでコイルに通電することによって実現されます。たとえば、モーターを1/4ステップモードで駆動すると、4つの異なる電流レベルを使用して、1回転あたり200ステップのモーターに1回転あたり800マイクロステップが与えられます。

分解能(ステップサイズ)セレクタ入力(MS1、MS2、およびMS3)により、以下の表に従って5つのステップ分解能から選択できます。 MS1とMS3には100kΩのプルダウン抵抗が内蔵されており、MS2には50kΩのプルダウン抵抗が内蔵されているため、これら3つのマイクロステップ選択ピンを切断したままにするとフルステップモードになります。 マイクロステップモードが正しく機能するには、電流制限が有効になるように、電流制限を十分に低く設定する必要があります(以下を参照)。 そうしないと、中間電流レベルが正しく維持されず、モーターがマイクロステップをスキップします。

制御入力

写真4&5 STEP入力への各パルスは、DIRピンによって選択された方向のステッピングモーターの1マイクロステップに対応します。 STEPピンとDIRピンは内部で特定の電圧に引っ張られていないため、これらのピンのいずれかをアプリケーションにフローティングのままにしないでください。

一方向に回転させたいだけの場合は、DIRをVCCまたはGNDに直接接続できます。チップには、その多くの電源状態を制御するための3つの異なる入力があります。RST、SLP、およびENです。これらの電源状態の詳細については、データシートを参照してください。

RSTピンがフローティングであることに注意してください。ピンを使用していない場合は、PCB上の隣接するSLPピンに接続して、ピンをハイにし、ボードを有効にすることができます。

現在の制限 モーターを接続する前に、電流がモーターの電流制限内にあることを確認するために、ドライバーの電流制限を調整する必要があります。これを行うには、モジュールのポテンショメータを使用して基準電圧を調整し、VRefを設定します。

ビデオリンクの写真の詳細を参照してください。 6

メーカ​​ーの図面 シートpic.7

ステップ13:建設プロトタイピング

<図>

回路は、モータースピンドルとLED用にドリルで開けられたハードボードダイヤルを使用してプロトタイプ化されました。

次に、さまざまな文字盤のデザインが普通紙に印刷され、その上にセロテープが貼られました。 LEDワイヤーハーネスは、一時的なダイヤルの所定の位置にあるLEDを使用して作成されました。

丸い文字盤のデザインを使用している場合、これにより、ボードなどが文字盤に取り付けられるのか、バックボックスに取り付けられるのかを確認できます。

ステップ14:建設RTCの変更

<図> <図> <図> <図>

モジュールには、リチウムイオン充電式バッテリーが付属しています。図の写真を参照してください。 2.

私は非充電式バッテリーを使用しているので(リチウム鉄バッテリーを使用した回路設計とそれに伴う火災の危険性に満足していません)、以下のようにモジュールから抵抗R5を取り外しました。これにより、バッテリーへの充電電流が停止します。

写真3は抵抗のないモジュール(それを壊すだけ)を示し、写真4は変更された回路を示しています。

ステップ15:建設取り付けモジュールとボード

<図> <図> <図> <図> <図> <図> <図>

最新のスクエアダイヤルデザインでは、すべてのモジュールとボードがダイヤルに取り付けられています。クラシックなラウンドダイヤルのデザインでは、ダイヤルのスペースが少ないため、バックボックスにいくつかの部品を取り付ける必要があります。

モーターは木製の取り付けブロックにホットメルト接着されていますpic.1&2。樹木が茂ったブロックは合板のシートから切り取られますpic.3。取り付けブロックの深さは、ダイヤルからスピンドルが正しく突き出るように設定されています。 bloclsを文字盤にホットメルト接着しました。

VeroボードとLCDディスプレイも、衝撃接着剤を使用して文字盤に接着された木製のブロックにネジ止めされています。

写真4は、取り付け位置を示す透明なダイヤルを備えた正面図を示しています。

写真。 5は同じですが、背面図を示しています。

写真6は、木製の取り付けブロックの位置とレイアウトを示しています。

写真7は、ブロックに取り付けられたモジュールとモーターを示しています。

ステップ16:建設用LEDの固定

<図> <図>

3mmのLEDが取り付けられているので、文字盤の表面のすぐ上に表示されますpic.1。

3mmの穴が開けられ、ホットメルト接着剤がそれらを所定の位置に保持します。

均一な深さを得るために、ワッシャーとそれに接着されたカードを使用してジグを作成しました。

ステップ17:コンストラクションクラシックスタイルのイングリッシュダイヤルクロックケース

<図> <図> <図> <図> <図> <図>

古典的な12 "ダイヤル時計ケースは「ケースのみ」pic.1としてEbayから購入することができます。

さまざまなスタイルが利用可能です。これはオーク材で、バックボックスから離れてヒンジで動くダイヤルサラウンドがありますpic.2。

これにより、すべてのハードワークが完了したため、ビルドが非常に簡単になります。文字盤は真ちゅう製の文字盤ベゼルの後ろに隠された3本の小さな木ネジで取り付けられています。

この文字盤の周囲は、木の元の明るい色を引き出すために剥がされて漂白されていますpic.3。文字盤は中心から外れた曲がりくねった穴があったので取り外されました。

アルミニウムのシートから新しい文字盤が切り取られましたpic.4。

写真5バックボックスを示す気圧計の側面図。

写真6は、オリジナルの湾曲したバックボックス、ヒンジ付きダイヤルベゼル、ペグダイヤルサラウンドを備えたレギュレーター時計ケースを示しています。

これらの時計ケースの多くは、4本の木製ペグで固定されていました。ケースがこのように構成されている場合は、片側に1対のヒンジを追加し、残りの2つのペグを使用してダイヤルサラウンドを所定の位置にロックします。

ステップ18:現代の建設ケース

<図> <図> <図> <図> <図> <図> <図>

額縁バージョン

私は背中合わせに取り付けられた2つの同じ額縁を使用しました。これらのフレームは約30cmx30cmです。 12 "x12" pic.1。

pic.2フレームは背中合わせに結合されています。

pic.3これにより2倍の深さのフレームが得られます。

pic.4ワイヤードボードとモジュールを示す背面図。

pic.5リアフレームから見た文字盤。

pic.6すべての配線が整ったフレームの後半。

pic.7文字盤の前面がフレームの前半分から見えるようになりました。木製の斜角は、フレームの前半分の後ろのスペースを隠します。

ステップ19:モダンケースバックボックスの構築

<図> <図> <図> <図> <図> <図> <図> <図> <図>

バックボックス

Pic.1気圧計は、上部を除くすべての側面でダイヤルフレームよりも小さいバックボックスに収納されています。フラムのオーバーラップは、バックボックスを隠すのに役立ち、壁のケースに影の効果を追加します。

Pic.2バックボックスの深さは50mmで、接着とネジ止めされた木材で構成されています。

写真3フレームのオーバーラップを示すリアダイヤルフレームの後ろの位置にあるバックボックスの背面図。

Pic.4ネジ穴を埋めてから、バックボックスにマットブラックのコートを塗ります。

Pic.5後部額縁が所定の位置にあるバックボックスは、ダイヤルを保持します。後部フレームが上下逆に配置されていることに注意してください。

Pic.6スペーサーは、額縁のくぼみと同じサイズと深さにカットされています。

Pic.7文字盤の下にスペーサーがセットされています。

Pic.8これにより、リアフレームの上端でダイヤルレベルが上がります。

Pic.9リアフレームの上にフロント額縁が配置されたバックボックス。このフレームはガラスを保持します。

ステップ20:現代のケースの壁への取り付けの構築

<図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図>

気圧計の取り付け

Pic.1気圧計の背面にアクセスできるようにするために、気圧計をGTV270°インセットヒンジのペアに取り付けました。ヒンジは壁に固定された木のブロックに取り付けられており、気圧計を振り出してアクセスできるようにします。いつでもメンテナンスのために気圧計を降ろす必要がある場合、ヒンジにはクイックリリース機能もあります。ヒンジピボットが後退しているため、ヒンジを外したときにケースの上部が壁から外れることもあります。

Pic.2ヒンジは、壁にねじ込まれた木製のブロックに取り付けられています。

Pic.3ヒンジが取り付けられる左側に余分な木材をねじ込み、接着しました。これにより、時計ケースが開いているときに時計のすべての重量がこちら側にかかるため、強度が増します。 2枚のアルミニウムプレートがヒンジ穴を覆います。

Pic.4ヒンジブロックが所定の位置にあります。これらはネジではなく、ケースにボルトで固定されていることに注意してください。

Pic.5壁に取り付けられたバックボックス。固定ネジは、ヒンジを木製の取り付けブロックにも固定します。右側の木製の警棒も壁に固定され、バックボックスの右上隅を支えます。また、バックボックスを壁に押し付けて保持する壁取り付けロックピンの固定ポイントとしても機能します。

Pic.6バックボックスは、木製の取り付けブロックと警棒が壁に固定された状態で開いた状態で示されています。バトンの前端の穴は、バックボックスの側面の穴と一致します。ここにスチールピンを挿入して、気圧計を壁に固定します。

Pic.7バックボックスが開いており、LCDディスプレイと設定スイッチにアクセスできます。

Pic.8スチール製ロッキングピンこれは、ある長さのトレッドバーがネジ山にねじ込まれている小さなキャビネットノブです。

写真9&10バロメーターを壁に完全に押し込むと、ロッキングピンがロックされます。引き抜くと、気圧計が回転して、コントロールスイッチとLCDディスプレイにアクセスできるようになります。

Pic.11ロッキングピンの詳細と右側のダイヤル固定ボルトの位置。ワッシャーを穴の上にエスカットチョンプレートとして接着しました。

ステップ21:コンストラクションモダンケースダイヤルマウント

<図> <図> <図> <図> <図> <図> <図> <図> <図>

ダイヤルやすべてのボードなどはメンテナンスのために取り外し可能で、2本のボルトでバックボックスに固定されています。

ダイヤルをバックボックスに取り付ける

ダイヤルは、すべてのステッピングモーター、ボード、モジュールの合計重量を保持し、背面に不均等なアルミニウム角度の2つのストリップを衝撃接着することによって補強されます.2つの木のブロックがこれらのバーに接着され、小さなネジがこれらの木製のブロックを保持しますバックボックスの側面から。 LCD取り付けブロックの下の文字盤にさらに薄い木のストリップが接着されています。これはケースにねじ込まれていませんが、ダイヤルを支えるためにバックボックスにあります。

Pic.1アルミニウムの不等角度の強化バー。

Pic.2バーの位置を強化する。

Pic.3左右のダイヤル固定ボルト用の接着された木製の固定/サポートブロックと下部の接着されたダイヤルサポート。

Pic.4バックボックスとダイヤルの間の接点/固定点を示しています。ダイヤル固定/木製サポート付きブラックのバックボックス。

写真5取り付けブロックとバーの位置を示す背面図。

Pic.6バックボックス付きダイヤルを取り外し、ダイヤルの背面に取り付けブロックと強化バーを接着しました。

ダイヤルスペーサーにより、ダイヤルを後部額縁の上部と同じ高さに置くことができます。

写真7文字盤固定ボルトの位置を示す時計の右側。

Pic.8マウントは、4つの薄い木片で構成され、前面の額縁のくぼみに配置されます。これにより、額縁と文字盤の間の隙間が埋められ、Perspexシートが所定の位置に保持され、文字盤にフォトマウント効果が追加されます。

Pic.9前面の額縁の後ろに取り付けます。

ステップ22:構築ダイヤル

<図> <図> <図> <図> <図> <図>

Pic.1文字盤は厚さ1.5mmのアルミシートでできており、保護用のプラスチックフィルムで覆われています。

Pic.2 cadプログラムからA3用紙にダイヤルを印刷し、すべてのLEDとステッピングモーターシャフトの穴の中心マークを含めます。これがドリルテンプレートになります。アルミニウムダイヤルブランクの用紙を置き、端をテープで留めて止めます。移動します。紙にすべての穴を中央でパンチします。

Pic.3紙のテンプレートを取り外し、LED用に3mmの穴を開け、ステッピングモータースピンドル用に3つの大きな穴を開けます。

小さな下穴から始めて、ドリルサイズを3段階で増やします。丸い文字盤を使用している場合は、市場のペンで投影フィルムに印を付け、この段階で切り取ります。

Pic.4これで保護プラスチックフィルムを取り外すことができます。ダイヤルの前後をこすり、バリを取り除き、ペンキの鍵を用意します。

Pic.5アクリルプライマーをスプレーしてから、お好みのトップコートをスプレーします。私はアンティークホワイトを使用しました。

次に、マットクリアアクリルを最後に塗ります。一晩乾かしておきます。

ダイヤルpic.6の高解像度写真を含めました。別の形式で必要な場合は、私に連絡してください。私のCADフォーマットはTurboCadです。

ステップ23:建設ダイヤルデカール

<図> <図> <図> <図> <図> <図> <図>

ウォータースライドデカール転写を適用します。

私はBIGBITEStudioのウォータースライドデカール紙を使用しています。彼らのサイトにはいくつかの優れたチュートリアルがあります。 https://www.bigbitestudio.co.uk/tutorials/water-decal-tutorials/

Pic.1ウォータースライドデカールは、水に浸したインクジェットプリンターで印刷され、所定の位置にスライドされます。彼らは非常に詳細なプリントを与え、一度ニスを塗るとタフです。

転送を通して文字盤の色が見えるように、透明な転送を注文することを忘れないでください。パックの指示に従ってください。

Pic.2転写では、文字盤を転写紙に印刷して乾かし、文字盤のサイズのすぐ下に切り取ります。次に、アクリルニスを塗ります。

プリンタを次のように設定しました。普通紙、写真、高速オフこれにより、プリンタが用紙に過剰にインクを塗るのを防ぎます。ニスが乾くと、透明な転写が白い裏紙から離れるまで転写が水に浸されます。

>

Pic.3浸したトランスファーを文字盤の上に移動します。

Pic.4トランスファーを所定の位置にスライドさせます。

Pic.5転写紙を押したまま、白い裏紙をそっと後ろに引きます。

十字架がすべての穴の中心と一致していることを確認してください。

Pic.6気泡を取り除きます。

Pic.7次に、マットニスを塗る前に乾かします。

ワニスのコートが穴よりも小さいドリルビットの後ろを使用して穴の上の転写の層を突破した後。次に、最後にニスを塗り、穴の周りの端をシールします。

ステップ24:建設の手

<図> <図> <図> <図> <図> <図> <図> <図> <図> <図>

手は非常に個人的な選択であり、選択できるさまざまなスタイルがあります。最も難しいのは、互いに一致する手を見つけることです。私は小さな手の完璧なセットを見つけましたが、メインの気圧計に一致するロングハンドを見つけることができませんでした。結局、私は3つのドナーの手から自分で作りました。

私の手はすべてクォーツの秒針だったので、ステッピングモーターのスピンドルに取り付けるために、取り付けスピンドルを後ろからやすりで削ります。

一部のステッピングモーターでは、スピンドルをドリルアウトしてハンドスピンドルを使用できますが、スピンドルが難しすぎてドリルできませんでした。

Pic.1完成した手。

Pic.2長い気圧計の針は3つの異なる針で構成されています

Pic.3手のスペードバランスの低い部分を取得するために、スペードハンドを使用しました。

Pic.4まず、鋭利なハサミで上を切り落としました。

Pic.5次に、ポイントを切り取って上部をトリミングしました。

Pic.6残りの部分は、2つの小さい手の形に合うようにやすりで削られました。

Pic.7手のバランスが完成しました。

Pic.8フロントポインターとセンターを作成するために、ドナーの手から端を切り取りました。

Pic.9リアバランスシャフトを作るために、3番目のドナーハンドからセクションを切り取りました。

Pic.10新しい手の3つの部分を残しました。真ん中は、ボンディングを可能にするためのバランスシャフトの重なりを示しています。右の写真は、バランスシャフトとセンターシャフトの下側に衝撃接着剤で接着されたバランスシャフトを示しています。

手をステッピングモーターのスピンドルに固定するために、衝撃接着剤を使用したくありませんでした。手は壊れやすく、手で取り外すと損傷する可能性があるためです。結局、私はそれぞれの手にほんの少しのブルータックを求めました。 Blu Tackはパテのようで、設定されていませんが、非常によく保持されているようです!

ステップ25:建設概略図

<図> <図>

主なシェマティックは写真に示されています。 1Pic.2の電源で。

また、約1アンペアの12V電源アダプターの調整されたプラグが必要になります。

バックライトLEDをオンまたはオフにするためにLCDディスプレイにスイッチを取り付けたことに注意してください。これはオプションですが、ディスプレイは99.99%の時間表示されないため、電力を節約できます。

より大きな回路図は私のウェブサイトにあります

ステップ26:建設ベロボード

<図> <図> <図> <図> <図> <図> <図>

ベロボードレイアウト

Pic.1すべてのモジュールが取り外されたベロボード。

Pic.2モジュールが配置されたベロボード。

Pic.3ベロボードの背面図(上から下に反転)。

Pic.4LEDベロボード

このボードは、ダイヤルLEDの接続ポイントとして使用されます。これにより、メンテナンスが必要な場合にダイヤルをメインボードから切り離すことができます。

Pic.5 LED Veroボードは、デュポンソケットとオスデュポンケーブルでメインボードに接続します

Pic.6ベロボードの配線が進行中です。

Pic.7ダイヤルの背面にあるベロボードとモジュールの位置。

ステップ27:コード

コード

コードには、メイン気圧計コードと6時間表示用の1つと、3時間表示と天気予報用の1つの部分があります。

ステップ28:タイムラプスビデオ

雨と嵐を予測する雨レーダーと気圧計を示すタイムラプスビデオ。

これは4Kビデオなので、ダイヤルと予測LEDの詳細をすべて確認できるはずです。

コード

  • BarometerA4988_23.ino
  • BarometerA4988_3hour__21.ino
BarometerA4988_23.ino Arduino
気圧計と6時間表示のメインファイル
 / * ULN2003ドライバーボード、AccelStepper、Arduino UNOを使用して28BYJ-48ステッピングモーターを制御するためのスケッチ例:ステップ数/回転数。詳細:https://www.makerguides.comv4はステップ6時間の圧力ステップをvoidgetpressure 1523からメインループに移動し、1時間ごとにチェックします365v5未使用のステップ要素を削除しますv66時間のdiff表示に変換します/ low for EN control v11 chenge calc for hour change 1380v12 add calcCurrentDisp(); to calc current time from line 1384v13 removed 30 sec syncv14 air pressure extremes LEDsv15 add hour diff hour calc etc to row 1 when not on settingsv16 adding 16th stepsv17 errorv18 change min pulse to hour pulse on the hour + 1minv19 check enable and sleepsv20 added DAC to NANO so pins changed on 328 to match (analogue and digital swapped A6 D3 - deleted v20 also changed Low range hi range to both light above 19 or -19v21 same as 20 with serial print removedv23 notes added LCD display info added to startup */#include  //SFE_BMP180 pressure sensor#include #include #include // ######## You will need to create an SFE_BMP180 object, here called "pressure":SFE_BMP180 pressure;#define ALTITUDE 118.0 // Altitude of Kenley Surrey in meters// also used to adjust/sync/calibrate to nearby weather station/3 hour display//#########//**********************// set the LCD address to 0x27 for a 20 chars 4 line display// Set the pins on the I2C chip used for LCD connections:// addr, en,rw,rs,d4,d5,d6,d7,bl,blpolLiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address#define DS3231_I2C_ADDRESS 0x68// Convert normal decimal numbers to binary coded decimalbyte decToBcd(byte val){ return( (val/10*16) + (val%10) );}// Convert binary coded decimal to normal decimal numbersbyte bcdToDec(byte val){ return( (val/16*10) + (val%16) );}// Include the AccelStepper library:#include // Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:#define dirPin 8#define stepPin 9#define dirPin2 10#define stepPin2 11#define motorInterfaceType 1// Create a new instance of the AccelStepper class:AccelStepper stepper =AccelStepper(motorInterfaceType, stepPin, dirPin);//barometer motorAccelStepper stepper2 =AccelStepper(motorInterfaceType, stepPin2, dirPin2);// 6 hour motorfloat seaPressure =0;float pressureNow =0;float pressurePrevious =0;float pressureDiff =0;int checkStop =0;int pressureRndDiff =0;int pressureRndNow =0;int pressureRndPrevious =0;int adjustOn =4; // allows adjustment of barometer// int test =0; // test mode 0 off 1 is onchar status; double T,P,a;//int h =0;//int m =0;//int j =0;int stepcount =0;int time =0;int resetmins =1;int secondNow =0;int secondPrevious=0;int minuteNow =0;int minutePrevious=0;int hourNow =0;int hourPrevious=0;int hourNow1=0;int hourPrevious1=0;int initial =0;int initial1 =0;int initial3 =0;int highPressureLED =3;int lowPressureLED =5;int hour6LowLED =15;int hour6HighLED =16;int manSync =12; // resets seconds to 30 secondsint changeSetting =2;int syncStop =0;int sync30Stop =0;int stepoffHour =0;int stepoffHourbkw =0;int stepoffMin =0;int stepoffMinbwd =0;int stepoffRTCminfwd =0;int stepoffRTCminbwd =0;int stepoffRTChourfwd =0;int stepoffRTChourbwd =0;int settingreadPin =A3; //Pin for sensing analogue value from potint settingVal =0; // Analogue value 0-1023int LCDstop =0; // stops settings on LCD display refreshing until they changeint hourPulse =13; //min pulse for seconds display was 14int adjustLock =0; // turns off adjust lockint hourcalc =0; // number from 0 to 7 representing the 8 hours of stored pressure readings int hourDiff =0; // used to check if 6hour previous motor should be stepped.int hourChange =0; // the amount of 6 hour to stepint currentDisplay =0; //current 6hour change readingint hour0 =1013; // you can set last 8 hours pressure here or leave at 0 and theint hour1 =1014; // readings will catch up over the next 8 hoursint hour2 =1015;int hour3 =1016;int hour4 =1016;int hour5 =1016;int hour6 =1012;int hour7 =1013;int sleep1 =6;int sleep2 =7;// check air pressure here https://www.meteoplug.com/cgi-bin/meteochart.cgi?draw=a3aeaaa1acbdf9f1fcfed4fedbc2c094c0d6d6d1d2c5edcebbfee9ffeff1fbf9//int Disp3hrIn =A3;//int Disp3hrVal =0;void setup() { pinMode(adjustOn, INPUT); pinMode(hourPulse, OUTPUT); pinMode(highPressureLED, OUTPUT); pinMode(lowPressureLED, OUTPUT); pinMode(hour6LowLED, OUTPUT); pinMode(hour6HighLED, OUTPUT); pinMode(manSync, INPUT); pinMode(sleep1, OUTPUT); pinMode(sleep2, OUTPUT); pinMode(settingreadPin, INPUT); // Set the maximum steps per second:stepper.setMaxSpeed(1000); stepper2.setMaxSpeed(1000); lcd.begin(20,4); // initialize the lcd for 20 chars 4 lines, turn on backlight lcd.backlight(); // backlight on not needed as man controlled lcd.setCursor(0,0); //Start at character 0 on line 0 lcd.print("Barometer A988"); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ lcd.setCursor(0,1); //Start at character 0 on line 1 lcd.print(" Version 23"); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { Wire.begin(); Serial.begin(9600); // set the initial time here:// DS3231 seconds, minutes, hours, day, date, month, year // setDS3231time(10,42,9,5,18,12,19);//delay(2000);lcd.clear();}Serial.println("REBOOT");// serial removed // Initialize the sensor (it is important to get calibration values stored on the device). if (pressure.begin()) Serial.println("BMP180 init success");// serial removed else { // Oops, something went wrong, this is usually a connection problem, // see the comments at the top of this sketch for the proper connections. Serial.println("BMP180 init fail\n\n");// serial removed while(1); // Pause forever. } //LED TestdigitalWrite(hour6HighLED, HIGH);delay (500);digitalWrite(hour6HighLED, LOW);digitalWrite(hour6LowLED, HIGH);delay (500);digitalWrite(hour6LowLED, LOW);digitalWrite(highPressureLED, HIGH);delay (500);digitalWrite(highPressureLED, LOW);digitalWrite(lowPressureLED, HIGH);delay (500);digitalWrite(lowPressureLED, LOW);delay (500);lcd.clear();getPressure ();// gets all pressure readings// Disp readings on startup so hands can be set lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("H"); lcd.print(hourcalc); lcd.setCursor(2,1); lcd.print(" "); lcd.setCursor(2,1); lcd.print("Old"); lcd.print(currentDisplay); lcd.setCursor(13,1); lcd.print(" "); lcd.setCursor(13,1); lcd.print("Disp"); lcd.print(hourDiff); //disable motors on startupdigitalWrite(sleep1, HIGH);digitalWrite(sleep2, HIGH);stepper.disableOutputs();stepper2.disableOutputs();// test =1; // test set to 0 off 1 on}void loop() { if( digitalRead(adjustOn) ==HIGH || adjustLock ==1)// only alow settings when change settings switch is ON{ //digitalWrite(sleep1, LOW);//enable on //digitalWrite(sleep2, LOW);//enable on only enable outputs for 2 mins Settings(); //set what function the setiing switches have adjustLock =1; //hold on adjustment if( digitalRead(adjustOn) ==LOW){//digitalWrite(sleep1, HIGH);//disable on//digitalWrite(sleep2, HIGH);//enable on only enable outputs for 2 minsadjustLock =0; //hold on adjustment } }// only allow settings change when setting switch is on // displayTime(); // display the real-time clock data on the Serial Monitor, byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //enable air pressure readings if (minute ==9 || minute ==19 || minute ==29 || minute ==39 || minute ==49 || minute ==59 &&second ==59) { checkStop =0;// resets checkstop to allow air pressure readings every 10 mins }//check air pressure every 10 mins if (checkStop ==0) { if ( minute ==0 || minute ==10 || minute ==20 || minute ==30 || minute ==40 || minute ==50 ) { //digitalWrite(sleep1, LOW);//enable on -only enable outputs for 1 min // only sleep1 needs activation getPressure ();// gets all pressure readings checkStop =1;// stops multiple readings of air pressure }// else //digitalWrite(sleep1, HIGH);//enable off // Serial.print("Sleep 1 HIGH (off) "); // Serial.println(hourChange); } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@if(digitalRead(manSync)==HIGH)// resets seconds to 30{ setDS3231time(30, minute, hour, dayOfWeek, dayOfMonth, month, year); //Set seconds to 30 on RTC } // counts seconds secondNow =second; if(secondNow!=secondPrevious || initial) { lcd.setCursor(0,0); lcd.print("UTC "); if(hour<10) { lcd.print(0); } lcd.print(hour); lcd.print( ":"); if(minute<10) { lcd.print(0); } lcd.print(minute); lcd.print( ":"); if(second<10) { lcd.print(0); } lcd.print(second); lcd.print(" "); // Serial.print("-1*0 ");// Serial.println(-1*0); initial =0; secondPrevious =secondNow; } // count minutes minuteNow =minute; if(minuteNow!=minutePrevious || initial) //settingVal <690 stops clock motors operating when setting RTC { initial =0; minutePrevious =minuteNow; // digitalWrite(minPulse,HIGH);//1 min pulse for seconds display sync syncStop =0;// clock will not sync again untill a new minute has started. // digitalWrite(minPulse,LOW);//1 min pulse for seconds display sync } // counts hours + 1min for hourPulse at 15 seconds past the hour this allows barometer and 6 hour dial to step first if ( minute ==0 &&second ==15) // send hour pulse 15 seconds past the hour to 3 hour circuit allows other motors to stop { digitalWrite(hourPulse,HIGH); digitalWrite(highPressureLED,HIGH); // Serial.println("hourPulse Hi "); } else if (minute !=1 || second !=0) { digitalWrite(hourPulse,LOW);digitalWrite(highPressureLED,LOW); }// counts hours hourNow =hour; if ((minute ==59 &&second> 50) || (minute ==0 &&second <10) )// allows change on the hour only {// digitalWrite(sleep2, LOW);// enable 6hr motor if(hourNow!=hourPrevious || initial) //settingVal <690 stops clock motors operating when setting RTC { initial =0; hourPrevious =hourNow;//print hour stores every hour // serial removed /* Serial.print("hour0 "); Serial.println(hour0); Serial.print("hour1 "); Serial.println(hour1); Serial.print("hour2 "); Serial.println(hour2); Serial.print("hour3 "); Serial.println(hour3); Serial.print("hour4 "); Serial.println(hour4); Serial.print("hour5 "); Serial.println(hour5); Serial.print("hour6 "); Serial.println(hour6); Serial.print("hour7 "); Serial.println(hour7); */ //##############################################################################//step 6 hour motorif (hourChange> 0 &&hourChange <40) // 6 hour motor will not step if diff> 10 { stephourFwd(); //Serial.print("Step 6 hour Forward ");// serial removed // Serial.println(hourChange);// serial removed hourChange =0; } else if (hourChange <0 &&hourChange> -40) // else if (hourDiff ==-1 || test ==1) { stephourBwd(); // Serial.print("Step 6 Hour Backward ");// serial removed // Serial.println(hourChange);// serial removed hourChange =0; } // hourChange =0; //############################################################################## } // digitalWrite(sleep2, HIGH);// disable 6hr motor// add LCD stop if(second==0) { // lcd.setCursor(0,1); //lcd.print(" "); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("H"); lcd.print(hourcalc); lcd.setCursor(2,1); lcd.print(" "); lcd.setCursor(2,1); lcd.print("Old"); lcd.print(currentDisplay); lcd.setCursor(13,1); lcd.print(" "); lcd.setCursor(13,1); lcd.print("Disp"); lcd.print(hourDiff); } } } // Set Clock/Motors###################################################################################################//gets advance retard settings from potvoid Settings(){ settingVal =analogRead(settingreadPin); // read the value from the pot if ( settingVal>=0 &&settingVal <85 ) { setMinsfwd(); } if ( settingVal>=85 &&settingVal <170 ) { setMinsbwd(); } if ( settingVal>=170 &&settingVal <255 ) { setMinsslowfwd(); } if ( settingVal>=255 &&settingVal <340 ) { setMinsslowbkd(); } if ( settingVal>=340 &&settingVal <425 ) { setHoursfwd(); } if ( settingVal>=425 &&settingVal <510 ) { setHoursbwd(); } if ( settingVal>=510 &&settingVal <595 ) { setHoursslowfwd(); } if ( settingVal>=595 &&settingVal <690 ) { setHourslowbkd(); } if ( settingVal>=690 &&settingVal <765 ) { setRTCfwdmin(); } if ( settingVal>=765 &&settingVal <850 ) { setRTCbwdmin(); } if ( settingVal>=850 &&settingVal <900 ) { setRTCfwd(); } if ( settingVal>=900 &&settingVal <970 ) { setRTCbwd(); }if ( settingVal>=970 &&settingVal <1025 ) { } if ( settingVal>=0 &&settingVal <85 &&LCDstop==0)// LCDstop prevents the LCD from freshing until another item is selected { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("Barometer Advance"); LCDstop=1; } if ( settingVal>=85 &&settingVal <170 &&LCDstop==1) { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("Barometer Retard"); LCDstop=0; } if ( settingVal>=170 &&settingVal <255 &&LCDstop==0 ) { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("Baro Inch Advance"); LCDstop=1; } if ( settingVal>=255 &&settingVal <340 &&LCDstop==1 ) { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("Baro Inch Retard"); LCDstop=0; } if ( settingVal>=340 &&settingVal <425 &&LCDstop==0 ) { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("6Hr Baro Advance"); LCDstop=1; } if ( settingVal>=425 &&settingVal <510 &&LCDstop==1 ) { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("6Hr Baro Retard"); LCDstop=0; } if ( settingVal>=510 &&settingVal <595 &&LCDstop==0 ) { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("6Hr Baro Inch Advn"); LCDstop=1; } if ( settingVal>=595 &&settingVal <690 &&LCDstop==1 ) { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("6Hr Baro Inch Retard"); LCDstop=0; } if ( settingVal>=690 &&settingVal <765 &&LCDstop==0) { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("RTC Min Advance"); LCDstop=1; } if ( settingVal>=765 &&settingVal <850 &&LCDstop==1 ) { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("RTC Min Retard"); LCDstop=0; } if ( settingVal>=850 &&settingVal <900 &&LCDstop==0 ) { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("RTC Hour Advance"); LCDstop=1; } if ( settingVal>=900 &&settingVal <970 &&LCDstop==1 ) { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print("RTC Hour Retard"); LCDstop=0; } if ( settingVal>=970 &&settingVal <1025 &&LCDstop==0 ) { lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print( "OFF"); LCDstop=1; } }// END of Loop// set RTC min forward 1 min per press ##################################################################################void setRTCfwdmin(){ if( digitalRead(changeSetting) ==HIGH &&stepoffRTCminfwd ==0 ) { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); minute =minute+1; if (minute ==60) { minute =0; } setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year); //Set seconds to 30 on RTC stepoffRTCminfwd =1; } if( digitalRead(changeSetting) ==LOW ) { stepoffRTCminfwd =0; }}//##################################################################################// set RTC min backward 1 min per press ##################################################################################void setRTCbwdmin(){ if( digitalRead(changeSetting) ==HIGH &&stepoffRTCminbwd ==0 ) { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); minute =minute-1; if (minute <1) { minute =59; } setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year); //Set seconds to 30 on RTC stepoffRTCminbwd =1; } if( digitalRead(changeSetting) ==LOW ) { stepoffRTCminbwd =0; }}//##################################################################################//###################################################################################################// set RTC hour forward 1 hour per press ##################################################################################void setRTCfwd(){ if( digitalRead(changeSetting) ==HIGH &&stepoffRTChourfwd ==0 ) { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); hour =hour+1; setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year); //Set seconds to 30 on RTC stepoffRTChourfwd =1; } if( digitalRead(changeSetting) ==LOW ) { stepoffRTChourfwd =0; }}//##################################################################################// set RTC hour backward 1 hour per press ##################################################################################void setRTCbwd(){ if( digitalRead(changeSetting) ==HIGH &&stepoffRTChourbwd ==0 ) { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); hour =hour-1; setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year); //Set seconds to 30 on RTC stepoffRTChourbwd =1; } if( digitalRead(changeSetting) ==LOW ) { stepoffRTChourbwd =0; }}//##################################################################################// set Minutes Motor forward 1 min per press ##################################################################################void setMinsfwd(){ //digitalWrite(sleep1, LOW); //stepper.enableOutputs();// step minutes 1 min per press if( digitalRead(changeSetting) ==HIGH &&stepoffMin ==0 ) { //Serial.println("Step Forward Man");// serial removed stepoffMin =1; stepminsFwd(); } if( digitalRead(changeSetting) ==LOW ) { stepoffMin =0; }//digitalWrite(sleep1, HIGH); //stepper.disableOutputs();}//##################################################################################// set Minutes Motor backward 1 min per press ##################################################################################void setMinsbwd(){ //digitalWrite(sleep1, LOW); // stepper.enableOutputs(); if( digitalRead(changeSetting) ==HIGH &&stepoffMinbwd ==0 ) { // Serial.println("Step Backward Man");// serial removed stepoffMinbwd =1; stepminsBwd(); } if( digitalRead(changeSetting) ==LOW ) { stepoffMinbwd =0; }//digitalWrite(sleep1, HIGH); // stepper.disableOutputs();}//##################################################################################// step minutes slow forward const press ##################################################################################void setMinsslowfwd(){ stepper.enableOutputs(); digitalWrite(sleep1, LOW); if( digitalRead(changeSetting) ==HIGH ) { // Serial.println("Step Baro Inch Forward Man");// serial removed stepper.setCurrentPosition(0); // Run the motor forward at 500 steps/second until the motor reaches 4096 steps (1 revolution):while (stepper.currentPosition() !=1) { //was 52 52x60 =3120 stepper.setSpeed(50); stepper.runSpeed(); } /* digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW);*/ } digitalWrite(sleep1, HIGH); stepper.disableOutputs();}//##################################################################################// step minutes slow backward const press ##################################################################################void setMinsslowbkd(){ stepper.enableOutputs(); digitalWrite(sleep1, LOW); if( digitalRead(changeSetting) ==HIGH ) { // Serial.println("Step Baro Inch Backward Man");// serial removed stepper.setCurrentPosition(0); // Run the motor forward at 500 steps/second until the motor reaches 4096 steps (1 revolution):while (stepper.currentPosition() !=-1) { //was 52 52x60 =3120 stepper.setSpeed(-50); stepper.runSpeed(); } /* digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW);*/ } digitalWrite(sleep1, HIGH); stepper.disableOutputs();}//##################################################################################// set Hour Motor forward 1 hour per press ##################################################################################void setHoursfwd(){ // stepper2.enableOutputs(); // digitalWrite(sleep2, LOW); // step hours 1 hour per press if( digitalRead(changeSetting) ==HIGH &&stepoffHour ==0 ) { // Serial.println("Step 6hr Forward Man");// serial removed stepoffHour =1; stephourmanFwd(); } // stepper2.disableOutputs(); // digitalWrite(sleep2, HIGH);if( digitalRead(changeSetting) ==LOW ) { stepoffHour =0; }...This file has been truncated, please download it to see its full contents.
BarometerA4988_3hour__21.inoArduino
File for 3 hour display and forecasting
/* Example sketch to control a 28BYJ-48 stepper motor with ULN2003 driver board, AccelStepper and Arduino UNO:number of steps/revolutions. More info:https://www.makerguides.com v4 added presure extreme LEDsv5 add forcast LEDs and calcv6 sorted enable and sleep orderv7 remove adjust on and test replace it with Clearing and threatening LEDs PIN 12 and 13 v8 add dac driver-deletedv9 added LCDv10 added weather forecast usingLEDs v12 LEds test addedv13 add 1 dp point to 3 hour displayv14 void 1026 add slow set buttonsv18 voided v19last reading not included in number of stepsv20 change led test orderv20a serial.print removed indicated by // serial removedv21 as 20a identical to v20 that includes serial print*/#include  //SFE_BMP180 pressure sensor#include #include // ######## You will need to create an SFE_BMP180 object, here called "pressure":SFE_BMP180 pressure;#define ALTITUDE 125.0 // Altitude of Kenley Surrey in meters//#########//**********************// set the LCD address to 0x27 for a 20 chars 4 line display// Set the pins on the I2C chip used for LCD connections:// addr, en,rw,rs,d4,d5,d6,d7,bl,blpolLiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address//#define DS3231_I2C_ADDRESS 0x68// Convert normal decimal numbers to binary coded decimalbyte decToBcd(byte val){ return( (val/10*16) + (val%10) );}// Convert binary coded decimal to normal decimal numbersbyte bcdToDec(byte val){ return( (val/16*10) + (val%16) );}// Include the AccelStepper library:#include // Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:#define dirPin 11#define stepPin 10#define motorInterfaceType 1// Create a new instance of the AccelStepper class:AccelStepper stepper =AccelStepper(motorInterfaceType, stepPin, dirPin);float seaPressure =0;float pressureNow =0;float pressurePrevious =0;float pressureDiff =0;int checkStop =0;//int pressureRndDiff =0;int pressureRndNow =0;int pressureRndPrevious =0;int adjustOn =12; // allows adjustment of barometer// int test =0; // test mode 0 off 1 is onchar status; double T,P,a;//int h =0;//int m =0;//int j =0;int stepcount =0;//int time =0;//int resetmins =1;//int secondNow =0;//int secondPrevious=0;//int minuteNow =0;//int minutePrevious=0;//int hourNow =0;//int hourPrevious=0;int initial =0;int initial1 =0;int initial3 =0;//int sync30 =3;//30sec sync on pin18//int syncLED =15;//int manSync =12;//int adjustOn =12;//int syncStop =0;//int sync30Stop =0;int stepoffHour =0;int stepoffHourbkw =0;int stepoffMin =0;int stepoffMinbwd =0;//int stepoffRTCminfwd =0;//int stepoffRTCminbwd =0;//int stepoffRTChourfwd =0;//int stepoffRTChourbwd =0;//int settingreadPin =A3; //Pin for sensing analogue value from pot//int settingVal =0; // Analogue value 0-1023int LCDstop =0; // stops settings on LCD display refreshing until they changeint hourPulse =3; //hour pulse from main Barometer Arduinoint adjustLock =0; // turns off adjust lockint hourcalc =0;float hourDiff =0.50; // used to check if 3hour previous motor should be stepped.float hourChange =0.00; // the amount of 3 hour to step float valueint hourStep =0; //the amount of 3 hour to stepint hourStepdigit1 =0; // gets the 1st digit from hourstepint hourStepdigit2 =0; // gets the 2nd digit from hourstepint stepTotal =0; // tptal amount of steps for 3 hour motorint hourChangeNeg =0;// if hour change is -ve this stores the value to chenge stepTotal laterfloat currentDisplay =0.50; //current 3hour change readingfloat hour0 =1036.00; // you can set last 3 hours pressure here or leave at 0 and thefloat hour1 =1036.00; // readings will catch up over the next 4 hoursfloat hour2 =1036.00;float hour3 =1036.00;float hour4 =1036.00;//check readings https://www.meteoplug.com/cgi-bin/meteochart.cgi?draw=a3aeaaa1acbdf9f1fcfed4fedbc2c094c0d6d6d1d2c5edcebbfee9ffeff1fbf9int sleep =9;int hourPulseOff =0;//int testinput =17;int testpulse =0;int hourPlus1min =0;int stepFwd1 =14;int manstepFwd1 =0;int maninchFwdBwd =A7;int stepBwd1 =15;int manstepBwd1 =0;int hour3LowLED =5;// Green low range LEDint hour3HighLED =4;//Red high range LEDint ledStormy =8;int ledRain =7;int ledChange =6;int ledFair =2;int ledDry =13;int ledClear =12;int ledThreat =17;int ledNoChange =16;//Testint n =0;int n1 =0;int n2 =0;void setup() { pinMode(ledStormy, OUTPUT); pinMode(ledRain, OUTPUT); pinMode(ledChange, OUTPUT); pinMode(ledFair, OUTPUT); pinMode(ledDry, OUTPUT); pinMode(ledClear, OUTPUT); pinMode(ledThreat, OUTPUT); pinMode(ledNoChange, OUTPUT); pinMode(stepFwd1, INPUT); pinMode(stepBwd1, INPUT); // pinMode(adjustOn, INPUT); pinMode(hourPulse, INPUT); pinMode(hour3LowLED, OUTPUT); pinMode(hour3HighLED, OUTPUT); pinMode(sleep, OUTPUT); // pinMode(settingreadPin, INPUT); // Set the maximum steps per second:stepper.setMaxSpeed(1000); lcd.begin(20,4); // initialize the lcd for 20 chars 4 lines, turn on backlight lcd.backlight(); // backlight on not needed as controlled by 7 MAX2719 lcd.setCursor(0,0); //Start at character 0 on line 0 lcd.print("Barometer A988 3 Hr"); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ lcd.setCursor(0,1); //Start at character 0 on line 0 lcd.print(" Version 20"); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { // Wire.begin(); Serial.begin(9600); delay(2000);lcd.setCursor(0,2); //Start at character 0 on line 0 lcd.print("##### LED TEST #####"); //@@@@@@@@}//#############################################################Serial.println("REBOOT v08");//############################################################ // Initialize the sensor (it is important to get calibration values stored on the device). if (pressure.begin()) Serial.println("BMP180 init success"); else { // Oops, something went wrong, this is usually a connection problem, // see the comments at the top of this sketch for the proper connections. Serial.println("BMP180 init fail\n\n"); while(1); // Pause forever. }// test =1; // test set to 0 off 1 on//LED Testdelay (2000);digitalWrite(ledThreat, HIGH);delay (500);digitalWrite(ledThreat, LOW);digitalWrite(ledNoChange, HIGH);delay (500);digitalWrite(ledNoChange, LOW);digitalWrite(ledClear, HIGH);delay (500);digitalWrite(ledClear, LOW);digitalWrite(ledStormy, HIGH);delay (500);digitalWrite(ledStormy, LOW);digitalWrite(ledRain, HIGH);delay (500);digitalWrite(ledRain, LOW);digitalWrite(ledChange, HIGH);delay (500);digitalWrite(ledChange, LOW);digitalWrite(ledFair, HIGH);delay (500);digitalWrite(ledFair, LOW);digitalWrite(ledDry, HIGH);delay (500);digitalWrite(ledDry, LOW);digitalWrite(hour3HighLED, HIGH);delay (500);digitalWrite(hour3HighLED, LOW);digitalWrite(hour3LowLED, HIGH);delay (500);digitalWrite(hour3LowLED, LOW); lcd.clear(); getPressure ();// gets all pressure readings showLCD(); // load display to LCD getForecast(); //get forcast and set LEDs for weather //disable motors on startupdigitalWrite(sleep, HIGH);stepper.disableOutputs(); }void loop() { hourPlus1min =(digitalRead(hourPulse));//checks for pulse at 1min past the hour from the barometer if (hourPlus1min ==HIGH &&hourPulseOff ==0 || initial1 ) { initial1 =0; hourcalc++; if (hourcalc> 4) { hourcalc =0; } //Serial.print("hourcalc ");// serial removed // Serial.println(hourcalc);// serial removed getPressure ();// gets all pressure readings getForecast(); //get forcast and set LEDs for weather showLCD(); // load display to LCD hourPulseOff =1; //turns off } else if (hourPlus1min ==LOW) { hourPulseOff =0; } adjustLock =0; //hold on adjustment// Step forward/back man~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // step hours 1 hour per press manstepFwd1 =digitalRead(stepFwd1); if( manstepFwd1 ==HIGH &&stepoffHour ==0 ) { stepoffHour =1; stephourmanFwd(); } manstepFwd1 =digitalRead(stepFwd1);if( manstepFwd1 ==LOW ) { stepoffHour =0; } // step hours 1 hour per press manstepBwd1 =digitalRead(stepBwd1); if( manstepBwd1 ==HIGH &&stepoffHour ==0 ) { stepoffHour =1; stephourmanBwd(); } manstepBwd1 =digitalRead(stepBwd1); if( manstepBwd1 ==LOW) { stepoffHour =0; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //Inch 3hr forward/backwardsmaninchFwdBwd=analogRead(A7);if (maninchFwdBwd>800 ){// Serial.print(" maninchFwdBwd=");// serial removed // Serial.println(maninchFwdBwd);// serial removed maninchFwd(); } else if (maninchFwdBwd <200) { // Serial.print(" maninchFwdBwd=");// serial removed// Serial.println(maninchFwdBwd);// serial removed maninchBwd(); } //##############################################################################//step 3 hour motorif (hourChange> 0 &&hourChange <20) // 3 hour motor will not step if diff> 40 { stephourFwd(); // Serial.print("Step 3 hour Forward ");// serial removed // Serial.println(hourChange);// serial removed hourChange =0; } else if(hourChange <0 &&hourChange> -20) { stephourBwd(); // Serial.print("Step 3 Hour Backward ");// serial removed // Serial.println(hourChange);// serial removed hourChange =0; } //############################################################################## } //##################################################################################// set Hour Motor backward 1 hour per press ##################################################################################void setHoursbwd(){ // digitalWrite(sleep, LOW);// stepper.enableOutputs(); // step hours 1 hour per press if( digitalRead(adjustOn) ==HIGH &&stepoffHourbkw ==0 ) { // Serial.println("Step 3hr Backward Man"); stepoffHourbkw =1; stephourmanBwd(); }// stepper.disableOutputs();// digitalWrite(sleep, HIGH);if( digitalRead(adjustOn) ==LOW ) { stepoffHourbkw =0; }// End step hours 1 hour per press}//##################################################################################// step hours slow forward const press ##################################################################################void maninchFwd(){ stepper.enableOutputs(); digitalWrite(sleep, LOW); if( digitalRead(adjustOn) ==HIGH ) { // Serial.println("Step 3hr Inch Forward Man");// serial removed stepper.setCurrentPosition(0); // Run the motor forward at 500 steps/second until the motor reaches 8 steps (1 revolution):while (stepper.currentPosition() !=1) { //was 52 52x60 =3120 stepper.setSpeed(10); stepper.runSpeed(); } } digitalWrite(sleep, HIGH);stepper.disableOutputs();}//##################################################################################// step hours slow backward const press ##################################################################################void maninchBwd(){ stepper.enableOutputs(); digitalWrite(sleep, LOW); if( digitalRead(adjustOn) ==HIGH ) { // Serial.println("Step 3hr Inch backward Man");// serial removed stepper.setCurrentPosition(0); // Run the motor forward at 500 steps/second until the motor reaches 8 steps (1 revolution):while (stepper.currentPosition() !=-1) { //was 52 52x60 =3120 stepper.setSpeed(-10); stepper.runSpeed(); } } digitalWrite(sleep, HIGH);stepper.disableOutputs();}//################################################################################## //Hour Motor #####################################################################################################void stephourFwd() // steps hour hand forward 1 hour{ stepper.enableOutputs(); // Serial.println("Step 3 hrs forward auto");// serial removed digitalWrite(sleep, LOW); stepper.setCurrentPosition(0); // Run the motor forward at 500 steps/second until the motor reaches 4096 steps (1 revolution):while (stepper.currentPosition() !=hourChange*160) { //hourDiff gives the nuber of steps to take stepper.setSpeed(400); stepper.runSpeed(); } digitalWrite(sleep, HIGH); stepper.disableOutputs(); }//###############################################################################################################//Hour Motor #####################################################################################################void stephourBwd() // steps hour hand backward 1 hour{ stepper.enableOutputs(); //Serial.println("Step 3hrs backward auto");// serial removed digitalWrite(sleep, LOW); stepper.setCurrentPosition(0);while ( stepper.currentPosition() !=hourChange*160) { stepper.setSpeed(-400); stepper.runSpeed(); }digitalWrite(sleep, HIGH); stepper.disableOutputs(); }//###############################################################################################################//Hour Motor Man Step forward#####################################################################################################void stephourmanFwd() // steps hour hand forward 1 hour{ stepper.enableOutputs(); digitalWrite(sleep, LOW); //Serial.println("Step 3hr forward man");// serial removed stepper.setCurrentPosition(0); // Run the motor forward at 500 steps/second until the motor reaches 4096 steps (1 revolution):while ( stepper.currentPosition() !=160) { stepper.setSpeed(400); stepper.runSpeed(); } digitalWrite(sleep, HIGH); stepper.disableOutputs(); }//###############################################################################################################//Hour Motor Man Step back ward #####################################################################################################void stephourmanBwd() // steps hour hand backward 1 hour{ stepper.enableOutputs(); digitalWrite(sleep, LOW); // Serial.println("Step 3hr backward man");// serial removed stepper.setCurrentPosition(0);while ( stepper.currentPosition() !=-160) { stepper.setSpeed(-400); stepper.runSpeed(); }digitalWrite(sleep, HIGH); stepper.disableOutputs(); }//###############################################################################################################void getPressure ()//get all pressure readings checked every 10 mins eg 0 10 20 etc{ if (checkStop ==0){ // If you want sea-level-compensated pressure, as used in weather reports, // you will need to know the altitude at which your measurements are taken. // We're using a constant called ALTITUDE in this sketch:// Serial.println(); // Serial.print("provided altitude:"); // Serial.print(ALTITUDE,0);// Serial.print(" meters, "); // Serial.print(ALTITUDE*3.28084,0);// Serial.println(" feet"); // If you want to measure altitude, and not pressure, you will instead need // to provide a known baseline pressure. This is shown at the end of the sketch. // You must first get a temperature measurement to perform a pressure reading. // Start a temperature measurement:// If request is successful, the number of ms to wait is returned. // If request is unsuccessful, 0 is returned. status =pressure.startTemperature(); if (status !=0) { // Wait for the measurement to complete:delay(status); // Retrieve the completed temperature measurement:// Note that the measurement is stored in the variable T. // Function returns 1 if successful, 0 if failure. status =pressure.getTemperature(T); if (status !=0) { // Print out the measurement:// Serial.print("temperature:"); // Serial.print(T,2); // Serial.print(" deg C, "); // Serial.print((9.0/5.0)*T+32.0,2); // Serial.println(" deg F"); // Start a pressure measurement:// The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait). // If request is successful, the number of ms to wait is returned. // If request is unsuccessful, 0 is returned. status =pressure.startPressure(3); if (status !=0) { // Wait for the measurement to complete:delay(status); // Retrieve the completed pressure measurement:// Note that the measurement is stored in the variable P. // Note also that the function requires the previous temperature measurement (T). // (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.) // Function returns 1 if successful, 0 if failure. status =pressure.getPressure(P,T); if (status !=0) { // Print out the measurement:// Serial.print("absolute pressure:"); // Serial.print(P,2); // Serial.print(" mb, "); // Serial.print(P*0.0295333727,2); // Serial.println(" inHg"); // The pressure sensor returns abolute pressure, which varies with altitude. // To remove the effects of altitude, use the sealevel function and your current altitude. // This number is commonly used in weather reports. // Parameters:P =absolute pressure in mb, ALTITUDE =current altitude in m. // Result:p0 =sea-level compensated pressure in mb seaPressure =pressure.sealevel(P,ALTITUDE); // we're at 160 meters (Kenley, Surrey UK) // serial removed /* Serial.print("relative (sea-level) pressure:"); Serial.print(seaPressure,2); Serial.print(" mb, "); Serial.print(seaPressure*0.0295333727,2); Serial.println(" inHg"); */ // On the other hand, if you want to determine your altitude from the pressure reading, // use the altitude function along with a baseline pressure (sea-level or other). // Parameters:P =absolute pressure in mb, p0 =baseline pressure in mb. // Result:a =altitude in m. a =pressure.altitude(P,seaPressure); // Serial.print("computed altitude:"); // Serial.print(a,0); // Serial.print(" meters, "); // Serial.print(a*3.28084,0); // Serial.println(" feet"); } else Serial.println("error retrieving pressure measurement\n"); } else Serial.println("error starting pressure measurement\n"); } else Serial.println("error retrieving temperature measurement\n"); } else Serial.println("error starting temperature measurement\n");}//Serial.print("hourscalc "); // Serial.println(hourcalc);if (hourcalc ==0){ hour0 =seaPressure;//was rnd sea pressure currentDisplay =hourDiff; // the last display reading becomes the old reading called currentDisplay hourDiff =hour0 - hour3; // this is the air pressure difference from now to the reading 3 hours ago and wil be displayed onthe 3 hour dial calcCurrentDisp (); // calculates 3 hour Air pressure display }else if (hourcalc ==1){ hour1 =seaPressure; currentDisplay =hourDiff; hourDiff =hour1 - hour4; calcCurrentDisp (); }else if (hourcalc ==2 ){ hour2 =seaPressure; currentDisplay =hourDiff;hourDiff =hour2 - hour0; calcCurrentDisp (); }else if (hourcalc ==3 ){ hour3 =seaPressure; currentDisplay =hourDiff; hourDiff =hour3 - hour1; calcCurrentDisp (); }else if (hourcalc ==4 ){ hour4 =seaPressure; currentDisplay =hourDiff; hourDiff =hour4 - hour2; calcCurrentDisp (); }//show 3 hour pressure scale hi/low LEDsif(hourDiff> 9 || hourDiff <-9) // if 3 hour pressure is outside of extended range both hi and low range leds light{digitalWrite( hour3HighLED, HIGH); digitalWrite( hour3LowLED, HIGH);}else if(hourDiff>=4.80) { digitalWrite( hour3HighLED, HIGH); digitalWrite( hour3LowLED, LOW); } else if (hourDiff <=-4.80) { digitalWrite( hour3LowLED, HIGH); digitalWrite( hour3HighLED, LOW); } else if ( hourDiff <4.80 &&hourDiff>-4.80 ) { digitalWrite( hour3LowLED, LOW); digitalWrite( hour3HighLED, LOW); } // Serial.print("currentDisplay (old) ");// serial removed // Serial.println(currentDisplay);// serial removed// Serial.print("3 hour display to show ");// serial removed// Serial.println(hourDiff);// serial removed//Serial.print("RND seaPressure ");//Serial.println(round(seaPressure));//get pressure change and show change over 1 hour on LCD bottom row pressureNow =seaPressure; if ( pressureNow !=pressurePrevious || initial ) { initial =0; pressureDiff =pressureNow - pressurePrevious; //Print pressure and diff on LCD lcd.setCursor(0,3); if (pressurePrevious ==0.00) { pressurePrevious =pressureNow;// shows previous pressure at startup } if(pressurePrevious<1000) { lcd.print(0); } lcd.print(pressurePrevious);// shows previous pressure until 1hPa change lcd.print("hPa "); // pressurePrevious =pressureNow; lcd.setCursor(12,3); lcd.print(" ");//blank section lcd.setCursor(12,3); lcd.print(pressureDiff); // show rounded pressure reading on display updayes every hour lcd.setCursor(0,2); lcd.print(" "); // show rounded pressure on lcd lcd.setCursor(0,2); if(pressureNow<1000) { lcd.print(0); } lcd.print(round(pressureNow)); } pressureRndPrevious =pressureRndNow; pressurePrevious =pressureNow;//resets pressure change//################################################################################# } //####################################################################// show forecast on LEDs/* Predicting the Weather With the BarometerMore specifically, a barometer with readings in hPa can be interpreted in this manner:If the reading is over 1022 hPa Rising or steady pressure means continued fair weather.Slowly falling pressure means fair weather.Rapidly falling pressure means cloudy and warmer conditions.If it falls between 1009–1022 hPa Rising or steady pressure means present conditions will continue.Slowly falling pressure means little change in the weather.Rapidly falling pressure means that rain is likely, or snow if it is cold enough.If the reading is under (1009 hPaRising or steady pressure indicates clearing and cooler weather.Slowly falling pressure indicates rainRapidly falling pressure indicates a storm is coming.Rising or Fal ling slowlyPressure change of 0.1 to 1 mb in the preceding three hoursRising or FallingPressure change of 1 to 3 mb in the preceding three hoursRising or Falling quicklyPressure change of 3 to 6 mb in the preceding three hoursRising or Falling very rapidlyPressure change of more than 6.0 mb in the preceding three hours */void getForecast(){ //reading is under (1009 hPa //Rising or steady pressure indicates clearing and cooler weather if(seaPressure <1009.00 &&hourDiff>=0 ) { ClearforecastLED();// clear all forecast LEDs before changing digitalWrite( ledChange, HIGH); digitalWrite( ledClear, HIGH); lcd.setCursor(8,2); lcd.print(" "); lcd.setCursor(8,2); lcd.print("Chg Clearing"); } //reading is under (1009 hPa //Slowly falling pressure indicates rain else if(seaPressure <1009.00 &&hourDiff <0 &&hourDiff>=-1.5 ) { ClearforecastLED(); digitalWrite( ledRain, HIGH); digitalWrite( ledThreat, HIGH); lcd.setCursor(8,2); lcd.print(" "); lcd.setCursor(8,2); lcd.print("Rain Threat"); } //reading is under (1009 hPa //Rapidly falling pressure indicates a storm is coming. else if(seaPressure <1009.00 &&hourDiff <-1.5 ) { ClearforecastLED(); digitalWrite( ledStormy, HIGH); digitalWrite( ledThreat, HIGH); lcd.setCursor(8,2); lcd.print(" "); lcd.setCursor(8,2); lcd.print("Storm Threat"); } //1009–1022 hPa //Rising or steady pressure means present conditions will continue. //Slowly falling pressure means little change in the weather. else if(seaPressure>=1009.00 &&seaPressure <=1022.00 &&hourDiff>=-1.5 &&hourDiff <=1.5 ) { ClearforecastLED(); digitalWr ite( ledNoChange, HIGH); digitalWrite( ledFair, HIGH); lcd.setCursor(8,2); lcd.print(" "); lcd.setCursor(8,2); lcd.print("Fair No Chge"); }//1009–1022 hPa //Rising rapidly //Clearing else if(seaPressure>=1009.00 &&seaPressure <=1022.00 &&hourDiff>1.5 )...This file has been truncated, please download it to see its full contents.

回路図


製造プロセス

  1. アネロイドバロメーター
  2. 血圧モニタ
  3. 消火器
  4. 圧力計
  5. Arduino Spybot
  6. FlickMote
  7. 自家製テレビB-Gone
  8. マスタークロック
  9. Arduino + ESPウェザーボックス
  10. Find Me
  11. Arduino Power