#1 2021-02-04 14:35:25

Alonewooolf
Учасник
Зареєстрований: 2020-05-23
Повідомлень: 11

Модифицированная прошивка СМС-Вес

автор Андрей Герасименко
Доброго дня друзья приглашаю всех к ознакомлению и плевков мне в лицо. Да пока не заплюют код не пишется.

В коде явно есть ошибки, цель создания этой темы чтобы эти ошибки нашлись и устранились.
Реализовано:
Подключение к Блинк для построения графиков (раз в час отсылает данные на сервера блинк, можно и чаще но батарея);
По смс "Info" присылает всю инфу на данный момент в виде смс (оно и так присылает раз в три часа, это если оч сильно надо);
Подстройка calibration_factor путем кнопочек в блинке ("+" , "-");
есть возможность реализовать вкл и выкл нагрузки, например подлить води в улей для нормализации влажности (кспериментально);

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 (постоянной перезаписываемой памятью)
#include "DHT.h"
#define DHTPIN 2 // Тот самый номер пина, о котором упоминалось выше
#define DHTPIN1 3
DHT dht2(DHTPIN, DHT11);  //Инициация датчика1
DHT dht3(DHTPIN1, DHT11);  //Инициация датчика2
SoftwareSerial mySerial(10, 11); // Назначаем порты вввода/вывода для GSM-модуля

#define TINY_GSM_MODEM_SIM800
#include <TinyGsmClient.h>
#include <BlynkSimpleSIM800.h>
TinyGsm modem(mySerial);

 char incomingByte; 
 String inputString;

char auth[] = "YourAuthToken";
char apn[]  = "YourAPN";
char user[] = "";
char pass[] = "";

  float h2 = dht2.readHumidity(); //Измеряем влажность
  float t2 = dht2.readTemperature(); //Измеряем температуру
  float h3 = dht3.readHumidity(); //Измеряем влажность
  float t3 = dht3.readTemperature(); //Измеряем температуру


float delta00; // Изменение веса с момента старта
float delta01; // Изменение веса с предыдущего срабатывания
float raw00; //"сырые" данные с АЦП на момент старта
float raw01; //"сырые" данные с АЦП от предыдущего срабатывания
float raw02; //текущие данные с АЦП
float rawz02; //текущие данные с АЦП
word calibrate0=20880; //калибровочный коэфициент для датчиков (возможно необходима корректировка под Вашу модель)
word daynum=0; //количество дней(срабатываний) от старта

int notsunset=0; //признак заката
int Hwarning=0;
int Halarm=0;

word i;

boolean setZero=false;

float swarm0w; //переменные для роевого предупреждения
float w0; 
float DeltaW=0;
unsigned long swarm0t; 
unsigned long TimeNow;
unsigned long time3h; // время для отсылки статистики
unsigned long TimeNow1;
unsigned long time3h1; // время для отсылки статистики Блинк
// Далее - текстовые переменные для обработчика информации от модуля связи

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

      notsunset=0;
 for (int i=0; i <= 250; i++){
      if ( !digitalRead(2) ){ notsunset++; } //Это точно закат?
      delayMicroseconds(1000);
   }

  if ( notsunset==0 )
  { 

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

    digitalWrite(13, HIGH);  

  raw01=raw02;

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

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

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

digitalWrite(pin2sleep, LOW); //И вот только теперь, после замеров, включаем GSM-модуль

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

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


  readVcc(); 
  SignalQ();


  for ( i = 0; i <= 20 ; i++) { delayMicroseconds(10000);}
  mySerial.println("AT+CMGF=1");    //  Начало блока отправки СМС
    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);  // шеснадцатеричный эквивалент новой строки

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

  mySerial.println("Bat%  GSM/31  T_out  Thive  Humid% Delta3D  Delta0");
  
  mySerial.print(ch1); // процент заряда батареи
  mySerial.print(ch2);
  if (ch3 != ',') {mySerial.print(ch3);} else  mySerial.print("_");
  if (ch4 != ',' && ch3 != ',') {mySerial.print(ch4);} else  mySerial.print("_");
  
  mySerial.print("__");
  mySerial.print(csq1); // устойчивость приема сигнала GSM
  mySerial.print(csq2);
  mySerial.print(csq3);
  if (csq4 != ',') {mySerial.print(csq4);} else  mySerial.print("_");
  mySerial.print("_____");
  
  mySerial.print(h2); //температура за бортом
  mySerial.print("_");
  mySerial.print(t2); // влага за бортом
  
  
  mySerial.print(t3); // температура внутри улья
  mySerial.print("__");
  mySerial.print(h3); // влажность внутри улья
  
  mySerial.print("__");
  
  mySerial.print(delta01); // изменение веса за сутки
  mySerial.print("__");
  mySerial.print(delta00); // изменение веса с момента включения

    mySerial.println (char(26));// код ASCII комбинации ctrl+z 
  for ( i = 0; i <= 700 ; i++) { delayMicroseconds(10000);}

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

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

  }

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

