Система "Умный дом" для загородного дома на Arduino Mega2560, HC-05, SIM900,DHT11,3-х DS18B20,RTC-DS1302

MaksVV
Offline
Зарегистрирован: 06.08.2015

добавил в скетч сообщения #545 функцию распечатки в Wi-Fi терминал переменных типа float .  Функция называется  Print_floatVar(здесь в скобках пишем переменную float, которую нужно распечатать)

Anikee
Offline
Зарегистрирован: 12.12.2017

MaksVV пишет:

Нашел один небольшой косяк при работе с ESP. При подключении к существующей сети Wi-Fi роутер назначает ESP шке IP адрес динамически - т.е. каждый раз разный может быть. Т.е. при перезагрузке роутера (электричество например отключали или ещё что), ESPшка получит другой IP и мы уже не сможем управлять умным домом с Wi-Fi Serial Terminal, пока не узнаем новый IP адрес  ESP. Для исправления данного косяка нужно в настройках роутера сделать чтобы IP адрес нашёй ESP выделялся всегда один и тотже, т.е. статический. Исправил сообщение #539, там указал как это сделать, всё просто. 

В принципе, в большинстве роутеров есть возможность закрепить IP-адрес за конкретным МАС-адресом. Припишите МАС-адрес ESPшки к IP-адресу, описанному в скетче и все дела...

MaksVV
Offline
Зарегистрирован: 06.08.2015

читайте внимательно, проблема уже была решена и описана. 

MaksVV пишет:

Для исправления данного косяка нужно в настройках роутера сделать чтобы IP адрес нашёй ESP выделялся всегда один и тотже, т.е. статический. Исправил сообщение #539, там указал как это сделать, всё просто. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

обнаружил приятный бонус при работе с ESP - строки можно отправлять в терминал Wi-Fi на кириллице!!! Переделал скетч #545 на русский. 


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

////////////////////////PROGMEM
#include <avr/pgmspace.h>

const char string_0[] PROGMEM = "Умный дом = "; 
const char string_1[] PROGMEM = "ВКЛ";   
const char string_2[] PROGMEM = "ВЫКЛ";   
const char string_3[] PROGMEM = "ВНИМАНИЕ";   
const char string_4[] PROGMEM = "ТРЕВОГА";   
const char string_5[] PROGMEM = "ПРОВЕРКА";   
const char string_6[] PROGMEM = "Пожарная сигнализация = ";
const char string_7[] PROGMEM = "ВКЛ: ";
const char string_8[] PROGMEM = "ВКЛ: Уставка: ";
const char string_9[] PROGMEM = " *C";
const char string_10[] PROGMEM = "ЭКОНОМИЯ";
const char string_11[] PROGMEM = "ВКЛ: температура в кухне: ";
const char string_12[] PROGMEM = "ЭКОНОМИЯ: температура в кухне: ";
const char string_13[] PROGMEM = "Параметры: ";
const char string_14[] PROGMEM = "Подпол:  ";
const char string_15[] PROGMEM = "В зале:       ";
const char string_16[] PROGMEM = "На улице:    ";
const char string_17[] PROGMEM = "На кухне:    ";
const char string_18[] PROGMEM = "Освещенность на улице: ";
const char string_19[] PROGMEM = "ИБП: +";
const char string_20[] PROGMEM = "SMS: ";
const char string_21[] PROGMEM = "Кол-во сработок пож.датчиков: ";
const char string_22[] PROGMEM = "DS18B20 ERROR: ";
const char string_23[] PROGMEM = "DS18B20 ERROR_ZAL: ";
const char string_24[] PROGMEM = "DS18B20 ERROR_KUHNYA: ";
const char string_25[] PROGMEM = "DS18B20 ERROR_ULICA: ";
const char string_26[] PROGMEM = "DHT11 ERROR: ";
const char string_27[] PROGMEM = "Наработка: ";
const char string_28[] PROGMEM = " дней";
const char string_29[] PROGMEM = "нет связи";
const char string_30[] PROGMEM = "Открыта калитка";
const char string_31[] PROGMEM = "Открыта входная дверь";
const char string_32[] PROGMEM = "Открыта дверь в бане";
const char string_33[] PROGMEM = "Тревога! Вода в погребе!";
const char string_34[] PROGMEM = "Очень высокая температура в бане. Пожар?!";
const char string_35[] PROGMEM = "Сработал датчик дыма";
const char string_36[] PROGMEM = "Баня готова";
const char string_37[] PROGMEM = "Движение в ванной";
const char string_38[] PROGMEM = "Движение в кухне";
const char string_39[] PROGMEM = "Движение в зале";
const char string_40[] PROGMEM = "Нет питания 220В";
const char string_41[] PROGMEM = "ОХРАНА ПЕРИМЕТРА ВКЛ";
const char string_42[] PROGMEM = "Внимание! Критическая температура!!!";
const char string_43[] PROGMEM = "Климат контроль = ";
const char string_44[] PROGMEM = "AT+CIPSEND=";
const char string_45[] PROGMEM = "";
const char string_46[] PROGMEM = "";
const char string_47[] PROGMEM = "";
const char string_48[] PROGMEM = "";
const char string_49[] PROGMEM = "";

//все что выше, строки для цикла запрос параметров, ниже отчеты о выполнении команд
const char string_50[] PROGMEM = "Ошибка команды!";   
const char string_51[] PROGMEM = "Встроенный светодиод выключен";  //отчет 0
const char string_52[] PROGMEM = "Встроенный светодиод включен";   //отчет 1 и т.д.




const char* const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4,   // здесь массив строк отчетов
string_5,  string_6,  string_7,  string_8,  string_9, string_10,string_11,string_12,string_13, 
string_14, string_15, string_16, string_17, string_18,string_19,string_20,string_21,string_22, 
string_23, string_24, string_25, string_26, string_27,string_28,string_29,string_30,string_31,
string_32, string_33, string_34, string_35, string_36,string_37,string_38,string_39,string_40,
string_41, string_42, string_43, string_44, string_45,string_46,string_47,string_48,string_49,
string_50, string_51, string_52};



#define  BUF_LENGTH 50
char buf[BUF_LENGTH]; // буффер для работы прогмем, если нужны строки более 50 символов, тут ставим бОльшее значение


// далее всем строкам дефайним название, чтобы не 0 1 2... так проще ориентироваться
#define SMARTHOME      0
#define ON             1
#define OFF            2
#define VNIMANIE       3
#define TREVOGA        4
#define PROVERKA       5
#define FIREALARM      6
#define ON_            7
#define USTAVKA        8
#define GRADUS         9
#define ECONOMIA       10
#define ON_TEMP_KUHNYA 11
#define ECON_TEMP_KUHNYA 12
#define PARAMETRY      13
#define PODPOL         14
#define ZAL            15
#define ULICA          16
#define KUHNYA         17
#define SOLNCE         18
#define IBP            19
#define SMS            20
#define FIRESHET       21
#define DS_ERROR_OBCH  22
#define DS_ERROR_ZAL   23
#define DS_ERROR_KUH   24
#define DS_ERROR_UL    25
#define DHT_ERROR      26
#define NARABOTKA      27
#define DNEY           28
#define NET_SVYAZI     29
#define OTKR_KALITKA   30
#define OTKR_VH_DVER   31
#define OTKR_BANYA_DVER 32
#define VODA_POGREB    33
#define ALARMTEMP_BANYA 34
#define DYM_DATCHIK     35
#define BANYA_GOTOVA   36
#define DVIG_VANNA     37
#define DVIG_KUHNYA    38
#define DVIG_ZAL       39
#define NET_220V       40
#define OHR_PERIMETR   41
#define ALARMTEMP      42
#define KLIMAT_KONTROL 43
#define AT_CIPSEND 44

