SMS-моніторинг ваги трьох вуликів за 30$

SMS-моніторинг ваги трьох вуликів за 30$

Ні, це не комерційна пропозиція, такою є вартість комплектуючих системи, яку Ви зможете зібрати після прочитання статті.

Трохи передісторії:

Якийсь час тому я вирішив завести бджіл, і вони таки з'явилися на цілий сезон, але не вийшли з зимівлі.
І це незважаючи на те, що начебто все робив правильно – осінній прикорм, утеплення перед холодами.
Вулик був класичний дерев'яний системи "Дадан" на 10 рамок з 40-мм дошки.
Але тієї зими через температурні «гойдалки» навіть досвідчені бджолярі втратили значно більше, ніж зазвичай.

Так прийшла ідея системи моніторингу стану вулика.
Після публікації кількох статей на Хабр-і та спілкування на форумі бджолярів, вирішив іти від простого до складного.
Вага — єдиний безперечний параметр, але, як правило, існуючі системи моніторять лише один «еталонний» вулик.
Якщо з ним щось йде не так (наприклад, виліт рою, хвороба бджіл), то показники стають неактуальними.

Тому вирішено було стежити за зміною ваги одразу трьох вуликів одним мікроконтролером, а інші «плюшки» додати після.
У результаті вийшла автономна система з часом роботи близько місяця на одному заряді батареї 18650 та відправкою статистики раз на добу.
Конструкцію намагався максимально спростити, щоб її можна було повторити навіть без схем, за одними фотографіями.

Логіка роботи наступна: при першому запуску/скиданні запам'ятовуються в EEPROM показання датчиків, встановлених під вулики.
Далі, щодня, після заходу сонця система «прокидається», зчитує показання та відправляє СМС зі зміною ваги за добу і від моменту включення.
Крім того, передається значення напруги батареї, а при зниженні до 3.5В видається попередження про необхідність зарядки, бо нижче 3.4В модуль зв'язку не включається, та й показання ваги вже «спливають».

«Ти пам'ятаєш, як усе починалося. Все було вперше і знову.
SMS-моніторинг ваги трьох вуликів за 30$
Так, саме такий набір «заліза» був спочатку, правда до кінцевого варіанта дожили лише тензодатчики та дроти, але про все по порядку.
Насправді, бухта кабелю не знадобиться, просто вона опинилася в ту ж ціну, що і 30м навідріз.

Якщо Ваc не лякає демонтаж 3 smd-світлодіодів і півсотні точок звичайної (вивідної) пайки - то в дорогу!

Отже, нам знадобиться наступний набір обладнання/матеріалів:

  1. Arduino Pro Mini 3V
    Слід звернути увагу на мікросхему лінійного перетворювача – вона має бути саме на 3.3В – на чіпі маркування KB 33/LB 33/DE A10 – у мене китайці щось наплутали, і вся партія
    плат у магазині виявилася з 5-вольтовими регуляторами та кварцами на 16MHz.
  2. USB-Ttl на чіпі CH340 можна навіть 5-вольтовий, але тоді під час прошивки мікроконтролера, Arduino потрібно буде відключати від GSM-модуля, щоб не спалити останній.
    Плати на чіпі PL2303 не працюють під Windows 10.
  3. Модуль зв'язку GSM Goouu Tech IOT GA-6-B або AI-THINKER A-6 Mini.
    Чому зупинився на ньому? Neoway M590 – конструктор, що вимагає окремих танців з бубнами, GSM SIM800L – не сподобався нестандартний 2.8V рівень логіки, що вимагає узгодження навіть із тривольтовою ардуїнкою.
    До того ж, рішення від AiThinker має мінімальне споживання енергії (при відправці СМС не бачив струму вище 100мА).
  4. Антена GSM GPRS 3DBI (на фото вище - прямокутна хустка з "хвостиком", на 9 годин)
  5. Стартовий пакет оператора, що має гарне покриття у місці розташування Вашої пасіки.
    Так, пакет треба попередньо активувати у звичайному телефоні, ВІДКЛЮЧИТИ ЗАПИТ PIN при вході, і поповнити рахунок.
    Зараз є багато варіантів із назвами в стилі «Датчик», «IoT» — у них дещо менша абонплата.
  6. провід dupont 20см мама-мама - 3 шт. (для підключення Arduino до USB-TTL)
  7. 3 шт. HX711 - АЦП для ваг
  8. 6 тензодатчиків на вагу до 50 кг
  9. 15метрів 4-жильного телефонного кабелю – для з'єднання модулів ваги з ARDUINO.
  10. Фоторезистор GL5528 (важливо саме такий, з темновим опором 1МОм та світловим 10-20кОм) та два звичайні резистори на 20к
  11. Шматок двостороннього «товстого» скотчу 18х18мм – для кріплення ардуїно до модуля зв'язку.
  12. Утримувач батарей 18650 і, власне, сама батарея ~2600мАч.
  13. Трохи воску або парафіну (свічка-таблетка аромалампи) - для вологозахисту HX711
  14. Відрізок дерев'яного бруса 25х50х300мм для основи тензодатчиків.
  15. Дюжина шурупів з пресшайбою 4,2х19 мм для кріплення датчиків до основи.

Батарею можна взяти з розбирання ноутбуків - у рази дешевше за нову, а ємність вийде куди більше, ніж у китайської UltraFire - у мене вийшло 1500 проти 450 (це у фаєра 6800 😉

Крім цього, будуть потрібні некриві руки, паяльник ЕПСН-25, каніфоль і припій ПОС-60.

SMS-моніторинг ваги трьох вуликів за 30$

Ще 5 років тому я користувався радянським паяльником з мідним жалом (ось не зайшли мені паяльні станції — брав на тест-драйв і закінчував схему ЕПСН).
Але після виходу його з ладу та кількох китайських жахливих під-ялинок, остання мала назву Sparta — річ настільки ж сувора, як і назва, зупинився.
на виробі із терморегулятором.

Тож поїхали!

SMS-моніторинг ваги трьох вуликів за 30$

Для початку, випаюємо з GSM-модуля два світлодіоди (місце, де вони були обведені помаранчевим овалом)
Сім-карту вставляємо контактними майданчиками до друкованої плати, скошений куточок на фото позначений стрілкою.

SMS-моніторинг ваги трьох вуликів за 30$

Далі аналогічну процедуру проводимо зі світлодіодом на платі Arduino (овал зліва від квадратного чіпа),
Паяємо гребінку на чотири контакти (1),
Беремо два резистори на 20k, скручуємо висновки з одного боку, паяємо скручування в отвір контакту A5, висновки, що залишилися в RAW і GND ардуїнки (2),
Фоторезистору укорочуємо ноги до 10мм і паяємо його до висновків GND та D2 плати (3).

Тепер настав час синьої ізолятори двостороннього скотчу - клеїмо його на тримач сім-карти модуля зв'язку, а зверху - ардуїно - червона (срібляста) кнопка звернена до нас і знаходиться над сімкою.

Паяємо харчування: плюс із конденсатора модуля зв'язку (4) на контакт RAW arduino.
Справа в тому, що сам модуль зв'язку вимагає для свого живлення 3.4-4.2В, а його контакт PWR заведений на знижуючий перетворювач step-down, тому для роботи від li-ion напруга треба подавати минаючи цю частину ланцюга.

В ардуїно ж, навпаки ми заводимо харчування через лінійний перетворювач - при малих струмах споживання, падіння напруги drop-out становить 0.1В.
Зате подавши стабілізовану напругу на модулі HX711, ми позбавляємось необхідності їх доопрацювання під менший вольтаж (і заодно підвищення шумів в результаті даної операції).

Далі паяємо перемички (5) між контактами PWR-A1, URX-D4 і UTX-D5, «землю» GND-G (6) та нарешті живлення від тримача батарей 18650 (7), підключаємо антену (8).
Тепер беремо USB-TTL перетворювач і з'єднуємо проводами Dupont з ARDUINO (гребінка 1) контакти RXD-TXD та TXD-RXD, GND-GND:

SMS-моніторинг ваги трьох вуликів за 30$

На фото вище ще перша версія (з трьох) системи, яка використовувалася для налагодження.

А ось тепер ми на деякий час відвернемося від паяльника і перейдемо до програмної частини.
Описуватиму послідовність дій для Windows:
По-перше, необхідно завантажити та встановити/розпакувати програму Arduino IDE - поточна версія - 1.8.9, але я користуюся 1.6.4

Для простоти розпаковуємо архів у папку C:arduino-«номер_Вашої_версії», усередині у нас будуть папки /dist, drivers, examples, hardware, java, lib, libraries, reference, tools, а також виконуваний файл arduino (крім інших).

Тепер нам потрібна бібліотека для роботи з АЦП HX711 - зелена кнопка "clone or download" - download ZIP.
Вміст (папка HX711-master) лягає в каталог C:arduino-«номер_Вашої_версії»libraries

Ну і звичайно ж драйвер для USB-TTL з того ж github - з розпакованого архіву легко запускається інсталяція файлом SETUP.

Ок, запускаємо та налаштовуємо програму C:arduino-«номер_Вашої_версії»arduino

SMS-моніторинг ваги трьох вуликів за 30$

Заходимо в пункт «Інструменти»-вибираємо плату Arduino Pro or Pro Mini, процесор Atmega 328 3.3V 8 MHz, порт — номер крім системного COM1 (він з'являється після установки драйвера CH340 при підключеному USB-TTL адаптері)

Ок, копіюємо нижченаведений скетч (програму), і вставляємо її у вікно 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 ставимо свій номер телефону з кодом країни, на який приходитимуть SMS.

Тепер тиснемо кнопку перевірити (над цифрою один у скріншоті вище) - якщо внизу (під трійкою на скрині) "Компіляція завершена" - то можемо прошивати мікроконтролер.

Так, USB-TTL підключений до ARDUINO та комп'ютера, ставимо заряджений акумулятор у тримач (зазвичай на новій ардуїнці починає моргати світлодіод із частотою раз на секунду).

Тепер прошивка - тренуємося натискати червону (сріблясту) кнопку мікроконтролера - це потрібно буде зробити строго в певний момент!
Чи є? Тиснемо кнопку «Ввантажити» (над двійкою на скріншоті), і уважно дивимося на рядок внизу інтерфейсу (під трійкою скрина).
Як тільки напис "компіляція" зміниться "завантаженням" - тиснемо червону кнопку (ресет) - якщо всі ок - на USB-TTL адаптері радісно заморгають вогники, а внизу інтерфейсу напис "Ввантажили"

Тепер поки ми чекаємо на прихід тестової СМС на телефон, розповім як працює програма:

SMS-моніторинг ваги трьох вуликів за 30$

На фото – друга версія налагоджувального стенду.

При першому включенні система звіряє байти номер 500 і 501 EEPROM якщо вони рівні, значить калібрувальні дані не записані, алгоритм переходить до розділу налаштування.
Те саме відбувається, якщо при включенні фоторезистор затінений (ковпачком від авторучки) - активується режим скидання параметрів.

Тензодатчики вже повинні бути встановлені під вулики, оскільки ми просто фіксуємо початковий рівень нуля і далі вимірюємо зміну ваги (зараз просто прийдуть нулі, оскільки ми нічого ще не підключали).
На ардуїно почне моргати вбудований світлодіод піна 13.
Якщо скидання не відбувається, світлодіод спалахує на 12 секунд.
Після цього відправляється тестова СМС із повідомленням «INITIAL BOOT OK» та напругою батареї.
Модуль зв'язку вимикається і через 3 хвилини плата Ардуїно переводить плати АЦП HX711 в режим сну і засинає сама.
Така затримка зроблена щоб не ловити наведення від працюючого GSM-модуля (після вимкнення він деякий час «фонить»).

Далі, у нас працює переривання фотодатчиком на другому піні (включена підтяжка плюсу функцією pullup).
При цьому після спрацьовування ще 3 хвилини перевіряється стан фоторезистора для виключення повторних/хибних спрацьовувань.
Що характерно, без будь-якого налаштування система спрацьовує через 10 хвилин після астрономічного заходу сонця в похмуру погоду і через 20 в ясну.
Так, щоб при кожному включенні система не робила скидання, повинен бути підключений принаймні перший модуль HX711 (піни DT-D10, SCK-А0)

Потім знімаються показання тензодатчиків, обчислюється зміна ваги з попереднього спрацьовування (перше число в рядку після Hive) і від першого включення, перевіряється напруга батареї і ця інформація надсилається у вигляді SMS:

SMS-моніторинг ваги трьох вуликів за 30$

До речі, чи отримали СМС? Вітаю! Ми на середині шляху! Батарею поки що можна витягти з власника, комп'ютер нам далі не знадобиться.

До речі, центр управління польотами вийшов настільки компактним, що його можна вмістити в майонезну баночку, в моєму випадку чудово підійшла напівпрозора коробочка розміром 30х60х100мм (від візиток).

Так, спляча система споживає ~2.3мА - на 90% за рахунок модуля зв'язку - він не вимикається повністю, а переходить в режим очікування.

SMS-моніторинг ваги трьох вуликів за 30$

Приступаємо до виготовлення датчиків, для початку торкнемося схеми розташування сенсорів:

SMS-моніторинг ваги трьох вуликів за 30$

Це план вулика – вид зверху.

Класично, встановлюються 4 сенсори по кутах (1,2,3,4)

Ми ж міряти будемо інакше. А точніше навіть по-третє. Оскільки по-іншому роблять хлопці з BroodMinder:

SMS-моніторинг ваги трьох вуликів за 30$

У даній конструкції датчики встановлені на позиціях 1 і 2 точки 3,4 спираються на брус.
Тоді на сенсори припадає лише половина ваги.
Так, такий спосіб має меншу точність, але все-таки складно уявити, щоб бджоли забудували всі рамки «мовами» з сотень вздовж однієї стіни вулика.

Так ось, я пропоную взагалі звести датчики в точку 5 - тоді відпадає необхідність в екрануванні системи, а при використанні легких вуликів взагалі обходитися одним сенсором.

SMS-моніторинг ваги трьох вуликів за 30$

Загалом було перевірено два види модулів на HX711, два види датчиків, і два варіанти їх з'єднання — з повним мостом Уітстона(2 сенсори) та з половинкою, коли друга частина доповнюється 1к резисторами з допуском 0.1%.
Але останній спосіб небажаний і не рекомендований навіть виробниками сенсорів, тож опишу лише перший.

Отже, на один вулик у нас буде встановлюватись два тензодатчики і один модуль HX711 схема розпаювання наступна:

SMS-моніторинг ваги трьох вуликів за 30$

Від плати АЦП до Ардуїно йде 5 метрів 4-жильного телефонного кабелю. ми ж пам'ятаємо, як бджоли не люблять GSM-пристрою у вулику.

Загалом, на датчиках залишаємо «хвости» по 8см, зачищаємо кручений пару і все розпаюємо як на фото вище.

Перед початком столярної частини поставте віск/парафін у відповідній ємності плавитися на водяну баню.

Тепер беремо наш брус і ділимо на три відрізки по 100мм

Далі розмічаємо поздовжній паз шириною 25 мм, глибиною 7-8мм, за допомогою ножівки та стамески забираємо зайве - повинен вийти п-подібний профіль.

Віск розігрівся? - занурюємо туди наші плати АЦП - це захистить їх від вологи/туману:

SMS-моніторинг ваги трьох вуликів за 30$

Маємо це все на дерев'яній основі (необхідно обробити антисептиком від гниття):

SMS-моніторинг ваги трьох вуликів за 30$

Ну і нарешті, фіксуємо датчики шурупами:

SMS-моніторинг ваги трьох вуликів за 30$

Був ще варіант із синьою ізолентою, але з міркувань гуманності його не наводжу 😉

З боку Ардуїно робимо таке:

Зачищаємо наші телефонні кабелі, кольорові жили скручуємо між собою, лудимо.

Після цього паяємо до контактів плати як на фото:

SMS-моніторинг ваги трьох вуликів за 30$

Все, тепер для кінцевої перевірки, ставимо датчики по секторах кола, зверху - шматок фанери, обнуляємо контролер (ставимо батарею з одягненим на фотодіод ковпачком від авторучки).

При цьому має заморгати світлодіод на ардуїнці та прийти тестова СМС.

Далі знімаємо з фотоелемента ковпачок і йдемо набирати воду в 1.5 літрову пластикову пляшку.
Ставимо пляшку на фанеру і якщо вже пройшло кілька хвилин від включення, одягаємо ковпачок назад на фоторезистор (імітуючи захід сонця).

Через три хвилини світлодіод на ардуїно загориться, і Вам має прийти СМС зі значеннями ваги близько 1 кг на всіх позиціях.

Вітаю! система успішно зібрана!

Якщо тепер змусити систему спрацювати повторно, то першій колонці ваги вийдуть нулі.

Так, у реальних умовах фоторезистор бажано орієнтувати вертикально нагору.

Тепер наведу короткий мануал з користування:

  1. Встановити тензодатчики під задні стінки вуликів (під передні підставити брус/дошку завтовшки ~30мм)
  2. Затінити фоторезистор і поставити акумулятор - повинен заморгати світлодіод і прийти тестова SMS з текстом INITIAL BOOT OK
  3. Розташувати центральний блок на максимальному віддаленні від вуликів і так, щоб дроти не заважали під час роботи з бджолами.
    Щовечора, після заходу сонця буде приходити СМС зі зміною ваги за добу і з моменту запуску.
    При досягненні напруги батареї значення 3.5В СМС буде закінчуватися рядком «!!! CHARGE BATTERY !!!»
    Час роботи від однієї батареї ємністю 2600мАч - близько місяця.
    У разі заміни батареї добові зміни ваги вуликів не запам'ятовуються.

Що далі?

  1. Придумати як оформити все це в проект для github
  2. Завести 3 бджолиних сім'ї у вуликах системи Паливоди(або рогатих у народі)
  3. Додати "плюшок" - вимірювання вологості, температури, а головне - аналіз дзижчання бджіл.

Потім поки все, щиро Ваш, електробджоляр Андрій

Джерело: habr.com

Додати коментар або відгук