digitalWrite(13, LOW);

}

// *************************************************************************************************
void Send3D() // отправка статистики каждые 3 часа
{

  detachInterrupt(digitalPinToInterrupt(0));



  scale.power_up(); //включаем весы


    digitalWrite(13, HIGH);  


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


  rawz02=scale.get_units(240); //Прогреваем HX711 и измерительный мост
  rawz02=scale.get_units(20); //читаем данные с весов

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

  digitalWrite(pin2sleep, LOW); // Включаем модем

  daynum++; 
  delta00=(rawz02-raw00)/calibrate0; // calculate weight changes 
  delta01=(rawz02-raw01)/calibrate0;

  readVcc(); 
  SignalQ();


  for ( i = 0; i <= 20 ; i++) { delayMicroseconds(10000);}
  mySerial.println("AT+CMGF=1");    //  Part of SMS sending 

    for ( i = 0; i <= 200 ; i++) { delayMicroseconds(10000);}
  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);
    for ( i = 0; i <= 200 ; i++) { delayMicroseconds(10000);}

    // процент заряда батареи
  mySerial.print(ch1);
  mySerial.print(ch2);
  if (ch3 != ',') {mySerial.print(ch3);} else  mySerial.print("_");
  if (ch4 != ',' && ch3 != ',') {mySerial.print(ch4);} else  mySerial.print("_");
  // устойчивость приема сигнала GSM
  mySerial.print("__");
  mySerial.print(csq1);
  mySerial.print(csq2);
  mySerial.print(csq3);
  if (csq4 != ',') {mySerial.print(csq4);} else  mySerial.print("_");
  mySerial.print("_____");
  
  mySerial.print(h2); //температура за бортом
  mySerial.print("_");
  mySerial.print(t2); // влага за бортом
  
  
  mySerial.print(t3); // температура внутри улья
  mySerial.print("__");
  mySerial.print(h3); // влажность внутри улья
  
  mySerial.print("__");
  
  mySerial.print(delta01); // изменение веса от заката
  mySerial.print("__");
  
  mySerial.print(delta00); // изменение веса с момента включения

   mySerial.println (char(26));//код ASCII символа ctrl+z
  for ( i = 0; i <= 700 ; i++) { delayMicroseconds(10000);}


digitalWrite(pin2sleep, HIGH); // Выключаем модуль связи

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

  scale.power_down(); // выключаем весы

  attachInterrupt(0, SendStat , RISING); // Interrupt by HIGH level
   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 Walert() // отправка СМС о роении/злоумышленниках
{
digitalWrite(pin2sleep, LOW); // Включение модема
  delay(21000); // Ожидание загрузки

  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);

   if (Hwarning != 0) // warning about hive invasion
   {
    mySerial.println("WARNING!!!"); 
    mySerial.print("Hive  "); 
    mySerial.print(Hwarning);
    mySerial.println("  is opened! "); 
  }

  if (Halarm != 0)
   {
    mySerial.println("ALARM!!!");  // alarm about swarm
    mySerial.print("Bees in hive  "); 
    mySerial.print(Halarm);
    mySerial.println("  is SWARMING!!! "); 
  }

   mySerial.println (char(26));//код ASCII последдовательности ctrl+z
  delay(7000);

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

Hwarning=0;
Halarm=0;
DeltaW=0;
for (int i = 0; i <= 24; i++) { //часто моргаем светодиодом
    digitalWrite(13, HIGH);
    delay(250);
    digitalWrite(13, LOW);
    delay(250);
  }
  }



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

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


  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-модуля
  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.println("Bat%  GSM/31  T_out  Thive  Humid% Delta3D  Delta0");
  // процент заряда батареи
  mySerial.print(ch1);
  mySerial.print(ch2);
  if (ch3 != ',') {mySerial.print(ch3);} else  mySerial.print("_");
  if (ch4 != ',' && ch3 != ',') {mySerial.print(ch4);} else  mySerial.print("_");
  // устойчивость приема сигнала GSM
  mySerial.print("__");
  mySerial.print(csq1);
  mySerial.print(csq2);
  mySerial.print(csq3);
  if (csq4 != ',') {mySerial.print(csq4);} else  mySerial.print("_");
  mySerial.print("_____");
  
  mySerial.print(h2); //температура за бортом
  mySerial.print("_");
  mySerial.print(t2); // влага за бортом
  
  
  mySerial.print(t3); // температура внутри улья
  mySerial.print("__");
  mySerial.print(h3); // влажность внутри улья
  
  mySerial.println (char(26));// код ASCII комбинации ctrl+z 
  delay(7000);
  

raw02=raw00;

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

delay(7000);

//////////////////////////////