#define REPORT_LED_OFF  51
#define REPORT_LED_ON   52
#define ERR             50



////////////////////////PROGMEM


#include <SoftwareSerial.h>
SoftwareSerial ESPport( 7,  8 ); 
//// ////////////////   RX, TX

// если у вас MEGA, то ESP подключите, например, к Serial3 (14, 15) 
// закомментируйте верхние две строчки выше, связанные с софтсериал, и раскоментируйте нижеследующую:
// #define ESPport Serial3




// ниже для буфера и адреса принимаемых сообщений ESP  
#define BUFFER_SIZE 30
char buffer[BUFFER_SIZE];
int ch_id;

bool balance_ESP = false;

//ниже для буффера цикла "запрос параметров по wi-fi"
#define BUFF_LENGTH 200
char buff [BUFF_LENGTH];


//ниже переменные, которые уже были у автора темы -  их так и оставляем, а тут они нужны, чтобы проверить этот скетч


String currStr = "";

int  TempUlicaC  = 20;  // Переменная. Итоговая температура на улице  (По умолчанию 20гр.*С)
int  TempKuhnyaC = 200;  // Переменная. Итоговая температура на кухне  (По умолчанию 20гр.*С)
int  TempPodpol  = 10;  
int TempZalC =20;
float Vpit = 12.8;

int vlag_Podpol = 68;
int dsZshet = 0;
int dsUshet = 0;
int dsKshet = 0;
int UlicaS = 70;
int SMSschet=0;
int Fireschet = 0;
int dsshet = 0;
int ds_Zshet = 0;
int ds_Ushet = 0;
int ds_Kshet = 0;
int dhtschet = 0;
int Dayschet = 0;
bool perimetr=1;
bool AlarmTemp = 1;
int tempDust = 25;


bool statushome = 1;
int statusFireAlarm =1;
int statusotp=1;

#include <DS3231.h>

// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);
Time t;
int RTCSekunda;              // Переменная "секунда" для суточного таймера цикл RTCtimer()
int RTCChas;                 // Переменная "час" для суточного таймера цикл RTCtimer()
int RTCMinuta;               // Переменная "минута" для суточного таймера
int RTCDay;                  // Переменная "день" для суточного таймера цикл RTC_timer()
int statusBud=2;             // Переменная "будильник" 0 - ожидание, 1 - прозвучал в этих сутках, 2 - отключен
boolean NewDay=false;        // Флаг "новые сутки" для функции автокорректировки хода часов
boolean statusKur=false;     // Флаг "работа курантов" 

#define ledPin 13



void setup() 
{ 
 rtc.begin();
pinMode (ledPin, OUTPUT);
  Serial.begin(38400); // Терминал нужен так просто для контроля что там в порту ESP шки 
  ESPport.begin(38400); // ESP8266  
 while ( ESPport.available() > 0 )ESPport.read(); // очистка буфера Serial
  delay (300);
  ESPport.println(F("AT+RST"));
  delay (3500);
  ESPport.println(F("AT+CWMODE=1")); // режим клиента   
  delay (300);
  ESPport.println(F("AT+CIPMODE=0")); // сквозной режим передачи данных. 
  delay (300);
  ESPport.println(F("AT+CIPMUX=1")); // multiple connection.
 delay (300);
  ESPport.println(F("AT+CIPSERVER=1,88")); // запускаем ТСР-сервер на 88-ом порту

  ESPport.println(F("AT+CIFSR")); // узнаём адрес
  digitalWrite(ledPin,HIGH);  
 }

void loop() 
{
 
  ESP();
}





void ESP(){ // цикл опроса ESP-шки
 int packet_len; // объявляем переменные
 
 char *pb;  
 ESPport.readBytesUntil('\n', buffer, BUFFER_SIZE); // читаем строку из есп в переменную "buffer"
  
 if(strncmp(buffer, "+IPD,", 5)==0) // если в "buffer" есть строка из пяти символов - "+IPD," тогда -
  {                                 // (СИшная функция "strncmp" сравнивает содержимое "buffer" с заданой строкой "+IPD,")
   sscanf(buffer+5, "%d,%d", &ch_id, &packet_len); // - вычитываем из "buffer" и засовываем в переменные (ch_id и packet_len) id клиента и длину пакета 
   if (packet_len > 0)                             // (СИшная функция "sscanf")
    {
      pb = buffer+5; {int povt = 0;
      while(*pb!=':'&&povt!=200) {pb++; povt++;}}
      pb++;
      
 //далее идёт парсинг команд
   char a,b,c,d;
   a= buffer [9];  b= buffer [10];
   c= buffer [11]; d= buffer [12];
 
 if (a=='s'&&b=='v'&&c=='e'&&d=='t'){ 
  char temp[5];
  for (int l=0; l<3; l++) temp[l] = buffer [l+13];
  Serial.println (atoi(temp));
  
  }
 
 
 else if(a=='0'){
      if(b=='1'){
        if(c=='1')
        {
          if(d=='1'){ if (!digitalRead(ledPin)) digitalWrite(ledPin, 1); PrintTEXT(REPORT_LED_ON); otvet_klienty();} // включить светодиод (0111)
     else if(d=='0'){ if (digitalRead(ledPin)) digitalWrite(ledPin, 0); PrintTEXT(REPORT_LED_OFF); otvet_klienty();} // выключить светодиод (0110)
    
     // заметьте как пользоваться отчетами. 
     // strcat(buff, "\r\n"); это вот просто перевод строки
     //Сначала пишем PrintTEXT(тут в скобках дефайн номера строки из прогмем); 
     // далее обязательно otvet_klienty(); (эта функция уже содержит первод строки) это как EndSMS() у ТС. Вот например делаем отчет по выполнению команды 0112
     // если надо после строки ну например "Ha ylice: " вставить переменную int (в данном случае это температура), а потом опять строку "*C", делаем так (см. команду 0112):
     
     else if(d=='2'){PrintTEXT(ULICA); Print_intVar(TempUlicaC); PrintTEXT(GRADUS);  otvet_klienty(); }
     
     // или если текст небольшой (большой лучше через PROGMEM) можно так (см. команда 0113):
     
     else if(d=='3'){strcat(buff, "ZAL: ");    Print_intVar(TempZalC);   strcat(buff, " *С"); strcat(buff, "\r\n"); 
                     strcat(buff, "Podpol: "); Print_intVar(TempPodpol); strcat(buff, " *С"); otvet_klienty();}  
                     
     else if(d=='4'){PrintTEXT(IBP); Print_floatVar(Vpit); strcat(buff, "V"); otvet_klienty();}
     else if(d=='5'){ currStr="+CUSD: 0,\"Balans:156,20r dbuihdbidjbdb"; balance_ESP=1; otvet_klienty();} // Уменьшение желаемой температуры в доме на 1гр.С (0115)
    
     else if(d=='6'){zapros_ESP();} // запрос параметров
     else {PrintTEXT(ERR); otvet_klienty();}
        }
      }
}
   

  
    
    
    }
  }
for (int i =0;i<BUFFER_SIZE;i++ ) buffer[i]=0; // очистка буфера

  
}


//////////////////////формирование ответа клиенту в терминал WI-FI////////////////////


void otvet_klienty() 
{  


if (balance_ESP)  //если это запрос баланса, берем строку с балансом из GSM модуля
  {
   // пишем в буфер из строки стринг всё что после 8 символа и до символа 'r' (ну рублей тобишь)
  for (int k =0;k<BUFF_LENGTH;k++ ) buff[k]=0;
    int leng =0; {int povt = 0;
    while (currStr[leng]!='r'&&povt != 200) { leng++; povt++;} }
  for (int i=0; i<leng-9; i++) buff[i] = currStr[i+10];
  balance_ESP = 0;
  } 
  
    int len=0; {int povt = 0;

    while (buff[len]!='\0'&&povt!=200){ len++; povt++;}}
 

    
  ESPport.print(F("AT+CIPSEND=")); // ответ клиенту: ат-команда, id-клиента, , , длина пакета
  ESPport.print(ch_id);
  ESPport.print(",");
  ESPport.println(len+2);

  delay(40);

  if(ESPport.find(">")) // ожидание от esp приглашения ввода
    {
ESPport.print(buff); 
ESPport.println("");  
for (int k =0;k<BUFF_LENGTH;k++ ) buff[k]=0;// чистим буфер
      delay(110);
    }

}


void zapros_ESP() {

for (int k =0;k<BUFF_LENGTH;k++ ) buff[k]=0;

for (int i=0; i<10; i++){

  
if (i==0){

t = rtc.getTime();
RTCChas = t.hour;                 
RTCMinuta = t.min;          
int Year = t.year; 
RTCDay = t.date;   

strcat(buff, "\r\n");   // Просто перенос строки
Print_intVar(RTCDay);        strcat(buff, " "); 
strcat(buff, rtc.getMonthStr());    strcat(buff, " "); 
Print_intVar(Year);         strcat(buff, " "); 
strcat(buff, rtc.getDOWStr());      strcat(buff, " "); 
Print_intVar(RTCChas);      strcat(buff, " "); 

strcat(buff, ": "); 

 if(RTCMinuta < 10) strcat(buff, "0");
Print_intVar(RTCMinuta);   
strcat(buff, "\r\n"); strcat(buff, "\r\n");
}

if (i==1){
PrintTEXT (SMARTHOME); 
if (statushome) PrintTEXT(ON); 
else     PrintTEXT(OFF); 
strcat(buff, "\r\n");
PrintTEXT(FIREALARM);
if (statusFireAlarm==1) PrintTEXT(ON); 
if (statusFireAlarm==0) PrintTEXT(OFF);
if (statusFireAlarm==2) PrintTEXT(VNIMANIE);
if (statusFireAlarm==3) PrintTEXT(TREVOGA); 
if (statusFireAlarm==4) PrintTEXT(PROVERKA); 
strcat(buff, "\r\n");
PrintTEXT(KLIMAT_KONTROL); 
  if (statusotp==1){PrintTEXT(USTAVKA); Print_intVar(tempDust); strcat(buff," *C");}
  if (statusotp==0)PrintTEXT(OFF); 
  if (statusotp==2)PrintTEXT(ECONOMIA);
  if (statusotp==3)PrintTEXT(ON_TEMP_KUHNYA); 
  if (statusotp==4)PrintTEXT(ECON_TEMP_KUHNYA); 
  strcat(buff, "\r\n");
}

if (i==2){

  
 PrintTEXT(PARAMETRY); 
   strcat(buff, "\r\n");
  PrintTEXT(PODPOL); 
  Print_intVar(vlag_Podpol); strcat(buff," % ; "); Print_intVar (TempPodpol); strcat(buff," *C");
  strcat(buff, "\r\n");

  PrintTEXT(ZAL); 
  if (dsZshet<4){Print_intVar(TempZalC); strcat(buff," *C");} 
  else PrintTEXT(NET_SVYAZI); 
  strcat(buff, "\r\n");

  PrintTEXT(ULICA); 
  if (dsUshet<4){Print_intVar(TempUlicaC); strcat(buff, " *C ;"); } 
  else PrintTEXT(NET_SVYAZI); 
  strcat(buff, "\r\n");

  
}


if (i==3){
  PrintTEXT(KUHNYA); 
  if (dsKshet<4){Print_intVar(TempKuhnyaC); strcat(buff, " *C");} 
  else PrintTEXT(NET_SVYAZI); 
  strcat(buff, "\r\n");
  
  PrintTEXT(SOLNCE); Print_intVar (UlicaS); strcat(buff, " %");
  strcat(buff, "\r\n");

 PrintTEXT(IBP); Print_floatVar (Vpit); strcat(buff, " V");
 strcat(buff, "\r\n");
  
//  if (Vpit<=12.0)   { Serial.println("Alarm! Min zaryad akkumulyatora IBP!"); }
//  if (Vpit>=14.0)   { Serial.println("Alarm! Max zaryad akkumulyatora IBP!"); }


  PrintTEXT(SMS);  Print_intVar(SMSschet);
  strcat(buff, "\r\n");}
 
 

  if (i==4){
  PrintTEXT(FIRESHET);  Print_intVar(Fireschet);
  strcat(buff, "\r\n");
  PrintTEXT(DS_ERROR_OBCH); Print_intVar(dsshet);
  strcat(buff, "\r\n");
  PrintTEXT(DS_ERROR_ZAL);  Print_intVar(ds_Zshet);  // смотрим глючность датчика
  strcat(buff, "\r\n");} 
 
  
 

  if (i==5) {
 PrintTEXT(DS_ERROR_KUH); Print_intVar(ds_Kshet);  // смотрим глючность датчика
  strcat(buff, "\r\n");
  PrintTEXT(DS_ERROR_UL); Print_intVar(ds_Ushet);  // смотрим глючность датчика
  strcat(buff, "\r\n");
  PrintTEXT(DHT_ERROR); Print_intVar(dhtschet);
  strcat(buff, "\r\n"); 
   PrintTEXT(NARABOTKA); Print_intVar(Dayschet); PrintTEXT(DNEY);
  strcat(buff, "\r\n");
    
 
  }

  if (i==6){
   
 
  if(1)  { PrintTEXT(OTKR_KALITKA); strcat(buff, "\r\n");}
  if(1)  { PrintTEXT(OTKR_VH_DVER); strcat(buff, "\r\n");}
  if(1)  { PrintTEXT(OTKR_BANYA_DVER); strcat(buff, "\r\n");}
  if(1) { PrintTEXT(VODA_POGREB); strcat(buff, "\r\n");}  
 }
  if (i==7){

  if (1)    { PrintTEXT(ALARMTEMP_BANYA); strcat(buff, "\r\n");}
  if (1)  { PrintTEXT(DYM_DATCHIK); strcat(buff, "\r\n");}
  
   }

    if (i==8){
  if (1)  { PrintTEXT(BANYA_GOTOVA); strcat(buff, "\r\n");}  
   if (1) { PrintTEXT(DVIG_VANNA); strcat(buff, "\r\n");} 
  if (1) { PrintTEXT(DVIG_KUHNYA); strcat(buff, "\r\n");} 
  if (1) { PrintTEXT(DVIG_ZAL); strcat(buff, "\r\n");}
}

if (i==9){
 
  if (1) { PrintTEXT(NET_220V); strcat(buff, "\r\n");}
  if (perimetr==1)           { PrintTEXT(OHR_PERIMETR); strcat(buff, "\r\n");}
  if (AlarmTemp==1) {PrintTEXT(ALARMTEMP); strcat(buff, "\r\n");}
 
}


int len=0; {int povt = 0;

    while (buff[len]!='\0'&&povt!=200) {len++; povt++;}}


  ESPport.print(F("AT+CIPSEND="));
  ESPport.print(ch_id);
  ESPport.print(",");
  if (i==9) ESPport.println(len+2);
  else ESPport.println(len);

  delay(100);

  if(ESPport.find(">")) // ожидание от esp приглашения ввода
    {
ESPport.print(buff); 
if (i==9) ESPport.println("");  
for (int k =0;k<BUFF_LENGTH;k++ ) buff[k]=0;// чистим буфер, не знаю нужно ли это
      delay(110);
    }

}

}


void Print_intVar (int &var){
char temp[5];
itoa(var, temp, 10) ;
strcat(buff, temp);
}

void Print_floatVar (float &var){
char temp[] = "     ";
dtostrf(var, 5, 1, temp);
strcat(buff, temp);
}

void PrintTEXT (int Str_nomer) {
strcpy_P(buf, (char*)pgm_read_word(&(string_table[Str_nomer])));
strcat(buff, buf); 
for (int j =0;j<BUF_LENGTH;j++ ) buf[j]=0; }

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

также нашел ещё одну программу вайфай терминала на андроид WiFi TCP/UDP Controller. Позволяет добавить больше кнопок, также имеются более широкие настройки и есть ползунки плавного регулирования (например можно настроить диммирование светодиодных лент). Там есть функция подкрашивания кнопок (зеленый или красный) в зависимости от пришедшего отчета, но я чёто не смог настроить чтобы работало, может у кого получится. расскажите. 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

а ESP8266 зависает, бывает? как рессетить?

MaksVV
Offline
Зарегистрирован: 06.08.2015

У меня пока не зависал. Но, думаю, вариант с хардовым пересбросом питания самый надежный ,как и в джсм модулях.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

MaksVV пишет:

обнаружил приятный бонус при работе с ESP - строки можно отправлять в терминал Wi-Fi на кириллице!!! Переделал скетч #545 на русский. 

Думаю дело в этом, IDE теперь нормально кирилицу в терминал выдает.

ARDUINO 1.8.2 2017.03.22

[ide]
* Fix command line: works again with relative paths (regression)
* Fix command line: "--save-prefs" works again (regression)
* AVR toolchain has been updated with a tentative fix for the ld-returned-5-exit-status bug
* Update arduino-builder to 1.3.25
  - avoid name clashing for libraries
  - cache core archives to speedup compilation consistently
* Allow BoardManager to fetch FreeBSD tools (thanks @kevans91)
* Serial monitor: the input string box is automatically focused when window is selected
* Serial monitor: now can not be opened during upload
* Serial monitor: now properly decodes UTF8 characters (thanks @aknrdureegaesr)
Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014
Здравствуйте, сочувствующие!
Наконец-то, реализована функция климат-контроля! Отныне ардуино управляет газовым котлом. Газовый котел у меня Daewoo DWG130 с внешним выносным пультом и без клемм подключения внешних термостатов.Поэтому сделал так, без вмешательстно в автоматику безопасности котла, что очень важно. НО будет ли так работать с другими котлами других моделей незнаю. Мой котел Daewoo DGB-130 MSC он идет с тремя видами пультов, и у меня разумается очень "удачная" модель пульта DBR-W21 :) Чем она прекрасна: существует "электронный дребезг" показаний температуры с внутреннего датчика пульта. Т.е. когда температура переходит с градуса на градус, показания начинают прыгать, а пульт в это время начинает слать команды на котел "пуск" и "останов". Облазил я кучу форумов, все маятся, а корейцы исправлять этот баг не хотят. Ну что ж боремся с этим сами.
 
Зарисовал небольшую схемку:
Работает это так:
 
1.Когда температура в помещении в норме, то умный дом (он же УД) подает на реле питание, и реле удерживает нормально-замкнутый контакт разомкнутым. Пульт котла получается обесточенным. Сам же котел находится в ожидании. 
 
2.После понижения температуры ниже уставки УД отключает питание с реле и его нормально-замкнутый контакт замыкается. Пульт оживает, восстанавливается связь с котлом, котел начинает прогревать контур отопления.
 
3.При повышении температуры в помещении выше уставки УД снова подает питание на реле, и оно размыкает свой контакт обесточивая пульт. Котел перестает видеть пульт и после не продолжительного завершения цикла прогрева контура отопления переходит в режим ожидания. При этом каких либо истерик от котла и пульта не наблюдается.
 
Есть только один минус у этого способа! Когда пульт обесточен, а котел в режиме ожидания, то котел не реагирует на начавшийся расход воды ГВС. Т.е. если кто-то включил горячую воду в душевой кабине ( а у меня котел греет горячую воду только для душевой кабины), то котел не запускается, вода бежит холодная. Для этого я предусмотрел в схеме тумблер, который стоит параллельно НЗ контакту  реле и замыкает цепь связи пульта. Замкнув этот тумблер, схема возвращается в свой заводской вид, что важно на случай неадекватной работы УД.
 
Из больших плюсов этой схемы это, простота, и безопасность!
 
Привет всем владельцам котлов Daewoo DGB-130 MSC!
#DGB-130
#DBR-W21
Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014
Так же установил датчик давления в систему отопления.
Датчик приобрел вот здесь:
 
 
Он на удивление маленький. Какая у него там точность на самом деле я думаю никому не известно, но за 500р очень даже гуд!
У датчика резьба G1/4"... Но в ЛеруаМерлен подобрал мне продавец два переходника в резьбу 1/2". Всё это скрутив в кучу, я всё равно установил на расстоянии от радиатора отопления через полипропиленовую вставку, потому что таким образом датчик не подвергается нагреву и всегда имеет комнатную температуру. Кабель применил како-то древний советский экранированный от звукотехники похоже, как раз хватило до контроллерного шкафа. Датчик цепляется по трем проводам. Красный +5В, черный GND, желтый это аналоговый сигнал от 0,5 до 4,5в.
т.е. 0,5в это 0МРа, а 4,5в это 1,2МРа (ну верх шкалы т.е.)
Отсюда не хитрый программный код:
//_______для измерения давления в системе отопления цикл "manometr"
float PresKotel=0;     // https://mysku.ru/blog/aliexpress/33748.html про датчик давления
int Val_MIN = 101;     // минимальное значение АЦП при давлении 0(ноль) Bar (0,51В)
int Val_MAX = 930;     // максимальное значение АЦП при давлении верха шкалы датчика (4,5В)
int Press_MAX = 1200;  // верх шкалы датчика давления в кПа (у меня 1200кПа=1,2МПа)


void manometr() // Цикл "манометр" измерение давления в системе отопления дома
// https://mysku.ru/blog/aliexpress/33748.html про датчик давления
// покупал тут https://ru.aliexpress.com/item/New-Electric-Unit-Pressure-Transducer-Sen...
{
  int val = analogRead(A5);
  PresKotel = map(val, Val_MIN, Val_MAX, 0, Press_MAX); // про функцию map http://arduino.ru/Reference/Map
  PresKotel = PresKotel/100;    // перевод в Bar (бары 1бар=0,098кгс/см2)
}


void alarms()  //______________Цикл "тревожные сигналы"
{
if (PresKotel < 0.5 && SMSPress==false) 
     { delay(1000); manometr();
       if (PresKotel < 0.5 && SMSPress==false)  //Отправка СМС о низком давлении в системе отопления
          { startOneSMS(); Serial2.print("Alarm!Davlenie:"); Serial2.print(PresKotel); Serial2.print("Bar_"); vremya2(); EndSMS(); 
            startTwoSMS(); Serial2.print("Alarm!Davlenie:"); Serial2.print(PresKotel); Serial2.print("Bar_"); vremya2(); EndSMS(); SMSPress=true;}
     }
if (PresKotel > 1.2 && SMSPress==true) {SMSPress=false;}
}

Ну кусок для калибровки нуля и максимального значения... в деле правда не проверял ещё.
else if(d=='6'){ int val = analogRead(A5); Val_MIN = val; manometr(); Serial.print(PresKotel); Serial.println("Bar");} // Калибровка нуля датчика давления отопления
else if(d=='7'){ int val = analogRead(A5); Val_MAX = val; manometr(); Serial.print(PresKotel); Serial.println("Bar");} // Калибровка верха шкалы датчика давления отопления

 

 

mishel
Offline
Зарегистрирован: 02.02.2018

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

 

vittka
Offline
Зарегистрирован: 29.04.2012

Здравствуйте!

Предлагаю вместо тумблера отключения дистанционного управления (или || с ним) в трубу подачи горячей воды в душевую кабину поставить  датчик протока, аналогично этому https://ru.aliexpress.com/item/one-inch-water-pump-flow-switch/634339319.html?spm=a2g0v.12010108.1000023.3.18375535MNvr91.

Этот датчик отработал прошлое лето на моем участке. Включал насос подачи воды из бочки для полива при открытии крана. Давление было всего менее 0,1 атм.

Он, правда , дюймовый, но думаю можно найти и меньше.

С уважением к Вашей огромной работе, Виталий.

Oleg_I
Offline
Зарегистрирован: 04.04.2016

Приветствую всех форумчан. 

Подскажите пытался ли кто использовать для связи умного дома модуль который по ссылке 

https://www.ebay.com/itm/GSM-GPRS-A6-Mini-Development-Quad-band-Board-SM...

 

Я все озабочен мыслями о дистанционном управлени через сеть интернет с любой точки земного шара ) 

Или хотя бы получать информацию о состоянии дома по интернету

Всем спасибо 

Konstantin86
Offline
Зарегистрирован: 15.03.2018

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

Идея такая, есть клавиатура к ардуино, 4х3 столбца, как только введен пароль из 4 цифр, через 60 секунд активируется система охраны, то есть датчики движения, протечки, газа/дыма. При срабатывании любого из них отправляется смс посредством SIM800L. прочие датчики температуры и тд работают постоянно.

подскажите, как это реализовать в коде.

Спасибо.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Сначала научиться работать с клавиатурой. Сразу рекомендация  - всё выводить в сериал монитор, чтобы узнать работает или нет.

- ну т.е. научиться получать инфу о состоянии каждой кнопки. 

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

- учимся делать таймер без delay. 

- учимся работать с каждым датчиком отдельно

- учимся работать с sim800L при чем и программно и аппаратно (есть особенности в подключении и питании)

- Потом объединяем по очереди отдельные скетчи, пока не получим один большой рабочий. 

Примерно такая схема. За вас скетч никто писать не будет. 

Многое можно взять из скетча ТС, а также отдельные элементы, которые я указал - всё есть на форме. Ищите. 

 

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

Konstantin86 пишет:

Идея такая, есть клавиатура к ардуино, 4х3 столбца, как только введен пароль из 4 цифр, через 60 секунд активируется система охраны, то есть датчики движения, протечки, газа/дыма. При срабатывании любого из них отправляется смс посредством SIM800L. прочие датчики температуры и тд работают постоянно.

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

Александр89
Offline
Зарегистрирован: 29.03.2018

Добрый день

Проект, супер.

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

посмотрел у вас на схеме второй контакт реле замкнут на землю.

 

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Александр89 пишет:

Добрый день

Проект, супер.

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

посмотрел у вас на схеме второй контакт реле замкнут на землю.

Вот так

Александр89
Offline
Зарегистрирован: 29.03.2018

А на пине ардуинки HIGH и ждем LOW?, ведь в объемнике реле постоянно замкнуто и размыкается во время паники. Или все меняет оптопара?

Вячеслав, спасибо большое, понял где не доработал

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Состряпал я тут экранчик 2004 для УД.

Встроил в него датчик атмосферного давления BMP180,датчик температуры DS18B20 и ИК-приемник, чтобы из зала тоже управлять пультом. Всё это установил во встраиваемю соединительную коробку для гипсокартона и подключил кабелем UTP-5e неэкранированным к УД на расстоянии 2м.... Всё сначало было хорошо и на радостях я даже сигнализатор резкого падения атмосферного давления в программу добавил, чтобы УД распознавал, когда погода резко портится и наоборот. Но радовался не долго, УД стал зависать, по нескольку раз в день! Впервые! за 3 года МЕГА зависала... до этого как швецарские часы... короче, думал соображал. Решил программно отключить всё что связано с датчиков BMP180УД заработал! Достаточно стабильно, но пару раз зависал за неделю. Возможно, это связано с тем что кабель я использовал не экранированный, а шину I2C вообще нельзя выводить за периметр платы. Расстроила меня эта шина вообщем. Надо переходить на  CAN или RS485. Может библиотека для BMP180 от Adafruita такая несовместимая с экраном и DS3231.

Сталкивался кто нибудь с такой бедой?

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

 

ну и т.д. там экранов много

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Вот. Недавно закончился срок поверки на счетчик воды, и я приобрел новый счетчик уже с датчиком расхода. СГВ-15Д. Его выходной контакт замкнут каждый 10-й литр воды.

Соответственно дописал программу. Чтобы считала расход и каждый 1 день месяца присылала отчет о потраченной воде за месяц и текущими показаниями счетчика воды.

Программа пока тестируется.

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Вот куски программы:

int Fvoda_m3_sum=5;    // Cчетчик расхода воды суммарный
int Fvoda_L_sum=0;     // Cчетчик расхода воды в этом месяце
int Fvoda_m3_Mes=1;    // Показания расхода воды м3 на 1 число предыдущего месяца
int Fgas_m3_sum=0;     // Cчетчик расхода газа суммарный
int Fgas_L_sum=0;      // Cчетчик расхода газа в этом месяце
int rashodV=0;         // временная переменная итог расхода воды за месяц 
int rashodG=0;         // временная переменная итог расхода газа за месяц
boolean Fvoda_on=false;   // Флаг состояния геркона счетчика СГВ-15Д



void rashodomer() // Цикл "расходомер" измерение суммарных расходов
{
 int presset = digitalRead(34); // high - разомкнут, low - замкнут каждый 10-й литр. Для СГВ-15Д. 1 импульс = 10 литрам
  if(presset == true && Fvoda_on == false)
      {
       Fvoda_L_sum++;                           // +10 литров к расходу
       if(Fvoda_L_sum < 100) {EEPROM.write(54, Fvoda_L_sum);}   // запоминаем расход литры. Емкость ячейки памяти 0...255
       Fvoda_on = true;
     } 

else{Fvoda_on = digitalRead(34);}    

  if(Fvoda_L_sum >= 100)
    {
      Fvoda_m3_sum++ ; Fvoda_L_sum=0;
      EEPROM.write(53, Fvoda_m3_sum);  // запоминаем расход кубометры
      EEPROM.write(54, Fvoda_L_sum);   // запоминаем расход литры
      rashodV = Fvoda_m3_sum - Fvoda_m3_Mes;
    }
}

 // Вывод на экран 2004
void lcdpar4() // Показания счетчиков
{
  //lcd.rightToLeft()
  lcd.clear();
  //1 строка
  lcd.setCursor(0,0); lcd.print("Расход-м3-литры-итог");
  //2 строка
  lcd.setCursor(0,1); lcd.print("Вода:");
  lcd.setCursor(5,1); lcd.print(Fvoda_m3_sum); lcd.setCursor(10,1);lcd.print(Fvoda_L_sum * 10); lcd.setCursor(17,1);lcd.print(rashodV);
  //3 строка
  lcd.setCursor(0,2); lcd.print(" Газ:");
  lcd.setCursor(5,2); lcd.print(Fgas_m3_sum);  lcd.setCursor(10,2);lcd.print(Fgas_L_sum);  lcd.setCursor(17,1);lcd.print(rashodG);
  //4 строка
  lcd.setCursor(0,3); lcd.print("Отправлено SMS:"); lcd.setCursor(15,3); lcd.print(SMSschet);
}

void RTCtimer()  // Цикл суточного таймера на RTC
{
if(RTCDay == 1) // отправка смс о расходах каждый 1 день месяца
  { if(SMSrashod==false) 
    { 
      SMSrashody();
      EEPROM.write(55, Fvoda_m3_Mes); // Записываем текущие показания в память для расчета через месяц
      SMSrashod=true;
    } 
   } 
    else{SMSrashod==false;}
  } 


void SMSrashody()
{
   startOneSMS();
   Serial2.print  (t.date, DEC);       Serial2.print(" ");
   Serial2.print  (rtc.getMonthStr()); Serial2.print(" ");
   Serial2.print  (t.year, DEC);       Serial2.print(" ");
   Serial2.println("Pokazaniya:"); // СМС  
   Serial2.print("Voda:"); Serial2.print(Fvoda_m3_sum); Serial2.print(","); Serial2.println(Fvoda_L_sum);  
   Serial2.print("za mesyac:"); Serial2.println(rashodV);
   Serial2.print(" Gas:"); Serial2.print(Fgas_m3_sum);  Serial2.print(","); Serial2.println(Fgas_L_sum);  
   EndSMS();   
}

Ну как то так, ещё добавлю сигнализацию утечки воды если хозяев нет дома и включена охранная сигнализация



 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Slavyanin55 пишет:

Состряпал я тут экранчик 2004 для УД.

Встроил в него датчик атмосферного давления BMP180,датчик температуры DS18B20 и ИК-приемник, чтобы из зала тоже управлять пультом. Всё это установил во встраиваемю соединительную коробку для гипсокартона и подключил кабелем UTP-5e неэкранированным к УД на расстоянии 2м.... Всё сначало было хорошо и на радостях я даже сигнализатор резкого падения атмосферного давления в программу добавил, чтобы УД распознавал, когда погода резко портится и наоборот. Но радовался не долго, УД стал зависать, по нескольку раз в день! Впервые! за 3 года МЕГА зависала... до этого как швецарские часы... короче, думал соображал. Решил программно отключить всё что связано с датчиков BMP180УД заработал! Достаточно стабильно, но пару раз зависал за неделю. Возможно, это связано с тем что кабель я использовал не экранированный, а шину I2C вообще нельзя выводить за периметр платы. Расстроила меня эта шина вообщем. Надо переходить на  CAN или RS485. Может библиотека для BMP180 от Adafruita такая несовместимая с экраном и DS3231.

Сталкивался кто нибудь с такой бедой?

Хех, конечно i2c так далеко низя. Скидывай часть кода, отвечающую за экран, Счетчик к экрану ближе? или к меге? Ардуино то есть в наличии? CAN модули ты говорил есть у тебя. 

Я постараюсь тебе организовать CAN обмен. распишу, покажу

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Slavyanin55 пишет:

Состряпал я тут экранчик 2004 для УД.

Встроил в него датчик атмосферного давления BMP180,датчик температуры DS18B20 и ИК-приемник, чтобы из зала тоже управлять пультом. Всё это установил во встраиваемю соединительную коробку для гипсокартона и подключил кабелем UTP-5e неэкранированным к УД на расстоянии 2м.... Всё сначало было хорошо и на радостях я даже сигнализатор резкого падения атмосферного давления в программу добавил, чтобы УД распознавал, когда погода резко портится и наоборот. Но радовался не долго, УД стал зависать, по нескольку раз в день! Впервые! за 3 года МЕГА зависала... до этого как швецарские часы... короче, думал соображал. Решил программно отключить всё что связано с датчиков BMP180УД заработал! Достаточно стабильно, но пару раз зависал за неделю. Возможно, это связано с тем что кабель я использовал не экранированный, а шину I2C вообще нельзя выводить за периметр платы. Расстроила меня эта шина вообщем. Надо переходить на  CAN или RS485. Может библиотека для BMP180 от Adafruita такая несовместимая с экраном и DS3231.

Сталкивался кто нибудь с такой бедой?

Сколько памяти на локальные переменные остается после компиляции?
Проблема точно не в длине провода. У меня этот датчик висит на проводе в 15 метрах от контроллера, плюс еще датчики температуры и так же DS3231 - все ок.
Нужно смотреть код, возможно слишком часто идет обращение к датчику. Ну и что там со свободной памятью.

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

MaksVV
Offline
Зарегистрирован: 06.08.2015

Слава, я уже тебе говорил, везде где печатаешь в порт или в lcd текст -  используй макрос F. Это довольно простой и действенный способ сэкономить оперативную память, у тебя в скетче просто уйма Serial.print - ов . Применив LCD ты еще принтов добавил. Действительно очень даже может быть, что оперативка заканчивается. 

было  

Serial.print ("привет мир"); lcd.print("Привет мир:");

используем макрос F, строковые константы при этом ложатся не в ОЗУ, а на флеш:

Serial.print (F("привет мир")); lcd.print(F("Привет мир:"));

 

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

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

rw4cju.ru
Offline
Зарегистрирован: 12.08.2015

Доброе время суток. 

Слежу за Вашим проектом.

Нравится сами примеры реализации. От себя добавлю, что в моем варианте работает (постоянно) маленький сервер на Raspberry 3 +HDD с установленной MajorDomo (далее МД) . Датчики и пр. исполнительные механизмы (ворота, вентиляторы, блок освещения (реле) приводы штор и пр. имеют каждый, свой модуль (Ардуино ПроМини) и канал(ы) передачи (обмена) информации, Это  либо на витой паре RS485, в основном это МОДБАС (блоки реле) либо протокол библиотеки MySensors, либо радиокнал (NRF24l01) (см. MySensors.org) с которым система очень гибкая в добавлении новых узлов, либо датчиков. Собрал прошил, включил и он в общей сети (рекомендую).  Ваш проект привлекает именно самой идейной стороной.

В тоже время, центрлизация! т.е. сведение всех каналов обмена информации и управления на один блок либо ведет к нестабильности либо возможной перегрузке.  Да и при его сбое все наверное останавливается. 

Из своих наработок.

Максимально возможно разделить логическую часть, с функциями опроса и исполнения команд. Те если например, есть каскад датчиков которые структурно увязаны в один блок (комната, помещение, отдельно стоящее строение) на них следует (по возможности) выделять отдельный блок. Например на Ардуино.  А данные, с этого блока, уже передавать на логический т.е например Мегу.

Кроме того, на Меге несколько информационных портов (4 СОМ) позволят упростить даный вопрос.  В моем вараинте есть внешние блоки они самодостаточные и только обслуживат датчики.  Мега, тоже есть, и может даже откажусь в дальнейшем от сервера, но прелесть в том, что МД шлет на телефон(ы) через "Телеграмм" всю оперативную информацию о состоянии системы и данные систем дома. (Отопление, ворота и пр) Так что отказ в пользу меги не очень то обоснован.

Мега же "лопатит" получаемые данные от остальных сводит ее в формат передачи на сервер. ну и выводит информацию на "тАбло". 20*4 

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

Если есть интерес то могу поделится наработанными материалами (платы/схемы) и пр. 

С Уважением! 

 

 

Ramonak
Offline
Зарегистрирован: 30.01.2015

Slavyanin55, подскажите, пожалуйста: где вы купили экран 2004LCD с русским шрифтом?

MaksVV
Offline
Зарегистрирован: 06.08.2015

rw4cju.ru, мы тут почти также куролесим 

rw4cju.ru
Offline
Зарегистрирован: 12.08.2015

MaksVV пишет:

rw4cju.ru, мы тут почти также куролесим 

Я не спорю, САN, конечно интересное решение, но, наверное, не всегда.

Я не хочу спорить, про его прелести или недостатки, это не главное. 

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

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

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

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

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

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

Проводная сеть — это конечно сила, я ее всегда использую и ее преимуществ не отвергаю, но и радиоканалы тоже оправданы.  Когда начал пробовать то тоже испытывал сомнения потом понял .... работает и еще как. А главное простота. Например, у меня есть переносной блок, в котором есть DHT22. (вот его подробное описание  http://mysensors.ru/build/humidity/ именно как датчик) фотоэлемент. контактный датчик (2) один кнопка один можно внешний (на прерывания). На плате есть место под другие датчики (планировал датчик давления). Размеры его 120*70*18 (стандартная коробка BOKS приобретённая в магазине). Питание 3 батарейки. Время работы, уже почти год!!!!  Схема постоянно в работе. "Спит" и примерно раз в 20 сек дает данные температуры и влажности, уровень освещенности и пр. если же нажать кнопку или контакт, то мгновенная реакция!!!  Этот датчик у меня "бродит" то в баню, то в сарай, то в погреб, то в машину (зимой) то... короче где только его не "ставил.  Большую часть он находится в душевой и лежит на окне. Дальность его с базой проверенные 100 м на улице. В доме он работает в любом месте и положении. Ну не знаю, может такой вариант и не всем нужен, но как вариант. 

Есть блок на стене, он содержит ESP8266 (i2c+LCD20*4) на него данные идут по MQTT и тоже радиоканал. и на него приходят данные как от сервера так и от других источников.  В этом же блоке есть приемопередатчик NRF24L01 и также получает данные с датчиков напрямую в сети хоть с сервером хоть без. 

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

Т.е логика такая примерно.

Если "За бортом" >5 C т.е не тепло не холодно (как сейчас) то включим первый режим. Скорость движения теплоносителя меньше, соответственно и циклирование горелки котла (вкл/выкл) в разы меньше, а поскольку она димируется (регулировка мощности) своей автоматикой, то соответственно и снижается общее потребление газа.  Суть процесса в том, что на котле (датчики) возникает меньшая ошибка по уровню температурной разности подача/обратка и следовательно автоматика снижает мощность горелки. Ну и так далее. Т.е если скорость будет большая (условно) то теплоноситель, быстро прогревается по всему контуру (у меня всего в системе около 30 л и это время от начального (старт) режима всего 6-7 минут) и выключает горелку (цикл). И так далее, из большой скорости быстро набирается ошибка разности и котел опять входит в цикл, что не есть хорошо по его режиму.. лучше когда горелка "дует" постоянно но с малой мощность. Т.е для котла это хорошо. 

По мере снижения температуры, (менее -2 -5) переходим на 2-й и далее при < -10 включаем 3-й режим.  По результату эксплуатации этого блока за 2 сезона, а также данных тепловых перепадов (по внешним датчикам, от 2 шт. средняя) уже получил "положительное сальдо" и довольно приличной от 50 до 70 кубов в месяц экономии газа, При среднем расходе, ранее в месяц около 300 кб в сильные морозы. . Т.е игра стоит свеч.

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

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

А в целом автору удачи.  Я глядя на его примеры реализации много взял себе в качестве концепции и как идеи. За это ему огромное спасибо. 

С Уважением!!!!

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Ramonak пишет:

Slavyanin55, подскажите, пожалуйста: где вы купили экран 2004LCD с русским шрифтом?

Такой экранчик я взял из подохшего контроллера вот такой вот установки дозирования хим.реагента. Офигенный экранчик, но подсветка могла бы быть поярче. http://www.hms-neftemash.ru/product/nasosnye-stantsii-ustanovki-dozirovaniya-reagentov/ustanovki-dozirovaniya-khimreagenta-udkh-metanola/

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

dr.lmg пишет:
МК не перегружен. Очень много глобальных переменных, нужно оптимизировать код. Сам с этой проблемой сталкивался.

Да, так оно и оказалось. Я компилирую в IDE 1.0.5. А этот компилятор не показывает загрузку ресурсов.

Закомпилировал с горем пополам IDE 1.8.5. пишет, что недостаточно памяти. Закомментировав всю работу с ESP, получил значение в 50%.  Всё правильно MaksVV говорит надо в PROGMEM запихивать, но компилятор опять там чего то не видит, что то ему не нравится. Библиотеки  подбирать такая мука :)

Почти победил плавный розжиг ночной подсветки... оказалось, что куча библиотек поделили между собой внутренние таймеры Меги и блокируют работу ШИМа на 12 пине. Опытным путем обнаружил, что на 4-м пине ШИМ работает, правда бывает "моросит" подсветка при розжиге/гашении.

Понятное дело,что Мега не резиновая и возможности ограничены... но ещё бы подрастянуть её :)

Ramonak
Offline
Зарегистрирован: 30.01.2015

Slavyanin55, можно более подробные фото экрана? Нет поблизости подходящего сгоревшего контроллера :)

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

dr.lmg пишет:
Сколько памяти на локальные переменные остается после компиляции? Проблема точно не в длине провода. У меня этот датчик висит на проводе в 15 метрах от контроллера, плюс еще датчики температуры и так же DS3231 - все ок. Нужно смотреть код, возможно слишком часто идет обращение к датчику. Ну и что там со свободной памятью.

Заменил я кабель до экрана на экранированную FTP. BMP180 удалил пока.

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Ramonak пишет:

Slavyanin55, можно более подробные фото экрана? Нет поблизости подходящего сгоревшего контроллера :)

https://vk.com/id18126240?z=photo18126240_456239276%2Falbum18126240_252822785%2Frev

На АЛи такого нет, я уже смотрел.

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

MaksVV пишет:

Слава, я уже тебе говорил, везде где печатаешь в порт или в lcd текст -  используй макрос F. Это довольно простой и действенный способ сэкономить оперативную память, у тебя в скетче просто уйма Serial.print - ов . Применив LCD ты еще принтов добавил. Действительно очень даже может быть, что оперативка заканчивается. 

было  

Serial.print ("привет мир"); lcd.print("Привет мир:");

используем макрос F, строковые константы при этом ложатся не в ОЗУ, а на флеш:

Serial.print (F("привет мир")); lcd.print(F("Привет мир:"));

 

Макс! Я всё помню, я обязательно победю! :)

stambylov
stambylov аватар
Offline
Зарегистрирован: 10.05.2012

Slavyanin55 пишет:

Ramonak пишет:

Slavyanin55, можно более подробные фото экрана? Нет поблизости подходящего сгоревшего контроллера :)

https://vk.com/id18126240?z=photo18126240_456239276%2Falbum18126240_252822785%2Frev

На АЛи такого нет, я уже смотрел.

Ребят, могу посоветовать сенсорный экран компании Nextion, для создания оболочки у него имеется бесплатный софт, там даже ребенок разберется.

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

С Ардуиной общается по Serial (TX, RX). Дисплеи есть резистивные и емкостные.

Я беру их на али, Рекомендую (Surenno Store) магазин на AliExpress.

Вот делал проект охранки-пожарки в котельной, ссылка на видео

Александр89
Offline
Зарегистрирован: 29.03.2018

Добрый день, а где можно посмотреть, почитать про Ваш вариант реализации умного дома?

stambylov
stambylov аватар
Offline
Зарегистрирован: 10.05.2012

Александр89 пишет:

Добрый день, а где можно посмотреть, почитать про Ваш вариант реализации умного дома?

Кому адресован вопрос?

Александр89
Offline
Зарегистрирован: 29.03.2018

вопрос адресован, rw4cju.ru

rw4cju.ru
Offline
Зарегистрирован: 12.08.2015

Александр89 пишет:

вопрос адресован, rw4cju.ru

доброе время суток. 

ВАС что конктретно интересует? Как реализовано. 

см. вот этот сайт (не реклама) http://majordomo.smartliving.ru/forum/viewforum.php?f=8 на нем подробно описана вся система. См ник shemnik69

Выполнена она на raspberry 3. К ней? (ему?)  подключен HDD через USB. на нем же развернута и сама система т.е операционка приложения (по сути небольшой сервер) .

