Контрольные весы для пасеки с отправкой данных в SMS

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Блин. Ну я же понятно вроде описал - сделайте и посмотрите, как это работает. Пин ардуины должен быть настроен на вход. По вашему описанию - у вас соединено не так.

Цитата:

не совсем понял как тогда подключать сигнальный провод ("второй свободный конец") к контакту GND дисплея?

Ещё раз, последний:

1. От пина ардуины идёт провод. К нему присоединяется резистор одним концом, второй конец резистора - на 5В. В точке соединения резистора и провода идёт ещй одно соединение, назовём это "свободный конец". Вот если этот свободный конец будет просто никуда не подключён - то digitalRead() с пина ардуины вернёт HIGH. Если его подоткнуть на GND - digitalRead вернёт LOW.

2. Этот свободный конец вы подключаете на плату дисплея, наряду с другими контактами. Контакт для этого свободного конца на плате дисплея напрямую идёт на GND, таким образом, если дисплей подключён - на пине ардуины будет LOW, и HIGH в противном случае.

Ну попробуйте уже на макетке собрать простейшую схему, без дисплея - и просто потыкать свободным концом в 5В и GND. Я вам даже код тестового скетча приведу:

#define STATUS_PIN 2 // номер пина, на котором будем читать уровень (по умолчанию - пин номер 2)

byte lastPinState;


void echo(byte state)
{
  if(state)
    Serial.println(F("HIGH"));
  else
    Serial.println(F("LOW"));
}

void setup()
{
  pinMode(STATUS_PIN, INPUT);
  lastPinState = digitalRead(STATUS_PIN);
  Serial.begin(9600);
  
  echo(lastPinState);
}

void loop()
{
  byte curState = digitalRead(STATUS_PIN);
  if(curState != lastPinState)
  {
    lastPinState = curState;
    echo(lastPinState);
    
  }
}

 

garyn1976
Offline
Зарегистрирован: 25.10.2017

DIYMan пишет:

Цитата:

не совсем понял как тогда подключать сигнальный провод ("второй свободный конец") к контакту GND дисплея?

2. Этот свободный конец вы подключаете на плату дисплея, наряду с другими контактами. Контакт для этого свободного конца на плате дисплея напрямую идёт на GND, таким образом, если дисплей подключён - на пине ардуины будет LOW, и HIGH в противном случае.

Ну попробуйте уже на макетке собрать простейшую схему, без дисплея - и просто потыкать свободным концом в 5В и GND. Я вам даже код тестового скетча приведу:

#define STATUS_PIN 2 // номер пина, на котором будем читать уровень (по умолчанию - пин номер 2)

byte lastPinState;


void echo(byte state)
{
  if(state)
    Serial.println(F("HIGH"));
  else
    Serial.println(F("LOW"));
}

void setup()
{
  pinMode(STATUS_PIN, INPUT);
  lastPinState = digitalRead(STATUS_PIN);
  Serial.begin(9600);
  
  echo(lastPinState);
}

void loop()
{
  byte curState = digitalRead(STATUS_PIN);
  if(curState != lastPinState)
  {
    lastPinState = curState;
    echo(lastPinState);
    
  }
}

 

Спасибо. Да, я уже собирал тестовую модель и тыкал - все так и есть - если свободным концом на землю - то ноль, если в воздухе то 5В.

но...

DIYMan пишет:

"Этот свободный конец вы подключаете на плату дисплея, наряду с другими контактами. Контакт для этого свободного конца на плате дисплея напрямую идёт на GND, таким образом, если дисплей подключён - на пине ардуины будет LOW, и HIGH в противном случае."

Если свободный конец провода подключен наряду с другими контактами  - то по сути он подключен и на землю, что вызывает LOW сигнал на индикаторном пине всегда.

Это работает, Если этот свободный конец подсоединить к ноге GND дисплея, Которая отключается вместе с дисплеем - тогда да - на сигнальном пине будет появляться 5В, но дисплей тогда не унести будет - он же будет к сигнальному проводу припаян, а сигнальный провод в итоге к сигнальному пину ардуины.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

garyn1976 пишет:

 

Если свободный конец провода подключен наряду с другими контактами  - то по сути он подключен и на землю, что вызывает LOW сигнал на индикаторном пине всегда.

