Собираем СМС-весы пчеловода на Arduino без пайки* + как это работает

Scale

Пчеловоды – весьма трудолюбивый и неунывающий народ, который нередко сам делает инвентарь для пасеки!

Но многих смущает обилие пайки в моей конструкции.

Поэтому я решил сделать максимально простой проект в духе Массимо Банци (одного из создателей Arduino).

Кроме того, Вы не поверите, но за годы работы с этой платформой, у меня никогда не было беспаечной макетной платы:

400

Она так и зовется, макетная плата-400

Но я-бы рекомендовал еще взять плату PCB 5х7см, если решите вдруг увековечить конструкцию при помощи паяльника 😉

Естественно, дело не обойдется без Arduino Pro Mini 3.3V 8Mhz:

Arduino

,модуля связи SIM800l с антенкой:

SIM800l

и модуля АЦП HX-711:

HX711

На последних трех компонентах попросите сразу распаять контактные гребенки (в радиомагазинах за скромную плату обычно это делают):

Комплект

В результате, мы получим таких вот букашечек-таракашечек 😉

Единственное, что придется паять самостоятельно – это сигнальные провода (E+ E- A+ A-) на плате АЦП.

Кроме того нам понадобится:

USB-UART конветер CH340, диод 1N4007, электролитический конденсатор 2200 мкФ 16V, фоторезистор GL5528 и модуль зарядки TP4056(если мы будем использовать LiIon батарею).

Еще нужны будут по десятку гибких проводников для макетирования (dupont) папа-папа, мама-мама, папа-мама (всего 30).
В принципе, их надо меньше, но если брать поштучно, по 7-8, они будут стоить те-же деньги.

Это все обойдется ну максимум долларов в 15, но самую вишенку я оставил напоследок 😉

Нам понадобятся неработающие напольные электронные весы, которые кто выбрасывает, а кто просто отдает за бутылку пива.

Тут мы вообще убиваем сразу двух зайцев – экономим 5$ на тензодатчиках(которые обычно не ломаются), и получаем красивую основу для них-же :

Даром!

А если вспомнить, что тем самым мы избавляем свалку от пополнения еще одним компонентом, то вообще можно приписать себя к движению “зеленых” 😉

Не удалось раздобыть весы бесплатно? Не беда! Такие наверняка есть у Вашей жены/девушки/любовницы!

Убедите ее что она самая прекрасная даже без процедур взвешивания, и дело в шляпе!

А заодно утащите с кухни одну из прозрачных коробочек для продуктов, но лучше все-таки попросить 😉

Темы питания я сейчас не касаюсь, ибо пока мы будем брать его от компьютера.

В дальнейшем-же можно будет приспособить старую батарею и зарядку от мобильника (спасем окружающую среду еще раз).

Правда заряжать придется раз в неделю.

Ах да, без сим-каты мобильного оператора нам тоже не обойтись.

Итак, все компоненты в наличии – вперед!

Сейчас приступим к любимому “очумелыми ручками” процессу – потрошить технику (весы).

Кроме увлекательности, данный этап является также самым ответственным и вот почему (далее мы разберем принцип работы электронных весов):

Мост Уитстона

На картинке изображен измерительный мост Уитстона, R2 – тензорезистор (меняет сопротивление в зависимости от нагрузки)

В идеале, без веса, вольтметр Vg показывает 0, соответственно, с увеличением оного, мы будем регистрировать изменение напряжения.

Оно также зависит от напряжения батареи подключеной к мосту.

Дальше – дело техники – вместо вольтметра ставится аналого-цифровой преобразователь (АЦП), дисплей, и в итоге на экранчике мы видем килограммы/фунты и т.д.

Если заглянуть в характеристики Arduino, то мы найдем, что на борту уже имеется 10-битный АЦП, так почему-же не использовать его?

Обычно, в напольных весах используется такой вот тензодатчик (нагрузка до 50кг, всего х4):

Тензодатчик

Он содержит половинку моста Уитстона (с R2).

Согласно характеристикам, при максимальной нагрузке и напряжении (10В), на выходе мы получим отклонение всего в 10 милливольт.

Из ардуино не выжать чувствительность лучше 1мВ, то-есть мы сможем регистрировать минимальное изменения веса в 5 килограмм.

Вот почему необходим внешний усилитель, либо АЦП – HX711(24бит) в нашем случае, что теоретически расширяет чувствительность до грамм.

Но на самом деле, электромагнитные наводки сильно портят картину, что уж говорить о разьемных соединениях, делающих измерения почти невозможными.

Отсюда и вытекает необходимость пайки моста к плате АЦП и дальнейшая изоляция контактов от влаги

Но хватит сухой теории, пора вскрывать весы:

До переделки

