
Ne, to nije komercijalna ponuda, ovo je cijena komponenti sustava koje možete skupiti nakon što pročitate članak.
Malo povijesti:
Nekoliko vremena prije odlučio sam se baviti pčelarstvom, i pčele su se doista pojavile... na cijelu sezonu, ali nisu preživjele zimu.
I to unatoč tome što sam se činilo da sam sve radio ispravno — jesenski prihranjivanje i izolacija prije hladnoće.
Košnica je bila klasična drvena konstrukcija sustava 'Dadant' s 10 okvira od 40-mm dasaka.
No te zime, zbog temperaturnih 'oscilacija', čak su i iskusni pčelari izgubili znatno više nego obično.
Tako je nastala ideja o sustavu za praćenje stanja košnice.
Nakon objavljivanja nekoliko članaka na Habr-u i komunikacije na forumu pčelara, odlučio sam ići od jednostavnog prema složenom.
Težina je jedini nepobitan parametar, no sustavi koji postoje obično prate samo jednu 'referentnu' košnicu.
Ako s njom nešto nije u redu (primjerice izlazak roja, bolest pčela), tada podaci postaju neaktualni.
Stoga je odlučeno pratiti promjenu težine tri košnice pomoću jednog mikrokontrolera, a ostale 'mali dodatci' dodati kasnije.
Na kraju je nastao samostalan sustav s vremenom rada od oko mjesec dana na jednom punjenju baterije 18650 i slanjem statistike jednom dnevno.
Pokušao sam maksimalno pojednostaviti konstrukciju, kako bi se mogla ponoviti čak i bez shema, samo prema fotografijama.
Logika rada je sljedeća: pri prvoj aktivaciji/ponovnom postavljanju, vrijednosti senzora se pohranjuju u EEPROM ispod košnica.
Zatim, svaki dan, nakon zalaska sunca, sustav se 'budi', očitava vrijednosti i šalje SMS s promjenom težine za dan i od trenutka uključivanja.
Osim toga, šalje se vrijednost napona baterije, a ako padne ispod 3.5V, šalje se upozorenje o potrebi punjenja, jer ispod 3.4V modul veze se ne uključuje, a očitane težine već 'otiđu'.
"Sjećaš se kako je sve počelo. Sve je bilo po prvi put i opet."