Это работает, Если этот свободный конец подсоединить к ноге GND дисплея, Которая отключается вместе с дисплеем - тогда да - на сигнальном пине будет появляться 5В, но дисплей тогда не унести будет - он же будет к сигнальному проводу припаян, а сигнальный провод в итоге к сигнальному пину ардуины.

 

1. Так и задумано, это признак подключения дисплея;

2. ЗАЧЕМ припаивать сигнальный провод к дисплею? Он должен быть выведен на колодку, куда подключается плата, на которой закреплён дисплей.

3. Всё просто, как 3 копейки, вы как-то не догоняете, по-моему.

garyn1976
Offline
Зарегистрирован: 25.10.2017

DIYMan пишет:

2. ЗАЧЕМ припаивать сигнальный провод к дисплею? Он должен быть выведен на колодку, куда подключается плата, на которой закреплён дисплей.

3. Всё просто, как 3 копейки, вы как-то не догоняете, по-моему.


Я и сам вижу, что чтото тривиальное не могу понять. Либо какаято запутка в терминологии и мы говорим об одном и том же но разными словами.
Колодка это что такое?
Сигнальный провод подведенный к колодке подключен к общей земле, или он идет отдельным контактом и замыкается на землю только когда подтыкается монитор?

Когда нет подключения дисплея, то на сигнальном проводе 5В
Когда дисплей подключен, то и сигнальный провод должен стать подключенным на землю, результат = 0В
Когда дисплей снимается, то сигнальный провод должен получать разрыв в цепи от земли, и на сигнальном пине снова 5В.

Я вот так понял. И так работает. Но не могу сообразить как сигнальный провод сделать отключаемым от общей земли, при съеме дисплея.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Колодка - это разъём, любого нужного вам типа: с одной стороны "мама", с другой - "папа". Мама - на одной плате, папа - на другой. Первая плата - ваш контроллер, вторая - плата с дисплеем. На колодку первой платы выведен сигнальный провод, ответный контакт этой колодки на плате дисплея заведён на GND.

Как объяснить проще такие очевиднейшие вещи - я не знаю. Если и в этот раз не поймёте - я пас.

garyn1976
Offline
Зарегистрирован: 25.10.2017

DIYMan пишет:

Колодка - это разъём, любого нужного вам типа: с одной стороны "мама", с другой - "папа". Мама - на одной плате, папа - на другой. Первая плата - ваш контроллер, вторая - плата с дисплеем. На колодку первой платы выведен сигнальный провод, ответный контакт этой колодки на плате дисплея заведён на GND.

Как объяснить проще такие очевиднейшие вещи - я не знаю. Если и в этот раз не поймёте - я пас.

garyn1976 пишет:

 таком случае находится свободный конец провода - который идет от сигнального пина ардуины? У меня заведен на GND на плате, я уже понял что это высывает ноль на сигнальном пине. Но как же тогда подтыкать обратно дисплей - так чтобы он еще зацеплял сигнальный провод? делать чтото типа 5 ноги на дисплее(параллель GND ноги дисплея) - чтобы она подтыкалась в сигнальный провод?

 

я вот об этом же и спрашивал. теперь все понятно. т.е. нужно  городить дополнитеьный контакт для этого сигнального пина.

Спасибо.

VadimZ
Offline
Зарегистрирован: 08.10.2017

Дорогие пасечники,давайте обьединим свои усилия и сделаем диагностику своих ульев,и мониторинг различных параметров жизни пчёл.Сами мы не можем написать скетчи ,поэтому есть исполнитель готовый взятся за этот труд. Пишите,чем больше народа тем дешвле же для каждого!

garyn1976
Offline
Зарегистрирован: 25.10.2017

Может кно-нибудь подсказать?

Какое разрешается максимальное расстояние между HX711 и тензодатчиками (длина проводов)?

Имеется в виду, что по идее при слишком длинном проводе - должны быть потери в точности показаний? И если такое может быть - то какой примерно может быть длина проводов? (задача удлиннить провода)

BFF
Offline
Зарегистрирован: 25.10.2015

Длина может быть значительной. Работать будет. Но любой всплеск мнтынны вашего мобильного телефона будет на входе АЦП соответстенно весь электромагнитный месор у вас. У меня АЦП на расстоянии 50см от сенсоров. А от АЦП до процессора испробованная дальность 30 метров и работает. Только если на улице, все должно быть покрыто лаком.

kot55
Offline
Зарегистрирован: 14.06.2016

garyn1976 пишет:

Может кно-нибудь подсказать?