Тут стоит заметить, что хитрые китайцы (а может не китайцы а может и не хитрые, но тоже молодцы 😉 придумали, как соединить 4 полумоста в 1 мост, сэкономив на АЦП:

Соединение датчиков

Для того, чтобы разобраться, где какой вывод (на фотографии овал №3), Вам понадобится тестер, DT-830 вполне подойдет, ну или дедовский стрелочный, главное чтобы мог измерять сопротивление 1-3кОм.

Ищем пары выводов с сопротивлением 2К (если 1.5К – не оно)

Если тестера нет, можно еще подразобрать весы и проследить все по проводам!

Мне повезло, и соединения были выполнены в соответствии с приведеной схемой.

Только вот порядок подключения проводов к АЦП другой (следите за очередностью подключения красных!):

Порядок подключения

Будьте внимательны, иначе весы будут показывать отрицательный вес(тогда достаточно поменять местами провода A+ и А-), либо вообще не показывать ничего (проверить схему еще раз).

Соединения 1 и 2 нужно сохранить, остальное (плату и экран)- удалить:

После переделки

Можно сразу подключить провода мама-мама (на фото в желтом овале), покрывать контакты и плату АЦП лаком будем когда все заработает.

Теперь откладываем нашу измерительную часть и собираем схеу на макетной плате:

Начало сборки

Обратите внимание, слева – шина питания 5V (подаем из компьютера), справа – 4V

Они получаются за счет падения напряжения на диоде (обведен синим овалом) – устанавливается серебристым ободком влево!

Не перепутайте полярность электролитического конденсатора (минус обозначен белой полосой на корпусе).

Фоторезистор (в желтом кружочке) полярности не имеет – ему все-равно.

Да, и не забудьте вставить сим карту (предварительно нужно пополнить и отключить запрос пин-кода).

На фото я ее специально не дослал в держатель модуля SIM800L – сверху, контактами к себе, скосом в сторону буквы f макетной платы.

А теперь берем наши соединительные провода, и вперед “втыкать” я для удобства разложил провода в форме клевера:

Соединения

Для начала соединяем питание: красный и коричневый провода с USB-TTL (“свисток” справа от макетной платы) на левую шину питания.

Далее соединяем землю левой и правой шин (черный провод снизу).

С правой шины подаем питание на arduino – коричневый и красный (gnd и raw), SIM800l.

Далее, подключаем провода передачи данных (желтый и оранжевый) между arduino и USB-TTL, arduino и SIM800l

Да, у Вас не будет столько проводов одинакового цвета, но у меня есть, поэтому для понятности и соблюдения цветовой дифференциации штанов сделал так.

Просто соединяйте в соответствии с фотографией.

Ок, осталось подключить синий провод выключения модуля GSM и шлейф от наших весов (слева).

Хочу акцентировать внимание – питание на HX711 берется со внутреннего стабилизатора Ардуино – сиреневый провод на VCC!

Вроде ничего сложного, но как по мне, на обычной макетной плате все было-бы несколько попроще (вид со стороны установки модулей):

Соединения2

А всего-то 16 точек пайки!

Теперь, если включить USB-TTL в порт компьютера(лучше через USB-удлинитель), и Ваш ардуино новый в целофане, то он заморгает светодиодом с частотой раз в секунду.

Модуль связи тоже начнет подмигивать, сигнализируя что у него все в порядке.

В первом приближении можно считать нашу систему собраной, приступим теперь к прошивке программы (в Ардуино они зовутся скетчами).

Буду описывать последовательность действий для Windows:

Во-первых, необходимо скачать и установить/распаковать программу Arduino IDE – текущая версия – 1.8.9, но я пользуюсь 1.6.4

Для простоты распаковываем архив в папку C:\arduino-“номер Вашей версии”, внутри у нас будут папки /dist, drivers, examples, hardware, java, lib, libraries, reference, tools, а также исполняемый файл arduino (помимо прочих).

Теперь нам потребуется библиотека для работы с АЦП.

Содержимое (папка HX711-master) ложится в каталог C:\arduino-“номер Вашей версии”\libraries

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

Запускаем и настраиваем программу C:\arduino-“номер Вашей версии”\arduino

Интерфейс программы

Заходим в пункт “Инструменты”-выбираем плату “Arduino Pro or Pro Mini” , процессор Atmega 328 3.3V 8 MHz , порт – номер кроме системного COM1 (он появляется после установки драйвера CH340 при подключенном USB-TTL адаптере).

Ок, копируем нижеследующий скетч (программу), и вставляем ее в окно Arduino IDE

char phone_no[]="+123456789012"; // Номер телефона +код страны, на который будут приходить SMS


byte pin2sleep=9; //  Пин включения/выключения GSM-модуля

#include <avr/sleep.h>  // Библиотека перевода ARDUINO в режим сна

#include <SoftwareSerial.h> // Библиотека программного последовательного порта
#include "HX711.h" // Библиотека HX711 https://github.com/bogde/HX711 или beefree.xyz/wp-content/uploads/2019/07/HX711-master.zip
HX711 scale;
#include <EEPROM.h> // Библиотека баботы с EEPROM (постоянной перезаписываемой памятью)

SoftwareSerial mySerial(10, 11); // Назначаем порты вввода/вывода для GSM-модуля


float delta00; // Изменение веса с момента старта

float delta01; // Изменение веса с предыдущего срабатывания


float raw00; //"сырые" данные с АЦП на момент старта

float raw01; //"сырые" данные с АЦП от предыдущего срабатывания

float raw02; //текущие данные с АЦП

word calibrate0=20880; //калибровочный коэфициент для датчиков (возможно необходима корректировка под Вашу модель)

word daynum=0; //количество дней(срабатываний) от старта

word i;

boolean setZero=false;

// Далее - текстовые переменные для обработчика информации от модуля связи

char ch = 0;
char ch1 = 0;
char ch2 = 0;
char ch3 = 0;
char ch4 = 0;

char csq = 0;
char csq1 = 0;
char csq2 = 0;
char csq3 = 0;
char csq4 = 0;

void readVcc() // Функция чтения заряда батареи из GSM-модуля
{
  ch = mySerial.read();
   while (mySerial.available() > 0) {  ch = mySerial.read(); } // очищаем входной буфер порта

 mySerial.println("AT+CBC"); //запрашивем статус батареи у GSM-модуля
// delay(200);
for ( i = 0; i <= 20 ; i++) { delayMicroseconds(10000);}
 while (mySerial.available() > 0) { // считываем входную строку после запятой
 ch = mySerial.read();
     if (ch ==','){ 
       ch1 = mySerial.read();
       ch2 = mySerial.read();
       ch3 = mySerial.read();
       ch4 = mySerial.read();       
     }
   }
}

void SignalQ() // Считывание мощности сигнала GSM
{
  csq = mySerial.read();
   while (mySerial.available() > 0) {  csq = mySerial.read(); } // очищаем входной буфер порта

 mySerial.println("AT+CSQ"); //запрашиваем у GSM-модуля мощность сигнала
// delay(200);
for ( i = 0; i <= 20 ; i++) { delayMicroseconds(10000);}
 while (mySerial.available() > 0) { //считываем входную строку после двоеточия
 csq = mySerial.read();
     if (csq ==':'){ 
       csq1 = mySerial.read();
       csq2 = mySerial.read();
       csq3 = mySerial.read();
       csq4 = mySerial.read();       
     }
   }
}


void SendStat() //функция чтения и отправки веса в виде СМС
{

  detachInterrupt(digitalPinToInterrupt(0)); // запрет прерываний
  delayMicroseconds(10000); // в режиме прерывания функция delay не работает  - используем delayMicroseconds

  scale.power_up(); //Включение модуля HX711

    digitalWrite(13, HIGH);  

digitalWrite(pin2sleep, LOW); // Включаем GSM-модуль
for ( i = 0; i <= 2100 ; i++) { delayMicroseconds(10000);}

  raw01=raw02;

  raw02=scale.get_units(240); // "прогрев" модуля HX711 и тензорезисторов
  raw02=scale.get_units(20); // берем усредненные данные по 20 считываниям

  daynum++; 
  delta00=(raw02-raw00)/calibrate0; // вычисление изменения веса
  delta01=(raw02-raw01)/calibrate0;


  readVcc(); 
  SignalQ();

//  delay(200);
  for ( i = 0; i <= 20 ; i++) { delayMicroseconds(10000);}
  mySerial.println("AT+CMGF=1");    //  Начало блока отправки СМС
  //delay(2000);
    for ( i = 0; i <= 200 ; i++) { delayMicroseconds(10000);}
  mySerial.print("AT+CMGS=\"");
  mySerial.print(phone_no); 
  mySerial.write(0x22);
  mySerial.write(0x0D);  // шеснадцатеричный эквивалент возврата каретки
  mySerial.write(0x0A);  // шеснадцатеричный эквивалент новой строки
//  delay(2000);
    for ( i = 0; i <= 200 ; i++) { delayMicroseconds(10000);}
  mySerial.print("Turn ");
  mySerial.println(daynum);
  mySerial.print("Hive weight  ");
  mySerial.print(delta01);
  mySerial.print("   ");
  mySerial.println(delta00);
  mySerial.print("Battery capacity is ");
  mySerial.print(ch1);
  mySerial.print(ch2);
  if (ch3 != ',') {mySerial.print(ch3);}
  if (ch4 != ',' && ch3 != ',') {mySerial.print(ch4);}
  mySerial.println(" %");
  mySerial.print("GSM signal strenght:  ");
  mySerial.print(csq1);
  mySerial.print(csq2);
  mySerial.print(csq3);
  if (csq4 != ',') {mySerial.print(csq4);}
  mySerial.println(" of 31");
  mySerial.println (char(26));// код ASCII комбинации ctrl+z 
  for ( i = 0; i <= 700 ; i++) { delayMicroseconds(10000);}


digitalWrite(pin2sleep, HIGH); // Выключение GSM-модуля

scale.power_down(); //Выключение весов

for ( i = 0; i <= 700 ; i++) { delayMicroseconds(10000);}

attachInterrupt(0, SendStat , RISING); // Включаем прерывание (запуск функции SendStat) по затемнению фоторезистора (закат)

  digitalWrite(13, LOW);

}
// *************************************************************************************************

void switchto9600() //переключение скорости порта GSM-модуля на 9600, активация режима "сна"
{
mySerial.begin(115200); // Открытие програмного последовательного порта
delay(16000); // wait for boot
mySerial.println("AT");
delay(200);
mySerial.println("AT");
delay(200);
mySerial.println("AT+IPR=9600");    //  Команда смены скорости
delay(200);
mySerial.begin(9600);
mySerial.println("AT&W0"); // запись изменений
delay(200);
mySerial.println("AT&W");
delay(200);
mySerial.println("AT+CSCLK=1"); // активация режима "сна" - засыпает по высокому уровню на DTR (pin2sleep), включение - по низкому
}

void setup() { // Процедура инициализации - выполняется однократно при старте

  // Инициализация модуля АЦП
  // HX711.DOUT - pin 7
  // HX711.PD_SCK   - pin 8
  scale.begin(7, 8);
  scale.set_scale();


  pinMode(13, OUTPUT);  // Режим работы пина светодиода (13)
  pinMode(pin2sleep, OUTPUT);// Init ON/OFF pin for GSM Инициализация пина включения/выключения модема
  pinMode(2, INPUT_PULLUP); // Включение внутреннего напряжения подтяжки на пин 2 (для фотодатчика)
  Serial.begin(9600);

digitalWrite(pin2sleep, LOW); // Включение GSM-vjlekz
  delay(21000); // Ожидание запуска


// -------------------------------------------------------------------------------

switchto9600(); //Переключение скорости порта GSM-модуля

// -------------------------------------------------------------------------------

mySerial.begin(9600);

delay(200);

setZero=digitalRead(2); //проверка необходимости сброса параметров (при затененном фоторезисторе)

//if (EEPROM.read(500)==EEPROM.read(501) || setZero) // сброс параметров при первом включении
if (setZero)
{
  raw00=scale.get_units(240); // "прогрев" модуля HX711 и тензорезисторов
  raw00=scale.get_units(20); // берем усредненные данные по 20 считываниям

EEPROM.put(500, raw00); //запись данных в ППЗУ

for (int i = 0; i <= 24; i++) { //моргаем светодиодом
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
  }
}
else {
EEPROM.get(500, raw00); // весы просто выключались/меняли батарею - считывание исходных параметров АЦП

digitalWrite(13, HIGH); // Включаем светодиод на 12 секунд
    delay(12000);
digitalWrite(13, LOW);
}

delay(200); // Тестовая СМС при первом включении

readVcc();
SignalQ();
delay(200);
  mySerial.println("AT+CMGF=1");    
  delay(2000);
  mySerial.print("AT+CMGS=\"");
  mySerial.print(phone_no); 
  mySerial.write(0x22);
  mySerial.write(0x0D);  // шеснадцатеричный эквивалент возврата каретки
  mySerial.write(0x0A);  // шеснадцатеричный эквивалент новой строки
  delay(2000);
  mySerial.println("INITIAL BOOT OK");

  mySerial.print("Battery capacity is ");
  mySerial.print(ch1);
  mySerial.print(ch2);
  if (ch3 != ',') {mySerial.print(ch3);}
  if (ch4 != ',' && ch3 != ',') {mySerial.print(ch4);}
  mySerial.println(" %");
  mySerial.print("GSM signal strenght:  ");
  mySerial.print(csq1);
  mySerial.print(csq2);
  mySerial.print(csq3);
  if (csq4 != ',') {mySerial.print(csq4);}
  mySerial.println(" of 31");
  mySerial.println (char(26));// код ASCII комбинации ctrl+z 
  delay(7000);

raw02=raw00;

digitalWrite(pin2sleep, HIGH); // Выключение GSM-модуля


  scale.power_down(); //Выключение модуля HX711

attachInterrupt(0, SendStat , RISING); // Включаем прерывание (запуск функции SendStat) по затемнению фоторезистора (закат)

}

void loop() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); //Выбираем режим сна Ардуино
  sleep_mode(); // ВСЕМ СПАТЬ! 
  delay(3000);

}


