
不,这不是商业报价,这是您阅读本文后可以收集的系统组件的成本。
一点背景:
前段时间,我决定养蜂,它们确实出现了……整个季节,但没有从冬天出来。
尽管事实上一切似乎都做得不错-秋天的诱惑,在寒冷之前变暖。
该配置单元是经典的木制Dadan系统,带有40毫米板的10个框架。
但是那个冬天,由于温度的波动,即使是经验丰富的养蜂人损失也比平常多得多。
因此,蜂巢状态监视系统的想法就来了。
在Habr-e上发表了几篇文章并在养蜂人论坛上交流之后,我决定从简单走向复杂。
重量是唯一无可争辩的参数,但通常,现有系统仅监视一个“参考”配置单元。
如果他出了什么问题(例如,一群人的飞行,蜜蜂的疾病),那么这些指标就变得无关紧要了。
因此,决定使用一个微控制器同时监视三个蜂箱的重量变化,并在其后添加其他“面包圈”。
结果是一个自动系统,一次充电18650电池,运行时间约为一个月,每天发送一次统计信息。
一张照片显示,我试图尽可能简化设计,以便即使没有方案也可以重复进行。
工作逻辑如下:在第一次启动/重置时,安装在配置单元下面的传感器的读数存储在EEPROM中。
此外,每天日落之后,系统都会“醒来”,读取读数并以每天和从打开体重开始的体重变化发送SMS。
此外,还会传输电池的电压值,当电池的电压值降至3.5 V时,会发出有关需要充电的警告,因为低于3.4 V时,通讯模块无法打开,并且重量指示已经“浮空”。
“你还记得这一切是怎么开始的。一切都是一次又一次。”

是的,最初是这样的一组“铁”,尽管只有称重传感器和电线幸存到最终版本,但首先要考虑的是。
实际上,不需要电缆托架,事实证明它的价格与30m持平。
如果您不怕拆卸3个smd-LED和0.5点普通(输出)焊接,那就去吧!
因此,我们需要以下设备/材料集:
- Arduino Pro迷你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的解决方案具有最低的能耗(发送SMS时,我没有看到100mA以上的电流)。 - GSM GPRS 3DBI天线(在上图中-带有“尾巴”的矩形围巾,持续9小时)
- 入门包,适用于在您的养蜂场覆盖良好的操作人员。
是的,必须首先在普通电话中激活包裹,在入口处禁用PIN REQUEST,然后补充帐户。
现在,有很多名称为“ Sensor”,“ IoT”样式的选项-每月费用略低。 - 杜邦线20厘米妈妈妈妈-3件 (用于将Arduino连接到USB-TTL)
- 3只 HX711-用于秤的ADC
- 6个称重传感器,重达50 kg
- 15米长的4芯电话线-用于将砝码模块与ARDUINO连接。
- GL5528光敏电阻(这很重要,暗电阻为1MOhm,亮电阻为10-20kOhm)和两个常规的20k电阻器
- 一块18x18mm厚的双面胶带-用于将arduino附着到通信模块上。
- 18650电池座,实际上,电池本身约为2600mAh。
- 少许蜡或石蜡(香薰灯片蜡烛)-用于防潮HX711
- 一块25x50x300mm的木梁,用于称重传感器的底座。
- 一打带有4.2x19毫米压力垫圈的自攻螺钉,用于将传感器安装到基座。
电池可以从拆卸的笔记本电脑中取出-比新笔记本电脑便宜很多倍,并且容量将远远超过中国的UltraFire-我得到了1,500而不是450(这是从6800防火墙获得的;-)
此外,将需要弯曲的手,EPSN-25烙铁,松香和POS-60焊料。

5年前,我使用了带有铜钉的苏联烙铁(我没有焊台-我将其用于试驾,并完成了EPSN电路)。
但是,在他失败并在(d)棵圣诞树下放下了几棵中国大树之后,后者被称为斯巴达(Sparta)-就像名字停了下来一样严重
在带有温度控制器的产品上。
所以走吧!

首先,从GSM模块焊接两个LED(橙色椭圆形圈出的位置)
我们将带有垫的SIM卡插入印刷电路板,照片中的斜角由箭头指示。