Какое разрешается максимальное расстояние между HX711 и тензодатчиками (длина проводов)?

Имеется в виду, что по идее при слишком длинном проводе - должны быть потери в точности показаний? И если такое может быть - то какой примерно может быть длина проводов? (задача удлиннить провода)

BFF пишет:

Длина может быть значительной. Работать будет. Но любой всплеск мнтынны вашего мобильного телефона будет на входе АЦП соответстенно весь электромагнитный месор у вас. У меня АЦП на расстоянии 50см от сенсоров. А от АЦП до процессора испробованная дальность 30 метров и работает. Только если на улице, все должно быть покрыто лаком.

https://www.youtube.com/watch?v=K89tu6zCVz8&t=73s

lvk
Offline
Зарегистрирован: 28.05.2017

Сделал себе весы на тензодатчиках с беспроводным модулем для индикации веса. Логика использования представлялась такой – под ульем располагается весоизмерительный  модуль, который периодически раз в 15 мин включается и отсылает на индикаторный блок измеренный вес по радио (NRF24 модуль). Индикаторный блок также включается раз в 15 мин и принимает данные от весоизмерительного модуля.

Индикаторный блок умеет делать две вещи: 1 - показывать текущий вес улья относительно установленного для него опорного значения веса, и 2 - устанавливать это самое опорное (нулевое) значение.

Индикаторный блок будет лежать в избушке (в которой нет электричества, или к дереву прибью. еще не решил) и постоянно собирает данные с весов под ульем. Нажав на кнопку, можно  увидеть вес улья, измеренный в пределах последних 15 мин.

Питание модуля весов и индикаторного модуля сделал от литий-ионовых батареек с возможностью подзарядки. Ток потребления в покое около 60 мкА.

DoctorRoot
Offline
Зарегистрирован: 07.10.2018

bankir_1986 пишет:

Я правильно понимаю схему подключения тензодатчиков к HX711 или есть особенности?

 

Добрый день, не подскажите как должна выглядеть Ваша схема подключения после исправления ошибок подключения? Эта как я понял не совсем корректная.

lvk
Offline
Зарегистрирован: 28.05.2017

E+ и E- подключаются к диагонально портивоположным датчикам. То же для A+ и A- , т.е. схема подключения крест на крест.

lvk
Offline
Зарегистрирован: 28.05.2017

Есть вопрос по питанию GSM модуля A6.

Сделал плату, на которой размещаются АЦП HX711 для тензодатчиков, модуль NRF24 для связи с другими  весовыми модулями (которые без GSM) и собственно сам GSM модуль A6.

Модуль A6 запитывается от повышателя напряжения на микросхеме MT3608 (схема на рисунке), который разгоняет напряжение от литий-ионного аккумулятора до 5 В. Без модуля A6 (если его физически вынуть из гнезда) в спящем режиме  вся  плата кушает 35 мкА, с модулем все получается хуже - меньше 2.5 мА не получается (модуль выключается командой Serial.println("AT+CPOF");).  Думаю, без схемотехнического решения не обойтись, так чтобы полностью исключалась подача напряжения на модуль A6. 

Кто-нибудь решал эту проблему - так, чтобы при переводе модуля A6 в спящий режим потребление тока снизить изить до хотя бы десятков микроампер?

 

BeeLove
Offline
Зарегистрирован: 17.06.2014

С питанием не подскажу. А вто то, что близкое расположение антенн будет бить по мозгам процессора это гарантированно. 5 Вт GSM мощности должны работать только на выносной антенне.

bwn
Offline
Зарегистрирован: 25.08.2014

MT3608 вход ENABLE, переводит преобразователь в спящий режим с мкАмперным потреблением. Коммутировать можно лапкой процессора. Как поведет себя А6 в этом варианте, не скажу.

lvk
Offline
Зарегистрирован: 28.05.2017

Да, так и делаю, А6 без проблем это переваривает, трудность в том, что не смотря на то, что MT3608 переходит в малопотребляющий режим, VSUP остается нагруженным на модуль  A6 и через него похоже сочится ток покоя. Как бы его перекрыть? Как вараинт, нужен стабилизатор на +5 В с микроамперным  током покоя, расчитанный при этом на ток до 2 А, что-то таких не нашел. 

bwn
Offline
Зарегистрирован: 25.08.2014

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

lvk
Offline
Зарегистрирован: 28.05.2017

BeeLove, а вы реально сталкивались с влиянием радио такой мощности на процессор? Мне не прихододилось обнаруживать до сих пор такого влияния. 

Из общих соображений: частота 900 Мгц, длина волны ~33 см, размер модуля около 3 см, т.е. он в 10 раз меньше, чем длина волны. Вроде  как антенна он просто никакой, т.е. он не должен быть подвержен влиянию такого излучения.  

lvk
Offline
Зарегистрирован: 28.05.2017

Я так понимаю это то, что нужно?

bwn
Offline
Зарегистрирован: 25.08.2014

Да, за С9 не могу сказать на такой нагрузке, не взлетит ли? Смакетировать, и подержать на максимуме. Станет ясно, одного достаточно или надо паралллелить.

lvk
Offline
Зарегистрирован: 28.05.2017

Для С9 чем выше емкость, тем больший ток он способен пропускать без эксцессов?

bwn
Offline
Зарегистрирован: 25.08.2014

Не так, чем больше площадь контактов и пластин. Электролиты стремно, лучше керамику и смотреть нагрев.

lvk
Offline
Зарегистрирован: 28.05.2017

Понятно, спасибо!

garyn1976
Offline
Зарегистрирован: 25.10.2017

lvk пишет:

Есть вопрос по питанию GSM модуля A6.

 

Кто-нибудь решал эту проблему - так, чтобы при переводе модуля A6 в спящий режим потребление тока снизить изить до хотя бы десятков микроампер?

 

 

 

 

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

на питание gsm поставить релюху обыкновенную - управляемую с ардуины - по расписанию или по звонку/смс

 

Меня больше интересует как сделать веб сервер - который бы принимал значения от весов. html, яваскрыпты, и т.п. не знаю - и вот пока не могу понять где начать копать или посмотреть пример реализации подобного

lvk
Offline
Зарегистрирован: 28.05.2017

С реле идея хорошая, но мне что-то не очень нравится коммутировать ток, которым нужно будет этим реле управлять. Тока от одной ноги микроконтроллеора тут, видимо, не хватит, нужно будет делать  что-то на транзисторе....в общем пока остановился на выше приведенной схеме.

По поводу веб сервера попробуйте вот отсюда начать http://2150692.ru/faq/62-gprs-svyaz-cherez-sim800l-i-arduino

bwn
Offline
Зарегистрирован: 25.08.2014

lvk пишет:

Тока от одной ноги микроконтроллеора тут, видимо, не хватит, нужно будет делать  что-то на транзисторе....в общем пока остановился на выше приведенной схеме.

Кстати, менее затратное решении, модуль ведь жрет по максимуму только в момент передачи (предполагаю), значит коммутировать можем в моменты низкого потребления, а там все проще, думаю одного полевика в sot-23 хватит. Вместо ENABLE коммутируем питание модуля и стабилизатора.

pashking77
Offline
Зарегистрирован: 31.07.2019

Вот, человек сделал:

 

http://beefree.xyz/?p=81

lvk
Offline
Зарегистрирован: 28.05.2017

Кому интересно, присоединяйтесь – весы с отправкой веса по GSM

https://easyeda.com/editor#id=|3b31dad57ee3424c94e5d0edf2980b2f|6f4c146b5c414dd5911d559cd20583bc

Фото этой штуки в сборе

Было два основных посыла

1 сделать весы с минимальным потреблением, чтобы не менять и не заряжать батареи длительное время.

2. заложить возможность передачи данных на через GSM модуль от сторонних весов, чтоб не только измерять вес под одним ульем, а сразу под несколькими.

По потреблению удалось достичь 12 микроампер в среднем. При подаче питания от двух последовательно соединенных Li-Pol батарей, напряжение падает на 8 милливольт за 7 суток. С учетом максимального напряжения каждой батареи в 4.2 В, получается (8.4 В – 6.4 В)/0.008 В*7 сут/365 сут = 4.7 года, т.е. на сезон точно должно хватить. Сейчас весы запрограммированы на постоянный режим пониженного потребления. Пробуждаются для отправки СМС два раза в сутки, вот как это выглядит на телефоне.

Питание может быть от одной Li-Pol батареи (питание на GSM модуля подается через реле), либо от двух последовательно соединенных Li-Pol батарей (питание на GSM модуля подается через стабилизатор, в этом случае среднее потребление будет ниже).

Заложил возможность объединения передачи данных от нескольких весов при помощи NRF24 модулей.

GSM весовой модуль управляется при помощи двух сенсорных кнопок: касаешься одной  – весы переходят в режим записи номера телефона по СМС. Касание второй кнопки приводит к отправке СМС со значением текущего веса. Последующие СМС отправляются с периодичностью раз в 12 часов от последнего касания кнопки веса.

Код сделан на основе открытых библиотек и найденных на просторе сети примеров программирования, из которых путем модификаций и добавлений был собран итоговый вариант.


#include <LowPower.h>
#include <Q2HX711.h>
//
//// для часов
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
//// --------- для часов
//
//// для GSM модуля
//// Подключаем библиотеку iarduino_GSM для работы с GSM/GPRS Shield.
#include <iarduino_GSM.h>
//// Создаём объект gsm для работы с функциями и методами библиотеки iarduino_GSM.
iarduino_GSM gsm;
//// ---------- для GSM модуля
//
////Инициализируем библиотеку для считывания данных с входов A0 и A1
Q2HX711 hx711(A1, A0);
//
struct ComplexData {
  unsigned int Node, Year, Month, Day, Hour, Minute, Second;
} Data;
//
const long int WeightZero = 8495549; // 8146170+349379; // точка отсчета для измерения веса
//
long int CurrentWeight, PreviousWeight;
//
//// время сна
//const int TimeLimitSleepTransmitter = 10800; //  12 часов 48 мин 12-15 сек - 4 сек интервал
const int TimeLimitSleepTransmitter = 9684; //  12 часов точно 
//
//// пин питания GSM модуля
const int PowerSupplyGSM = A2;
//// пин питания часов
const int VSUP_Per_ON = 3;
//// пин питания сенсора веса
const int Load_ON = 4;
//
//// пин сенсоров пальцев
const int S1 = 5;
const int S2 = 6;
//// Телефонный номер на который отправлюятся сообщения
char     SMSnum[ 13]; // Объявляем строку для хранения номера отправителя SMS сообщений.
//// Флаг записи номера телефона
bool PhoneNumberFlag = false;
bool S1Flag = false, S2Flag = false;
//
//// ноиер ноги зумера
const int beeper = 12;
//
void setup()
{
  //Serial.begin(9600);

  pinMode(PowerSupplyGSM, OUTPUT); // GSM модуль
  pinMode(VSUP_Per_ON, OUTPUT); // часы
  pinMode(Load_ON, OUTPUT); // вес

  ////////////////////////////////////////////////////////
  // В целом все нижеперечисленное выводит на 12 мкА потребления, начиная, примерно со ~160 мкА
  // после того как из МК выпаяе светодиод и стабилизаор.
  pinMode(S1, INPUT);
  pinMode(S2, INPUT);
  digitalWrite(S1, LOW); // это дает примерно 85 мкА экономии
  digitalWrite(S2, LOW);

  pinMode(A4, LOW); //  это дает примерно 4 мкА экономии
  pinMode(A5, LOW); //
  pinMode(0, LOW); // это дает примерно 60 мкА экономии
  pinMode(1, LOW); //
  /////////////////////////////////////
  digitalWrite(A0, LOW);
  digitalWrite(A1, LOW);
  ////////////////////////////////////

  pinMode(VSUP_Per_ON, LOW); // часы
  digitalWrite(Load_ON, HIGH); // сенсор веса
  // получение данных веса
  get_sensor_data();
  // получение времени
  what_is_the_time();
  // Переназначение предыдущего и настоящего веса
  PreviousWeight = CurrentWeight;

  pinMode(beeper, OUTPUT);
}

void loop()
{
  // получение данных веса
  get_sensor_data();
  // получение времени
  what_is_the_time();
  // передача данных по GSM
  if (PhoneNumberFlag) {
    digitalWrite(PowerSupplyGSM, HIGH); // программное включение
    //Serial.print("PhoneNumberFlag = "); Serial.println(PhoneNumberFlag);
    //delay(10000);
    transmit_data();
    digitalWrite(PowerSupplyGSM, LOW); // программное включение

    //  Serial.print("CurrentWeight=");  Serial.println(CurrentWeight);
    //  Serial.print("PreviousWeight="); Serial.println(PreviousWeight);
    //  Serial.print("WeightZero=");     Serial.println(WeightZero);
    //  Serial.print("String to send =");     Serial.println(string2send());

  }
  // Переназначение предыдущего и настоящего веса
  PreviousWeight = CurrentWeight;
  // сон на xxx часов с выходом из него по нажатию кнопки
  S1Flag = false; S2Flag = false;
  for (int Counter = 0; Counter < TimeLimitSleepTransmitter; Counter++) {
    LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF);
    S2Flag = digitalRead(S2); // отправка веса по СМС
    S1Flag = digitalRead(S1); // включние GSM модуля для настройки по СМС
    //Serial.print("S1Flag = "); Serial.println(S1Flag);
    //Serial.print("S2Flag = "); Serial.println(S2Flag);
    if (S2Flag || S1Flag) {
      beepbeep();
      break;
    }
    S2Flag = false;
  }
  if (S1Flag) {
    beepbeep();
    // занимаемся програмированием GSM модуля с телефона при помощи СМС
    digitalWrite(PowerSupplyGSM, HIGH); // программное включение
    read_GSM_commands();
    //delay(10000); PhoneNumberFlag = true;
    //Serial.print("S1Flag = "); Serial.println(S1Flag);
    //digitalWrite(PowerSupplyGSM, LOW); // программное выключение
    S1Flag = false;
  }
}

void get_sensor_data(void) {

  long int CW;
  //  // включили питание GSM модуля
  //digitalWrite(Load_ON, HIGH);
  
  //delay(1000);
  hx711.power_up();
  delay(5000);
  // Начали читать сенсор веса
  CurrentWeight = hx711.read() - WeightZero;;
  for ( int Counter = 0; Counter < 100; Counter++)  CW = hx711.read() - WeightZero;
  CurrentWeight = (CurrentWeight + CW) / 2;
  // Выключили сенсор веса
  hx711.power_down();
  //digitalWrite(Load_ON, LOW);
  /////////////////////////////////////
  //digitalWrite(A0, LOW); // это нужно если питание модуля весов выключается аппаратно
  //digitalWrite(A1, LOW);

  /////////////////////////////////////
  digitalWrite(A0, HIGH); // это нужно если питание модуля весов выключается порграммно
  digitalWrite(A1, HIGH);

}

String string2send(void) {
  String buf, Current_buff, Previous_buff, Currrent_Previous_buff;
  
  Current_buff = make_message(WeightEvaluate(CurrentWeight));
  Previous_buff = make_message(WeightEvaluate(PreviousWeight));
  
  Currrent_Previous_buff = make_message(WeightEvaluate(CurrentWeight-PreviousWeight));

  buf = "Дата " + String(Data.Year) + ':' + String(Data.Month) + ':' + String(Data.Day) +
        '\n' + "Время " + String(Data.Hour) + ':' + String(Data.Minute) + ':' + String(Data.Second) +
        '\n' + "Вес " + Current_buff +
        '\n' + "Пред. вес " + Previous_buff +
        '\n' + "Привес " + Currrent_Previous_buff;
        
  return buf;
}

void transmit_data(void) {

  String buf = string2send();

  Serial.begin(115200);
  // включили питание GSM модуля
  //digitalWrite(PowerSupplyGSM, HIGH);
  delay(1000);

  Serial.flush();

  //  Инициируем GSM/GPRS и проверяем его готовность к работе:                           //

  gsm.begin(Serial);
  //while (gsm.status() != GSM_OK) {}
  for (int i = 0; i < 120; i++) {                                                            // Цикл попыток отправки SMS сообщения (количество попыток = 20, можно изменить).
    if (gsm.status() == GSM_OK) {
      i = 120;   // Инициируем работу GSM/GPRS Shield, указывая объект шины UART.
    }
  }
  //  Установка кодировки для символов Кириллицы:
  // Выполняем автоопределение кодировки скетча для отправки текста на Русском языке.
  gsm.TXTsendCodingDetect("п");
  // Если символы Кириллицы входящих  SMS сообщений некорректно отображаются в мониторе,  выберите одну из кодировок: GSM_TXT_CP866 / GSM_TXT_UTF8 / GSM_TXT_WIN1251.
  //  gsm.TXTreadCoding(GSM_TXT_CP866);
  // По умолчанию для входящих и исходящих SMS сообщений установлена кодировка GSM_TXT_UTF8.
  //  Отправка короткого SMS сообщения в условиях плохой связи или недостаточного питания:      //
  for (int i = 0; i < 20; i++) {                                                            // Цикл попыток отправки SMS сообщения (количество попыток = 20, можно изменить).
    if (gsm.SMSsend(buf, SMSnum)) {
      i = 20; // Пытаемся отправить сообщение и досрочно выходим из цикла если отправка удалась.
    }
    gsm.status();                                                                         // Запрашиваем статус связи после каждой попытки отправки SMS сообщения, это увеличивает шансы на успех следующей попытки отправки.
  }
  //Blink(3);

  Serial.println("AT+CPOF"); // выключаем
  delay(6000);
  // вылючили питание GSM модуля
  //digitalWrite(PowerSupplyGSM, LOW);

  Serial.end();
  /////////////////////
  pinMode(0, LOW);
  pinMode(1, LOW);
  ////////////////////
}

void read_GSM_commands() {

  char     SMStxt[161]; // Объявляем строку для хранения текста принятых SMS сообщений.
  char     SMStim[ 18]; // Объявляем строку для хранения даты и времени отправки SMS сообщений.
  uint16_t SMSlongID;   // Объявляем переменную для хранения идентификатора составного SMS сообщения.
  uint8_t  SMSlongSUM;  // Объявляем переменную для хранения количества SMS в составном сообщении.
  uint8_t  SMSlongNUM;  // Объявляем переменную для хранения номера SMS в составном сообщении.

  Serial.begin(115200);
  // включили питание GSM модуля
  //digitalWrite(PowerSupplyGSM, HIGH);
  delay(1000);

  Serial.flush();

  //  Инициируем GSM/GPRS и проверяем его готовность к работе:                           //
  gsm.begin(Serial);
  //while (gsm.status() != GSM_OK) {}
  for (int i = 0; i < 120; i++) { // Цикл попыток отправки SMS сообщения (количество попыток = 20, можно изменить).
    if (gsm.status() == GSM_OK) {
      i = 120;   // Инициируем работу GSM/GPRS Shield, указывая объект шины UART.
    }
  }
  //
  //  Установка кодировки для символов Кириллицы:
  // Выполняем автоопределение кодировки скетча для отправки текста на Русском языке.
  gsm.TXTsendCodingDetect("п");
  // Если символы Кириллицы входящих  SMS сообщений некорректно отображаются в мониторе,  выберите одну из кодировок: GSM_TXT_CP866 / GSM_TXT_UTF8 / GSM_TXT_WIN1251.
  //  gsm.TXTreadCoding(GSM_TXT_CP866);
  // По умолчанию для входящих и исходящих SMS сообщений установлена кодировка GSM_TXT_UTF8.

  // Читаем принятые СМС в течении двх минут
  bool timeout = false;
  unsigned long started_waiting_at = millis();
  while (!timeout) { // ждем прихода СМС с номером две минуты
    if (millis() % 1000 < 100) { // Выполняем код в теле оператора if первые 100 мс каждой секунды.
      delay(100);        // Устанавливаем задержку в 100 мс, чтоб не выполнить код более 1 раза за секунду.
      if (gsm.SMSavailable()) { // Функция SMSavailable() возвращает количество входящих непрочитанных SMS сообщений.
        //      Если есть входящие непрочитанные SMS сообщения:
        gsm.SMSread(SMStxt, SMSnum, SMStim, SMSlongID, SMSlongSUM, SMSlongNUM);           // Читаем SMS сообщение в ранее объявленные переменные (текст SMS сообщения, адрес отправителя, дата отправки, идентификатор SMS, количество SMS, номер SMS).

        PhoneNumberFlag = true; // отметили, что теперь есть куда посылать СМС

        //  Отправка короткого SMS сообщения в условиях плохой связи или недостаточного питания:      //
        for (int i = 0; i < 20; i++) {  // Цикл попыток отправки SMS сообщения (количество попыток = 20, можно изменить).
          if (gsm.SMSsend("Ваше СМС получено. Вы внесены в список рассылки.", SMSnum)) {
            i = 20; // Пытаемся отправить сообщение и досрочно выходим из цикла если отправка удалась.
          }
          gsm.status();  // Запрашиваем статус связи после каждой попытки отправки SMS сообщения, это увеличивает шансы на успех следующей попытки отправки.
        }
        break;
      }
    }
    if (millis() - started_waiting_at > 120000 ) timeout = true;
  }
  Serial.println("AT+CPOF"); // выключаем
  delay(6000);
  // вылючили питание GSM модуля
  //digitalWrite(PowerSupplyGSM, LOW);

  Serial.end();
  /////////////////////
  pinMode(0, LOW);
  pinMode(1, LOW);
  ////////////////////
}

void what_is_the_time() {
  tmElements_t tm;

  digitalWrite(VSUP_Per_ON, HIGH);
  TWCR = 1 << TWEN; // включение I2C

  if (RTC.read(tm)) {
    Data.Hour = tm.Hour;
    Data.Minute = tm.Minute;
    Data.Second = tm.Second;
    Data.Day = tm.Day;
    Data.Month = tm.Month;
    Data.Year = tmYearToCalendar(tm.Year);
  }
  else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
  }
  TWCR = 0 << TWEN; // выключение I2C
  digitalWrite(VSUP_Per_ON, LOW);
  pinMode(A4, LOW);
  pinMode(A5, LOW);

  //Serial.println(Data.Second);
}

// функция возвращает массу в граммах
float WeightEvaluate(long int weight) {
  float cw;
  // без округления 
  //return (float)weight / 18911.16;
  // с округлнием до 100 грамм
  cw = (float)weight / 1891.116;
  cw = round(cw);
  return cw / 10;
}

String make_message(float cw) {
  String cb;
  // вырезаем лишние знаки из СМС сообщения
  cb            = String(cw);
  cb.remove(cb.length() - 1);
  return cb;
}

void beepbeep(void) {
  // пищалка для сигнализации касания кнопок-сенсоров
  for (int kk = 0; kk < 1; kk++) {
    digitalWrite(beeper, HIGH);
    delay(2000);
    digitalWrite(beeper, LOW);
    delay(2000);
  }
}

 

alekskr
Offline
Зарегистрирован: 06.10.2019

lvk пишет:

Кому интересно, присоединяйтесь – весы с отправкой веса по GSM

 

Как присоединится к вашему проекту ?

lvk
Offline
Зарегистрирован: 28.05.2017

Могу отправить вам ссылку-приглашение через форум, либо на вашу почту. Если вы зарегистрируtтесь www.easyeda.com и сообщите мне ваши ник, то также можно отправить приглашение через  www.easyeda.com . В любом случае, если ваять схемы на www.easyeda.com, то там регистрироваться придется.

alekskr
Offline
Зарегистрирован: 06.10.2019

На www.easyeda.com зарегистрировался но понял что врядли разберусь.

lvk
Offline
Зарегистрирован: 28.05.2017

Система EasyEda кажется сложной или электрическая схема ?

alekskr
Offline
Зарегистрирован: 06.10.2019

Все оказалось сложновато, наверно возраст сказывается. Вы данную плату испытывали в полевых условиях.  

lvk
Offline
Зарегистрирован: 28.05.2017

Понятно.  Пока закончил испытания на энергопотребление под тестовым весом (это долго оказалось), до поля дело не дошло. Хотите попробовать в полевых? 

alekskr
Offline
Зарегистрирован: 06.10.2019

Есть такое желание. Только сезон уже окончился, весы сейчас не нужны. Хочу все смонтировать и опробовать до весны. 

lvk
Offline
Зарегистрирован: 28.05.2017

Для того чтобы просто смонтировать самому весы, не обязательно присоединяться к моему проекту. Вы можете его заказать как готовый по ссылке https://easyeda.com/lvkuzmin/nrf24-gsm-7-4-v , Сайт  www.easyeda.com для этого и сделан, чтобы все  в одном флаконе было (молодцы китайцы) - рисовать схемы, разводить платы, тут же их заказывать вместе с компонентами для сборки. По мне  - так очень удобно. Привозят прямо курьером до двери, по магазинам бегать не нужно. Цена для данного класса плат и схем очень хороша.  Чего я не нашел у китайцев - приобрел в chipdip.ru и на roboshop.spb.ru.

Если интересует - у меня осталось несколько плат от заказа на www.easyeda.com. Они делают минимум пять штук в заказе, поэтому осталось. Кроме того, для проверки, испытаний и отладки я сделал два экземпляра электронного блока. Так что если чего нужно - могу поделиться.

alekskr
Offline
Зарегистрирован: 06.10.2019

Спасибо за предложение, я не против у вас приобрести макет но скорее всего не получится так как я проживаю в Украине. 

lvk
Offline
Зарегистрирован: 28.05.2017

Желаю успеха в вашей работе! Довольно интересное занятие, со временем затягивает.