В первой строке, в кавычках char phone_no[]=”+123456789012″; – вместо 123456789012 ставим свой номер телефона с кодом страны, на который будут приходить СМС.

Жмем кнопку проверить (над цифрой один в скриншоте выше) – если внизу (под тройкой на скрине) “Компиляция завершена” – то можем прошивать микроконтроллер.

Так, USB-TTL подключен к ARDUINO и компьютеру – приступаем:

Для начала, тренируемся нажимать красную(серебристую) кнопку микроконтроллера – это нужно будет сделать строго в определенный момент!!!

Есть? Жмем кнопку “Вгрузить” (над двоечкой на скриншоте), и внимательно смотрим на строку внизу интерфейса (под тройкой скрина).

Как только надпись “компиляция” сменится “загрузкой” – жмем красную кнопку (ресет) – если все ок – на USB-TTL адаптере радостно заморгают огоньки, а внизу интерфейса надпись “Вгрузили”

Пока мы ждем прихода тестовой СМС на телефон, расскажу как работает программа:

При первом включении система сверяет байты номер 500 и 501 EEPROM если они равны, значит калибровочные данные не записаны, и алгоритм переходит к разделу настройки.

То-же самое происходит, если при включении фоторезистор затенен (колпачком от авторучки/пальцем) – активируется режим сброса параметров.

При первом включении/сбросе наши весы должны уже быть установлены под улей, так как мы просто фиксируем начальный уровень нуля и дальше измеряем изменение веса (сейчас просто придут нули).

На ардуино при этом начнет моргать встроенный светодиод пина 13.

Если сброс не происходит, светодиод просто загорается на 12 секунд.

После этого отправляется тестовая СМС с сообщением “INITIAL BOOT OK” , качеством приема GSM-сигнала и процентом заряда батареи.

Дальше, у нас работает прерывание по фотодатчику на втором пине (включена подтяжка плюса функцией pullup), обычно срабатывает на закате.

При этом снимаются показания тензодатчиков, вычисляется изменение веса с предыдущего срабатывания(первое число в строке после Hive) и от первого включения, проверяется напряжение батареи и эта информация отправляется в виде СМС:

Скриншот работы

Кстати, получили СМС? Поздравляю!

Возможно, мы почти закончили.

Теперь набираем в пластиковую тару воду и ставим на весы, после чего затеняем фоторезистор(на Ардуино загорится светодиод против вывода 13)

В идеале, нам придет СМС, с весом, соответствующим литражу.

Но возможны варианты:

  1. Если вес со знаком минус, тогда достаточно поменять местами провода A+ и А-.

  2. Если вес не соответствует действительности, нужно корректировать строку word calibrate0=20880;
    При больших показаниях, увеличиваем число 20880 во столько раз, во сколько измеренный вес больше реального, ну и наоборот.

  3. Если в строке веса пришло nan nan (not a number) – неправильно подключены тензодатчики/обрыв провода.
    Сопротивление одного плеча отключенного от всего отдельного датчика (красный-черный и черный-белый) должно составлять 1килоОм.

