
いいえ、これは商用オファーではありません。記事を読んだ後に組み立てることができるシステム コンポーネントのコストです。
少し背景:
しばらく前に私はミツバチを飼うことに決めました、そして彼らは確かに現れました...季節を通して、しかし冬の小屋から出ませんでした。
そして、これは、秋の補完給餌、寒い天候の前の断熱など、彼がすべてを正しく行っているように見えたという事実にもかかわらずです。
巣箱は、10 mm の板で作られた 40 個のフレームを備えた古典的な木製の「ダダン」システムでした。
しかし、その冬は気温の変動により、経験豊富な養蜂家でも例年よりもはるかに多くの養蜂を失いました。
こうして、巣の状態を監視するシステムのアイデアが生まれました。
Habr に関するいくつかの記事を公開し、養蜂家フォーラムでコミュニケーションをとった後、私は単純なものから複雑なものへ進むことにしました。
重量は唯一の議論の余地のないパラメータですが、原則として、既存のシステムは XNUMX つの「参照」ハイブのみを監視します。
何か問題が発生した場合(たとえば、群れの出発、ミツバチの病気)、指標は無関係になります。
そこで、XNUMX つのマイクロコントローラーを使用して XNUMX つの巣箱の重量の変化を一度に監視し、後で他の「良いもの」を追加することにしました。
その結果、18650 バッテリーの XNUMX 回の充電で約 XNUMX か月動作し、XNUMX 日 XNUMX 回統計を送信する自律システムが完成しました。
図がなくても写真だけで再現できるよう、デザインをできるだけ簡素化するように努めました。
動作ロジックは次のとおりです。最初の起動/リセット中に、巣箱の下に取り付けられたセンサーの読み取り値が EEPROM に保存されます。
その後、毎日日没後にシステムが「目覚め」、測定値を読み取り、その日の体重の変化と電源を入れた瞬間からの体重の変化を SMS で送信します。
さらに、バッテリー電圧値が送信され、それが 3.5V に低下すると、充電の必要性について警告が発せられます。これは、3.4V 未満では通信モジュールがオンにならず、重量測定値がすでに「浮遊」しているためです。
「すべてがどのように始まったか覚えていますか。 すべてが初めてのことの繰り返しでした。」

はい、これはまさに元のハードウェアのセットです。最終バージョンまで残ったのはひずみゲージとワイヤだけですが、まず最初に。
実際、ケーブルコイルは必要なく、30mのストレートコイルと同じ価格であることがわかりました。
3 つの SMD LED と XNUMX 箇所の従来の (出力) はんだ付けを分解することを恐れない場合は、行ってください。
したがって、次の機器/材料のセットが必要になります。
- Arduino プロミニ 3V
リニアコンバータのマイクロ回路に注意を払う必要があります - 正確に3.3Vである必要があります - チップ上のKB 33/LB 33/DE A10のマーキング - 私の中国語は何か間違っていて、バッチ全体
店内にあるボードには 5 ボルトのレギュレータと 16MHz の水晶振動子が搭載されていることが判明しました。 - CH340 チップ上の USB-Ttl - 5 ボルトのものも使用できますが、マイクロコントローラーをフラッシュしている間、GSM モジュールが焼けないように Arduino を GSM モジュールから切り離す必要があります。
PL2303チップ搭載のボードは、以下の条件下では動作しません。 Windows 10. - GSM通信モジュール Goouu Tech IOT GA-6-B または AI-THINKER A-6 Mini。
なぜそこで止まったのですか? Neoway M590 (タンバリン、GSM SIM800L と個別のダンスを必要とする設計者) は、2.8 ボルトの Arduino とさえ調整する必要がある非標準の XNUMX V レベルのロジックを好みませんでした。
さらに、AiThinker のソリューションはエネルギー消費が最小限です (SMS の送信時に 100mA を超える電流は見られませんでした)。 - GSM GPRS 3DBI アンテナ (上の写真 - 9 時の位置に「尾」が付いた長方形のスカーフ)
- 養蜂場の所在地を十分にカバーするオペレーターのスターター パッケージ。
はい、パッケージはまず通常の電話でアクティベートし、入力時に PIN 要求を無効にして、アカウントにチャージする必要があります。
現在、「センサー」、「IoT」などの名前のオプションが多数あり、サブスクリプション料金が若干安くなります。 - デュポンワイヤー 20cm メス-メス - 3 本(ArduinoをUSB-TTLに接続するため)
- 3個HX711 - スケール用 ADC
- 最大 6kg の重量に対応する 50 つのロードセル
- 15 メートルの 4 芯電話ケーブル - 重量モジュールを ARDUINO に接続するため。
- フォトレジスタ GL5528 (これが重要で、暗抵抗が 1 MΩ、明抵抗が 10 ~ 20 kΩ) と 20 つの通常の XNUMX kΩ 抵抗
- 18x18mmの「厚い」両面テープ - Arduinoを通信モジュールに取り付けるためのもの。
- 18650 バッテリー ホルダーと実際にはバッテリー自体は約 2600mAh です。
- 少量のワックスまたはパラフィン (キャンドルタブレット型アロマランプ) - 湿気防止用 HX711
- ひずみゲージのベース用の 25x50x300mm の木製の梁。
- センサーをベースに取り付けるための 4,2x19 mm プレスワッシャー付きの XNUMX 本のタッピングネジ。
バッテリーはラップトップの分解から入手できます - 新しいものより数倍安く、容量は中国の UltraFire よりもはるかに大きくなります - 私は 1500 に対して 450 を手に入れました (火災の場合は 6800 です 😉)
さらに、安定した手、EPSN-25 はんだごて、松脂、POS-60 はんだが必要です。