swarm0w=scale.get_units(10);
swarm0w=scale.get_units(10);
swarm0w=scale.get_units(10); //set initial data for swarm warning
swarm0t=millis();             // set initial time for swarm warning

///////////////////////////////

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


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

}

void sendSensors()
{
  Blynk.run();
  Blynk.virtualWrite(V0, h2);
  Blynk.virtualWrite(V1, h3);
  Blynk.virtualWrite(V2, t2);
  Blynk.virtualWrite(V3, t3);
  Blynk.virtualWrite(V4, delta00);
  delay(300000);
  mySerial.println("AT+SAPBR=0,1");
}

void smscom()
{  
   
   if(mySerial.available()){                  // Проверяем, если есть доступные данные
       delay(100);                            // Пауза
      while(mySerial.available()){            // Проверяем, есть ли еще данные.   
      incomingByte = mySerial.read();         // Считываем байт и записываем в переменную incomingByte   
      inputString += incomingByte;            // Записываем считанный байт в массив inputString   
    }
      inputString.toUpperCase();             // Меняем все буквы на заглавные 
      if (inputString.indexOf("info") > -1){ // Проверяем полученные данные, если info то шлем смску
      mySerial.println("AT+CMGF=1");    //  Раздел отправки СМС
      delay(2000);
      mySerial.print("AT+CMGS="");
      mySerial.print(phone_no);   
      delay(500);
      mySerial.print("Vlaga_in");
      mySerial.print(h2);  
      mySerial.print("%");
      mySerial.print(" Temp_in");
      mySerial.print(t2);
      mySerial.print("C");
      mySerial.print(" Vlaga_out");
      mySerial.print(h3);
      mySerial.print("%");
      mySerial.print(" Temp_out");
      mySerial.print(t3);
      mySerial.print("C");
      mySerial.print(" Vesa ");
      mySerial.print(delta01);
      mySerial.print("KG");
      delay(500);
      mySerial.print((char)26);
      delay(500);
      mySerial.println("AT+CMGDA="DEL ALL"");
      }
   }
}
      




void loop() {
smscom();





scale.power_up(); //включаем весы (hx711)


w0=scale.get_units(10);
w0=scale.get_units(10);
w0=scale.get_units(50); //читаем вес


  scale.power_down(); //выключаем весы

  TimeNow=millis();
  TimeNow1=millis();
//Статистика в  блинк раз в час
  if (TimeNow1-time3h1 > 3600000 ) 
{
  time3h1=TimeNow1;
  sendSensors();
}
 

//Статистика 3 часа
  if (TimeNow-time3h > 10800000 ) 
{
  time3h=TimeNow;
  Send3D();
}



// проверка веса улья на роение ил снятие крышки

 DeltaW=((swarm0w-w0)/calibrate0);
 if (TimeNow-swarm0t > 600000 ) 
{
  swarm0t=TimeNow;
  swarm0w=w0;
}
  else
    {
    if (DeltaW > 5 ) 
      {
        Hwarning=1; 
        Walert();
        swarm0t=TimeNow;
        swarm0w=w0;
       }
        else {if (DeltaW > 1 ) 
        {
         Halarm=1; 
         Walert();
         swarm0t=TimeNow;
         swarm0w=w0;
        }
       }

  }
     {Blynk.virtualWrite(V5,calibrate0 += 10);
      
      Blynk.virtualWrite(V6, calibrate0 -= 10);}
      


}





      
 

Остання редакція Alonewooolf (2021-02-04 16:04:52)

Неактивний

#2 2021-02-04 15:09:37

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: Модифицированная прошивка СМС-Вес

а оно компилируется
#define DHTPIN 2 // Тот самый номер пина, о котором упоминалось выше
#define DHTPIN 3

Неактивний

#3 2021-02-04 15:11:51

Alonewooolf
Учасник
Зареєстрований: 2020-05-23
Повідомлень: 11

Re: Модифицированная прошивка СМС-Вес

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

Неактивний

#4 2021-02-04 17:47:11

г0сть
Гість

Re: Модифицированная прошивка СМС-Вес

Alonewooolf пише:

да оно компилируется.

И работает?

#5 2021-02-04 18:03:16

Alonewooolf
Учасник
Зареєстрований: 2020-05-23
Повідомлень: 11

Re: Модифицированная прошивка СМС-Вес

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

Остання редакція Alonewooolf (2021-02-04 18:06:45)

Неактивний

#6 2021-02-04 18:55:56

г0сть
Гість

Re: Модифицированная прошивка СМС-Вес

Что-то любители пчел по всем форумам активизировались. Видать это жжжжжжжжжжжжжжжж неспроста

#7 2021-02-07 23:15:57

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Re: Модифицированная прошивка СМС-Вес

г0сть пише:

Что-то любители пчел по всем форумам активизировались. Видать это жжжжжжжжжжжжжжжж неспроста

smile

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму