Ви не увійшли.
Сторінки 1
автор Андрей Герасименко
Доброго дня друзья приглашаю всех к ознакомлению и плевков мне в лицо. Да пока не заплюют код не пишется.
В коде явно есть ошибки, цель создания этой темы чтобы эти ошибки нашлись и устранились.
Реализовано:
Подключение к Блинк для построения графиков (раз в час отсылает данные на сервера блинк, можно и чаще но батарея);
По смс "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)
Неактивний
тут использавно два датчика dht.
да оно компилируется.
Неактивний
да оно компилируется.
И работает?
К сожалению не могу сейчас протестить это на реальном железе. Потому что я на зароботках, придет сезон буду тестить в реальных условиях.
Думаю может тут будут знающие хорошо код люди, найдут в коде реальные баги, прошивка модернизирована за один день.
Мои знания очень скудные в ардуино, начал заниматься мес назад.
Остання редакція Alonewooolf (2021-02-04 18:06:45)
Неактивний
Что-то любители пчел по всем форумам активизировались. Видать это жжжжжжжжжжжжжжжж неспроста
Сторінки 1