不,這不是商業報價,這是您閱讀文章後可以組裝的系統組件的成本。
一點背景:
前段時間我決定養蜜蜂,它們確實出現了……整個季節,但沒有離開冬天。
儘管事實上他似乎做的一切都是正確的 - 秋季輔食,在寒冷之前變暖。
蜂巢是一個經典的木製系統“Dadan”,用於 10 毫米木板上的 40 個框架。
但那個冬天,由於溫度波動,即使是經驗豐富的養蜂人,損失也比平時多得多。
蜂巢健康監測系統的想法就是這樣產生的。
在 Habr 上發表了幾篇文章並在養蜂人論壇上進行了討論後,我決定從簡單到復雜。
重量是唯一無可爭辯的參數,但通常,現有系統僅監控一個“參考”蜂巢。
如果出現問題(例如,蜂群離開、蜜蜂疾病),那麼指標就變得無關緊要了。
因此,決定用一個微控制器同時監測三個蜂巢的重量變化,然後添加其他“好東西”。
結果,我們得到了一個自主系統,在一次 18650 電池充電和每天發送一次統計數據的情況下,運行時間約為一個月。
我試圖盡可能地簡化設計,這樣即使沒有圖表,也可以從一張照片中重複設計。
操作邏輯如下:在第一次啟動/重置時,安裝在蜂箱下的傳感器的讀數存儲在EEPROM中。
此外,每天日落之後,系統都會“醒來”,讀取讀數並發送短信,其中包含每天和開機時的重量變化。
另外,傳輸電池電壓值,當下降到3.5V時,發出需要充電的警告,因為低於3.4V通信模塊不開啟,重量讀數已經“浮動”離開”。
“你還記得這一切是如何開始的嗎? 一切都是第一次又一次。
是的,原來就是這樣一套“鐵”,雖然只有應變片和電線倖存到最終版本,但首先是第一件事。
其實cable bay用不著,原來和30m straight一樣的價錢而已。
如果您不怕拆卸 3 個 smd-LED 和半百點常規(輸出)焊接,那就去吧!
所以,我們需要以下一套設備/材料:
- Arduino 專業迷你 3V
你應該注意線性轉換器芯片 - 它應該正好是 3.3V - 在標記 KB 33 / LB 33 / DE A10 的芯片上 - 中國人把我搞砸了,整批
商店裡的電路板原來是 5 伏穩壓器和 16MHz 的石英。 - CH340 芯片上的 USB-Ttl - 甚至 5 伏也是可能的,但是在微控制器的固件期間,Arduino 將需要與 GSM 模塊斷開連接,以免燒毀後者。
基於 PL2303 芯片的開發板無法在 Windows 10 下運行。 - GSM 通訊模塊 Goouu Tech IOT GA-6-B 或 AI-THINKER A-6 Mini。
你為什麼停在那裡? Neoway M590 - 需要與手鼓單獨跳舞的構造器,GSM SIM800L - 不喜歡非標準的 2.8V 邏輯電平,即使與三伏 arduino 也需要協調。
此外,AiThinker 的解決方案具有極小的功耗(發送短信時,我沒有看到超過 100mA 的電流)。 - 天線 GSM GPRS 3DBI(在上圖中 - 一條帶“尾巴”的矩形圍巾,位於 9 點鐘位置)
- 操作員的入門包,在您的養蜂場位置具有良好的覆蓋範圍。
是的,必須先在普通電話中激活套餐,在入口處禁用 PIN REQUEST,然後為帳戶充值。
現在有很多選項,名稱如“傳感器”、“物聯網”——它們的月費略低。 - 杜邦線 20cm 母-母 — 3 件。 (用於將 Arduino 連接到 USB-TTL)
- 3 個HX711 - 用於秤的 ADC
- 6 個稱重傳感器,重量可達 50 公斤
- 15 米的 4 線電話線 - 連接配重模塊和 ARDUINO。
- 光敏電阻GL5528(重要的就是這個,暗阻1MΩ,光阻10-20kΩ)和兩個常規20k電阻
- 一塊雙面“厚”膠帶 18x18mm - 用於將 arduino 連接到通信模塊。
- 18650 電池座,實際上是電池本身 ~ 2600mAh。
- 少許蠟或石蠟(香薰蠟燭片)- 用於防潮 HX711
- 一塊 25x50x300mm 的木樑用於應變片的底座。
- 一打帶壓力墊圈的自攻螺釘 4,2x19 毫米,用於將傳感器連接到底座。
電池可以從拆解的筆記本電腦中取出 - 比新電池便宜很多倍,而且容量將比中國 UltraFire 的容量大得多 - 我得到 1500 對 450(這是火 6800 😉
此外,您還需要不彎曲的手、EPSN-25 烙鐵、松香和 POS-60 焊料。
5 年前,我使用了帶銅針的蘇聯烙鐵(焊台對我不起作用——我拿它試駕,並用 EPSN 完成了電路)。
但在失敗和幾棵中國巨大的假 (d) 樹之後,後者的名字叫斯巴達——一個和名字一樣刺耳的東西,停止了
在帶有恆溫器的產品上。
所以我們走吧!
首先,我們從 GSM 模塊上拆下兩個 LED(它們被圈成橙色橢圓的地方)
我們將帶有接觸墊的SIM卡插入印刷電路板,照片中的斜角以箭頭表示。
然後我們對 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):
上面的照片顯示了用於調試的系統的第一個版本(三個版本中的一個)。
現在我們暫時離開電烙鐵,轉到軟件部分。
我將描述 Windows 的操作順序:
首先,您需要下載並安裝/解壓程序
為簡單起見,我們將存檔解壓到 C: arduino-"your_version number" 文件夾中,裡面有 /dist、drivers、examples、hardware、java、lib、libraries、reference、tools 文件夾,以及 arduino 可執行文件(除其他外)。
現在我們需要一個庫來使用 ADC
內容(文件夾HX711-master)放在C:arduino-"your_version_number"libraries目錄下
當然,驅動程序
好的,運行並配置程序 C:arduino-"your_version number" arduino
我們轉到“工具”項-選擇“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 適配器上的燈愉快地閃爍,界面底部的字樣“已加載” “
現在,在我們等待測試短信到達手機時,我將告訴您該程序的工作原理:
在照片中-調試台的第二個版本。
首次開機時,系統會檢查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 之後行中的第一個數字)計算重量的變化,並從第一次包含開始,檢查電池電壓,並以以下形式發送此信息短信:
順便問一下,你收到短信了嗎? 恭喜! 我們在路中間! 電池仍然可以從支架上取下,我們不再需要電腦了。
順便說一句,任務控制中心非常緊湊,可以放入蛋黃醬罐中,在我的例子中,一個 30x60x100mm 大小的半透明盒子(來自名片)非常適合。
是的,睡眠系統消耗 ~2.3mA - 90% 由於通信模塊 - 它不會完全關閉,而是進入待機模式。
我們繼續製造傳感器,首先,讓我們談談傳感器的佈局:
這是蜂巢的平面圖 - 頂視圖。
傳統上,4 個傳感器安裝在角落 (1,2,3,4)
我們將以不同的方式衡量。 或者更確切地說,甚至是第三種方式。 因為 BroodMinder 的人做的不同:
在此設計中,傳感器安裝在位置 1 和 2,點 3,4 和 XNUMX 位於橫樑上。
那麼傳感器只佔重量的一半。
是的,這種方法的準確性較低,但仍然很難想像蜜蜂會沿著蜂巢的一面牆壁用蜂巢的“舌頭”建造所有的框架。
因此,我建議通常將傳感器減少到第 5 點——這樣就不需要屏蔽系統,並且在使用光蜂巢時,您完全可以使用一個傳感器。
通常,在 HX711 上測試了兩種類型的模塊、兩種類型的傳感器和兩種連接選項 - 一個完整的惠斯通電橋(2 個傳感器)和一個半橋,當第二部分補充 1k 電阻時公差為 0.1%。
但是後一種方法是不可取的,甚至傳感器製造商也不推薦,所以我只描述第一種。
所以,在一個蜂巢上我們將安裝兩個稱重傳感器和一個HX711模塊,接線圖如下:
從 ADC 板到 arduino 有 5 米長的 4 芯電話線 -
一般來說,我們在傳感器上留下每個 8 厘米的“尾巴”,清潔雙絞線並拆焊所有東西,如上圖所示。
在開始木工之前,將蠟/石蠟放入合適的容器中,使其在水浴中融化。
現在我們把木材分成三段,每段 100 毫米
接下來,我們標記一個 25 毫米寬、7-8 毫米深的縱向凹槽,使用鋼鋸和鑿子去除多餘部分 - 應該出現 U 形輪廓。
蠟加熱了嗎? - 我們將 ADC 板浸入其中 - 這將保護它們免受濕氣/霧氣的影響:
我們把它全部放在一個木製底座上(有必要用防腐劑處理它以防腐爛):
最後,我們用自攻螺絲固定傳感器:
藍色電工膠帶還有另一種選擇,但出於人道原因,我沒有提出它😉
在 Arduino 端,執行以下操作:
我們清理電話線,將彩色電線絞在一起,玩惡作劇。
之後,如圖所示焊接到電路板的觸點:
就是這樣,現在進行最後的檢查,我們將傳感器放在圓圈的各個部分,頂部 - 一塊膠合板,重置控制器(我們將帶筆帽的電池放在光電二極管上)。
同時,arduino 上的 LED 應該閃爍,並且應該會收到一條測試短信。
然後我們從光電管上取下蓋子,然後將水收集在一個 1.5 升的塑料瓶中。
我們將瓶子放在膠合板上,如果從打開開始已經過了幾分鐘,我們將蓋子放迴光敏電阻上(模擬日落)。
三分鐘後,arduino 上的 LED 燈會亮起,您應該會收到一條短信,重量值 \u1b\uXNUMXbo 在所有位置都約為 XNUMXkg。
恭喜! 系統組裝成功!
如果我們現在強制系統再次工作,那麼權重的第一列中將獲得零。
是的,在實際條件下,希望將光敏電阻垂直向上放置。
現在我將給出一個簡短的使用手冊:
- 在蜂箱的後壁下安裝稱重傳感器(用梁/板代替 ~ 30 毫米厚的前板)
- 遮住光敏電阻並將電池放入 - LED 應該閃爍,測試短信將附帶文本“INITIAL BOOT OK”
- 將中央塊放置在距蜂箱最遠的位置,以便在與蜜蜂一起工作時電線不會干擾。
每天晚上,日落之後,SMS 都會隨著每天和自發布以來的重量變化而變化。
當電池電壓達到 3.5V 時,短信將以“!!! 給電池充電!!!”
一塊容量為2600mAh的電池的工作時間約為一個月。
如果更換電池,蜂箱每天的重量變化就不會被記住。
接下來是什麼?
- 弄清楚如何在 github 的項目中安排所有這些
- 在 Palivoda 系統的蜂箱中擁有 3 個蜂群(或在人類中有角)
- 添加“包子”——測量濕度、溫度,最重要的是——分析蜜蜂的嗡嗡聲。
暫時就這些,您真誠的,電動養蜂人安德烈
來源: www.habr.com