Ei, see ei ole kommertspakkumine, see on süsteemikomponentide maksumus, mille saate pärast artikli lugemist kokku panna.
Natuke tausta:
Mõni aeg tagasi otsustasin mesilased hankida ja küll nad ilmusid... terveks hooajaks, aga ei lahkunud talveonnist.
Ja seda hoolimata sellest, et ta paistis kõike õigesti tegevat – sügisene lisasöötmine, soojustamine enne külma ilma.
Taru oli klassikaline puidust Dadani süsteem 10 raamiga 40 mm laudadest.
Kuid sel talvel kaotasid isegi kogenud mesinikud temperatuurikõikumiste tõttu palju rohkem kui tavaliselt.
Nii tekkis idee taru seisukorra jälgimise süsteemist.
Pärast mitme Habri artikli avaldamist ja mesinike foorumis suhtlemist otsustasin minna lihtsast keeruliseks.
Ainus vaieldamatu parameeter on kaal, kuid reeglina jälgivad olemasolevad süsteemid ainult ühte “referentstaru”.
Kui sellega midagi valesti läheb (näiteks sülemi lahkumine, mesilaste haigus), siis muutuvad näitajad ebaoluliseks.
Seetõttu otsustati ühe mikrokontrolleri abil jälgida korraga kolme taru kaalu muutust ja hiljem lisada muud “head”.
Tulemuseks oli autonoomne süsteem, mille tööaeg on 18650 aku ühe laadimisega umbes kuu ja mis saadab statistikat kord päevas.
Üritasin kujundust võimalikult palju lihtsustada, et seda saaks korrata ka ilma diagrammideta, lihtsalt fotodelt.
Tööloogika on järgmine: esimese käivitamise/lähtestamise ajal salvestatakse tarude alla paigaldatud andurite näidud EEPROM-i.
Seejärel iga päev pärast päikeseloojangut süsteem “ärkab”, loeb näidud ja saadab SMS-i kaalumuutusega päeva ja sisselülitamise hetke kohta.
Lisaks edastatakse aku pinge väärtus ja kui see langeb 3.5 V-ni, antakse hoiatus laadimisvajaduse kohta, sest alla 3.4 V sidemoodul ei lülitu sisse ja kaalunäidud juba “ujuvad minema”.
"Kas sa mäletad, kuidas see kõik algas. Kõik oli esimest korda ja uuesti.”
Jah, see on täpselt see riistvarakomplekt, mis algselt oli, kuigi lõpliku versioonini säilisid ainult pingeandurid ja juhtmed, kuid kõigepealt.
Tegelikult pole kaablipooli vaja, see osutus lihtsalt sama hinnaga kui 30 m sirge.
Kui te ei karda 3 SMD LED-i lahtivõtmist ja pooltsada punkti tavalist (väljund)jootmist, siis minge!
Seega vajame järgmisi seadmeid/materjale:
- Arduino Pro Mini 3V
Tähelepanu tuleks pöörata lineaarmuunduri mikroskeemile - see peaks olema täpselt 3.3 V - kiibil märgistus KB 33/LB 33/DE A10 - minu hiinlasel läks midagi valesti ja kogu partii
Poes olevatel plaatidel osutusid 5-voldised regulaatorid ja 16MHz kristallid. - USB-Ttl CH340 kiibil - saab kasutada isegi 5-voldist, kuid siis tuleb mikrokontrolleri vilkumise ajal Arduino GSM-moodulist lahti ühendada, et viimast mitte põletada.
PL2303 kiibil põhinevad plaadid ei tööta Windows 10 all. - GSM-sidemoodul Goouu Tech IOT GA-6-B või AI-THINKER A-6 Mini.
Miks sa seal peatusid? Neoway M590 - disainer, mis nõuab eraldi tantsu tamburiinidega, GSM SIM800L - ei meeldinud ebastandardne 2.8 V loogika tase, mis nõuab kooskõlastamist isegi kolmevoldise Arduinoga.
Lisaks on AiThinkeri lahendus minimaalse energiakuluga (SMS-i saatmisel ma ei näinud voolu suuremat kui 100mA). - GSM GPRS 3DBI antenn (ülaloleval fotol - "sabaga" ristkülikukujuline sall, kell 9)
- Hea levialaga operaatori stardipakett teie mesila asukohas.
Jah, esmalt tuleb pakett tavalises telefonis aktiveerida, sisenemisel KEELATA PIN-KOOTING ja oma kontot täiendada.
Nüüd on palju valikuid, mille nimed on stiilis “Sensor”, “IoT” - neil on pisut madalam liitumistasu. - dupont traat 20cm emane-emane - 3 tk. (Arduino ühendamiseks USB-TTL-ga)
- 3 tk. HX711 - ADC kaaludele
- 6 koormusandurit kaalule kuni 50 kg
- 15 meetrit 4-soonelist telefonikaablit - kaalumoodulite ühendamiseks ARDUINO-ga.
- Fototakisti GL5528 (see on oluline, tumetakistus 1 MΩ ja valgustakistus 10-20 kΩ) ja kaks tavalist 20 kΩ takistit
- Tükk kahepoolset “paksust” teipi 18x18mm - Arduino sidemooduli külge kinnitamiseks.
- 18650 akuhoidja ja tegelikult ka aku ise on ~2600mAh.
- Natuke vaha või parafiini (küünla-tableti aroomilamp) - niiskuskaitseks HX711
- Tükk puittala 25x50x300mm tensoandurite alusele.
- Kümmekond isekeermestavat kruvi koos 4,2x19 mm pressseibiga andurite aluse külge kinnitamiseks.
Aku saab võtta sülearvutite lahtivõtmisest - see on mitu korda odavam kui uus ja mahutavus on palju suurem kui Hiina UltraFire - sain 1500 versus 450 (see on tulekahju jaoks 6800 😉
Lisaks vajate kindlaid käsi, EPSN-25 jootekolbi, kampolit ja POS-60 jootetiiru.
Isegi 5 aastat tagasi kasutasin nõukogude vasest otsaga jootekolvi (jootmisjaamad minu jaoks ei töötanud - viisin selle proovisõidule ja lõpetasin vooluringi EPSN-iga).
Kuid pärast ebaõnnestumist ja mitmeid Hiina koletuid võltsinguid hakati viimast nimetama Spartaks - nii tõsine asi kui nimi, peatus
termostaadiga tootel.
Nii et lähme!
Alustuseks jootsime GSM-moodulist lahti kaks LED-i (koht, kus need asusid, on ümbritsetud oranži ovaaliga)
Sisestame SIM-kaardi koos kontaktplaatidega trükkplaadile, fotol olev kaldnurk on tähistatud noolega.
Seejärel teostame sarnase protseduuri Arduino tahvli LED-iga (ovaalne ruudukujulisest kiibist vasakul),
Jootke kamm nelja kontaktiga (1),
Võtame kaks 20k takistit, keerame juhtmed ühel küljel, jootme keerd tihvti A5 auku, ülejäänud juhtmed on arduino RAW ja GND (2),
Lühendame fototakisti jalad 10 mm-ni ja jootame selle plaadi (2) GND ja D3 tihvtide külge.
Nüüd on käes kahepoolse teibi sinise elektrilindi aeg - liimime selle sidemooduli SIM-kaardi hoidiku külge ja peal - Arduino - punane (hõbedane) nupp on meie poole ja asub SIM-kaardi kohal.
Jootme toiteploki: pluss sidemooduli kondensaatorist (4) RAW arduino tihvti.
Fakt on see, et sidemoodul ise vajab oma toiteallikaks 3.4-4.2 V ja selle PWR-kontakt on ühendatud astmelise muunduriga, nii et liitiumioonist töötamiseks tuleb pinge anda sellest ahela osast mööda minnes.
Vastupidi, Arduinos varustame toidet lineaarmuunduri kaudu - madala voolutarbimise korral on pingelangus 0.1 V.
Kuid andes HX711 moodulitele stabiliseeritud pinge, vabaneme vajadusest neid madalamale pingele muuta (ja samal ajal selle toimingu tulemusel suurenevast mürast).
Järgmiseks jootme džemprid (5) tihvtide PWR-A1, URX-D4 ja UTX-D5 vahele, maandame GND-G (6) ja lõpuks toide 18650 patareihoidjast (7), ühendame antenni (8).
Nüüd võtame USB-TTL muunduri ja ühendame RXD-TXD ja TXD-RXD, GND-GND kontaktid Duponti juhtmetega ARDUINOga (kamm 1):
Ülaltoodud foto näitab süsteemi esimest versiooni (kolmest), mida kasutati silumiseks.
Aga nüüd teeme jootekolbist mõneks ajaks pausi ja liigume edasi tarkvara osa juurde.
Kirjeldan Windowsi toimingute jada:
Esiteks peate programmi alla laadima ja installima/lahti pakkima
Lihtsuse huvides pakime arhiivi lahti kausta C: arduino - “teie_versiooni_number”, sees on kaustad /dist, draiverid, näited, riistvara, java, lib, teegid, viide, tööriistad ja ka arduino käivitatav fail (teiste hulgas).
Nüüd vajame ADC-ga töötamiseks raamatukogu
Sisu (kaust HX711-master) paigutatakse kataloogi C:arduino-“teie_versiooni_number”teegid
Ja muidugi juht
Ok, käivitame ja konfigureerime programmi C:arduino-“teie_versiooni_number”arduino
Avage üksus "Tööriistad" - valige plaat "Arduino Pro või Pro Mini", Atmega 328 3.3 V 8 MHz protsessor, port - muu number peale süsteemi COM1 (see ilmub pärast CH340 draiveri installimist USB-TTL-adapteriga ühendatud)
Ok, kopeerige järgmine visand (programm) ja kleepige see Arduino IDE aknasse
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);
}
}
Esimesel real jutumärkides char phone_no[]=”+123456789012″; — sisestage 123456789012 asemel oma telefoninumber koos riigikoodiga, kuhu SMS saadetakse.
Nüüd vajutame kontrollinuppu (ülaloleval ekraanipildil numbri ühe kohal) - kui allosas (ekraanil numbri kolme all) “Kompleerimine on lõpetatud” - saame mikrokontrolleri vilkuda.
Niisiis, USB-TTL ühendatakse ARDUINO ja arvutiga, asetage laetud aku hoidikusse (tavaliselt hakkab uuel Arduinol LED vilkuma korra sekundis).
Nüüd püsivara kohta - me treenime vajutama mikrokontrolleri punast (hõbedast) nuppu - seda tuleb teha rangelt teatud hetkel!!!
Sööma? Klõpsake nuppu Laadi (ekraanipildil kahe kohal) ja vaadake hoolikalt liidese allosas olevat rida (ekraanipildil kolme all).
Niipea kui koostamise kiri muutub allalaadimiseks, vajutage punast nuppu (lähtestamine) - kui kõik on korras, vilguvad USB-TTL-adapteri tuled rõõmsalt ja liidese allosas on kiri "Üleslaaditud ”
Nüüd, kui ootame telefoni test-SMS-i saabumist, räägin teile, kuidas programm töötab:
Fotol on silumisaluse teine versioon.
Esmakordsel sisselülitamisel kontrollib süsteem EEPROM-i baite 500 ja 501; kui need on võrdsed, siis kalibreerimisandmeid ei salvestata ja algoritm liigub häälestussektsiooni.
Sama juhtub ka siis, kui sisselülitamisel on fototakisti varjutatud (pliiatsi korgiga) - lähtestamisrežiim on aktiveeritud.
Koormusandurid tuleks juba tarude alla paigaldada, kuna fikseerime lihtsalt esialgse nulltaseme ja siis mõõdame kaalu muutust (nüüd tulevad lihtsalt nullid, kuna me pole veel midagi ühendanud).
Samal ajal hakkab Arduinol vilkuma kontakti 13 sisseehitatud LED.
Kui lähtestamist ei toimu, süttib LED 12 sekundiks.
Pärast seda saadetakse test SMS sõnumiga "INITIAL BOOT OK" ja aku pinge.
Sidemoodul lülitub välja ja 3 minuti pärast paneb Arduino plaat HX711 ADC plaadid unerežiimile ja uinub ise.
See viivitus tehti selleks, et mitte võtta häireid töötavast GSM-moodulist (pärast väljalülitamist "ubab" mõnda aega).
Järgmisena on meil teisel kontaktil fotosensori katkestus (plussi funktsioon on lubatud).
Sel juhul kontrollitakse pärast käivitamist fototakisti seisukorda veel 3 minutit - korduva/vale vallandamise välistamiseks.
Tüüpiline on see, et ilma reguleerimiseta aktiveeritakse süsteem pilves ilmaga 10 minutit pärast astronoomilist päikeseloojangut ja 20 minutit selge ilmaga.
Jah, et süsteem ei lähtestuks iga kord, kui see sisse lülitatakse, tuleb ühendada vähemalt esimene HX711 moodul (kontaktid DT-D10, SCK-A0)
Seejärel võetakse pingeandurite näidud, arvutatakse kaalumuutus eelmisest toimingust (esimene number reas pärast Taru) ja alates esimesest aktiveerimisest kontrollitakse aku pinget ja see teave saadetakse SMS-ina:
Muide, kas saite SMS-i kätte? Palju õnne! Oleme poolel teel! Aku saab esialgu hoidikust eemaldada, arvutit meil enam vaja ei lähe.
Muide, missiooni juhtimiskeskus osutus nii kompaktseks, et selle saab majoneesipurki panna, minu puhul sobis suurepäraselt läbipaistev karp mõõtudega 30x60x100mm (visiitkaartidelt).
Jah, magamissüsteem tarbib ~2.3mA - 90% tänu sidemoodulile - ei lülitu täielikult välja, vaid läheb ooterežiimile.
Alustame andurite valmistamist; kõigepealt puudutame andurite paigutust:
See on taru plaan – pealtvaade.
Klassikaliselt on nurkadesse paigaldatud 4 andurit (1,2,3,4)
Me mõõdame teisiti. Õigemini, isegi kolmandal viisil. Sest BroodMinderi poisid teevad seda erinevalt:
Selles konstruktsioonis on andurid paigaldatud positsioonidele 1 ja 2, punktid 3,4 ja XNUMX toetuvad talale.
Siis moodustavad andurid vaid poole kaalust.
Jah, selle meetodi täpsus on väiksem, kuid siiski on raske ette kujutada, et mesilased ehitaksid kõik kärgede “keeltega” raamid mööda ühte taruseina.
Seega teen ettepaneku viia andurid kokku punktis 5 - siis pole vaja süsteemi varjestada ja valgustarude kasutamisel on täiesti vaja ühe anduriga leppida.
Üldiselt katsetasime HX711-l kahte tüüpi mooduleid, kahte tüüpi andureid ja kahte võimalust nende ühendamiseks - täis Wheatstone'i sillaga (2 andurit) ja poolega, kui teist osa täiendatakse 1k takistitega. tolerants 0.1%.
Kuid viimane meetod on ebasoovitav ja seda ei soovita isegi andurite tootjad, seega kirjeldan ainult esimest.
Seega paigaldame ühe taru jaoks kaks pingemõõturit ja ühe HX711 mooduli, ühendusskeem on järgmine:
ADC-plaadilt Arduinosse on 5 meetrit 4-juhtmelist telefonikaablit -
Üldiselt jätame anduritele 8 cm “sabad”, eemaldame keerdpaari ja jootme kõik nagu ülaltoodud fotol.
Enne puusepatööde alustamist asetage vaha/parafiin sobivasse anumasse, et see veevannis sulaks.
Nüüd võtame oma puidu ja jagame selle kolmeks osaks, millest igaüks on 100 mm
Järgmisena märgime 25 mm laiuse, 7-8 mm sügavuse pikisuunalise soone, eemaldame rauasae ja peitli abil ülejäägi - peaks tekkima U-kujuline profiil.
Kas vaha on soojendatud? — kastame sinna oma ADC-plaadid — see kaitseb neid niiskuse/udu eest:
Asetame selle kõik puidust alusele (mädanemise vältimiseks tuleb seda töödelda antiseptiga):
Ja lõpuks kinnitame andurid isekeermestavate kruvidega:
Sinise elektrilindiga oli ka variant, aga inimlikkuse kaalutlustel ma seda ei esita 😉
Arduino poolelt teeme järgmist:
Eemaldame oma telefonikaablid, keerame värvilised juhtmed kokku ja tinatame.
Pärast seda jootke plaadi kontaktidele nagu fotol:
See on kõik, nüüd viimaseks kontrolliks panime andurid ringi sektoritesse, peale vineeritüki, lähtestasime kontrolleri (panime fotodioodile pliiatsi korgiga aku).
Samal ajal peaks Arduino LED-tuli vilkuma ja saabuma test-SMS.
Seejärel eemaldage fotoelemendilt kork ja täitke vesi 1.5-liitrisesse plastpudelisse.
Panime pudeli vineerile ja kui selle sisselülitamisest on juba mitu minutit möödas, paneme fototakistile korgi tagasi (simuleerides päikeseloojangut).
Kolme minuti pärast süttib Arduino LED-tuli ja peaksite saama SMS-i, mille kaaluväärtused on kõigis asendites umbes 1 kg.
Palju õnne! Süsteem on edukalt kokku pandud!
Kui nüüd sundida süsteemi uuesti tööle, siis esimeses kaaluveerus on nullid.
Jah, reaalsetes tingimustes on soovitav suunata fototakisti vertikaalselt ülespoole.
Nüüd annan lühikese kasutusjuhendi:
- Paigaldage tarude tagaseinte alla pingeandurid (eesmiste alla asetage ~30 mm paksune tala/laud)
- Varjutage fototakisti ja paigaldage aku – LED-tuli peaks vilkuma ja peaksite saama test-SMS-i tekstiga "INITIAL BOOT OK"
- Asetage keskseade tarudest maksimaalsele kaugusele ja nii, et juhtmed ei segaks mesilastega töötamist.
Igal õhtul pärast päikeseloojangut saate SMS-i oma kaalumuutustega päeva ja käivitamise hetke kohta.
Kui aku pinge jõuab 3.5 V-ni, lõpeb SMS reaga “!!! LAADI AKU!!!"
Ühe 2600 mAh aku tööaeg on umbes kuu.
Patarei vahetamisel igapäevaseid muutusi tarude kaalus ei mäleta.
Mis edasi?
- Mõelge välja, kuidas seda kõike Githubi projekti lisada
- Palivoda süsteemi tarudesse rajada 3 mesilasperet (või rahvas sarvilisi)
- Lisage "kuklid" - niiskuse, temperatuuri mõõtmine ja mis kõige tähtsam - mesilaste suminate analüüsimine.
See on praeguseks kõik, siiralt teie, elektrimesinik Andrei
Allikas: www.habr.com