
自从上一本关于该系统的出版物售价30美元以来已经有一段时间了。
在过去的农历月发生了什么变化?
- 增加了太阳能电池-使用寿命几乎不受限制。
- 添加了有关呼叫的发送信息。
- 我认为可以使用所有类型的通信模块的能力-AiThinker,Gouou tech,SIM800 / 900,Neoway M590 *
但是最重要的是,通信模块和微控制器现在已物理分离,从而消除了其与HX711的操作干扰。
这一切都要归功于对参加该系统讨论的哈布罗夫斯克居民和养蜂人的建设性批评。
其余的性能特征保持不变-蜂箱的最大重量为200公斤,日落之后进行测量并发送指标。
在不使用睡眠模式和GSM模块的附加信号线的批评中,我会说以下几点:
每个通信模块都有自己的详细信息-有些以低信号电平进入睡眠状态,有些以高电平进入睡眠状态,有些通过双击进入。
“自己动手做”的细节意味着某个创意部分,值得在这里展示。
我还设计了一个系统,以进一步监视不需要特别睡觉的蜂巢其他参数。
通常,在标题图中- 纯安卓 基本系统,您可以在其中随设计,传感器,模块等的数量/组一起在任何地方跳舞。
本文是关于规模的,在缩减的范围内,我的个人看法和系统的实现。
一句话-欢迎光临! 走吧
首先,该系统根本无法休眠……因为6伏的两节电池太阳能电池即使在多云的天气下也能产生5伏的电压,最高可达100毫安。
在待机模式(按照GSM1800标准)下,整个系统的功耗为17mA,而在GSM900上则约为30mA。
另外,正如已经提到的,这样做的目的是实时实现其他监视功能(例如,一群人可以在5分钟内退出)-没有时间睡觉;-)
您想要绝对节能,所以它将在下一个出版物中出现,但是完全不同。 故事 系统。
*是的,就通讯模块的脚注而言,这并不是我成为AiThinker的信徒,我只需要自己组装Neoway,SIM800L模块就需要单独的文章,并附有教育程序来使用它们。
简而言之,所选的GSM是恕我直言,这是唯一可以在4根电线(包括电源)上工作的GSM,而无需铃鼓额外跳舞。
我们将需要以下设备/材料:
- 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。
- GSM天线GPRS“ YG-01”

他们如何实现这种增长-一个谜-可能与完全不存在有关;-) - 入门包,适用于在您的养蜂场覆盖良好的操作人员。
是的,必须首先在常规电话中激活包裹,在入口处禁用PIN REQUEST,然后补充帐户。 - 杜邦线20厘米妈妈妈妈-4件 (用于将Arduino连接到USB-TTL)
- 3只 HX711-用于秤的ADC
- 6个称重传感器,重达50 kg
- 15米长的4芯电话线-用于连接配重模块和GSM与ARDUINO。
- 光敏电阻GL5528(这很重要,暗电阻为1MΩ,亮电阻为10-20kΩ)。
- 两对插头和插座6P6C-电话,插座-带“尾部”
- 50厘米,10毫米宽的双面胶带-用于将太阳能电池板粘贴到GSM模块的外壳上。
- 基于TP4056的锂离子电池充电器板
- 18650电池座,实际上是电池本身。
- 少许蜡或石蜡(香薰灯片蜡烛)-用于防潮HX711
- 一块25x50x300mm的木梁,用于称重传感器的底座。
- 一打带有4.2x19毫米压力垫圈的自攻螺钉,用于将传感器安装到基座。
- 太阳能电池5-6V 2W(下一个无线电法师中没有-我用了两个单瓦和一对1N4148二极管)

没有反向电流流过充电器,但应通过二极管正确打开并联的太阳能模块 - 一个用于通讯模块和一个太阳能电池的盒子(尺寸为60x100mm)-您可以适当分配电器,我的塑料名片盒30x60x100非常适合。
此外,将需要弯曲的手,EPSN-25烙铁,松香和POS-60焊料。
对于木工来说,钢/金属/钢锯,凿子和3mm钻头就足够了。
系统布局如下:

无论如何,您都不应将GSM模块放置在距离Arduino较近的地方,因为GSM900标准中的信号功率较高,这可能导致微控制器重新启动!
好吧,应该将带有太阳能电池的通信模块安装在电线杆上,这样接收效果会更好,并且距离蜜蜂更远。
现在开始组装:

首先,从GSM模块(橙色椭圆形圈出的地方)焊接了两个LED。
我们将带有垫的SIM卡插入印刷电路板,照片中的斜角由箭头指示。
另外,从电池和连接控制器的电线直接将其焊接到电容器(4)。
事实是,通信模块本身需要3.4-4.2V的电源,其PWR触点连接到降压降压转换器,因此对于锂离子电池而言,必须绕过电路的这一部分施加电压。

然后,我们使用Arduino板上的LED(方形芯片右侧的椭圆形)执行类似的过程。
我们将梳子沿板子一直水平焊接到四个触点(1)中。
我们将光敏电阻的支脚缩短到10 mm,并用20 cm的导体将其焊接到板的端子GND和D2(2)。
我们通过线性转换器供电-在低电流时,压降为0.1V。
但是通过向HX711模块施加稳定的电压,我们无需在较低的电压下对其进行精修(与此同时,由于此操作而增加了噪声)。
现在,您需要使用5米长的四线电话线,并按照本文开头的示意图将其焊接在微控制器和通信模块之间(线的颜色与实际情况相对应)。
我们还焊接了电池座,稍后再进行其余工作。
现在有一段时间,我们脱离了烙铁,然后转到软件部分。
我将描述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文件。
对于那些不愿使用库的人,我打包了Arduino IDE程序的程序集-只需下载并解压缩即可。
我们启动并配置程序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 // NeverSleep #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 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; boolean forceSend=false; char ch = 0; char ch1 = 0; char ch2 = 0; char ch3 = 0; char ch4 = 0; void readVcc() // read battery capacity { ch = mySerial.read(); while (mySerial.available() > 0) { ch = mySerial.read(); } // empty input buffer from modem mySerial.println("AT+CBC?"); //ask gprs for battery status (for sim800 and neoway command must be "AT+CBC" ) delay(200); while (mySerial.available() > 0) { //read input string between coma and CR ch = mySerial.read(); if (ch ==','){ ch1 = mySerial.read(); ch2 = mySerial.read(); ch3 = mySerial.read(); ch4 = mySerial.read(); } } } // ********************************************************************** void SendStat() { detachInterrupt(digitalPinToInterrupt(0)); // turn off external interrupt digitalWrite(13, HIGH); if (!forceSend){ 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 || forceSend ) { 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; readVcc(); delay(200); mySerial.println("AT+CMGF=1"); // Part of SMS sending 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("Battery capacity is "); mySerial.print(ch1); mySerial.print(ch2); mySerial.print(ch3); mySerial.print(ch4); mySerial.println(" %"); if (forceSend) {mySerial.print("Forced SMS");} mySerial.println (char(26));//the ASCII code of the ctrl+z is 26 delay(3000); } forceSend=false; digitalWrite(13, LOW); attachInterrupt(0, SendStat , RISING); // Interrupt by HIGH level } // ************************************************************************************************* void switchto9600() { mySerial.begin(115200); // Open software serial port delay(16000); // wait for boot mySerial.println("AT"); delay(200); mySerial.println("AT"); delay(200); mySerial.println("AT+IPR=9600"); // Change Serial Speed delay(200); mySerial.begin(9600); mySerial.println("AT&W0"); delay(200); mySerial.println("AT&W"); } void setup() { // Setup part run once, at start pinMode(13, OUTPUT); // Led pin init pinMode(2, INPUT_PULLUP); // Set pullup voltage Serial.begin(9600); // ------------------------------------------------------------------------------- switchto9600(); // switch module port speed // ------------------------------------------------------------------------------- mySerial.begin(9600); delay(200); 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 readVcc(); delay(200); mySerial.println("AT+CMGF=1"); 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("Battery capacity is "); mySerial.print(ch1); mySerial.print(ch2); mySerial.print(ch3); mySerial.print(ch4); mySerial.println(" %"); mySerial.println (char(26));//the ASCII code of the ctrl+z is 26 delay(3000); raw02=raw00; raw12=raw10; raw22=raw20; attachInterrupt(0, SendStat , RISING); // Interrupt by HIGH level } void loop() { digitalWrite(13, LOW); ch=mySerial.read(); if ( ch=='R' ) { //wait first lerrer from "RING" string forceSend=true; mySerial.println("ATH"); SendStat(); ch=' '; } }
在第一行中,用引号引起来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”和电池电量百分比。
此外,在第二个引脚上工作的光电传感器上有一个中断(加上上拉功能可启用提升功能)。
在这种情况下,再跳闸3分钟后,检查光敏电阻的状态以排除重复/误报。
为了防止每次打开系统时都进行复位,至少必须连接第一个HX711模块(引脚DT-D10,SCK-A0)
然后读取称重传感器的读数,计算上一次操作(Hive之后的行中的第一个数字)的重量变化,从第一次开始计算重量,检查电池电压,并以SMS形式发送此信息:

顺便说一句,您收到短信了吗? 恭喜你! 我们中途了! 虽然可以从电池座中取出电池,但我们将不再需要计算机。
我们开始制造传感器,首先,让我们来谈谈传感器的布局:

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

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

从ADC板到arduino,有5米长的4芯电话线(对于重量2和3的模块而言),第一个传感器用10厘米的“尾巴”连接,但稍后再讲。
通常,在传感器上,我们留出8厘米的“尾巴”,我们清洁双绞线,然后如上图所示对所有部件进行焊接。
开始细木工之前,将蜡/石蜡放入合适的容器中,使其在水浴中融化。
现在我们将光束分成100 mm的三个部分
接下来,我们用钢锯和凿子划出25毫米宽,7至8毫米深的纵向凹槽,去除多余的部分-应该出现U形轮廓。

实际上,我们需要一个H形零件1和两个-P-shki,它们都长10厘米。
为什么选择N-ka-不相信,将Arduino隐藏在其中:

此外,此处还连接了用于连接传感器2和3的6P6C插座。
蜡热身了吗? -我们将ADC板浸入那里-这样可以保护它们免受潮气/雾气的影响:

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

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

接下来,我们按照标题和常识中的方案焊接所有剩余的组件。
就组件位置而言,建议表现出想象力,要考虑的一件事-微控制器与GSM模块之间的距离至少应为一米!
我得到以下设计:

是的,由于制造简单,我将面板的安装角度定为45度,但在基辅纬度下,它接近夏季最佳的40度。
就是这样,现在进行最后检查,将传感器放在圆形区域的顶部,即一块胶合板,将控制器调零(打开系统,并用钢笔上的光电二极管上的盖子打开)。
在这种情况下,arduino上的LED应当闪烁,并且应该出现测试SMS。
然后,我们从光电管上取下盖子,然后去往6升的塑料瓶中收集水。
我们将瓶子放在胶合板上,如果从打开开始已经过了几分钟,则将瓶盖放回到光敏电阻上(模拟日落)。
同时,arduino上的LED会亮起,您应该在所有位置收到重量约为4 kg的SMS。
恭喜你! 系统组装成功!
如果现在使系统再次运行,则在权重的第一列中将得到零。
是的,在实际条件下,希望将光敏电阻垂直向上定向。
现在,我将简要介绍以下用途:
- 在蜂箱的后壁下安装应变计(在前面板下方替换为约30毫米厚的梁/板)
- 将通讯模块和太阳能电池板安装在离蜂巢数米的高处。
可以指南太阳能电池板的方向(我们不会抓住真正的方向)。 - 遮盖光敏电阻并放入电池-LED应该闪烁,并出现带有“ INITIAL BOOT OK”字样的测试SMS
从发射开始,每天晚上,日落之后,SMS的重量都会每天变化。
当您拨打GSM模块的SIM卡号码时,控制器摘机(我们听到“订户无法接听电话”),并且SMS进行了非凡的测量。
在这样的消息中,将有一行附加内容-“强制短信”;
系统的完整外观几乎没有:
- 在光电传感器上添加设备自动系统。
- 检查其他类型的通讯模块。
- 要在ESP-8266下进行所有操作-首先,它支持“无线”固件更新-方便。
其次-它可以通过简单的网页形式提供统计信息。
最后,如果您有Wi-Fi,则可以完全拒绝GSM-ki。
哦,是的,我已经厌倦了电线的乱七八糟的事情,并且向我保证系统将“绝对”节能。
一言以蔽之,我决定扮演一个“傻瓜”,并做到所有。
成功有多大-请在一个月内阅读出版物!
在Habr-a的页面上见,
电动养蜂人安德烈
PS有关此主题的新出版物,请参见beefree.xyz