Надеюсь у Вас все получилось!

Помните, я обещал спасти планету от загрязнения старыми батареями? Время пришло 😉

Программа написана так ,что система постоянно находится в режиме сна, потребляя при этом около 4 миллиампер (или 2, если выковырять постоянно горящий на Ардуино светодиод зубочисткой)

Вроде и немного, но возьмем к примеру батарею от старой Nokia (BL-5C), емкостью 1020 мАч, допустим, она сильно подустала, до 600.

тогда 600/2 = 300ч/24=12.5 суток.

Откуда можно взять батареи еще?

Старые смартфоны, сломаные планшеты, там они широкие и плоские , но более емкие, и наконец батареи ноутбуков.

Если разобрать “сдохший” элемент компьютера, то там мы найдем минимум три батареи стандарта 18650!

Берем тестер, замеряем напряжение каждой, та что с наименьшим – несем в пункт сбора на утилизацию, остальные – очень еще послужат!

У меня две таких, емкость составляет около 1800мАч.

Откуда я узнал емкость? Все просто – есть куча измерителей в стиле вот такого:

USB-meter

Помимо возможности оценить емкость батареи, данный приборчик помогает мне выявить битые USB-шнуры, зарядки и порты, не “тянущие” по току.

Но мы отклонилились от темы.

Вот теперь, когда уже все работает, пришло время как минимум покрыть плату АЦП лаком/воском/парафином.

Ну и конечно-же, увековечить конструкцию с помощью паяльника, как я писал выше.

Будет-ли работать все на беспаечной макетной плате под открытым небом?

Да на любой плате незакрытая от осадков конструкция просуществует до первого дожя!

Вот почему выше писалось о прозрачном судке для продуктов (ведь нам нужно, чтобы фотоэлемент “видел” небо)!

Но если Вы все-же решились использовать систему не прибегая к пайке, весьма нелишним будет использование аэрозольной смазки XADO/WD40.

Что-же еще можно сделать на базе уже собраной системы?

В интернете есть множество Ардуино-сообществ и форумов, over 100500 примеров работы с разным оборудованием.