Вот как это размещено "в натуре". Коридор там станция теплого пола (насос) внутри сам сервер. Работате круглые сутки уже более года. Отсутсвие эл. энергии переживает прекрасно может обходится (проверено) почти 28 часов что в моей практике не случалось. Есть генератор поскольку котел без эл. энергии не работает. 

Идем далее. Сам сервер это система MajorDomo. Работатет без сбоев с момента пуска, обновления и пр. делаю перодически через веб стрницу. Сами внешние узлы это множество разных блоков которые сами по себе живут но в комбинации и образуют умный дом. детально каждый расписывать долго см на стрнице указаной выше. 

Вот приммер модуля который принимает 4 контактных датчика (2 с прерыванием, порт RS485. 2 реле. 2 DHT 11 (22) и до 16 датчиков DS18b20,   (хотя такое количество это абсурд) но 2-3 прекрасно работают.  Вот его:http://majordomo.smartliving.ru/forum/viewtopic.php?f=22&t=3976  ели интересно то можно подробнее описать. Есть печатка (в корпус счетчика). 

Отличия от авторской по сути в том что система сама в себе (мозг управление) и не имеет привязки управляющих блоков реле кнопок и пр напрямую. Т.е это чисто командынй блок. Он же задает общий тренд поведения всей остальной команды контроллеров, в тоже время каждый из них сам по себе тоже работает в сети и как передает так может принимать (если есть такая задача) информацию, выполняет команды и пр. А центральный блок (сервер ) это еще и samba на которой лежат фильмы видео и пр. поскольку есто трекер для скачивания и с 00 часов (безлимит) он начинает свое "темное" дело.  Вот как то так. 

rw4cju.ru
Offline
Зарегистрирован: 12.08.2015

Еще добавлю что сама система (в целом) это постоянный поиск (с 2011 г) вариантов, и сначала она также строилсь в виде одного блока шкафа. В которыый сводилось "вся и все", но после нескольких лет "эксплуатации" от этого отказался в пользу распределенного интелекта по всему дому. Причина проста.  Централизация затрудняет выполнеие задачи при ее развитии, а также чрезмерно усложняет все структурно.  СКС конечно это замечательно сам знаю (по работе) но если изначально либо последовательно строить все на основе уже заведомо "умных"! блоков либо минимально встраивать в них интелект то централизация уже сводится к информ обмену а тут уже совсем другой расклад, и как раз этот вопрос прекрасно решен на уровне IP либо других протоколов. Modbus. TCP/IP. CAN и пр. 

Если пример ..телевизор холодильник микроволновка и пр имеют в своем составе микроконтроллры причем довольно мощные. b если у этих устройств есть каналы обмена информаци либо управления (например LAN. ИК порт WiFI и пр. да даже кнопочное управление можно вывести в информационный поток, то логично создвать не монстра совмещающего как просту логику так мускулы (реле актуаторы ипр), а информационую систему которая и будет это все делать. С появленим таких микрокомпютеров типа Raspberry это на мой взгляд само собой разумеется.

Потом, NRF24+MK или ESP8266 это просто идеальные для этого. В доме 3 ESP 8266 и 7 NRF решили самые трудные вопросы как разместить чтото не вступая в противоречие с домашними.  А это ведь знаете что... .... 

Блок управления ворот. Он на улице. открывает закрывает створу и калитку (ключи и дистанционно) если сам по себе, то от кнопки и ключей, а дистанционно по команде с телефонов, смартов, домофона времени. магнитолы в машине (когда заведена, блитуз цепляет мой смарт, а он открывает ворота) когда выехал, по ИК датчикам пересечения проема ворота закроются. 

Писать можно долго и детально, но не всем подойдет такая реализация.

Много факторов и желания а также возможностей должны совпадать.

Критики тоже на спят, им своего порой не нужно, а чужое все не такое как у них и конечно оно хуже. Все мы люди. Это понимаю тоже. 

Моя позиция, не критика, а рекомендация, потому как вижу "путь Самурая" у Вячеслава и хочу ему дать предложения.

Он конечно может их принимать /не принимать но остальные тоже из этого делают выводы.

А в целом, поскольку есть результат то значит автор добился того что хотел. 

Александр89
Offline
Зарегистрирован: 29.03.2018

спасибо

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Slavyanin55 пишет:

dr.lmg пишет:
МК не перегружен. Очень много глобальных переменных, нужно оптимизировать код. Сам с этой проблемой сталкивался.

Да, так оно и оказалось. Я компилирую в IDE 1.0.5. А этот компилятор не показывает загрузку ресурсов.

Закомпилировал с горем пополам IDE 1.8.5. пишет, что недостаточно памяти. Закомментировав всю работу с ESP, получил значение в 50%.  Всё правильно MaksVV говорит надо в PROGMEM запихивать, но компилятор опять там чего то не видит, что то ему не нравится. Библиотеки  подбирать такая мука :)

Понятное дело,что Мега не резиновая и возможности ограничены... но ещё бы подрастянуть её :)


На самом деле библиотеки тоже отжирают память. Причем очень часто -неоправданно.
Я бы все таки рекомендовал уйти от большого кол-ва глобальных переменных, часть загнать в EEPROM, остальное по максимуму использовать в функциях, отдавая - получая значения этих переменных обращением к функции. Я при помощи такого решения получил практически 25% экономии памяти.
Строки для отправки по тревожным сообщениям можно положить на SD карту, и брать их оттуда.

Khabibra
Offline
Зарегистрирован: 05.04.2018

Уважаемые! Прошу консультации, внимательно смотрю реализацию данного проекта. (!!!)  Решил сделать себе противопожарную, охранную и газовую сигнализацию, в связи сэтим у меня возник вопрос по датчикам.                                                                              В статье  http://blog.kvv213.com/2016/09/razbiraemsya-s-datchikami-co-i-metana-mq-4-i-mq-7/ описано не к чемность датчиков серии MG, но это все теория, а как на практике? Стоит устанавливать данные датчики или искать по серьезнее, (соответствено дороже),кто нибудь испытывал их на практике не на макете? И какие посоветуеете для частного дома?

stambylov
stambylov аватар
Offline
Зарегистрирован: 10.05.2012

 

 

 

 

Khabibra пишет:

Уважаемые! Прошу консультации, внимательно смотрю реализацию данного проекта. (!!!)  Решил сделать себе противопожарную, охранную и газовую сигнализацию, в связи сэтим у меня возник вопрос по датчикам.                                                                              В статье  http://blog.kvv213.com/2016/09/razbiraemsya-s-datchikami-co-i-metana-mq-4-i-mq-7/ описано не к чемность датчиков серии MG, но это все теория, а как на практике? Стоит устанавливать данные датчики или искать по серьезнее, (соответствено дороже),кто нибудь испытывал их на практике не на макете? И какие посоветуеете для частного дома?

Привет, это ты - Mansur Khabi.

- Датчик дыма

Чтоб не парится с датчиками дыма и не колхозить корпуса для них, советую готовый вариант, датчик имеет 4 провода, два из них питание 12В самого датчика, остальные два - выход (например, купили датчик с нормально разомкнутым (НР или НО) контактом, при наличии дыма датчик замыкает внутри себя контакты, далее подключаем к Arduino)

Для датчика с нормально замкнутым (НЗ) контактом все происходит также, только при дыме датчик размыкает свои контакты.

Извещатель пожарный дымовой 4-х проводный ИПД-3.2М НР

- Датчик загазованности

Этот датчик в отличии от датчика дыма, имеет НО и НЗ и мы сами можем выбрать выходной сигнал.

Проводной датчик утечки газа Sapsan GL-02 исп. 1(12V)

 

Khabibra
Offline
Зарегистрирован: 05.04.2018

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