
Nej, dette er ikke et kommercielt tilbud, men prisen på komponenterne til systemet, som du kan samle efter at have læst artiklen.
Lidt baggrund:
For noget tid siden besluttede jeg at begynde at holde bier, og de kom virkelig… for en hel sæson, men overlevede ikke vinteren.
Og det på trods af at jeg tilsyneladende gjorde alt rigtigt — efterårsforing, isolering for kulden.
Bistadet var en klassisk træmodel af "Dadant"-systemet med 10 rammer lavet af 40 mm brædder.
Men den vinter mistede også erfarne biavlere betydeligt mere end normalt på grund af temperaturskift.
Så idéen om et overvågningssystem til bistadets tilstand kom frem.
Efter at have offentliggjort flere artikler på Habr og haft kommunikation på biavlerforumet, besluttede jeg at starte fra det enkle og gå til det komplekse.
Vægt er den eneste ubestridte parameter, men som regel overvåger eksisterende systemer kun én 'standard' bistade.
Hvis der sker noget med det (for eksempel hvis dronningen flyver væk, eller bierne bliver syge), bliver målingerne irrelevante.
Derfor blev det besluttet at overvåge vægten af tre bistader med én mikrokontroller, og de øvrige 'goder' kunne tilføjes senere.
Resultatet blev et autonomt system, der har en driftstid på cirka en måned på en enkelt opladning af et 18650-batteri og sender statistikker en gang om dagen.
Jeg forsøgte at forenkle konstruktionen så meget som muligt, så den kunne gentages selv uden skemaer, blot ud fra billeder.
Logikken bag systemet er som følger: ved første opstart/reset gemmes sensoraflæsningerne, der er installeret under bistaderne, i EEPROM.
Derefter, hver dag efter solnedgang, 'vågner' systemet, læser aflæsningerne og sender en SMS med vægten ændring for dagen og siden systemet blev tændt.
Derudover sendes værdien af batteriets spænding, og når den falder til 3,5V, gives en advarsel om behovet for opladning, da under 3,4V tænder kommunikationsmodulet ikke, og vægtmålingerne bliver også 'ukorrekte'.
"Du husker, hvordan det hele begyndte. Det var første gang for alt og igen."

Ja, netop sådan et sæt 'hardware' var oprindeligt, dog var det kun vægtensorerne og kablerne, der nåede til den endelige version, men om alt i sin orden.
I virkeligheden vil du ikke få brug for en kabelrulle, da den viste sig at have samme pris som 30 m skåret.
Hvis du ikke er skræmt af nedtagning af 3 SMD-LED'er og halvtreds punkter almindelig (ben) lodning — så er du klar!
Så vi har brug for følgende udstyr/materialer:
- Arduino Pro Mini 3V
Det er vigtigt at bemærke, at lineære spændingsregulatoren skal være på 3,3V - chipmærkningen KB 33/LB 33/DE A10 - jeg har oplevet, at kineserne har lavet en fejl, og hele partiet
af printplader i butikken viste sig at have 5-volts regulatorer og kvartskrystaller på 16MHz. - USB-TTL med CH340 chip - man kan endda bruge en 5-volts, men så skal man under programmeringen af mikrokontrolleren frakoble Arduinoen fra GSM-modulet for ikke at brænde det sidste.
Printplader med PL2303 chip fungerer ikke på Windows 10. - GSM kommunikationsmodul Goouu Tech IOT GA-6-B eller AI-THINKER A-6 Mini.
Hvorfor valgte jeg denne? Neoway M590 - en konstruktion, der kræver lidt ekstra arbejde, GSM SIM800L - kunne ikke lide den unormale 2,8V logikniveau, som kræver tilpasning selv til en tre-volts Arduino.
Desuden har løsningen fra AiThinker et minimalt strømforbrug (under SMS sendt har jeg ikke set mere end 100mA). - GSM GPRS 3DBI antenne (på billedet ovenfor - rektangulær printplade med 'hale', ved 9 timer)
- Et startpakke fra en operatør, der har god dækning, hvor din bistade er placeret.
Ja, pakken skal aktiveres på en almindelig telefon, DEAKTIVER PIN-anmodning ved login og oplade saldoen.
Der findes mange muligheder med navne som 'Sensor', 'IoT' - de har en lidt lavere abonnementspris. - Dupont kabel 20 cm hun-hun - 3 stk. (til at forbinde Arduino til USB-TTL)
- 3 stk. HX711 - ADC til vægte
- 6 trykfølsomme sensorer til en vægt op til 50kg
- 15 meter 4-ledet telefonkabel - til forbindelse mellem vægtsensorerne og ARDUINO.
- GL5528 fotomodstand (det er vigtigt, at det er netop denne, med en mørk modstand på 1MΩ og lysmodstand på 10-20kΩ) og to almindelige modstande på 20k
- Et stykke dobbeltklæbende 'tyk' tape 18x18mm - til at fastgøre Arduino til kommunikationsmodulet.
- Batteriholder til 18650 batterier og selve batteriet ~2600mAh.
- Noget voks eller paraffin (te-lampe der bruges til aromaterapi) - til fugtbeskyttelse af HX711
- Et stykke træbrædder 25x50x300mm til base for trykfølsomhederne.
- Et dusin skruer med trykskiver 4,2x19 mm til at fastgøre sensorerne til basen.
Batteriet kan tages fra demonterede bærbare computere - langt billigere end nyt, og kapaciteten bliver langt større end det kinesiske UltraFire - jeg fik 1500 i forhold til 450 (UltraFire har 6800 😉
Derudover kræves der præcise hænder, en loddekolbe EPSN-25, harpiks og loddetin POS-60.

For 5 years, I used a Soviet soldering iron with a copper tip (soldering stations never appealed to me — I tested them and ended up with the EPSN circuit).
But after it broke down and a few terrible Chinese knockoffs, the last one was called Sparta — a thing as harsh as its name, I stopped
on a product with a temperature regulator.
So, let's get started!

First, we remove two LEDs from the GSM module (the area where they were is marked with an orange oval)
We insert the SIM card with the contact pads facing the printed circuit board; the beveled corner in the photo is indicated by an arrow.

Next, we perform the same procedure with the LED on the Arduino board (oval to the left of the square chip),
We solder a connector with four pins (1),
We take two 20k resistors, twist the leads on one side, solder the twist into the hole of contact A5, and the remaining leads into RAW and GND on the Arduino (2),
We shorten the legs of the photoresistor to 10mm and solder it to the GND and D2 outputs on the board (3).
Now it's time for the blue tape of double-sided adhesive — we stick it on the SIM card holder of the communication module, and above it — the Arduino — the red (silver) button is facing us and is located above the SIM card.
We solder the power: the positive from the capacitor of the communication module (4) to the RAW contact of the Arduino.
The thing is, the communication module requires a power supply of 3.4-4.2V, and its PWR contact is routed to a step-down converter, so for operation from li-ion, the voltage must be applied bypassing this part of the circuit.
On the Arduino side, on the contrary, we supply power through a linear converter — with low current consumption, the drop-out voltage amounts to 0.1V.
Thus, by supplying stabilized voltage to the HX711 modules, we eliminate the need to modify them for lower voltage (and also reduce noise resulting from this operation).
Next, we solder jumpers (5) between the contacts PWR-A1, URX-D4 and UTX-D5, 'ground' GND-G (6), and finally the power from the 18650 battery holder (7), connecting the antenna (8).
Now we take a USB-TTL converter and connect Dupont wires to the ARDUINO (connector 1) contacts RXD-TXD and TXD-RXD, GND-GND:

In the photo above — the first version (out of three) of the system used for debugging.
Now let's take a break from the soldering iron and switch to the software part.
I will describe the sequence of actions for Windows:
For det første skal programmet downloades og installeres/udpakkes — den aktuelle version er 1.8.9, men jeg bruger 1.6.4
For nemheds skyld udpakkes arkivet i mappen C:arduino-«nummer_Вашей_версии», inden i vil vi have mapperne /dist, drivers, examples, hardware, java, lib, libraries, reference, tools samt executabel fil arduino (ud over de andre).
Nu har vi brug for et bibliotek til at arbejde med ADC — den grønne knap «clone or download» — download ZIP.
Indholdet (mappen HX711-master) placeres i kataloget C:arduino-«номер_Вашей_версии»libraries
Og selvfølgelig driveren til fra samme github — fra den udpakkede arkiv startes installationsfilen SETUP.
Okay, vi starter og konfigurerer programmet C:arduino-«номер_Вашей_версии»arduino

Vi går til menuen «Værktøjer» — vælger kortet «Arduino Pro or Pro Mini», processor Atmega 328 3.3V 8 MHz, port — nummer bortset fra system COM1 (det dukker op efter installation af CH340-driveren, når USB-TTL-adapteren er tilsluttet)
Okay, vi kopierer den følgende sketch (programmet), og indsætter den i vinduet 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);
}
}
I den første linje, i citationstegnene char phone_no[]=»+123456789012″; — i stedet for 123456789012 indsætter vi vores eget telefonnummer med landskode, hvor SMS'er vil komme.
Nu trykker vi på knappen for at kontrollere (over tallene et i skærmbilledet ovenfor) — hvis der nedenunder (under treeren i skærmbilledet) står «Kompilering færdig» — så kan vi flashmikrokontrolleren.
Sådan, USB-TTL er tilsluttet ARDUINO og computeren, vi sætter det opladte batteri i holderen (normalt begynder en ny Arduino at blinke med LED'en en gang i sekundet).
Nu til flashningen — vi øver os i at trykke på den røde(sølvfarvede) knap på mikrokontrolleren — dette skal gøres præcist på det rigtige tidspunkt!!!
Er det? Vi trykker på knappen «Upload» (over toeren i skærmbilledet), og ser nøje på linjen nederst i grænsefladen (under treeren i skærmbilledet).
Når teksten «kompilering» skifter til «uploading» — trykker vi på den røde knap (reset) — hvis alt er ok — så vil lysene på USB-TTL-adapteren blinke lykkeligt, og i bunden af grænsefladen vil der stå «Vi har uploaded»
Nu mens vi venter på, at den test-SMS ankommer til telefonen, vil jeg fortælle, hvordan programmet fungerer:

På billedet — den anden version af testbænken.
Ved første opstart sammenligner systemet byte nummer 500 og 501 EEPROM, hvis de er ens, betyder det, at kalibreringsdata ikke er gemt, og algoritmen går videre til indstillingsafsnittet.
Det samme sker, hvis fotomodtageren er dækket (med en pennehætte) ved opstart — indstillingen til nulstilling aktiveres.
Tensionfølere skal allerede være installeret under bisken, da vi blot registrerer det initiale nulniveau og derefter måler vægtændringen (nu får vi bare nul, da vi ikke har tilsluttet noget endnu).
På Arduino'en begynder den indbyggede LED på pin 13 at blinke.
Hvis nulstillingen ikke sker, lyser LED'en i 12 sekunder.
Efter dette sendes en test-SMS med meddelelsen «INITIAL BOOT OK» og batterispændingen.
Kommunikationsmodulet slukker, og efter 3 minutter sætter Arduino-kortet HX711 ADC-kortene i dvalemodus og går selv i dvale.
Denne forsinkelse er lavet for ikke at fange interferens fra den aktive GSM-modul (efter slukning «støj» det i et stykke tid).
Dernæst arbejder vi med en afbrydelse fra fotomodtageren på den anden pin (plus spændes op med pullup-funktionen).
Efter aktiveringen kontrolleres tilstanden af fotomodtageren i 3 minutter yderligere — for at undgå gentagne/falske aktiveringer.
Bemærkelsesværdigt er, at systemet uden nogen indstilling aktiveres 10 minutter efter astronomisk solnedgang i overskyet vejr og efter 20 minutter i klart vejr.
Ja, for at systemet ikke skal nulstille ved hver opstart, skal den første HX711-modul være tilsluttet (pins DT-D10, SCK-A0).
Så hentes målingerne fra tensionfølerne, ændringen i vægt siden den forrige aktivering (det første tal i linjen efter Hive) og fra det første opstart tjekkes, batteriets spænding, og disse oplysninger sendes som en SMS:

Forresten, modtog du SMS'en? Tillykke! Vi er halvvejs! Du kan nu tage batteriet ud af holderen, computeren er ikke længere nødvendig.
Centret for flyveledelse er så kompakt, at det kan passe i et mayonnaiseflaske; i mit tilfælde passer en halvtransparent boks med dimensionerne 30x60x100 mm (til visitkort) perfekt.
Ja, det sovende system bruger ~2.3mA — 90% af dette skyldes kommunikationsmodulet — det slukker ikke helt, men går i standby-mode.

Lad os begynde at lave sensorerne; først vil vi berøre skemaet for placeringen af sensorerne:

Dette er planen for bisken — set ovenfra.
Traditionelt installeres der 4 sensorer i hjørnerne (1,2,3,4)
Vi skal måle på en anden måde. Mere præcist på en tredje måde. For det gør fyrene fra BroodMinder:

I denne konstruktion er sensorerne placeret på positionerne 1 og 2, punkterne 3 og 4 støtter sig til brættet.
Så, der hviler kun halvdelen af vægten på sensorene.
Ja, denne metode har en lavere nøjagtighed, men det er alligevel svært at forestille sig, at bierne vil fylde alle rammerne med "tunger" af voks langs den samme væg i kube.
Jeg foreslår derfor at samle sensorene i punkt 5 — så slipper vi for at skærme systemet, og med lette kasser kan vi endda klare os med en enkelt sensor.

I alt er der blevet testet to typer moduler på HX711, to typer sensorer og to varianter af deres forbindelse — med et fuldt Wheatstone-bro (2 sensorer) og med en halvdel, hvor den anden del suppleres med 1k modstande med en tolerance på 0,1%.
Men den sidste metode er uønsket og ikke anbefalet af producenterne af sensorerne, så jeg vil kun beskrive den første.
Så, der vil blive installeret to kraftsensorer og en HX711 modul til én kube. Skemaet for tilslutning er som følger:

Fra ADC-kortet til Arduino går der 5 meter af en 4-leder telefonkabel — .
Generelt efterlader vi "haler" på sensorene på 8 cm, afisolerer den snoede par og lodder det hele som på billedet ovenfor.
Før vi påbegynder snedkerarbejdet, stilles voks/paraffin i en egnet beholder til at smelte i et vandbad.
Nu tager vi vores bræt og deler det op i tre sektioner på 100 mm.
Derefter markerer vi den langsgående rille, 25 mm bred, dybde 7-8 mm, med sav og stemme og fjerner det overskydende — der skal komme en U-formet profil ud.
Er voksen smeltet? — dyp der vores ADC-kort — det beskytter dem mod fugt/tåge:

Vi placerer alt dette på en træbase (skal behandles med antiseptisk mod råd):

Og endelig fastgør vi sensorene med skruebolte:

Der var også en mulighed med blåt tape, men af humane årsager viser jeg ikke den 😉
Fra Arduino-siden gør vi følgende:
Vi afisolerer vores telefonkabler, snoer de farvede ledninger sammen, og lodder dem.
Derefter lodder vi til kontakterne på kortet som på billedet:

Det er det, nu til den endelige test, placerer vi sensorene i sektorerne af cirklen, ovenpå — et stykke finer, nulstiller kontrolleren (sætter batteriet med en hætte fra en kuglepen over fotodioden).
LED'en på Arduino’en skal blinke, og du skal modtage en test-SMS.
Fjern dækpladen fra lysføleren, og gå hen for at fylde vand i en 1,5 liters plastikflaske.
Placér flasken på finerpladen, og hvis der er gået et par minutter efter tænding, sætter du dækpladen tilbage på fotoresistoren (for at efterligne solnedgang).
Efter tre minutter skal LED'en på Arduino'en lyse, og du bør modtage en SMS med vægtværdier omkring 1 kg på alle positioner.
Tillykke! Systemet er samlet med succes!
Hvis du nu får systemet til at arbejde igen, vil der være nuller i den første vægtkolonne.
Ja, i virkelige forhold er det bedst at orientere fotoresistoren lodret opad.
Her er en kort manual til brug:
- Installer belastningssensorerne under de bageste vægge af bistaderne (for de forreste, sæt en planke/klods med en tykkelse på ca. 30 mm).
- Skjul fotoresistoren og sæt batteriet — LED'en skal blinke, og du skal modtage en test-SMS med teksten "INITIAL BOOT OK".
- Placer hovedenheden så langt væk fra bistaderne som muligt, og sørg for, at ledningerne ikke forstyrrer arbejdet med bierne.
Hver aften efter solnedgang vil der komme en SMS med ændringen af vægten for dagen og fra systemets opstart.
Når batteriets spænding når 3,5 V, vil SMS'en slutte med teksten "!!! CHARGE BATTERY !!!".
Driftstiden fra et batteri med 2600 mAh kapacitet er cirka en måned.
Ved udskiftning af batteriet gemmes de daglige ændringer i vægten ikke.
UPD ADVARSEL!
I FORHOLD TIL SVAG SIGNAL, ØGER GSM-modulet effekten, hvilket FØRER TIL SYSTEMGENSTART.
Dette blev opdaget under "marktests" (det er uklart, hvorfor brugere af GSM-moduler ikke rapporterer sådanne problemer).
Jeg forbereder nu et nyt schema:

Efter vellykket test vil denne publikation blive opdateret.
El-biavler Andrei.
Kilde: habr.com
