SMS 监控三个蜂箱的重量仅需 30 美元

SMS 监控三个蜂箱的重量仅需 30 美元

不,这不是商业报价,这是您在阅读本文后可以组装的系统组件的成本。

一点背景:

前一段时间,我决定养蜜蜂,它们确实出现了……整个季节,但没有离开冬天的小屋。
尽管事实上他似乎做的一切都是正确的——秋季添加辅食、寒冷天气前的保温。
蜂箱是一个经典的木制“Dadan”系统,有 10 个由 40 毫米厚的木板制成的框架。
但那个冬天,由于气温波动,即使是经验丰富的养蜂人,损失也比平时多得多。

这就是监控蜂巢状况的系统的想法的由来。
在发表了几篇关于 Habr 的文章并在养蜂人论坛上进行交流后,我决定从简单到复杂。
重量是唯一无可争议的参数,但通常,现有系统仅监控一个“参考”蜂巢。
如果出现问题(例如,蜂群离开、蜜蜂疾病),那么这些指标就变得无关紧要。

因此,决定使用一个微控制器同时监控三个蜂箱的重量变化,然后再添加其他“好东西”。
结果是一个自主系统,18650 电池充电一次,运行时间约为一个月,每天发送一次统计数据。
我试图尽可能地简化设计,这样即使没有图表,仅通过照片也可以重复它。

操作逻辑如下:在第一次启动/重置期间,安装在蜂箱下的传感器的读数存储在EEPROM中。
然后,每天日落后,系统“醒来”,读取读数并发送一条短信,其中包含当天以及从开机那一刻起的重量变化。
此外,还会传输电池电压值,当电压降至3.5V时,会发出需要充电的警告,因为低于3.4V,通信模块不会打开,重量读数已经“飘走”。

“你还记得这一切是如何开始的吗? 一切都是第一次。”
SMS 监控三个蜂箱的重量仅需 30 美元
是的,这正是最初的一套硬件,虽然只有应变计和电线保留到最终版本,但首先是第一件事。
事实上,你不需要电缆线圈,它只是和 30m 直管一样的价格。

如果您不怕拆解 3 个 SMD LED 和半百点常规(输出)焊接,那就去吧!

因此,我们需要以下设备/材料:

  1. Arduino Pro 迷你 3V
    你应该注意线性转换器微电路 - 它应该正好是3.3V - 芯片上标记为KB 33/LB 33/DE A10 - 我的中文出了问题,整个批次
    商店里的板子原来有 5 伏稳压器和 16 MHz 晶体。
  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 请求,然后为您的帐户充值。
    现在有很多名称为“传感器”、“物联网”的选项 - 它们的订阅费略低。
  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 mm 压垫圈,用于将传感器固定到底座上。

