30 美元的短信監控三個蜂箱的重量

30 美元的短信監控三個蜂箱的重量

不,這不是商業報價,這是您閱讀文章後可以組裝的系統組件的成本。

一點背景:

前段時間我決定養蜜蜂,它們確實出現了……整個季節,但沒有離開冬天。
儘管事實上他似乎做的一切都是正確的 - 秋季輔食,在寒冷之前變暖。
蜂巢是一個經典的木製系統“Dadan”,用於 10 毫米木板上的 40 個框架。
但那個冬天,由於溫度波動,即使是經驗豐富的養蜂人,損失也比平時多得多。

蜂巢健康監測系統的想法就是這樣產生的。
在 Habr 上發表了幾篇文章並在養蜂人論壇上進行了討論後,我決定從簡單到復雜。
重量是唯一無可爭辯的參數,但通常,現有系統僅監控一個“參考”蜂巢。
如果出現問題(例如,蜂群離開、蜜蜂疾病),那麼指標就變得無關緊要了。

因此,決定用一個微控制器同時監測三個蜂巢的重量變化,然後添加其他“好東西”。
結果,我們得到了一個自主系統,在一次 18650 電池充電和每天發送一次統計數據的情況下,運行時間約為一個月。
我試圖盡可能地簡化設計,這樣即使沒有圖表,也可以從一張照片中重複設計。

操作邏輯如下:在第一次啟動/重置時,安裝在蜂箱下的傳感器的讀數存儲在EEPROM中。
此外,每天日落之後,系統都會“醒來”,讀取讀數並發送短信,其中包含每天和開機時的重量變化。
另外,傳輸電池電壓值,當下降到3.5V時,發出需要充電的警告,因為低於3.4V通信模塊不開啟,重量讀數已經“浮動”離開”。

“你還記得這一切是如何開始的嗎? 一切都是第一次又一次。
30 美元的短信監控三個蜂箱的重量
是的,原來就是這樣一套“鐵”,雖然只有應變片和電線倖存到最終版本,但首先是第一件事。
其實cable bay用不著,原來和30m straight一樣的價錢而已。

如果您不怕拆卸 3 個 smd-LED 和半百點常規(輸出)焊接,那就去吧!

所以,我們需要以下一套設備/材料:

  1. Arduino 專業迷你 3V
    你應該注意線性轉換器芯片 - 它應該正好是 3.3V - 在標記 KB 33 / LB 33 / DE A10 的芯片上 - 中國人把我搞砸了,整批
    商店裡的電路板原來是 5 伏穩壓器和 16MHz 的石英。
  2. CH340 芯片上的 USB-Ttl - 甚至 5 伏也是可能的,但是在微控制器的固件期間,Arduino 將需要與 GSM 模塊斷開連接,以免燒毀後者。
    基於 PL2303 芯片的開發板無法在 Windows 10 下運行。
  3. GSM 通訊模塊 Goouu Tech IOT GA-6-B 或 AI-THINKER A-6 Mini。
    你為什麼停在那裡? Neoway M590 - 需要與手鼓單獨跳舞的構造器,GSM SIM800L - 不喜歡非標準的 2.8V 邏輯電平,即使與三伏 arduino 也需要協調。
    此外,AiThinker 的解決方案具有極小的功耗(發送短信時,我沒有看到超過 100mA 的電流)。
  4. 天線 GSM GPRS 3DBI(在上圖中 - 一條帶“尾巴”的矩形圍巾,位於 9 點鐘位置)
  5. 操作員的入門包,在您的養蜂場位置具有良好的覆蓋範圍。
    是的,必須先在普通電話中激活套餐,在入口處禁用 PIN REQUEST,然後為帳戶充值。
    現在有很多選項,名稱如“傳感器”、“物聯網”——它們的月費略低。
  6. 杜邦線 20cm 母-母 — 3 件。 (用於將 Arduino 連接到 USB-TTL)
  7. 3 個HX711 - 用於秤的 ADC
  8. 6 個稱重傳感器,重量可達 50 公斤
  9. 15 米的 4 線電話線 - 連接配重模塊和 ARDUINO。
  10. 光敏電阻GL5528(重要的就是這個,暗阻1MΩ,光阻10-20kΩ)和兩個常規20k電阻
  11. 一塊雙面“厚”膠帶 18x18mm - 用於將 arduino 連接到通信模塊。
  12. 18650 電池座,實際上是電池本身 ~ 2600mAh。
  13. 少許蠟或石蠟(香薰蠟燭片)- 用於防潮 HX711
  14. 一塊 25x50x300mm 的木樑用於應變片的底座。
  15. 一打帶壓力墊圈的自攻螺釘 4,2x19 毫米,用於將傳感器連接到底座。

電池可以從拆解的筆記本電腦中取出 - 比新電池便宜很多倍,而且容量將比中國 UltraFire 的容量大得多 - 我得到 1500 對 450(這是火 6800 😉

此外,您還需要不彎曲的手、EPSN-25 烙鐵、松香和 POS-60 焊料。

30 美元的短信監控三個蜂箱的重量

5 年前,我使用了帶銅針的蘇聯烙鐵(焊台對我不起作用——我拿它試駕,並用 EPSN 完成了電路)。
但在失敗和幾棵中國巨大的假 (d) 樹之後,後者的名字叫斯巴達——一個和名字一樣刺耳的東西,停止了
在帶有恆溫器的產品上。

所以我們走吧!

30 美元的短信監控三個蜂箱的重量

首先,我們從 GSM 模塊上拆下兩個 LED(它們被圈成橙色橢圓的地方)
我們將帶有接觸墊的SIM卡插入印刷電路板,照片中的斜角以箭頭表示。

30 美元的短信監控三個蜂箱的重量

然後我們對 Arduino 板上的 LED(方形芯片左側的橢圓形)執行類似的程序,
我們將梳子焊接到四個觸點 (1) 中,
我們取兩個 20k 電阻,將導線擰到一側,將導線焊接到觸點 A5 的孔中,其餘導線在 arduino (2) 的 RAW 和 GND 中,
我們將光敏電阻的支腳縮短至 10mm,並將其焊接到電路板 (2) 的 GND 和 D3 引腳。

現在是雙面膠帶藍色電工膠帶的時候了——我們把它粘在通信模塊 SIM 卡的支架上,在上面——arduino——紅色(銀色)按鈕正對著我們,位於SIM 卡。

我們焊接 power: plus 從通信模塊 (4) 的電容器到 RAW arduino 引腳。
事實上,通信模塊本身需要 3.4-4.2V 的電源,其 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 觸點與杜邦線連接到 ARDUINO(組合 1):

30 美元的短信監控三個蜂箱的重量

上面的照片顯示了用於調試的系統的第一個版本(三個版本中的一個)。

現在我們暫時離開電烙鐵,轉到軟件部分。
我將描述 Windows 的操作順序:
首先,您需要下載並安裝/解壓程序 Arduino IDE - 當前版本是 1.8.9,但我使用的是 1.6.4

為簡單起見,我們將存檔解壓到 C: arduino-"your_version number" 文件夾中,裡面有 /dist、drivers、examples、hardware、java、lib、libraries、reference、tools 文件夾,以及 arduino 可執行文件(除其他外)。

現在我們需要一個庫來使用 ADC HX711 - 綠色按鈕“克隆或下載” - 下載 ZIP。
內容(文件夾HX711-master)放在C:arduino-"your_version_number"libraries目錄下

當然,驅動程序 USB轉TTL 來自同一個 github - 來自解壓縮的存檔,安裝僅由 SETUP 文件啟動。

好的,運行並配置程序 C:arduino-"your_version number" arduino

30 美元的短信監控三個蜂箱的重量

我們轉到“工具”項-選擇“Arduino Pro 或 Pro Mini”板,Atmega 328 3.3V 8 MHz 處理器,端口-系統 COM1 以外的數字(它在安裝帶有 USB-TTL 的 CH340 驅動程序後出現適配器連接)

好的,複製以下草圖(程序)並將其粘貼到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);

  }

}

在第一行,在引號中 char phone_no[]="+123456789012"; - 而不是 123456789012 我們將我們的電話號碼與 SMS 將發送到的國家代碼放在一起。

現在我們按下檢查按鈕(在上面的屏幕截圖中的第一個上方) - 如果低於(在屏幕上的三個下方)“編譯完成” - 然後我們可以刷新微控制器。

因此,USB-TTL 連接到 ARDUINO 和一台計算機,我們將充電電池放入支架中(通常在新的 Arduino 上,LED 開始以每秒一次的頻率閃爍)。

現在是固件 - 我們正在訓練按下微控制器的紅色(銀色)按鈕 - 這需要在特定時刻嚴格執行!!!
吃? 單擊“上傳”按鈕(屏幕截圖中的兩個上方),並仔細查看界面底部的行(屏幕中的三個下方)。
一旦“編譯”字樣被“加載”取代 - 按下紅色按鈕(重置) - 如果一切正常 - USB-TTL 適配器上的燈愉快地閃爍,界面底部的字樣“已加載” “

現在,在我們等待測試短信到達手機時,我將告訴您該程序的工作原理:

30 美元的短信監控三個蜂箱的重量

在照片中-調試台的第二個版本。

首次開機時,系統會檢查EEPROM的字節數500和501,如果相等,則不寫入校準數據,算法繼續進行設置部分。
如果在打開時光敏電阻被遮蔽(用筆帽),也會發生同樣的事情——重置模式被激活。

稱重傳感器應該已經安裝在蜂箱下方,因為我們只是將初始水平固定為零,然後測量重量的變化(現在它只會變成零,因為我們還沒有連接任何東西)。
同時,Arduino 上 13 腳內置的 LED 會閃爍。
如果未發生重置,則 LED 亮起 12 秒。
之後,將發送一條測試短信,其中包含消息“INITIAL BOOT OK”和電池電壓。
通信模塊關閉,3 分鐘後Arduino 板將HX711 ADC 板置於休眠模式並自行休眠。
這樣的延遲是為了不捕獲正在工作的 GSM 模塊的拾音器(在將其關閉後,它會“phonites”一段時間)。

接下來,我們在第二個引腳上有一個光電傳感器中斷(通過上拉功能啟用正上拉)。
同時,再觸發 3 分鐘後,檢查光敏電阻的狀態 - 排除重複/誤報。
值得注意的是,在沒有任何調整的情況下,該系統在多雲天氣下在天文日落後 10 分鐘後工作,在晴朗天氣下工作 20 分鐘後。
是的,這樣系統就不會每次開機都復位,至少要連接第一個HX711模塊(引腳DT-D10,SCK-A0)

然後讀取稱重傳感器的讀數,根據之前的操作(Hive 之後行中的第一個數字)計算重量的變化,並從第一次包含開始,檢查電池電壓,並以以下形式發送此信息短信:

30 美元的短信監控三個蜂箱的重量

順便問一下,你收到短信了嗎? 恭喜! 我們在路中間! 電池仍然可以從支架上取下,我們不再需要電腦了。

順便說一句,任務控制中心非常緊湊,可以放入蛋黃醬罐中,在我的例子中,一個 30x60x100mm 大小的半透明盒子(來自名片)非常適合。

是的,睡眠系統消耗 ~2.3mA - 90% 由於通信模塊 - 它不會完全關閉,而是進入待機模式。

30 美元的短信監控三個蜂箱的重量

我們繼續製造傳感器,首先,讓我們談談傳感器的佈局:

30 美元的短信監控三個蜂箱的重量

這是蜂巢的平面圖 - 頂視圖。

傳統上,4 個傳感器安裝在角落 (1,2,3,4)

我們將以不同的方式衡量。 或者更確切地說,甚至是第三種方式。 因為 BroodMinder 的人做的不同:

30 美元的短信監控三個蜂箱的重量

在此設計中,傳感器安裝在位置 1 和 2,點 3,4 和 XNUMX 位於橫樑上。
那麼傳感器只佔重量的一半。
是的,這種方法的準確性較低,但仍然很難想像蜜蜂會沿著蜂巢的一面牆壁用蜂巢的“舌頭”建造所有的框架。

因此,我建議通常將傳感器減少到第 5 點——這樣就不需要屏蔽系統,並且在使用光蜂巢時,您完全可以使用一個傳感器。

30 美元的短信監控三個蜂箱的重量

通常,在 HX711 上測試了兩種類型的模塊、兩種類型的傳感器和兩種連接選項 - 一個完整的惠斯通電橋(2 個傳感器)和一個半橋,當第二部分補充 1k 電阻時公差為 0.1%。
但是後一種方法是不可取的,甚至傳感器製造商也不推薦,所以我只描述第一種。

所以,在一個蜂巢上我們將安裝兩個稱重傳感器和一個HX711模塊,接線圖如下:

30 美元的短信監控三個蜂箱的重量

從 ADC 板到 arduino 有 5 米長的 4 芯電話線 - 我們記得蜜蜂不喜歡蜂巢中的 GSM 設備.

一般來說,我們在傳感器上留下每個 8 厘米的“尾巴”,清潔雙絞線並拆焊所有東西,如上圖所示。

在開始木工之前,將蠟/石蠟放入合適的容器中,使其在水浴中融化。

現在我們把木材分成三段,每段 100 毫米

接下來,我們標記一個 25 毫米寬、7-8 毫米深的縱向凹槽,使用鋼鋸和鑿子去除多餘部分 - 應該出現 U 形輪廓。

蠟加熱了嗎? - 我們將 ADC 板浸入其中 - 這將保護它們免受濕氣/霧氣的影響:

30 美元的短信監控三個蜂箱的重量

我們把它全部放在一個木製底座上(有必要用防腐劑處理它以防腐爛):

30 美元的短信監控三個蜂箱的重量

最後,我們用自攻螺絲固定傳感器:

30 美元的短信監控三個蜂箱的重量

藍色電工膠帶還有另一種選擇,但出於人道原因,我沒有提出它😉

在 Arduino 端,執行以下操作:

我們清理電話線,將彩色電線絞在一起,玩惡作劇。

之後,如圖所示焊接到電路板的觸點:

30 美元的短信監控三個蜂箱的重量

就是這樣,現在進行最後的檢查,我們將傳感器放在圓圈的各個部分,頂部 - 一塊膠合板,重置控制器(我們將帶筆帽的電池放在光電二極管上)。

同時,arduino 上的 LED 應該閃爍,並且應該會收到一條測試短信。

然後我們從光電管上取下蓋子,然後將水收集在一個 1.5 升的塑料瓶中。
我們將瓶子放在膠合板上,如果從打開開始已經過了幾分鐘,我們將蓋子放迴光敏電阻上(模擬日落)。

三分鐘後,arduino 上的 LED 燈會亮起,您應該會收到一條短信,重量值 \u1b\uXNUMXbo 在所有位置都約為 XNUMXkg。

恭喜! 系統組裝成功!

如果我們現在強制系統再次工作,那麼權重的第一列中將獲得零。

是的,在實際條件下,希望將光敏電阻垂直向上放置。

現在我將給出一個簡短的使用手冊:

  1. 在蜂箱的後壁下安裝稱重傳感器(用梁/板代替 ~ 30 毫米厚的前板)
  2. 遮住光敏電阻並將電池放入 - LED 應該閃爍,測試短信將附帶文本“INITIAL BOOT OK”
  3. 將中央塊放置在距蜂箱最遠的位置,以便在與蜜蜂一起工作時電線不會干擾。
    每天晚上,日落之後,SMS 都會隨著每天和自發布以來的重量變化而變化。
    當電池電壓達到 3.5V 時,短信將以“!!! 給電池充電!!!”
    一塊容量為2600mAh的電池的工作時間約為一個月。
    如果更換電池,蜂箱每天的重量變化就不會被記住。

接下來是什麼?

  1. 弄清楚如何在 github 的項目中安排所有這些
  2. 在 Palivoda 系統的蜂箱中擁有 3 個蜂群(或在人類中有角)
  3. 添加“包子”——測量濕度、溫度,最重要的是——分析蜜蜂的嗡嗡聲。

暫時就這些,您真誠的,電動養蜂人安德烈

來源: www.habr.com

添加評論