Da, upravo taj skup 'hardvera' je prvotno bio sastavljen, iako su do konačnog varijanta preživjeli samo tensodavači i žice, ali sve po redu.
U stvari, kolut kabela nije potreban, jednostavno se ispostavilo da je bio iste cijene kao i 30 m na komad.
Ako vas ne plaši demontaža 3 smd LED dioda i pola stotine točaka običnog (izlaznog) lemljenja — krenimo!
Dakle, trebat će nam sljedeći set opreme/materijala:
- Arduino Pro Mini 3V
Treba obratiti pažnju na čip linearnog pretvarača — mora biti točno 3.3V — na čipu oznake KB 33/LB 33/DE A10 — kod mene su Kinezi nešto zamijenili, i cijela serija
ploča u trgovini ispostavila se s 5-voltnim regulatorima i kristalima od 16MHz. - USB-Ttl na čipu CH340 — može biti čak i 5-voltnog, ali tada prilikom programiranja mikrokontrolera, Arduino će trebati isključiti s GSM modula, da ne bi oštetili potonji.
Ploče na čipu PL2303 ne rade pod Windows 10. - GSM komunikacijski modul Goouu Tech IOT GA-6-B ili AI-THINKER A-6 Mini.
Zašto sam se odlučio za njega? Neoway M590 — konstrukcija koja zahtijeva posebne prepravke, GSM SIM800L — nije mi se svidio nestandardni 2.8V nivo logike, koji zahtijeva usklađivanje čak i s trovoltnim Arduinom.
Osim toga, rješenje od AiThinker ima minimalnu potrošnju energije (prilikom slanja SMS-a nisam vidio struju veću od 100mA). - GSM GPRS antena 3DBI (na gornjoj fotografiji — pravokutna pločica s 'repom', na 9 sati)
- Startni paket operatera koji ima dobru pokrivenost na mjestu vaše pčelinje farme.
Da, paket treba unaprijed aktivirati u običnom telefonu, ISKLJUČITI ZAHTJEV ZA PIN pri ulasku, i napuniti račun.
Trenutno postoji mnogo opcija s nazivima poput 'Senzor', 'IoT' — oni imaju nešto manju mjesečnu pretplatu. - Dupont žice 20 cm mama-mama — 3 kom. (za povezivanje Arduina s USB-TTL)
- 3 kom. HX711 — ADC za vage
- 6 tenzodatasetora za težinu do 50kg
- 15 metara 4-žilnog telefonskog kabela — za povezivanje modula težine s ARDUINOM.
- Fotorenzistor GL5528 (važan je baš takav, s otporom u tami od 1MΩ i svjetlosnim od 10-20kΩ) i dva obična otpornika od 20k
- Komadić dvostrane 'debele' ljepljive trake 18x18mm — za pričvršćivanje Arduina na komunikacijski modul.
- Držač baterija 18650 i, zapravo, sama baterija ~2600mAh.
- Malo voska ili parafina (svijeća-tableta aromalampe) — za zaštitu od vlage HX711
- Komad drvenog blokova 25x50x300mm za osnovu tenzodatasetora.
- Dužina od deset samočepnih vijaka s podloškom 4.2x19 mm za pričvršćivanje senzora na osnovu.
Bateriju možete nabaviti s razbijenih prijenosnika — mnogo je jeftinija od nove, a kapacitet će biti daleko veći nego kod kineske UltraFire — kod mene je ispalo 1500 naspram 450 (to je kod fajera 6800 😉
Osim toga, trebat će vam nesmetane ruke, lemljenje EPSN-25, smolu i lem POS-60.

Prije 5 godina koristio sam sovjetski lemilicu s bakrenom vrhom (nikako nisam mogao prihvatiti lemljenje stanica – isprobao sam ih, ali sam završio s EPN-om).
No, nakon što je odustala i nekoliko kineskih strašnih podmeta, posljednja se zvala Sparta – stvar toliko surova kao i njen naziv, stao sam
na proizvod s termoregulatorom.
Idemo!

Za početak, odstranimo dva LED-a iz GSM modula (mjesto gdje su se nalazili označeno je narančastim ovalom)
SIM karticu umetnemo kontaktnim površinama prema tiskanoj ploci, kut s poslom na fotografiji označen je strelicom.

Zatim provodimo sličnu proceduru sa LED-om na Arduino ploči (oval lijevo od kvadratnog čipa),
Lejemo greben na četiri kontakta (1),
Uzimamo dva otpornika od 20k, uvijamo pinove s jedne strane, lemlimo uvijanjem u rupu kontakta A5, preostale pinove u RAW i GND Arduina (2),
Fotorezistoru skraćujemo noge na 10mm i lemlimo ga na pinove GND i D2 ploče (3).
Sada je vrijeme za plavu samoljepivu traku – lijeplimo je na držač SIM kartice modula, a na vrh – Arduino – crvena (srebrna) tipka okrenuta je prema nama i nalazi se iznad SIM kartice.
Lemimo napajanje: plus s kondenzatora modula (4) na kontakt RAW Arduina.
Naime, sam modul zahtijeva za svoje napajanje 3.4-4.2V, a njegov kontakt PWR je spojen na step-down pretvarač, stoga, za rad s li-ion naponom, treba ga spojiti mimo ovog dijela kruga.
S druge strane, u Arduinu napajamo kroz linearni pretvarač - pri malim strujnim potrošnjama, pad napona iznosi 0.1V.
Međutim, davanjem stabiliziranog napona na HX711 module, oslobađamo se potrebe za prilagodbom na manji napon (a istovremeno se smanjuje šum do kojeg dolazi uslijed ove operacije).
Zatim lemlimo sabirnice (5) između kontakata PWR-A1, URX-D4 i UTX-D5, „zemlju“ GND-G (6) te na kraju napajanje iz držača baterija 18650 (7), povezujemo antenu (8).
Sada uzimamo USB-TTL pretvarač i povezujemo ga Dupont žicama s ARDUINOM (greben 1) kontakte RXD-TXD i TXD-RXD, GND-GND:

Na gornjoj fotografiji - još prva verzija (od tri) sustava, koja se koristila za otklanjanje grešaka.
A sada se na trenutak odmičemo od lemilice i prelazimo na softverski dio.
Opisivat ću postupak za Windows:
Prvo, potrebno je preuzeti i instalirati/raspakovati program — trenutna verzija — 1.8.9, ali ja koristim 1.6.4
Za jednostavnost, raspakirajte arhivu u folder C:arduino-«broj_vaše_verzije», unutra će biti fascikle /dist, drivers, examples, hardware, java, lib, libraries, reference, tools, kao i izvršna datoteka arduino (pored ostalih).
Sada će nam biti potrebna biblioteka za rad s ADC-om — zelena dugmad «clone or download» — download ZIP.
Sadržaj (folder HX711-master) ide u katalog C:arduino-«broj_vaše_verzije»libraries
Naravno, potrebni su drajveri za sa istog githuba — iz raspakovane arhive samo pokrenite instalaciju datotekom SETUP.
U redu, pokrećemo i podešavamo program C:arduino-«broj_vaše_verzije»arduino

Idemo na «Alati» — biramo ploču «Arduino Pro ili Pro Mini», procesor Atmega 328 3.3V 8 MHz, port — broj osim sistemskog COM1 (on se pojavljuje nakon instalacije drajvera CH340 kada je USB-TTL adapter povezan)
U redu, kopiramo sledeći skeč (program), i lepljamo ga u prozor 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);
}
}
U prvoj liniji, u navodnicima char phone_no[]=»+123456789012″; — umesto 123456789012 stavljamo svoj broj telefona s pozivnim brojem zemlje na koji će stizati SMS-ovi.
Sada pritisnemo dugme za proveru (iznad broja jedan u ekranu iznad) — ako se ispod (ispod trojke na ekranu) piše «Kompilacija završena» — možemo da programiramo mikrokontroler.
Dakle, USB-TTL je povezan na ARDUINO i računar, stavljamo napunjen akumulator u držač (obično na novoj arduinou počinje treptati LED sa frekvencijom jednom u sekundi).
Sada počinjemo s programiranjem — vežbamo pritisnuti crveno(srebrno) dugme mikrokontrolera — to cemo morati učiniti tačno u određeni trenutak!!!
Imate? Pritiskamo dugme «Učitaj» (iznad dvojke na ekranu), i pažljivo se osvrnemo na red u donjem delu sučelja (ispod trojke iz ekrana).
Čim natpis «kompilacija» zameni «učitavanje» — pritisnemo crveno dugme (reset) — ako je sve u redu — na USB-TTL adapteru veselo će treptati lampice, a u donjem delu sučelja natpis «Učitano»
Sada dok čekamo dolazak testnog SMS-a na telefon, ispričat ću kako program funkcioniše:

Na slici — druga verzija testnog stuba.
Prilikom prvog uključivanja, sistem upoređuje bajtove brojeva 500 i 501 EEPROM-a, ako su jednaki, to znači da kalibracijski podaci nisu zapisani, i algoritam prelazi na odeljak podešavanja.
Isto se događa kada je fotootpor prilikom uključivanja zaklonjen (kapicom od olovke) — aktivira se način resetiranja parametara.
Tenzodetektori trebaju već biti postavljeni ispod košnica, jer jednostavno fiksiramo početnu razinu nule i dalje mjerimo promjenu težine (sada ćemo jednostavno dobiti nule, jer još ništa nismo priključili).
Na Arduinu će početi treptati integrirani LED na pin 13.
Ako resetiranje ne uspije, LED se pali tijekom 12 sekundi.
Nakon toga se šalje testna SMS poruka s informacijom „INITIAL BOOT OK“ i naponom baterije.
Modul veze se isključuje, i nakon 3 minute Arduino ploča prebacuje HX711 A/D konvertere u režim mirovanja i sama zaspi.
Ova kašnjenja su napravljena kako bi se izbjeglo hvatanje smetnji od aktivnog GSM modula (nakon isključivanja on neko vrijeme 'baca' smetnje).
Zatim imamo prekid po foto senzoru na drugom pinu (povezivanje na + putem pullup funkcije je omogućeno).
Nakon aktiviranja, još 3 minute se provjerava stanje fotootpora — da bi se isključila ponovna/lažna aktiviranja.
Zanimljivo je da bez ikakvih podešavanja sustav reagira 10 minuta nakon astronomskog zalaska sunca u oblačnom vremenu i nakon 20 minuta u vedrom vremenu.
Da, kako bi sustav prilikom svakog uključivanja ne radio reset, barem prvi modul HX711 mora biti priključen (pins DT-D10, SCK-A0).
Nakon toga se uzimaju mjerenja tenzodetektora, izračunava se promjena težine od prethodnog aktiviranja (prvi broj u retku nakon Hive) i od prvog uključivanja, provjerava se napon baterije i te informacije se šalju u obliku SMS-a:

Usput, jeste li dobili SMS? Čestitam! Na pola smo puta! Bateriju za sada možete izvaditi iz držača, računar nam više nije potreban.
Usput, kontrolni centar za letove ispao je toliko kompaktan da ga može stati u staklenku za majonezu, u mom slučaju savršeno se uklapa prozirna kutija veličine 30x60x100mm (od vizitki).
Da, uspavana sustav troši ~2.3mA — 90% zbog modula veze — ne isključuje se potpuno, nego prelazi u način čekanja.

Krećemo u izradu senzora, za početak ćemo obraditi dijagram rasporeda senzora:

Ovo je plan košnice — gornji pogled.
Klasično se postavljaju 4 senzora u kutovima (1,2,3,4)
Mjerit ćemo na drugačiji način. Točnije, čak i na treći. Budući da dečki iz BroodMinder rade to drugačije:

U ovoj konstrukciji senzori su postavljeni na pozicijama 1 i 2, točke 3 i 4 oslanjaju se na gredu.
Dakle, na senzore pada samo pola težine.
Da, ova metoda ima manju preciznost, ali teško je zamisliti da bi pčele izgradile sve okvire sa 'jezičcima' od voska duž jedne strane košnice.
Predlažem da sve senzore svedemo na točku 5 — tada otpada potreba za ekraniranjem sustava, a pri korištenju lakih košnica može se čitav posao obaviti samo s jednim senzorom.

Uglavnom, testirali su se dva tipa modula na HX711, dva tipa senzora i dvije opcije njihove povezanosti — s punim Wheatstoneovim mostom (2 senzora) i s pola, kada se druga polovina dopunjuje 1k otporima s tolerancijom 0,1%.
No, posljednji način je nepoželjan i nije preporučen ni od strane proizvođača senzora, stoga ću opisati samo prvi.
Dakle, na jednu košnicu postavljamo dva strain gage sensora i jedan modul HX711, shema povezivanja je sljedeća:

Od ADC ploče do Arduina ide 5 metara 4-žičanog telefonskog kabela — .
Uglavnom, ostavljamo 'repove' od senzora dužine 8 cm, skratimo uvrnutu žicu i sve povežemo kao na fotografiji iznad.
Prije nego što započnemo drvenarsku dio, stavite vosak/akati u odgovarajući spremnik da se otopi na vodenoj kupelji.
Sada uzimamo naš gredu i dijelimo ga na tri dijela od 100 mm.
Zatim označavamo uzdužni utor širine 25 mm, dubine 7-8 mm, i pomoću pile i dlijeta uklanjamo viškove — trebao bi ispasti U-oblik.
Je li se vosak otopio? — uronimo naše ADC ploče u njega — to će ih zaštititi od vlage/mista:

Sve to postavljamo na drvenu podlogu (neophodno je obraditi ga antiseptikom protiv truljenja):

I konačno, učvrstimo senzore samoreznim vijcima:

Bila je još opcija s plavom izolacijskom trakom, ali zbog humanih razloga je ne navodim 😉.
S strane Arduina radimo sljedeće:
Skraćujemo naše telefonske kabele, bojene žice uvijamo zajedno i lemljenje.
Nakon toga, lemljemo na kontakte ploče kao na fotografiji:

To je to, sada za konačnu provjeru, postavljamo senzore po sektorima kruga, na vrhu — komad šperploče, resetiramo kontroler (stavljamo bateriju s pokrivačem od autoručke na fotodiodu).
LED na Arduino mora trepćati i trebate primiti testnu SMS poruku.
Sada skidamo kapicu s fotoresistora i idemo puniti vodu u plastičnu bocu od 1,5 litara.
Stavljamo bocu na šperploču i, ako je prošlo nekoliko minuta od uključivanja, ponovno stavljamo kapicu na fotoresistor (imitujući zalazak sunca).
Nakon tri minute LED na Arduino će se upaliti, a trebali biste primiti SMS s vrijednostima težine oko 1 kg na svim pozicijama.
Čestitam! Sustav je uspješno sastavljen!
Ako sada ponovo aktivirate sustav, u prvoj koloni težine bit će nule.
Da, u stvarnim uvjetima fotoresistor je poželjno orijentirati vertikalno prema gore.
Sada ću navesti kratak priručnik za korištenje:
- Postavite senzore težine ispod stražnjih stranica košnica (ispod prednjih stavite drvo debljine ~30mm)
- Zasjenite fotoresistor i postavite bateriju — LED bi trebao treptati, a trebate primiti testnu SMS poruku s tekstom «INITIAL BOOT OK»
- Postavite središnju jedinicu na maksimalnu udaljenost od košnica i tako da žice ne ometaju rad s pčelama.
Svake večeri, nakon zalaska sunca, dolazit će SMS s promjenom težine tijekom dana i od trenutka pokretanja.
Prilikom postizanja napona baterije od 3,5V, SMS će završiti s porukom «!!! CHARGE BATTERY !!!»
Vrijeme rada od jedne baterije kapaciteta 2600mAh — oko mjesec dana.
U slučaju zamjene baterije, dnevne promjene težine košnica se ne pamte.
UPD UPOZORENJE!
U SLABIM SIGNALNIM UVJETIMA, GSM modul povećava snagu, što dovodi do REBOOTa SUSTAVA
To je otkriveno tijekom 'poljskih' ispitivanja (nije jasno zašto korisnici GSM modula ne prijavljuju takve probleme).
Trenutno pripremam novu shemu:

Nakon uspješnog pregleda, ova publikacija će biti ažurirana.
Elektropčelar Andrej.
Izvor: habr.com
