不,这不是商业报价,这是您在阅读本文后可以组装的系统组件的成本。
一点背景:
前一段时间,我决定养蜜蜂,它们确实出现了……整个季节,但没有离开冬天的小屋。
尽管事实上他似乎做的一切都是正确的——秋季添加辅食、寒冷天气前的保温。
蜂箱是一个经典的木制“Dadan”系统,有 10 个由 40 毫米厚的木板制成的框架。
但那个冬天,由于气温波动,即使是经验丰富的养蜂人,损失也比平时多得多。
这就是监控蜂巢状况的系统的想法的由来。
在发表了几篇关于 Habr 的文章并在养蜂人论坛上进行交流后,我决定从简单到复杂。
重量是唯一无可争议的参数,但通常,现有系统仅监控一个“参考”蜂巢。
如果出现问题(例如,蜂群离开、蜜蜂疾病),那么这些指标就变得无关紧要。
因此,决定使用一个微控制器同时监控三个蜂箱的重量变化,然后再添加其他“好东西”。
结果是一个自主系统,18650 电池充电一次,运行时间约为一个月,每天发送一次统计数据。
我试图尽可能地简化设计,这样即使没有图表,仅通过照片也可以重复它。
操作逻辑如下:在第一次启动/重置期间,安装在蜂箱下的传感器的读数存储在EEPROM中。
然后,每天日落后,系统“醒来”,读取读数并发送一条短信,其中包含当天以及从开机那一刻起的重量变化。
此外,还会传输电池电压值,当电压降至3.5V时,会发出需要充电的警告,因为低于3.4V,通信模块不会打开,重量读数已经“飘走”。
“你还记得这一切是如何开始的吗? 一切都是第一次。”
是的,这正是最初的一套硬件,虽然只有应变计和电线保留到最终版本,但首先是第一件事。
事实上,你不需要电缆线圈,它只是和 30m 直管一样的价格。
如果您不怕拆解 3 个 SMD LED 和半百点常规(输出)焊接,那就去吧!
因此,我们需要以下设备/材料:
- Arduino Pro 迷你 3V
你应该注意线性转换器微电路 - 它应该正好是3.3V - 芯片上标记为KB 33/LB 33/DE A10 - 我的中文出了问题,整个批次
商店里的板子原来有 5 伏稳压器和 16 MHz 晶体。 - 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 请求,然后为您的帐户充值。
现在有很多名称为“传感器”、“物联网”的选项 - 它们的订阅费略低。 - 杜邦线 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 mm 压垫圈,用于将传感器固定到底座上。
电池可以从笔记本电脑拆解中取出 - 它比新电池便宜几倍,而且容量会比中国的 UltraFire 大得多 - 我得到了 1500 与 450 (这是火 6800 😉
此外,您还需要稳定的手、EPSN-25 烙铁、松香和 POS-60 焊料。
甚至 5 年前,我还使用过带有铜尖的苏联烙铁(焊台对我来说不起作用 - 我把它进行了一次试驾,并用 EPSN 完成了电路)。
但在它的失败和几个中国可怕的赝品之后,后者被称为斯巴达——一个像它的名字一样严厉的东西,停止了
在带有恒温器的产品上。
那么我们走吧!
首先,我们从 GSM 模块上拆下两个 LED(它们所在的位置用橙色椭圆圈出)
我们将带有接触垫的SIM卡插入印刷电路板,照片中的斜角用箭头表示。
然后我们对 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):
上图显示了系统的第一个版本(共三个版本),用于调试。
但现在我们将暂时离开烙铁并转向软件部分。
我将描述 Windows 的操作顺序:
首先,您需要下载并安装/解压程序
为简单起见,我们将存档解压到文件夹 C: arduino - “your_version_number”,里面有文件夹 /dist、驱动程序、示例、硬件、java、lib、库、参考、工具以及 arduino 可执行文件(除其他外)。
现在我们需要一个库来与 ADC 配合使用
内容(文件夹 HX711-master)放置在目录 C:arduino-“your_version_number”libraries 中
当然还有司机
好的,让我们启动并配置程序 C:arduino-“your_version_number”arduino
进入“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适配器上的灯将快乐地闪烁,并且在界面底部显示“已上传”字样”
现在,当我们等待测试短信到达手机时,我将告诉您该程序的工作原理:
图为第二版调试台。
第一次开机时,系统检查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 发送:
顺便问一下,你收到短信了吗? 恭喜! 我们已经成功一半了! 现在可以从电池座中取出电池;我们将不再需要计算机。
顺便说一句,任务控制中心非常紧凑,可以放入蛋黄酱罐中;就我而言,一个尺寸为 30x60x100mm(来自名片)的半透明盒子非常适合。
是的,由于通信模块,睡眠系统消耗约 2.3mA - 90% - 它不会完全关闭,而是进入待机模式。
让我们开始制作传感器;首先,让我们了解一下传感器的布局:
这是蜂巢的平面图 - 俯视图。
通常,4 个传感器安装在角落(1,2,3,4、XNUMX、XNUMX、XNUMX)
我们将以不同的方式进行衡量。 或者更确切地说,甚至是第三种方式。 因为 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 将亮起,您应该收到一条短信,其中所有位置的重量值约为 1 kg。
恭喜! 系统已组装成功!
如果我们现在强制系统再次工作,那么第一个权重列将为零。
是的,在实际情况下,建议将光敏电阻垂直向上放置。
现在我将给出一个简短的用户手册:
- 在蜂箱后墙下方安装应变计(在前墙下方放置约 30 毫米厚的梁/板)
- 遮蔽光敏电阻并安装电池 - LED 应该闪烁,您应该收到一条测试短信,其中包含“初始启动正常”文本
- 将中央单元放置在距蜂巢最大距离处,以便在与蜜蜂一起工作时电线不会干扰。
每天晚上,日落之后,您都会收到一条短信,其中包含当天以及从发射那一刻起您的体重变化。
当电池电压达到3.5V时,短信将以“!!!”结束。 给电池充电!!!”
一块2600mAh电池的工作时间约为一个月。
如果更换电池,则不会记住蜂箱重量的每日变化。
接下来是什么?
- 弄清楚如何将所有这些放入 github 项目中
- 在 Palivoda 系统的蜂巢中建立 3 个蜜蜂家族(或在人体内有角的蜜蜂家族)
- 添加“面包”——测量湿度、温度,最重要的是——分析蜜蜂的嗡嗡声。
现在就这些了,真诚的,电动养蜂人安德烈
来源: habr.com