电池可以从笔记本电脑拆解中取出 - 它比新电池便宜几倍,而且容量会比中国的 UltraFire 大得多 - 我得到了 1500 与 450 (这是火 6800 😉

此外,您还需要稳定的手、EPSN-25 烙铁、松香和 POS-60 焊料。

SMS 监控三个蜂箱的重量仅需 30 美元

甚至 5 年前,我还使用过带有铜尖的苏联烙铁(焊台对我来说不起作用 - 我把它进行了一次试驾,并用 EPSN 完成了电路)。
但在它的失败和几个中国可怕的赝品之后,后者被称为斯巴达——一个像它的名字一样严厉的东西,停止了
在带有恒温器的产品上。

那么我们走吧!

SMS 监控三个蜂箱的重量仅需 30 美元

首先,我们从 GSM 模块上拆下两个 LED(它们所在的位置用橙色椭圆圈出)
我们将带有接触垫的SIM卡插入印刷电路板,照片中的斜角用箭头表示。

SMS 监控三个蜂箱的重量仅需 30 美元

然后我们对 Arduino 板上的 LED(方形芯片左侧的椭圆形)执行类似的过程,
将梳子焊接到四个触点 (1),
我们取两个 20k 电阻,将引线扭在一侧,将扭曲焊接到引脚 A5 的孔中,其余引线位于 arduino 的 RAW 和 GND (2),
我们将光敏电阻的引脚缩短至 10mm,并将其焊接到电路板 (2) 的 GND 和 D3 引脚上。

现在是时候使用蓝色电工胶带或双面胶带了 - 我们将其粘在通信模块的 SIM 卡座上,在顶部 - Arduino - 红色(银色)按钮面向我们,位于 SIM 卡上方。

我们将电源:+从通信模块电容器(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):

SMS 监控三个蜂箱的重量仅需 30 美元

上图显示了系统的第一个版本(共三个版本),用于调试。

但现在我们将暂时离开烙铁并转向软件部分。
我将描述 Windows 的操作顺序:
首先,您需要下载并安装/解压程序 Arduino IDE — 当前版本是1.8.9,但我使用1.6.4

为简单起见,我们将存档解压到文件夹 C: arduino - “your_version_number”,里面有文件夹 /dist、驱动程序、示例、硬件、java、lib、库、参考、工具以及 arduino 可执行文件(除其他外)。

现在我们需要一个库来与 ADC 配合使用 HX711 — 绿色按钮“克隆或下载” — 下载 ZIP。
内容(文件夹 HX711-master)放置在目录 C:arduino-“your_version_number”libraries 中

当然还有司机 USB转TTL 来自同一个 github - 从解压的存档中,只需使用 SETUP 文件启动安装即可。

好的,让我们启动并配置程序 C:arduino-“your_version_number”arduino

SMS 监控三个蜂箱的重量仅需 30 美元

进入“Tools”项-选择“Arduino Pro or 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。

现在我们按下检查按钮(上面屏幕截图中的数字一上方) - 如果在底部(屏幕上的数字三下方)“编译已完成” - 那么我们可以刷新微控制器。

因此,USB-TTL 连接到 ARDUINO 和计算机,将充电的电池放入支架中(通常新 Arduino 上的 LED 开始每秒闪烁一次)。

现在对于固件 - 我们正在训练按下微控制器的红色(银色)按钮 - 这需要在某个时刻严格完成!
吃? 单击“加载”按钮(屏幕截图中的两个按钮上方),然后仔细查看界面底部的行(屏幕截图中的三个按钮下方)。
一旦“编译”字样变为“正在下载”,按下红色按钮(重置) - 如果一切正常,USB-TTL适配器上的灯将快乐地闪烁,并且在界面底部显示“已上传”字样”

现在,当我们等待测试短信到达手机时,我将告诉您该程序的工作原理:

SMS 监控三个蜂箱的重量仅需 30 美元

图为第二版调试台。

第一次开机时,系统检查EEPROM的字节号500和501;如果它们相等,则不记录校准数据,算法进入设置部分。
如果在打开时光敏电阻被遮蔽(被笔帽),也会发生同样的情况 - 重置模式被激活。

称重传感器应该已经安装在蜂箱下方,因为我们只需固定初始零水平,然后测量重量的变化(现在零就会出现,因为我们还没有连接任何东西)。
同时,Arduino 上引脚 13 的内置 LED 将开始闪烁。
如果未发生重置,LED 会亮起 12 秒。
此后,将发送一条测试短信,其中包含消息“INITIAL BOOT OK”和电池电压。
通信模块关闭,3 分钟后 Arduino 板将 HX711 ADC 板置于睡眠模式并自行休眠。
进行这种延迟是为了避免受到正在工作的 GSM 模块的干扰(关闭后,它会“发出”一段时间)。

接下来,我们在第二个引脚上有一个光电传感器中断(加号功能已启用)。
在这种情况下,触发后,将再检查光敏电阻的状态 3 分钟 - 以消除重复/错误触发。
典型情况是,在没有任何调整的情况下,系统在多云天气下天文日落后 10 分钟启动,在晴朗天气下 20 分钟启动。
是的,为了使系统每次开机时不复位,至少必须连接第一个HX711模块(引脚DT-D10、SCK-A0)

然后读取应变计的读数,计算上次操作的重量变化(Hive 之后的行中的第一个数字),并从第一次激活开始检查电池电压,并将此信息作为 SMS 发送:

SMS 监控三个蜂箱的重量仅需 30 美元

顺便问一下,你收到短信了吗? 恭喜! 我们已经成功一半了! 现在可以从电池座中取出电池;我们将不再需要计算机。

顺便说一句,任务控制中心非常紧凑,可以放入蛋黄酱罐中;就我而言,一个尺寸为 30x60x100mm(来自名片)的半透明盒子非常适合。

是的,由于通信模块,睡眠系统消耗约 2.3mA - 90% - 它不会完全关闭,而是进入待机模式。

SMS 监控三个蜂箱的重量仅需 30 美元

让我们开始制作传感器;首先,让我们了解一下传感器的布局:

SMS 监控三个蜂箱的重量仅需 30 美元

这是蜂巢的平面图 - 俯视图。

通常,4 个传感器安装在角落(1,2,3,4、XNUMX、XNUMX、XNUMX)

我们将以不同的方式进行衡量。 或者更确切地说,甚至是第三种方式。 因为 BroodMinder 的人采取了不同的做法:

SMS 监控三个蜂箱的重量仅需 30 美元

在此设计中,传感器安装在位置 1 和 2,点 3,4 和 XNUMX 位于横梁上。
那么传感器只占重量的一半。
是的,这种方法的准确性较低,但仍然很难想象蜜蜂会沿着蜂巢的一堵墙用蜂窝“舌头”建造所有框架。

所以,我建议一般将传感器减少到5个——这样就不需要屏蔽系统了,在使用轻型蜂箱时,完全有必要凑合使用一个传感器。

SMS 监控三个蜂箱的重量仅需 30 美元

一般来说,我们在 HX711 上测试了两种类型的模块、两种类型的传感器以及两种连接它们的选项 - 使用一个完整的惠斯通电桥(2 个传感器)和一个半惠斯通电桥(当第二部分补充有 1k 电阻器和一个公差为0.1%。
但后一种方法是不可取的,甚至传感器制造商也不推荐,所以我只描述第一种方法。

因此,对于一个蜂箱我们将安装两个应变片和一个HX711模块,接线图如下:

SMS 监控三个蜂箱的重量仅需 30 美元

从 ADC 板到 Arduino 有 5 米长的 4 线电话线 - 我们记得蜜蜂不喜欢蜂巢里的 GSM 设备.

一般来说,我们在传感器上留下 8 厘米的“尾巴”,剥去双绞线并焊接所有东西,如上图所示。

在开始木工部分之前,将蜡/石蜡放入合适的容器中,在水浴中融化。

现在我们把木材分成三段,每段 100 毫米

接下来,我们标记一个 25 毫米宽、7-8 毫米深的纵向凹槽,使用钢锯和凿子去除多余的部分 - 应该出现 U 形轮廓。

蜡是否已加热? — 我们将 ADC 板浸入其中 — 这将保护它们免受湿气/雾气的影响:

SMS 监控三个蜂箱的重量仅需 30 美元

我们将它们全部放在木质底座上(必须用防腐剂处理以防止腐烂):

SMS 监控三个蜂箱的重量仅需 30 美元

最后,我们用自攻螺钉固定传感器:

SMS 监控三个蜂箱的重量仅需 30 美元

还有一个带有蓝色电工胶带的选项,但出于人性的原因,我不会展示它 😉

从 Arduino 端我们执行以下操作:

我们剥去电话线,将彩色电线绞在一起,然后镀锡。

之后,焊接到板触点上,如图所示:

SMS 监控三个蜂箱的重量仅需 30 美元

就是这样,现在进行最后的检查,我们将传感器放在圆圈的各个部分,顶部放一块胶合板,重置控制器(我们将带有笔帽的电池放在光电二极管上)。

同时,Arduino 上的 LED 应该闪烁,并且测试短信应该到达。

接下来,取下光电管的盖子,将水装入 1.5 升的塑料瓶中。
我们将瓶子放在胶合板上,如果打开后已经过了几分钟,我们将盖子放回光敏电阻上(模拟日落)。

三分钟后,Arduino 上的 LED 将亮起,您应该收到一条短信,其中所有位置的重量值约为 1 kg。

恭喜! 系统已组装成功!

如果我们现在强制系统再次工作,那么第一个权重列将为零。

是的,在实际情况下,建议将光敏电阻垂直向上放置。

现在我将给出一个简短的用户手册:

  1. 在蜂箱后墙下方安装应变计(在前墙下方放置约 30 毫米厚的梁/板)
  2. 遮蔽光敏电阻并安装电池 - LED 应该闪烁,您应该收到一条测试短信,其中包含“初始启动正常”文本
  3. 将中央单元放置在距蜂巢最大距离处,以便在与蜜蜂一起工作时电线不会干扰。
    每天晚上,日落之后,您都会收到一条短信,其中包含当天以及从发射那一刻起您的体重变化。
    当电池电压达到3.5V时,短信将以“!!!”结束。 给电池充电!!!”
    一块2600mAh电池的工作时间约为一个月。
    如果更换电池,则不会记住蜂箱重量的每日变化。

接下来是什么?

  1. 弄清楚如何将所有这些放入 github 项目中
  2. 在 Palivoda 系统的蜂巢中建立 3 个蜜蜂家族(或在人体内有角的蜜蜂家族)
  3. 添加“面包”——测量湿度、温度,最重要的是——分析蜜蜂的嗡嗡声。

现在就这些了,真诚的,电动养蜂人安德烈

来源: habr.com

添加评论