然后,我们使用Arduino板上的LED(方形芯片左侧的椭圆形)执行类似的步骤,
将梳子焊接到四个触点(1)中,
我们使用两个20k电阻器,将导线的一侧扭绞,将绞线焊接到接触孔A5中,其余的导线分别放在RAW和GND arduinki(2)中,
我们将光敏电阻缩短到10 mm,然后将其焊接到GND和D2板的结论(3)。
现在是时候 蓝色电工胶带 双面胶带-将其粘贴在通信模块的SIM卡座上,顶部-arduino-红色(银色)按钮面向我们且位于SIM卡上方。
焊接电源:正极从通信模块(4)的电容器到RAW arduino引脚。
事实是,通信模块本身需要3.4-4.2V的电源,其PWR触点连接到降压降压转换器,因此对于锂离子电池而言,必须绕过电路的这一部分施加电压。
相反,在arduino中,我们通过线性转换器启动电源-在低电流下,压降为0.1V。
但是通过向HX711模块提供稳定的电压,我们无需在较低的电压下对其进行精修(与此同时,由于此操作,噪声也会增加)。
然后,我们在PWR-A1,URX-D4和UTX-D5触点,GND-G地(6)以及最后来自18650电池座(7)的电源之间焊接跳线(5),连接天线(8)。
现在我们使用USB-TTL转换器,将RXD-TXD和TXD-RXD的GND-GND触点与杜邦线连接到ARDUINO(梳1):

在上面的照片中-用于调试的系统的第一个版本(共三个)。
现在有一段时间,我们脱离了烙铁,然后转到软件部分。
我将描述Windows的操作顺序:
首先,您需要下载并安装/解压Arduino IDE程序-当前版本为1.8.9,但我使用1.6.4
为简单起见,我们将归档文件解压缩到文件夹C:\ arduino-“ your_version_number”中,其中包含/ dist,驱动程序,示例,硬件,java,lib,库,引用,tools文件夹以及arduino可执行文件(以及其他文件)。
现在,我们需要一个用于使用HX711 ADC的库-绿色的“克隆或下载”按钮-下载ZIP。
内容(文件夹HX711-master)放置在目录C:\ arduino-“ your_version_number” \库中
当然, USB-TTL的驱动程序来自同一个github-从解压缩的存档中,只需启动安装程序SETUP文件。
好的,运行并配置程序C:\ arduino-“ your_version_number” \ arduino

我们转到“工具”项-选择“ Arduino Pro或Pro Mini”板,选择Atmega 328 3.3V 8 MHz处理器,该端口号是系统COM1以外的数字(安装CH340驱动程序并连接USB-TTL适配器后显示)
好的,复制以下草图(程序)并将其粘贴到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 char phone_no [] =“ + 123456789012”; -我们将电话号码与发送SMS的国家/地区代码放在一起,而不是123456789012。
现在单击检查按钮(在上面的屏幕快照中的数字上方)-如果编译内容在下面(在屏幕快照中的三元组之下),那么我们可以刷新微控制器。
因此,USB-TTL已连接到ARDUINO和计算机,我们将已充电的电池放入了电池座(通常在新的arduino上,LED开始每秒闪烁一次)。
现在,固件-我们正在训练中,按下微控制器的红色(银色)按钮-这将需要在某一时刻严格完成!!!
有没有 单击“上传”按钮(在屏幕快照中的两个上方),然后仔细查看界面底部的行(在三个屏幕下)。
一旦将“编译”字样替换为“下载”,请按红色按钮(重置)-如果一切正常,则USB-TTL适配器会快乐地闪烁,并且在界面底部显示“已下载”字样
现在,当我们等待测试短信通过电话到达时,我将告诉您该程序的工作原理:

在照片中-调试台的第二个版本。
第一次打开系统时,它将检查EEPROM的字节500和501;如果它们相等,则说明校准数据尚未写入,算法进入设置部分。
如果在打开光敏电阻(用笔盖住)时将其阴影化,则会发生相同的事情-激活参数重置模式。
应变片应该已经安装在蜂箱的下面,因为我们只需将初始水平固定为零,然后测量重量的变化即可(现在归零了,因为我们还没有连接任何东西)。
在arduino上,插针13的内置LED指示灯将闪烁。
如果未发生重置,则LED点亮12秒钟。
之后,将发送测试SMS,并显示消息“ INITIAL BOOT OK”和电池电压。
通信模块关闭,三分钟后Arduino板将HX711 ADC板置于睡眠模式并自行入睡。
进行这样的延迟是为了避免受到来自工作中的GSM模块的干扰(将其关闭后,它会“字体化”一段时间)。
此外,在第二个引脚上工作的光电传感器上有一个中断(加上上拉功能可启用提升功能)。
在这种情况下,再跳闸3分钟后,检查光敏电阻的状态以排除重复/误报。
特点是,无需任何调整,该系统在多云天气下的天文日落后10分钟即可工作,而在晴朗天气下则可在20分钟后工作。
是的,因此每次系统不复位时,至少必须连接第一个HX711模块(引脚DT-D10,SCK-A0)
然后读取称重传感器读数,计算上一次操作(Hive之后的行中的第一个数字)的重量变化,并从第一次开始计算电池电压,并以SMS形式发送此信息:

顺便说一句,您收到短信了吗? 恭喜你! 我们中途了! 虽然可以从电池座中取出电池,但我们将不再需要计算机。
顺便说一句,事实证明,飞控中心非常紧凑,可以装在蛋黄酱罐中,在我的情况下,这是一个30x60x100mm大小的半透明盒子(来自名片)。
是的,由于通信模块,睡眠系统消耗的电流约为2.3mA-90%-它无法完全关闭,而是进入待机模式。

我们开始制造传感器,首先,让我们来谈谈传感器的布局:

这是配置单元的计划-顶视图。
通常,在角落(1、2、3、4)中安装4个传感器
我们将以不同的方式进行衡量。 更确切地说,即使在第三。 正如来自BroodMinder的家伙所做的不同:

在这种设计中,传感器安装在位置1和2,点3.4基于光束。
然后只有一半的重量落在传感器上。
是的,这种方法的准确性较低,但是很难想象蜜蜂会从蜂巢的一面壁上的蜂窝中通过“舌头”建立所有框架。
因此,我建议将传感器总数减少到5点-这样就无需屏蔽系统,并且在使用蜂箱时,完全有必要使用一个传感器。

总的来说,我们测试了HX711上的两种模块,两种类型的传感器以及两种连接它们的选项-带有完整的惠斯通电桥(2个传感器),另一半则在第二部分中添加了0.1k电阻的1k电阻器。
但是后一种方法是不可取的,即使传感器制造商也不推荐使用,因此我仅介绍第一种。
因此,我们将在一个配置单元中安装两个称重传感器和一个HX711模块,接线图如下:

从ADC板到arduino,有5米长的4芯电话线- 我们还记得蜜蜂不喜欢蜂巢中的GSM设备 。
通常,在传感器上,我们留出8厘米的“尾巴”,我们清洁双绞线,然后如上图所示对所有部件进行焊接。

我再重复一次-注意极性!
如果称重传感器的黑线连接到HX711板的E +,则红色变为A +
否则,您将获得减轻的重量,而不是增加体重,但这没有关系,在这种情况下,足以将ADC板上的称重传感器(A +和A-)的红色导线互换。
开始细木工之前,将蜡/石蜡放入合适的容器中,使其在水浴中融化。
现在我们将光束分成100 mm的三个部分
接下来,我们用钢锯和凿子划出25毫米宽,7至8毫米深的纵向凹槽,去除多余的部分-应该出现U形轮廓。
蜡热身了吗? -我们将ADC板浸入那里-这样可以保护它们免受潮气/雾气的影响:

我们将其全部放在一个木制底座上(有必要使用防腐剂来防止腐烂):

最后,我们用螺丝固定传感器:

还有一种选择是用蓝色的电工胶带,但是出于人道的原因,我不带它;-)
从Arduino方面,我们执行以下操作:
我们清洁电话线,将彩色电线绞在一起,细小一点。
之后,如图所示,我们焊接到电路板触点:

就是这样,现在进行最后检查,将传感器放在圆的扇区上,在顶部-一块胶合板,将控制器调零(将电池盖在墨水笔上的光电二极管上)。
在这种情况下,arduino上的LED应当闪烁,并且应该出现测试SMS。
然后我们从光电管上取下盖帽,然后去将水收集到1.5升的塑料瓶中。
我们将瓶子放在胶合板上,如果打开后已经过了几分钟,则将瓶盖放回到光敏电阻上(模拟日落)。
三分钟后,Arduino上的LED会亮起,您应该在所有位置收到一条短信,短信的重量值约为1 kg。
恭喜你! 系统组装成功!
如果现在使系统再次运行,则在权重的第一列中将得到零。
是的,在实际条件下,希望将光敏电阻垂直向上定向。
现在,我将简要介绍以下用途:
- 在蜂箱的后壁下安装应变计(在前面板下方替换为约30毫米厚的梁/板)
- 遮盖光敏电阻并放入电池-LED应该闪烁,并出现带有“ INITIAL BOOT OK”字样的测试SMS
- 将中央单元放置在尽可能远离蜂巢的位置,以免与蜜蜂工作时电线干扰。
从发射开始,每天晚上,日落之后,SMS的重量都会每天变化。
当电池电压达到3.5V时,SMS将以“ !!! CHARGE BATTERY !!!”行结束。
一个容量为2600mAh的电池的工作时间约为一个月。
在更换电池的情况下,无法记住蜂箱重量的每日变化。
接下来是什么?
- 为了弄清楚如何将所有这些都放入github的项目中
- 在Palivoda系统的蜂巢中(或有角的人中)开始3个蜜蜂家族
- 添加“小圆面包”-湿度,温度的测量,最重要的是-蜜蜂嗡嗡声的分析。
让我们全心全意照顾您的电子养蜂人Andrey
PS有关此主题的新出版物,请参见beefree.xyz