А самое главное, все это достаточно просто обьединяется в Ваши проэкты (если конечно не прогуливали информатику в школе 😉

Самое простое в данном случае – подключение экранчика и кнопок для просмотра веса а также датчика влажности/температуры.

Главное, помнить – в мире нет ничего невозможного! Есть только вещи к которым мы недостаточно стремимся!

С уважением, электропчеловод Андрей.

нужна помощь для поддержки сайта

61 thoughts on “Собираем СМС-весы пчеловода на Arduino без пайки* + как это работает”

  1. Какой модуль GSM SIM800l или IOT-GA6-B лучше использовать. По командам они взаимозаменяемые ?

    1. Добрый день!
      Да, команды незначительно отличаются AT+CBC и AT+CBC? для IOT, немного разные строки ответа.
      По работе с СМС они одинаковые.

      Основное отличие – в питании:
      Работающий модуль IOT-GA6-B потребляет 17/35 ма (в зависимости от стандарта связи), SIM800 – вдвое больше.

      В режиме сна оба модуля потребляют около 2мА.
      Активируется он тоже по разному – на SIM800 просто подается высокий уровень сигнала, в IOT приходится “передергивать затвор” с интервалом 2.2с.

      SIM800 расcчитан на питание и сигналы ~3.3В, IOT имеет бортовой step-down c 5В(для уровня 3.3В надо подпаиваться к конденсатору ), демократичен к логическим уровням TTL

      То-есть, скорректировав скетч под специфику каждого – особой разницы не вижу – хоть Neoway M590E

      Но лично мне симпатичны IOT-GA6-B , как более свежая разработка компании AI-THINKER, есть версии с возможностью подключить камеру прямо на модуль связи.

      1. Доброго дня, можно ли в этот скетч установить датчик шума, чтобы он шум мерил например в процентах и это тоже в смс закидал вместе с весом.
        Заранее благодарен.
        Сейчас пытаюсь ваш скетч запихнуть в ФЛПрог, для дальнейшей модернизации, т.к не знаю С++.

        1. Добрый день!
          “Датчик шума” несколько неэффективен, поскольку это может быть и звук презжающего автомобиля, и лай собаки.
          Можно просто подключить электретный микрофон к модулю связи и включить режим автоответа на входящие звонки.
          Тогда можно будет слушать происходящее в улье.
          Я экспериментировал с модулем микрофона на MAX9814, правда довольно много шумов.

  2. Добрый день, Андрей.
    Возможна ли Ваша помощь при сборке весов?

    1. Добрый день!
      Если что-то в процессе сборки весов по статье не будет получаться – обращайтесь!

      С уважением, Андрей

      1. Добрый день, Андрей.
        Я не могу найти некоторые компоненты. Возможно ли у Вас приобрести полный комплект весов? Может уже настроенный?

        1. Добрый день!
          Компоненты для системы выбирались самые распространенные.
          Большинство магазинов продающих ардуино их имеет.
          В крайнем случае, все есть на AliExpress

          С уважением, Андрей

  3. Здравствуйте скопировал скейч но вылазиет ошибка и выделяется строка аmySerial.print(phone_no); в чем может быть причина?

    1. Добрый день!
      Нужно раскомментировать строку // char phone_no[]=”+123456789012″;
      И подставить в кавычки Ваш номер телефона.
      Первый пункт исправил в статье.

      С уважением, Андрей

  4. спасибо все получилось.А не подскажите как прикрутить дисплей 16*2?

    1. Добрый день!
      LCD1602 есть обычные, а также с I2C интерфейсом, в интернете множество примеров.
      В целом-же Вам придется заменить блок
      mySerial.print(“Turn “);
      mySerial.println(daynum);
      mySerial.print(“Hive weight “);
      mySerial.print(delta01);
      mySerial.print(” “);
      mySerial.println(delta00);
      mySerial.print(“Battery capacity is “);
      mySerial.print(ch1);
      mySerial.print(ch2);
      if (ch3 != ‘,’) {mySerial.print(ch3);}
      if (ch4 != ‘,’ && ch3 != ‘,’) {mySerial.print(ch4);}
      mySerial.println(” %”);
      mySerial.print(“GSM signal strenght: “);
      mySerial.print(csq1);
      mySerial.print(csq2);
      mySerial.print(csq3);
      if (csq4 != ‘,’) {mySerial.print(csq4);}
      mySerial.println(” of 31″);

      на конструкцию вида :

      lcd.setCursor(0, 0);
      lcd.print(” daily total”);
      lcd.setCursor(0, 1);
      lcd.print(delta01);
      lcd.setCursor(8, 1);
      lcd.print(delta01);

  5. Спасибо, а при таком изменении смс будут отсылаться?

    1. Тогда нужно просто добавить вывод на LCD1602 ничего не убирая

  6. Добрый день!
    Возможно ли при сборке этих компонентов прошить ардуино, что бы в смс приходил вес на 8 утра , на 15 ч и на 20 00+ общий за день+ общий всего с момента обнуления? Спасибо!

    ps. Все компоненты на алиэкспресс примерно 682 грн с тензо датчиками!

    не понял! если светодиод не увидит свет (ночь) все на утро обнулиться?

    1. Добрый день!
      В данной конструкции можно сделать только утром и вечером, поскольку нет модуля часов реального времени.
      Для этого следует заменить attachInterrupt(0, SendStat , RISING); на attachInterrupt(0, SendStat , CHANGE);
      >>если светодиод не увидит свет
      Показания весов обнуляются только при включении питания при условии закрытого светодиода!

  7. Здраствуйте, все спаял на макетную плату, но почему-то нет сброса и светодиот просто загорается, уже перепробывал и eeprom сбрасывать на заводские, толи ардуино нано бракованная. Посоветуйте куда рыть.?

    1. Добрый день!
      Замерьте напряжение на пине D2 Arduno – что получается при затененном и открытом фотоэлементах?

      1. Добрый день, Андрей замерил напряжения при затененном 1,9 вольта, а при открытом 0,31 вольта

        1. Возможно Вы недостаточно закрываете фоторезистор (я просто пальцем касаюсь).
          Для 3.3В Ардуино логическая единица – выше 2 Вольт, поэтому может и не срабатывать.
          Выпаяйте резистор и попробуйте на массу сопротивлением 1-10кОм соединить кратковременно.
          Вообще делать отладку в комментариях как-то не совсем с руки.
          Пришлите мне фото вашей системы на почту letdrive@gmail.com

          С уважением, Андрей

  8. Добрый день! Возможно ли реализовать весы так, чтобы данные ( дата, вес, дельта веса, температура, влажность, …) в определенное время, по запросу СМС или от срабатывания фоторезистора вносились в документ Excel (в определенные строки либо столбцы, определенного листа), который находиться на гугл диске ? Спасибо!

    1. Добрый день!
      Можно писать в текстовый файл на флешке.
      Можно сохранять данные на сервер в базу MySQL.
      Связку с Excel видел только между ПК и Arduino с помощью макроса по ком-порту(кабелю).
      Но никак не на гугл-диск.

  9. Добрый день подскажите пожалуйста куда на ардуинку подключен модуль тензодатчиков что-то я его не вижу на схеме?

  10. Сначала скажу Вам огромное спасибо, за труд. Мы с ребенком наблюдаем за Вашим блогом. Старший сын ходит на роботехнику и мы с ним как то решили собрать что то подобное, единственное хотим добавить датчик температуры и на базе Arduino Uno.
    Вопрос такой, подскажите что необходимо переписать для подключения к Uno.
    И какой конденсатор Вы поставили.

    1. Здравствуйте!
      Спасибо за отзыв!
      Как преподавателю курса Ардуино мне на карантине очень не хватает аудитории!
      Для подключения к Uno нужно будет подобрать калибровочный коэффициент “word calibrate0=20880;” путем установки известного веса и меняя данное число во столько раз, во сколько раз реальный вес отличается от отображаемого.
      Конденсатор 1000мкФ 16В.
      Да, к Уно пин RX GSM-модуля следует подключать через делитель напряжения на двух резисторах (arduino(TX)-10K-GSM(RX)-20K-GND), либо с одинаковыми номиналами в плечах.
      Датчик температуры могу посоветовать либо цифровой DS18B20, либо на терморезисторе , к примеру NTC 3950.
      Как раз одна из следующих публикаций будет посвящена универсальному цифровому термометру (от -55 до +300 градусов Цельсия) на последнем.

      1. Спасибо за ответ.
        Будем ждать запчастей и собирать. Датчик температуры как раз заказал DS18B20

  11. Здравствуйте, собрал весы на nano 5 вольт приходят по несколько смс при закате, как будто виснет. И при повторном подключении батареи и затенение фоторезистора eeprom не збрасывается. Приходится заливать скетчь заново.

      1. Почти разобрался, был неисправен фоторезистор, схема питается от аккомулятора 6 вольт через преопразователь, единственное так и осталось что приходит по несколько смс.

        1. Добрый день!
          Подправил программу.
          Загрузите заново из статьи – должно работать без повторов.

    1. Здравствуйте, подскажите пожалуйста, собрал почти как у вас на макетной плате покатолько конденсатор не ставил, питаю всю схему от литиевой батарейки, приходят СМС почти одна за одной с текстом инитиал Бут ок и все, смс с весом не приходят, хоть затеняю фото резистор хоть нет, подскажите в чем может быть причина.

      1. Добрый день!
        У Вас однозначно проблема с питанием (при просадке ниже 2.7В микроконтроллер перегружается)
        Для начала, если мы говорим именно о литиевых батарейках а не аккумуляторах, его напряжение должно быть 3.5В,
        и то со временем(разрядом) оно снижается у любых элементов.
        Как я уже писал, может спасти конденсатор 10мкФ , 25В запаянный просто на микроконтроллер:
        https://i.postimg.cc/Ss2r5K8x/capacitor.jpg

  12. Здравствуйте, сегодня весы заглючили идёт постоянно смс за смс и горит диод, что это может быть?

    1. Добрый день!
      Соседство микроконтроллера с модулем связи приводит к наличию сильных помех.
      Попробуйте запаять конденсатор 10мкФ 25В как показано на фото
      https://i.postimg.cc/Ss2r5K8x/capacitor.jpg

  13. Здравствуйте!
    Собрал всё согласно вашей инструкции, но возникла проблема из разряда “откуда не ждали” – при загрузке скетча через Ardurino ID, получаю ошибку:
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x0d
    Потратил уже немало времени, но решения так и не нашел, может быть у вас есть предположения?

    1. Добрый день!
      Похоже, у Вас проблема с настройкой среды Arduino IDE, все подробно описано в статье http://beefree.xyz/?p=174
      В частности, ошибк может быть связана с установкой драйвера USB-TTL, настройкой платы и порта в среде программирования.
      С уважением, Андрей

  14. Здравствуйте, а из-за чего может не выводить общий вес?
    Выводит только тот вес который приложили/отложили, а где должен быть общий вес пишет “nan “.

    (только коефициент веса подобрал и вроде правильно изменил входа с тензодатчиков, больше ничего не изменено)

    1. Выполните сброс системы(с затенением фотодатчика при включении).
      И выводится не общий вес, а вес с момента включения, +вес с момента предыдущего срабатывания!

  15. Получилось записать скетч на ардуино (проблема была в том, что китайцы прислали версию 5V, а я упорно пытался прошить как 3.3V), сейчас все в сборе, приходят смс, но всегда приходит вес 0.00 0.00, какой бы груз в этот момент не стоял на весах(((
    Может быть проблема в модуле HX711т.к.он у меня с маркировкой МН почему-то, прямо как здесь (https://easycraft.by/datchik-davleniya-hx711) или из-за того, что я подаю 5V на VCC модуля?
    Пасека на кочевке скоро как месяц, а я все борюсь с весами )

    1. Проблема может быть в соединении платы HX711 с микроконтроллером.
      Проверьте все контакты, есть-ли напряжение питания на GND и VCC платы.
      Еще – правильность подключения тензодатчиков:
      белый+черный —- E+
      белый+черный —- E-
      красный ——— A-
      красный ——— A+
      На первой паре контактов – сопротивление примерно 1000 Ом, на второй – тоже.

    2. Исправьте:
      delta00=(raw02-raw00)/calibrate0; // вычисление изменения веса
      delta01=(raw02-raw01)/calibrate0;
      на:
      delta00=(raw02-raw00); // вычисление изменения веса
      delta01=(raw02-raw01);

      Мне помогло.

      1. Добрый день!
        Помогло с чем???
        По предложенной правке вес Вы получите в “попугаях”

        1. Да, Вы правы, я просто по привычке вбил scale.set_scale(calibrate0);.
          А в паре с delta00=(raw02-raw00)/calibrate0; он и выдавал бред.
          Извините, ввел в заблуждение.

      2. Доброго дня, Андрей. Во-первых спасибо за труды, которыми делитесь в общем доступе, во – вторых за то, что отвечаете даже на комментарии)
        У меня наконец-то получилось все собрать и протестировав неделю дома, на балконе. Отправил весы в лес…
        А там..( При установке все ОК, но уже вечером, почему-то смс после заката идут одна за одной, с разницей в 1 минуту – приходится блокировать сим карту, может вы подскажете где зарыта собака?
        ( конденсаторы уже припаяны и на модуль SIM и на ардурину)

        1. Добрый день!
          Тут надо менять фьюзы микроконтроллера, как это описано в статье https://habr.com/ru/post/472726/
          Для этого нужна еще одна плата Ардуино (любая)

  16. “Обратите внимание, справа – шина питания 5V (подаем из компьютера), слева – 4V”

    Вы попутали стороны – это с лева 5V, с права 4V

  17. Привет. Почему на фотографии, где проведена распиновка проводов, порты приема и передачи с программатора воткнуты в ардуино в порты – земля и питание??? Вы вводите людей в заблуждение :):):).

    1. Мда, там половина проводов перепутаны :):):). Или я не так понял :)?

      1. Вы совсем не так поняли, видимо у Вас другая ревизия платы.

    2. Потому, что есть различные разводки плат Arduino pro mini – ровно фотографией выше на плате четко видно назначение сигналов.

      1. Спасибо за пояснение. Я в точности по фото насобирал, тупо без понимания и разбора, что к чему. А потом смотрю, что-то не работает. Хорошо, что пояснили. Спасибо. Кстати, Вы молодец, что развиваете свои проекты👍👍👍👋

        1. …пока не подключил свои мозги. Сразу видно, что Вы хороший учитель. Подаете материал таким образом, чтобы понять, нужно ученику так же подключать мозги ;).

  18. Доброго дня. Такой вот вопрос: у меня используется IOT-GA6 (клон). заметил не приятную особенность, иногда модуль уходит в глубокий сон, что приходится пересбрасывать питание для нормальной работы. Не подскажете в чем может быть причина?

      1. Увы. прошивки уже менял. Обе версии. Буду менять модуль. Наверное в нем проблема.

  19. Доброго времени суток, подскажите пожалуйста, как в этот скетч прикрутить датчик влажности и температуры на основе DHT11.
    Заранее благодарю!!!

    1. DHT11 на Arduino pro mini 8MHz 3.3V работает нестабильно.
      ds18b20 – датчик температуры – нормально.
      В моей публикации “Умный улей на Ардуино” это есть

      1. Спасибо за подсказку, добавил датчик в эту прошивку, нормально приходит темп и влага только первый раз, следующие смс идут со символом nan (нет даных) обрыл все так и не понял в чем беда. На вашей новой прошивке проделал тот же путь заменив датчик темп и влаги на свой, все работает.
        Спасибо большое за труды, я теперь уже начал хотя бы на 2% процента понимать структуру кода!

Leave a Reply

Your email address will not be published. Required fields are marked *