5年前でさえ、私は銅の先端が付いたソビエトのはんだごてを使用していました(はんだ付けステーションは私には機能しませんでした。テストドライブに持って行き、EPSNで回路を完成させました)。
しかし、その失敗といくつかの中国製の巨大な偽物の後、後者はスパルタと呼ばれるようになりました - その名前と同じくらい厳しいものは中止されました
サーモスタット付き製品の場合。
じゃ、行こう!

まず、GSM モジュールから XNUMX つの LED のはんだを外します (LED が配置されていた場所はオレンジ色の楕円で囲まれています)。
SIM カードは、接触パッドをプリント基板に向けて挿入します。写真では、斜めの角が矢印で示されています。

次に、Arduino ボード上の LED (正方形のチップの左側の楕円形) で同様の手順を実行します。
コームを 1 つの接点にはんだ付けします (XNUMX)。
20kの抵抗を5つ用意し、片側のリード線をねじり、そのねじり部分をピンA2の穴にはんだ付けします。残りのリード線はArduinoのRAWとGNDにあります(XNUMX)、
フォトレジスタの脚を 10mm に短くし、基板の GND ピンと D2 ピンにはんだ付けします (3)。
次に、青い電気テープの両面テープを通信モジュールの SIM カード ホルダーに貼り付けます。その上に、Arduino の赤い (銀色) ボタンがこちらを向いて SIM カードの上にあります。
電源と通信モジュールのコンデンサ (4) を RAW arduino ピンにはんだ付けします。
実際のところ、通信モジュール自体は電源に 3.4 ~ 4.2 V を必要とし、その PWR 接点は降圧コンバータに接続されているため、リチウムイオンで動作するには、回路のこの部分をバイパスして電圧を供給する必要があります。
逆に、Arduino では、リニアコンバータを通じて電力を供給します。低消費電流では、ドロップアウト電圧降下は 0.1V です。
しかし、HX711 モジュールに安定した電圧を供給することで、モジュールをより低い電圧に変更する必要がなくなります (同時に、この動作の結果としてノイズが増加することもありません)。
次に、ピン PWR-A5、URX-D1、UTX-D4 の間にジャンパー (5) をはんだ付けし、GND-G (6) を接地し、最後に 18650 バッテリー ホルダー (7) から電力を供給し、アンテナ (8) を接続します。
次に、USB-TTL コンバータを使用して、RXD-TXD および TXD-RXD、GND-GND 接点を Dupont ワイヤで ARDUINO (comb 1) に接続します。

上の写真は、デバッグに使用されたシステムの最初のバージョン (XNUMX つのうち) を示しています。
ここで、はんだごてをしばらく休んで、ソフトウェアの部分に移ります。
一連の行動について説明します Windows:
まず、プログラムをダウンロードしてインストール/解凍する必要があります — 現在のバージョンは 1.8.9 ですが、私は 1.6.4 を使用しています
簡単にするために、アーカイブをフォルダー C: arduino - “your_version_number” に解凍します。その中には、フォルダー /dist、ドライバー、サンプル、ハードウェア、Java、lib、ライブラリ、リファレンス、ツール、および arduino 実行可能ファイルが含まれます。 (とりわけ)。
次に、ADC と連携するためのライブラリが必要です。 — 緑色のボタン「クローンまたはダウンロード」 — ZIP をダウンロードします。
コンテンツ (フォルダー HX711-master) は、ディレクトリ C:arduino-“your_version_number”libraries に配置されます。
そしてもちろんドライバーも 同じ github から - 解凍されたアーカイブから、インストールは SETUP ファイルを使用して簡単に起動されます。
OK、プログラムを起動して設定しましょう C:arduino-“your_version_number”arduino

「ツール」項目に移動します - 「Arduino Pro または Pro Mini」ボード、Atmega 328 3.3V 8 MHz プロセッサー、ポート - システム COM1 以外の番号を選択します (USB-TTL アダプターを使用して CH340 ドライバーをインストールした後に表示されます)接続されています)
OK、次のスケッチ (プログラム) をコピーし、Arduino IDE ウィンドウに貼り付けます。
char phone_no[]="+123456789012"; // Your phone number that receive SMS with counry code
#include <avr/sleep.h> // ARDUINO sleep mode library
#include <SoftwareSerial.h> // Sofrware serial library
#include "HX711.h" // HX711 lib. https://github.com/bogde/HX711
#include <EEPROM.h> // EEPROM lib.
HX711 scale0(10, 14);
HX711 scale1(11, 14);
HX711 scale2(12, 14);
#define SENSORCNT 3
HX711 *scale[SENSORCNT];
SoftwareSerial mySerial(5, 4); // Set I/O-port TXD, RXD of GSM-shield
byte pin2sleep=15; // Set powerON/OFF pin
float delta00; // delta weight from start
float delta10;
float delta20;
float delta01; // delta weight from yesterday
float delta11;
float delta21;
float raw00; //raw data from sensors on first start
float raw10;
float raw20;
float raw01; //raw data from sensors on yesterday
float raw11;
float raw21;
float raw02; //actual raw data from sensors
float raw12;
float raw22;
word calibrate0=20880; //calibration factor for each sensor
word calibrate1=20880;
word calibrate2=20880;
word daynum=0; //numbers of day after start
int notsunset=0;
boolean setZero=false;
float readVcc() { // Read battery voltage function
long result1000;
float rvcc;
result1000 = analogRead(A5);
rvcc=result1000;
rvcc=6.6*rvcc/1023;
return rvcc;
}
void setup() { // Setup part run once, at start
pinMode(13, OUTPUT); // Led pin init
pinMode(2, INPUT_PULLUP); // Set pullup voltage
Serial.begin(9600);
mySerial.begin(115200); // Open Software Serial port to work with GSM-shield
pinMode(pin2sleep, OUTPUT);// Itit ON/OFF pin for GSM
digitalWrite(pin2sleep, LOW); // Turn ON modem
delay(16000); // Wait for its boot
scale[0] = &scale0; //init scale
scale[1] = &scale1;
scale[2] = &scale2;
scale0.set_scale();
scale1.set_scale();
scale2.set_scale();
delay(200);
setZero=digitalRead(2);
if (EEPROM.read(500)==EEPROM.read(501) || setZero) // first boot/reset with hiding photoresistor
//if (setZero)
{
raw00=scale0.get_units(16); //read data from scales
raw10=scale1.get_units(16);
raw20=scale2.get_units(16);
EEPROM.put(500, raw00); //write data to eeprom
EEPROM.put(504, raw10);
EEPROM.put(508, raw20);
for (int i = 0; i <= 24; i++) { //blinking LED13 on reset/first boot
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}
}
else {
EEPROM.get(500, raw00); // read data from eeprom after battery change
EEPROM.get(504, raw10);
EEPROM.get(508, raw20);
digitalWrite(13, HIGH); // turn on LED 13 on 12sec.
delay(12000);
digitalWrite(13, LOW);
}
delay(200); // Test SMS at initial boot
//
mySerial.println("AT+CMGF=1"); // Send SMS part
delay(2000);
mySerial.print("AT+CMGS="");
mySerial.print(phone_no);
mySerial.write(0x22);
mySerial.write(0x0D); // hex equivalent of Carraige return
mySerial.write(0x0A); // hex equivalent of newline
delay(2000);
mySerial.println("INITIAL BOOT OK");
mySerial.print("V Bat= ");
mySerial.println(readVcc());
if (readVcc()<3.5) {mySerial.print("!!! CHARGE BATTERY !!!");}
delay(500);
mySerial.println (char(26));//the ASCII code of the ctrl+z is 26
delay(3000);
//
raw02=raw00;
raw12=raw10;
raw22=raw20;
//scale0.power_down(); //power down all scales
//scale1.power_down();
//scale2.power_down();
}
void loop() {
attachInterrupt(0, NULL , RISING); // Interrupt on high lewel
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //Set ARDUINO sleep mode
digitalWrite(pin2sleep, HIGH); // Turn OFF GSM-shield
delay(2200);
digitalWrite(pin2sleep, LOW); // Turn OFF GSM-shield
delay(2200);
digitalWrite(pin2sleep, HIGH);
digitalWrite(13, LOW);
scale0.power_down(); //power down all scales
scale1.power_down();
scale2.power_down();
delay(90000);
sleep_mode(); // Go to sleep
detachInterrupt(digitalPinToInterrupt(0)); // turn off external interrupt
notsunset=0;
for (int i=0; i <= 250; i++){
if ( !digitalRead(2) ){ notsunset++; } //is a really sunset now? you shure?
delay(360);
}
if ( notsunset==0 )
{
digitalWrite(13, HIGH);
digitalWrite(pin2sleep, LOW); // Turn-ON GSM-shield
scale0.power_up(); //power up all scales
scale1.power_up();
scale2.power_up();
raw01=raw02;
raw11=raw12;
raw21=raw22;
raw02=scale0.get_units(16); //read data from scales
raw12=scale1.get_units(16);
raw22=scale2.get_units(16);
daynum++;
delta00=(raw02-raw00)/calibrate0; // calculate weight changes
delta01=(raw02-raw01)/calibrate0;
delta10=(raw12-raw10)/calibrate1;
delta11=(raw12-raw11)/calibrate1;
delta20=(raw22-raw20)/calibrate2;
delta21=(raw22-raw21)/calibrate2;
delay(16000);
mySerial.println("AT+CMGF=1"); // Send SMS part
delay(2000);
mySerial.print("AT+CMGS="");
mySerial.print(phone_no);
mySerial.write(0x22);
mySerial.write(0x0D); // hex equivalent of Carraige return
mySerial.write(0x0A); // hex equivalent of newline
delay(2000);
mySerial.print("Turn ");
mySerial.println(daynum);
mySerial.print("Hive1 ");
mySerial.print(delta01);
mySerial.print(" ");
mySerial.println(delta00);
mySerial.print("Hive2 ");
mySerial.print(delta11);
mySerial.print(" ");
mySerial.println(delta10);
mySerial.print("Hive3 ");
mySerial.print(delta21);
mySerial.print(" ");
mySerial.println(delta20);
mySerial.print("V Bat= ");
mySerial.println(readVcc());
if (readVcc()<3.5) {mySerial.print("!!! CHARGE BATTERY !!!");}
delay(500);
mySerial.println (char(26));//the ASCII code of the ctrl+z is 26
delay(3000);
}
}
最初の行では、引用符で囲まれ、charphone_no[]=”+123456789012″; となります。 — 123456789012 の代わりに、SMS の送信先となる国コードを付けた電話番号を入力します。
次に、チェック ボタン (上のスクリーンショットの XNUMX 番の上) を押します。一番下 (画面の XNUMX 番の下) に「コンパイルが完了しました」と表示されていれば、マイクロコントローラーをフラッシュできます。
そこで、USB-TTL を ARDUINO とコンピュータに接続し、充電したバッテリーをホルダーに置きます (通常、新しい Arduino の LED は XNUMX 秒に XNUMX 回点滅し始めます)。
次に、ファームウェアについてです。マイクロコントローラーの赤(銀)ボタンを押すようにトレーニングしています。これは、特定の瞬間に厳密に行う必要があります。
食べる? 「ロード」ボタン (スクリーンショットの XNUMX つの上) をクリックし、インターフェイスの下部にある行 (スクリーンショットの XNUMX つの下) を注意深く見てください。
「コンパイル」の文字が「ダウンロード中」に変わったらすぐに、赤いボタン(リセット)を押します。すべてが正常であれば、USB-TTL アダプターのライトが楽しく点滅し、インターフェイスの下部に「アップロードされました」という文字が表示されます。 」
さて、テスト SMS が電話に届くのを待っている間に、プログラムがどのように機能するかを説明します。

写真はデバッグ スタンドの第 XNUMX バージョンを示しています。
初めて電源を入れると、システムは EEPROM のバイト番号 500 と 501 をチェックします。それらが等しい場合、校正データは記録されず、アルゴリズムはセットアップ セクションに進みます。
オンにしたときにフォトレジスタが (ペンのキャップによって) 影になった場合にも同じことが起こります。リセット モードがアクティブになります。
最初のゼロレベルを修正して重量の変化を測定するだけなので、ロードセルは巣箱の下にすでに設置されているはずです(まだ何も接続していないため、ゼロが来るだけです)。
同時に、Arduino のピン 13 の内蔵 LED が点滅し始めます。
リセットが発生しない場合、LED は 12 秒間点灯します。
この後、「INITIAL BOOT OK」というメッセージとバッテリー電圧を含むテスト SMS が送信されます。
通信モジュールがオフになり、3 分後に Arduino ボードは HX711 ADC ボードをスリープ モードにし、自動的にスリープ状態になります。
この遅延は、動作中の GSM モジュールからの干渉を拾わないようにするために行われました (スイッチをオフにした後、しばらくの間「ビーン」します)。
次に、XNUMX 番目のピンにフォト センサー割り込みがあります (プラス機能が有効になります)。
この場合、トリガ後、フォトレジスタの状態がさらに 3 分間チェックされ、繰り返し/誤ったトリガが排除されます。
典型的なのは、調整を行わない場合、システムは曇天では天文日没後 10 分、晴天では 20 分後に作動することです。
はい、システムの電源を入れるたびにリセットされないように、少なくとも最初の HX711 モジュール (ピン DT-D10、SCK-A0) を接続する必要があります。
次に、ひずみゲージの読み取り値が取得され、前の操作からの重量の変化が計算され (Hive の後の行の最初の数値)、最初のアクティブ化からバッテリー電圧がチェックされ、この情報が SMS として送信されます。

ところで、SMSは届きましたか? おめでとう! 半分まで来ました! 現時点ではバッテリーをホルダーから取り外すことができるため、コンピューターは必要なくなります。
ちなみにミッションコントロールセンターはマヨネーズ瓶に収まるほどコンパクトで、私の場合は名刺サイズの30×60×100mmの半透明の箱がぴったり収まりました。
はい、スリープ状態のシステムは通信モジュールにより約 2.3mA (90%) を消費します。完全にはオフになりませんが、スタンバイ モードになります。

センサーの作成を始めましょう。まず、センサーのレイアウトに触れてみましょう。

これは巣の平面図です。
通常、4 つのセンサーがコーナーに取り付けられます (1,2,3,4、XNUMX、XNUMX、XNUMX)。
別の方法で測定いたします。 というか、XNUMX番目の方法でも。 なぜなら、BroodMinder の人たちはやり方が違うからです。

この設計では、センサーは位置 1 と 2 に取り付けられ、ポイント 3,4 と XNUMX はビーム上にあります。
その場合、センサーは重量の半分しか占めません。
確かに、この方法の精度はそれほど高くありませんが、ミツバチが巣の壁の XNUMX つに沿って蜂の巣の「舌」を使ってすべてのフレームを構築することを想像するのは依然として困難です。
したがって、一般的にセンサーをポイント 5 まで減らすことを提案します。そうすれば、システムをシールドする必要がなく、光の巣箱を使用する場合は、XNUMX つのセンサーで対応する必要があります。

一般に、HX711 の 2 種類のモジュール、1 種類のセンサー、およびそれらを接続するための 0.1 つのオプション (完全なホイートストン ブリッジ (センサー XNUMX 個) と、XNUMX 番目の部分に XNUMXk の抵抗を追加した場合の半分) をテストしました。許容誤差は XNUMX% です。
ただし、後者の方法は望ましくなく、センサー メーカーでも推奨されていないため、前者についてのみ説明します。
したがって、711 つのハイブに XNUMX つのひずみゲージと XNUMX つの HXXNUMX モジュールを取り付けることになります。配線図は次のとおりです。

ADCボードからArduinoまでは5メートルの4線電話ケーブルがあります。 .
一般に、上の写真のように、センサーに8cmの「テール」を残し、ツイストペアを剥がし、すべてをはんだ付けします。
大工仕事を始める前に、ワックス/パラフィンを適切な容器に入れて湯煎で溶かします。
次に、木材を 100 mm の XNUMX つのセクションに分割します。
次に、幅25 mm、深さ7〜8 mmの縦方向の溝に印を付け、弓鋸とノミを使用して余分な部分を除去します。U字型のプロファイルが現れるはずです。
ワックスは温まってますか? — ADC ボードをそこに浸します — これにより、湿気や霧から保護されます。

すべてを木製のベースの上に置きます(腐敗を防ぐために防腐剤で処理する必要があります)。

最後に、センサーをタッピングネジで固定します。

青い電気テープのオプションもありましたが、人道上の理由から、私はそれを提示しません 😉
Arduino 側からは次のことを行います。
電話ケーブルの被覆を剥ぎ、色付きのワイヤーを撚り合わせて、錫メッキを施します。
その後、写真のようにボードの接点にはんだ付けします。

最終チェックとして、センサーを円のセクターに配置し、その上に合板を置き、コントローラーをリセットします(フォトダイオードにペンキャップが付いたバッテリーを置きます)。
同時に、Arduino の LED が点滅し、テスト SMS が到着するはずです。
次に、光電池のキャップを外し、1.5 リットルのペットボトルに水を入れます。
ボトルを合板の上に置き、電源を入れてから数分が経過した場合は、キャップをフォトレジスターに戻します(日没をシミュレートします)。
1 分後、Arduino の LED が点灯し、すべての位置で約 XNUMX kg の重量値を含む SMS を受信するはずです。
おめでとう! システムは無事に組み立てられました!
ここでシステムを強制的に再度動作させると、最初の重み列にはゼロが入ります。
はい、実際の状況では、フォトレジスタを垂直上向きに配置することをお勧めします。
ここで、短いユーザーマニュアルを紹介します。
- 巣箱の後部の壁の下にひずみゲージを取り付けます (前部の壁の下に厚さ約 30 mm の梁/板を置きます)。
- フォトレジスタを遮光し、バッテリーを取り付けます。LED が点滅し、「INITIAL Boot OK」というテキストが記載されたテスト SMS を受信するはずです。
- 蜂を扱う際にワイヤーが邪魔にならないように、中央ユニットを巣箱からできるだけ離れた場所に設置してください。
毎晩、日没後に、その日の体重の変化と打ち上げの瞬間からの体重の変化を示す SMS が届きます。
バッテリー電圧が 3.5V に達すると、SMS は「!!!」という行で終了します。 バッテリーを充電してください!!!」
2600mAhバッテリーXNUMX個での動作時間は約XNUMXか月です。
電池を交換すると、毎日の巣箱の重量の変化は記憶されなくなります。
アップデートの警告!
信号が弱い場合、GSMモジュールは電力を増加させ、システムの再起動につながります。
これは「フィールド」テスト中に発見されました (GSM シールドのユーザーがこのような問題を報告しない理由は不明です)。
今、私は新しい計画を準備しています:

検証が成功すると、この出版物は更新されます。
電気養蜂家のアンドレイ。
出所: habr.com
