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

JAbraКОНЬ
Offline
Зарегистрирован: 30.08.2016

Привет, я новичек в этоме деле (работал со схемами на пускателях, кнопках и т.д, но не с низковольтной аппаратурой) Может расскажешь основы? А именно: как ты ардуино, который на выходе выдает 5 вольт, подключил к силовой цепи? Я так понимаю, что использовал какое-то реле?

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

MaksVV пишет:
Также я добавил в скетч от Slavyanin управление с нескольких телефонов, и чтобы отчет приходил именно на тот телефон, с которого происходит управление. Могу скетч выложить если кому интересно

Если можно - то  сразу со своими библиотеками. 

men1079
Offline
Зарегистрирован: 10.08.2016

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

Очень понравилась наглядная схема от MaksVV https://yadi.sk/i/VjdbyX6ypuQN3, в ней все датчики заведены на 1-Wire, и у новичка тут возникают сложности. Можно поподробнее объяснить:

* какие лучше использовать датчики протечки, освещенности, движения, концевики, пожарные... и как из связать с 1-Wire интерфейсом

* сколько их может быть на одном порту ардуины, и можно ли разносить на разные

* какой тип кабеля лучше использовать и какое расстояние может быть от контроллера и блока питания до датчика. Ведь если датчик питается от 5 или 12В, то на длинном кабеле напряжение упадет и будет меньше расчетного. Например концевик калитки может быть на удалении 50м, тут точно 5/12В упадет. Или надо ставить беспроводный на батарейке?

И отдельный вопрос по электропитанию - правильней запитывать датчики 5В не от ардуины, а от отдельного блока питания? датчики на 12В от отдельного блока питания 12В, а саму Ардуину от 9В? Или ардуину можно от 5 или 12В?

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Serg1 пишет:

Чем хороши некоторые ветки форума, так это неспешностью ответов :) , что дает время на загрузку собственных мозгов.

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

Arduino: 1.6.5 (Windows 7), Плата"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)
RTCtimer.ino: In function 'void MinusChas()':
RTCtimer:62: error: 'class DS1307' has no member named 'writeProtect'
......
Решилось удалением строк, оперирующих с Writе protect.
 
 Заказал в Китае GSM модуль на Неовей М590. Как придет, продолжу изменение программы под него.
 
Сейчас есть более общий вопрос- в сети есть много примеров программ, где управление происходит посредством СМС. Но все эти модули поддерживают GPRS. Примеров программ с управлением по GPRS я не нашёл. По идее дешевле 100 руб в мес заплатить за интернет, чем 2 руб за каждую смс. Или тут какие то сложности в реализации?
 

Вот тоже интересуюсь возможностью использования GPRS на 590. Нашлось что-нибудь? Даташиты и наборы команд находятся достаточно легко. Даже на русском! Один человек даже запилил библиотеку для него! Только бы вот ещё разобраться. Да ещё бы понять, как лучше обмениваться данными со смартфоном.

elik745i
Offline
Зарегистрирован: 08.04.2012

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

http://www.voltrans.az/?p=1720

Вопрос знатокам, файл на СД карте гдето килобайтов 400-500, почему грузит в браузере 40 секунд, можно это както убыстрить?

Mikhail6667
Offline
Зарегистрирован: 20.09.2016

Добрый день, всем!

Подскажите пжста, есть ли недорогие имульсные реле типа РИО-1...может на али? Делаю свет в доме хочу все через импульсное реле пустить и в параллель на ардуину

На данный момент самамя дешевая которую знаю - это РИО-1 около 1000 руб. А если таких около 25 шт. ставить - вообще не оч(

 

kalong
Offline
Зарегистрирован: 05.11.2015

Доброго дня, Mikhail6667

Можно посмотреть в сторону поляризованных реле, но там добавится блок питания вольт на 12-24, некая схема управления, но это все может оказаться оправданным при таком количестве реле. Тем более что и ардуина планируется. Так сходу первая ссылка на чип и дип, контора не дешевая, просто чтобы понимать про что речь. И ток управления там максимум 2а при 220в указан, так что только на свет и хватит, причем небольшой. Можно посмотреть другие, я просто направление мысли дал :)

http://www.chipdip.ru/product/trx-trq2-24vdc-l-r/

Просто на дин рейку не встанет, нужно будет руки приложить.

alex_r61
Offline
Зарегистрирован: 20.06.2012

Реле импульсное EPN-510, 220В, 16A ЭТК Энергия, в два раза дешевле.

elik745i
Offline
Зарегистрирован: 08.04.2012

Реле ниже 30Ампер вообще не рекомендую к употреблению! они при превышении тока (не редкость, пусковые токи лед лампочек и впрочем и люминесцентных очень высокие) слипаются и больше не отпускают, лично спалил два 4х канальных модуля на 10А!

rapidshe
Offline
Зарегистрирован: 31.12.2015

Slavyanin55, привет от КИПовца) вопрос такой) по части сим900 - работает четко без глюков и зависаний?  выискиваю лучшую настройку для него)

vb
Offline
Зарегистрирован: 15.09.2016

прикольные проэкты на Arduino видел на ngin.pro Насчет умного дома там про датчики много информации.

RuslanRec
Offline
Зарегистрирован: 02.11.2016

Супер. Автор ты в Башкирии на ПНР Транснефти случем не работал, лицо закомое - )

RuslanRec
Offline
Зарегистрирован: 02.11.2016

Коллеги я тут наткнулся на один интересный проектик http://www.homegenie.it/docs/index.php

Кто что скажет?, Возможно ли объеденить их?

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

RuslanRec пишет:

Супер. Автор ты в Башкирии на ПНР Транснефти случем не работал, лицо закомое - )

Неа, в Башкирии я никогда не был. Но у меня очень много коллег из Башкирии.

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

rapidshe пишет:

Slavyanin55, привет от КИПовца) вопрос такой) по части сим900 - работает четко без глюков и зависаний?  выискиваю лучшую настройку для него)

Привет, привет! Ну к СИМ900 вопросов нет, работает хорошо. Просто весь его функционал не используется у меня, и стоит он не мало денег. Люди осваивают сейчас более недорогие модели. Вот бы мне научиться с него баланс получать, простым методом. Как в сигнализации Старлайн М21. Делает сигнализация запрос баланса, и всё что от оператора пришло тупо пересылает хозяину как есть.

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

RuslanRec пишет:

Коллеги я тут наткнулся на один интересный проектик http://www.homegenie.it/docs/index.php

Кто что скажет?, Возможно ли объеденить их?

Любопытный проектик! Можно что нибудь перенять из него.

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

elik745i пишет:

Реле ниже 30Ампер вообще не рекомендую к употреблению! они при превышении тока (не редкость, пусковые токи лед лампочек и впрочем и люминесцентных очень высокие) слипаются и больше не отпускают, лично спалил два 4х канальных модуля на 10А!

Ну умеючи как говорится можно и не такое сделать. У меня 16 реле. Причем на одном 10-ти амперном сидят все домовые розетки, и коммутирует оно, утюги, мультиварку, ноутбуки, блендер... ну только, что не одновременно. Пока полет нормальный. Может производитель реле плохой у тебя. На производстве почти вся автоматика на реле работает, и ничего. И реле там не особенные.

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

men1079 пишет:

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

Надо проект (чертеж и схемы) смотреть на яндекс диске. Там показано как цеплять

men1079 пишет:

Очень понравилась наглядная схема от MaksVV https://yadi.sk/i/VjdbyX6ypuQN3, в ней все датчики заведены на 1-Wire, и у новичка тут возникают сложности. Можно поподробнее объяснить:

* какие лучше использовать датчики протечки, освещенности, движения, концевики, пожарные... и как из связать с 1-Wire интерфейсом

* сколько их может быть на одном порту ардуины, и можно ли разносить на разные

* какой тип кабеля лучше использовать и какое расстояние может быть от контроллера и блока питания до датчика. Ведь если датчик питается от 5 или 12В, то на длинном кабеле напряжение упадет и будет меньше расчетного. Например концевик калитки может быть на удалении 50м, тут точно 5/12В упадет. Или надо ставить беспроводный на батарейке?

*Схема красивая. Это могу и я сообразить.

*используйте датчики готовые сертифицированные из магазинов охранно-пожарных сигнализаций, если не хотите бороться с ложными сигналами. Будете уверены, что они сработают.

* На Меге достаточно портов, чтобы пока не заморачиваться. Главное начать! Если датчики не цифровые(адресные) то по возможности лучше, чтобы они сидели каждый на отдельном порту, чтобы точно знать, как сработал.

* Я люблю шнур провод ШВВП 2*0,5. Он везде в есть в продаже. Достаточно износоустойчив. На нем удобно сразу писать фломастером откуда и куда.

"Например концевик калитки может быть на удалении 50м, тут точно 5/12В упадет." - концевик это просто "сухой"контакт, а значит не токопотребляющее устройство, значит падения напряжения не будет, главное чтобы была цепь, токовая петля. Главное такие шнурки разделять от контроллера оптопарой! Чтобы эти "антенны" не выдавали сигнал на контроллер. Частая ошибка людей. Потом ищут проблемы в программе.

men1079 пишет:

И отдельный вопрос по электропитанию - правильней запитывать датчики 5В не от ардуины, а от отдельного блока питания? датчики на 12В от отдельного блока питания 12В, а саму Ардуину от 9В? Или ардуину можно от 5 или 12В?

Ардуину лучше питать от 9 вольт, не будет греться стабилизатор на ней. От Ардуины вообще лучше ничего не запитывать, целее будет! Все запитывать от разных источников питания, не забывая все GND соединять между собой.

RuslanRec
Offline
Зарегистрирован: 02.11.2016

Slavyanin55 пишет:

RuslanRec пишет:

Супер. Автор ты в Башкирии на ПНР Транснефти случем не работал, лицо закомое - )

Неа, в Башкирии я никогда не был. Но у меня очень много коллег из Башкирии.

Дружище напиши свою почту, есть кое какая информация. Хочу тебе скинуть.

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

Slavyanin55 пишет:

Вот бы мне научиться с него баланс получать, простым методом. Как в сигнализации Старлайн М21. Делает сигнализация запрос баланса, и всё что от оператора пришло тупо пересылает хозяину как есть.

У меня получилось так сделать. Причем видоизменил твой код по GSMу -  управляют домом двое (можно больше). И отчёт приходит только тому, кто отправлял команды. По поводу баланса - СМС с балансом приходила на русском поэтому были кракозябры, уже узнал у оператора сотовой связи как всё на английский перевести (у меня МТС нужно отправить с телефона такой запрос *111*6*2#), но не потребовалось. Кто-то подсказал что запрос баланса нужно делать такой командой "ATD*100#" и у меня баланс стал приходить в правильном виде

типа  +CUSD: 0,"Balans:76,20r,Limit:0,01r Novinki khit-paradov i su

          00390023002000280

для теста всё что приходит в GSM модуль я отправлял в сериал на ПК, чтобы видеть что реально приходит (без этого фиг бы что настроил, очень помогло).  К тому же у меня экран 16х2 стоит  - тоже удобно контролировать что приходит на модуль, без пк. 

 isStringMessage делаем не boolean, а int, добавляем  переменную для int KTOzapros и т.д. смотрите код 
bool TimeSMSzapros = false ; // флаг отправки смс о состоянии дома по времени, каждый день в 20:00
String currStr = "";
int isStringMessage = 0;   // 0 - не сообщение, 1 - сообщение абонент № один, 2 - сообщение от абонент № два 
int KTOzapros = 1;        // перменнная кто запросил баланс. 1 - абонент № один, 2 - аб. № два


void readSMS() //_____Цикл чтения входящих СМС-сообщений______________     
{
    if (!mySerial.available()) return;
 
    char currSymb = mySerial.read();
  Serial.print (currSymb);  // отправляем полученные от абонентов данные из смс на сериал монитор ПК, чтобы узнать что конкретно пришло по смс
    if ('\r' == currSymb)
       {
         if (isStringMessage!=0) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
                {
          lcd.clear(); lcd.setCursor (0,0); lcd.print ("Message "); 
          if (isStringMessage == 1) {lcd.print("Max");}
          if (isStringMessage == 2) {lcd.print("Slava");} 
          lcd.setCursor (0,1); lcd.print (currStr);          
              if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}               // Передача параметров по СМС
               else if (!currStr.compareTo("OHRANA-ON"))   { signalizON(); }
               else if (!currStr.compareTo("OHRANA-OFF"))   { signalizOFF();}
               else if (!currStr.compareTo("Balance"))   { SMSbalance();}
            isStringMessage = 0;
                }
         else { if (currStr.startsWith("+CMT: \"+79000000001")) { isStringMessage = 1; KTOzapros = 1;}  //если текущая строка начинается с "+CMT бла бла...001",то следующая строка является сообщением от аб.1
                if (currStr.startsWith("+CMT: \"+79000000002")) { isStringMessage = 2; KTOzapros = 2;}  //если текущая строка начинается с "+CMT бла бла...002",то следующая строка является сообщением от аб.2
                if (currStr.startsWith("+CUSD: 0,"))  //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
                  {
                  if (KTOzapros == 1) startMaxSMS();    // если запрос сделал аб.1, посылаем отчет ему
                  if (KTOzapros == 2) startSlavaSMS();  // если запрос сделал аб.2, посылаем отчет ему
                  mySerial.print (currStr);
                  EndSMS();
                  }    
              } 
               
        currStr = "";
      } 

    else if ('\n' != currSymb) { currStr += String(currSymb);}
}




void SMSzapros()
{
  if (TimeSMSzapros==true) { startSlavaSMS();}      // отчет каждый день автоматически в 20:00 приходит только абоненту номер 2 
  if (isStringMessage == 1) { startMaxSMS();}       // если запрос сделал аб.1, посылаем отчет ему
  if (isStringMessage == 2) { startSlavaSMS();}     // если запрос сделал аб.2, посылаем отчет ему
    mySerial.println (time.gettime("H:i, D, d M"));
  if (signaliz == 1) mySerial.println ("OHRANA Vkluchena!");
  if (signaliz == 0) mySerial.println ("OHRANA Otkluchena!");  
  if(digitalRead(23)==HIGH) mySerial.println ("Dvizhenie v kotelnoy!");
    mySerial.print("Kuhnya: "); mySerial.print (TempKuhnyaC); mySerial.println("*C");
    mySerial.print("VannaNiz: "); mySerial.print (TempVannaNizC); mySerial.println("*C");
    mySerial.print("Ulica: "); mySerial.print (TempUlicaC); mySerial.println("*C");
    mySerial.print("AntiFreeze: "); mySerial.print (TempFreezeC); mySerial.println("*C");
   EndSMS();                  



void SMSbalance() {
 
      mySerial.println("ATD*100#");
   
      delay(2000);                             
    
}

 

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

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

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

// для шины 1-wire и датчиков DS18B20

#include <OneWire.h> // библиотека для DS18B20
OneWire ds(2); // датчики DS18B20 на 2 пин

byte KuhnyaC[8] ={0x28, 0xFF, 0xB1, 0x43, 0x52, 0x15, 0x01, 0xDB};
byte VannaNizC[8] ={0x28, 0xFF, 0xBA, 0x6C, 0x52, 0x15, 0x01, 0x41};
byte UlicaC[8] ={0x28, 0xFF, 0xE8, 0x3C, 0x03, 0x15, 0x03, 0xE3};
byte FreezeC[8] ={0x28, 0x9D, 0xE5, 0x70, 0x01, 0x00, 0x00, 0xEE};// Сетевой адрес датчика DS18B20 в доме
volatile int  TempKuhnyaC = 20;
volatile int  TempVannaNizC = 20;
volatile int  TempFreezeC = 20;
volatile int  TempUlicaC = 20;

bool SMSAlarmTemp = false; 

bool AlarmTemp = false;

//_______Стартовый цикл________
void setup() {

WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1); // разрешение прерывания + выдержка 1 секунда

}

void loop(){
 
  // бла бла бла
  
  }

ISR (WDT_vect){ //вектор прерывания WD
static boolean n=0; // флаг работы: запрос температуры или её чтение
n=!n;
if (n) {ds.reset();  // сброс шины
        ds.write(0xCC);//обращение ко всем датчикам
        ds.write(0x44);// начать преобразование (без паразитного питания)  
       }
else   {ds.reset();
        ds.select(KuhnyaC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempKuhnyaC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта       
        TempKuhnyaC = TempKuhnyaC / 16;
        // получение с 2-го датчика
        ds.reset();
        ds.select(VannaNizC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempVannaNizC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта  
        TempVannaNizC = TempVannaNizC/16;
        ds.reset();
        ds.select(UlicaC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempUlicaC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта       
        TempUlicaC = TempUlicaC / 16;
        // получение с 2-го датчика
        ds.reset();
        ds.select(FreezeC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempFreezeC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта  
        TempFreezeC = TempFreezeC/16 ;
}
}
   

 

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

Немного кода из моей работающей проги


// Регистрация хозяина
      if (dataSms.indexOf("Register") > -1 && EEPROM.read(0) == 3) {
        k=1;
//    Serial.println("Register");
        for (i=20; i<=30; i++){            // записываем с 20 по 31 ячейку номер телефона главного
          EEPROM.write(i,dataSmsN[k]-48);
          k++;
        }
        EEPROM.write(0,0);
        Automatic = EEPROM.read(0);
        ClearDataIn();
        smsSendAlarm("Hi, Your number is added as a master!");
      }
// Проверяем номер телефона хозяина
      if (dataSmsN !=""){
        Boss = 0;
        for (i=1; i<=11; i++){
          Temp += dataSmsN[i]-48; // записываем в Temp номер телефона из прешедшей смс
        }
        ReadNBoss();// читаем номер хозяина из EEPROM
        if (Temp == NBoss){// Сравниваем номер прешедшей смс с номером из памяти
          Boss = 1;
          Temp = "";
          NBoss = "";
        }
      }
//процедура отправки СМС
void smsSendAlarm(String text) {
    ReadNBoss();                               //Читаем номер из памяти
    gsm.println("AT+CMGS=\"" + NBoss + "\"");  //Отправляем на GSM комманду отправка смс-номер
    NBoss = "";                                //Очищаем перемунную
    delay(300);                                //Делаем задержку на передачу комманды
    gsm.print(text);                           //Отправляем на GSM комманду отправка смс-текст
    text = "";                                 //Очищаем перемунную
    delay(500);                                //Делаем задержку на передачу комманды
    gsm.print((char)26);                       //Отправляем на GSM комманду отправка смс!
    delay(5000);                               //Делаем задержку отправку смс
    
}
//Отправка смс о балансе
void GoBalans(){
  gsm.print("AT+CUSD=1,");
  gsm.print('"');
  gsm.print("#100#");
  gsm.println('"');
}

//Читаем номер из памяти
void ReadNBoss(){
  NBoss = "";
  for (i=20;i<=30;i++){
    Temp2 = EEPROM.read(i);
    if (Temp2 == 0){NBoss += "0";}
    if (Temp2 == 1){NBoss += "1";}
    if (Temp2 == 2){NBoss += "2";}
    if (Temp2 == 3){NBoss += "3";}
    if (Temp2 == 4){NBoss += "4";}
    if (Temp2 == 5){NBoss += "5";}
    if (Temp2 == 6){NBoss += "6";}
    if (Temp2 == 7){NBoss += "7";}
    if (Temp2 == 8){NBoss += "8";}
    if (Temp2 == 9){NBoss += "9";}
  } 
}

 

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

Вот код для добавления номеров телефонов в память EEPROM 

// Добавление телефона в память
          if (val.indexOf("Add mobile") > -1 && Automatic == 0 && Boss == 1) {   // Получили смс о добавлении номера телефона, 
                                               // проверяем есть ли он в памяти,
                                               // если нет в памяти, то добавляем в память,
                                               // отсылаем смс о добавлении номера в память
                                               // если номер уже записан, то отсылаем смс, что номер уже существует
                                               
            Serial.print("Poluchili sms add mobile: ");
            Serial.println(dataSms);
            // цикл поиска телефона
            NoNumberEEPROM = 0;
            num = 0;
            for (i=31; i <= 142; i+=11){
              s1 = EEPROM.read(i);s2 = EEPROM.read(i+1);s3 = EEPROM.read(i+2);s4 = EEPROM.read(i+3);s5 = EEPROM.read(i+4);s6 = EEPROM.read(i+5);s7 = EEPROM.read(i+6);s8 = EEPROM.read(i+7);s9 = EEPROM.read(i+8);s10 = EEPROM.read(i+9);s11 = EEPROM.read(i+10);
              // Если номер смс совпадает с номером хозяина в памяти Add mobile 123 4 5678910 11
                                                                   //1234567891 12
              if (s1 == dataSms[11]-48 && s2 == dataSms[12]-48 && s3 == dataSms[13]-48 && s4 == dataSms[14]-48 && s5 == dataSms[15]-48 && s6 == dataSms[16]-48 && s7 == dataSms[17]-48 && s8 == dataSms[18]-48 && s9 == dataSms[19]-48 && s10 == dataSms[20]-48 && s11 == dataSms[21]-48 ){
                // номер есть в EEPROM
                Serial.println("nomer est v EEPROM");
                NoNumberEEPROM += 1;
              }
              if (s1 == 0 && s2 == 0 && s3 == 0){
                if (num == 0){
                  num += i;
                }
                Serial.println("num +");
                Serial.println(num);
              }
//              i += 10;
            }
            if (NoNumberEEPROM >= 1){
                Serial.println("Hi, there is a number already");
              sms("Hi, there is a number already", dataSmsN);
            }
            if (NoNumberEEPROM == 0 && num >= 1 && num<=131){
                Serial.println("Hi, number NO, next step add to EEPROM");
              k=11;
              for (i=num; i <= num+10; i++){
                EEPROM.write(i,dataSms[k]-48);
                k++;
              }
              searchAll(); // Делаем флаг 0 для обновление данных при снятой охране
              SerialPrintEEPROM();
              sms("Hi, number added to the memory", dataSmsN);
            }
            if (num >= 131){
              Serial.println("Hi, dobavleno max nomerov");
              sms("Hi, added the maximum number", dataSmsN);
            }
          }
          

 

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

Slavyanin55 пишет:

 

men1079 пишет:

Очень понравилась наглядная схема от MaksVV https://yadi.sk/i/VjdbyX6ypuQN3, в ней все датчики заведены на 1-Wire, и у новичка тут возникают сложности. Можно поподробнее объяснить:

* какие лучше использовать датчики протечки, освещенности, движения, концевики, пожарные... и как из связать с 1-Wire интерфейсом

* сколько их может быть на одном порту ардуины, и можно ли разносить на разные

*Схема красивая. Это могу и я сообразить.

 

да уж, это только красивая схема. Но думаю хоть чем то она поможет людям. Реально новичкам  (ну мне по крайней мере) с 1-wire тяжело иметь дело, более менее только с датчиками температуры DS18B20. На схеме расписаны микрухи, с помощью которых сигналы заводятся в 1-wire, для каждой даже есть свои библиотеки. Но вот например выключатели света не вариант на 1-wire заводить - большая задержка в работе. Я даже заказал в китае все эти микрухи (только там они дешевы и то не очень, у нас ппц как дорого). Но в итоге не стал всё вешать на 1-wire и пошёл по пути нескольких ардуин. Контроллер света  - отдельная arduino, на него заводятся выключатели света нефиксируемые (каждый на свой пин ардуино) и датчики движения (тоже каждый на свой пин), а вот дальше планирую в главную ардуину информацию посылать по rs485. Выключатели умные, короткое нажатие свет меняет положение на противоположное, длинное - вкл/выкл режим авто, даблклик  - изменить количество ламп в люстре. В одной комнате можно ставить несколько выключателей, заводя их параллельно на один пин, очень удобно на входе и возле кровати. Выключатели с 3цветной подсветкой  - с индикацией различных режимов работы. кому интересно выглядит всё это примерно так https://yadi.sk/d/gRk-caBPy8qu7

А вот остальное может и повешу на 1-wire. Удобно когда датчик DS18B20 уже висит (в кухне например) и на эту же шину датчик протечки воды прикрутить, не протягивая провода. 

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

Вот выкладываю видос https://yadi.sk/i/-YwItXqNy8tEW

бета версия, некоторые датчики не подключены

Суть такая: управление всем освещением в доме, датчики температуры и влажности почти в каждом помещении, датчики тока(для проссмотра, сколько фаза потребляет -> перевод в кВт далее)

Компаненты:

Arduino DUE или Mega https://ru.aliexpress.com/item/Free-Shipping-2012-Due-R3-ARM-Version-Main-Control-Board-with-USB-Cable-for-Arduino-development/32554997726.html?spm=2114.13010608.0.0.WOP5Zp

https://ru.aliexpress.com/item/Free-shipping-Mega-2560-R3-Mega2560-REV3-ATmega2560-Board-and-USB-Cable-compatible-for-arduino-Mega/32645993044.html?spm=2114.13010308.0.0.u3V5nv

 

Ethernet shield с SD или без SD карты https://ru.aliexpress.com/item/Free-Shipping-UNO-Shield-Ethernet-Shield-W5100-R3-UNO-Mega-2560-1280-328-UNR-R3-only/32502588687.html?spm=2114.13010608.0.0.WOP5Zp

Датчики температуры-влажности https://ru.aliexpress.com/item/Free-Shipping-New-1pcs-DHT21-AM2301-Capacitance-Digital-Temperature-And-Humidity-Sensor/32652946130.html?spm=2114.13010608.0.0.zS5FJS

Реле для arduino https://ru.aliexpress.com/item/Free-Shipping-1PCS-LOT-5V-4-Channel-Relay-Module-Shield-for-Arduino-ARM-PIC-AVR-DSP/1946710301.html?spm=2114.13010608.0.0.zS5FJS

https://ru.aliexpress.com/item/1pcs-12V-16-Channel-Relay-Module-for-arduino-ARM-PIC-AVR-DSP-Electronic-Relay-Plate-Belt/32589022833.html?spm=2114.13010608.0.0.WOP5Zp&detailNewVersion=&categoryId=400103

датчики тока https://ru.aliexpress.com/item/2016-Brand-New-High-Quality-30A-SCT-013-030-Non-invasive-AC-Current-Sensor-Split-Core/32609768157.html?spm=2114.13010608.0.0.zS5FJS&detailNewVersion=&categoryId=523

 

Взаимодействие с Web:

Написана страница html с визуализацией, внутри него код Json. который в свою очередь отправляет данные при нажатии на лампочку, и обнавляет данные всей страницы каждые 5 секунд, НЕ ОБНАВЛЯЯ СТРАНИЦУ ЦЕЛИКОМ

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

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

Slavyanin55 пишет:

MaksVV пишет:

Также я добавил в скетч от Slavyanin управление с нескольких телефонов, и чтобы отчет приходил именно на тот телефон, с которого происходит управление. Могу скетч выложить если кому интересно

Ещё как интересно! Давно уже хочу добавить это. Недавно сел, почитал форум, попробовал у себя, но ничего не получилось, ума не хватило. Это очень нужное дело, так как пользователей может быть много, как минимум 2-е

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

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

Mikhail6667 пишет:

Добрый день, всем!

Подскажите пжста, есть ли недорогие имульсные реле типа РИО-1...может на али? Делаю свет в доме хочу все через импульсное реле пустить и в параллель на ардуину

На данный момент самамя дешевая которую знаю - это РИО-1 около 1000 руб. А если таких около 25 шт. ставить - вообще не оч(

 

Вот реле, которое можно использовать совместно с ардуиной http://www.etm.ru/cat/nn/5111470/

у него есть 2-а независимых контакта, один используем для света, второй для индикации на ардуино

импульс с ардуины делаем через реле https://ru.aliexpress.com/item/Free-Shipping-1PCS-LOT-5V-4-Channel-Relay-Module-Shield-for-Arduino-ARM-PIC-AVR-DSP/1946710301.html?spm=2114.13010608.0.0.ly7dl7&detailNewVersion=&categoryId=400103

для импульса необходима задержка на вкл-выкл реле:

void ToggleLightsNewYear(int RelayNumber){
  if (RelayNumber == 1 && digitalRead(iRele1) == 0){
       digitalWrite(Rele1, !HIGH);
       delay(100); // задержка на переключения состояния импольсному реле
       digitalWrite(Rele1, !LOW);  
  }

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

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

JAbraКОНЬ пишет:

Привет, я новичек в этоме деле (работал со схемами на пускателях, кнопках и т.д, но не с низковольтной аппаратурой) Может расскажешь основы? А именно: как ты ардуино, который на выходе выдает 5 вольт, подключил к силовой цепи? Я так понимаю, что использовал какое-то реле?

подробнее #377

Фото с подключением https://yadi.sk/i/HzQpp3ymyHrfS

 

RuslanRec
Offline
Зарегистрирован: 02.11.2016

Может проект пора в github переносить?

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

MaksVV я такоц же модуль жду, так что будем тестить вместе.

У меня есть прошивка под gsm сигнализацию, с возможностью работы как по смс так и по gprs. пишите в личку, отправлю ruslanrec@mail.ru

bars
Offline
Зарегистрирован: 07.11.2016

Привет! Я тоже КИПовец! Ты интересное и нужное дело затеял. Посмотрел всю тему и так понял, что прогу для Ардуинки ты пишеш на С#. Дело конечно хорошее, но я хочу подсказать сайт FlProg.ru на нём представлена среда для разработки программ для ардуино ДЛЯ НЕ ПРОГРАМИСТОВ. вся программа пищется в удобном для нас КИПовцев виде, как логические блок схемы, а компилятор потом всё превращает в текст в С#. Много уже готовых блоков для подключений разных датчиков. Очень не плохая поддержка информацией на форуме. Я тоже делаю умный дом и прогу для ардуинки пишу в FlProg. В качестве мониторинга и управления системой я использую скаду. Кстате FlProg бесплатная.

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

Я хочу использовать Flprog только для создания сети rs485 (протокол Modbus) между ардуинами. Там типа сетевых переменных делается, как раз как я и хотел. На С+ мне тяжело такие вещи писать. Остальное вроде не так сложно, можно разобраться. 

fightingcloud
Offline
Зарегистрирован: 08.11.2016

Прошу не кидаться тапками, если кто-то уже обращался с подобным вопросом (: Лучше ткните где посмотреть (:

Собственно, вопрос. В прошлом году какие-то негодяи разбили окно, влезли на дачу и вынесли всё, что плохо лежало. Решила вот установить систему безопасности и наткнулась на Эктоконтрол. Кто-нибудь ставил? Как скоро приходят оповещения? Ещё интересует срок автономной работы, в посёлке частенько электричество отключают… На сайте информации не нашла.

Заранее спасибо за ответы (:

Serg1
Offline
Зарегистрирован: 04.12.2015

И снова здравствуйте!

Сей проект в феврале был заброшен на стадии переделки программы под другой таймер.

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

Программа залита, модуль  ВТ и таймер типа 1307 активированы. Сейчас на очереди GSM модуль на М590. Симку взял МТС. Для понимания расходов на СМС, прошу подсказать как много смс модуль будет слать при включении\отладке? Как происходит борьба с переполнением симки смс-ками?

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

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

 

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

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

int isStringMessage = 0;   // 0 - не сообщение, 1 - сообщение от Макса, 2 - сообщение от Славы
bool TimeSMSzapros = false ; // флаг отправки смс о состоянии дома по времени, каждый день в 20:00
int KTOzapros = 1;        // перменнная кто запросил баланс. 1 - абонент № один, 2 - аб. № два, 0 - запрос по блютуз

// ДЖСМ     //////////////////

void startMaxSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
{
      mySerial.print("AT+CMGF=1\r");
      delay(100);
      mySerial.println("AT + CMGS = \"+70000000001\""); // (+79000000000 сдесь должен быть ваш номер №1)
      delay(100);
}

void startSlavaSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по второму  номеру
{
      mySerial.print("AT+CMGF=1\r");
      delay(100);
      mySerial.println("AT + CMGS = \"+000000000002\""); // (+79000000000 сдесь должен быть ваш номер №2)
      delay(100);
}

void EndSMS ()
{
  delay(100);
   mySerial.println((char)26);                       // Команда отправки СМС
   delay(5000);
}



void readSMS() //_____Цикл чтения входящих СМС-сообщений______________     
{
    if (!mySerial.available()) return;
 
    char currSymb = mySerial.read();
  Serial.print (currSymb);   //отправляем на ПК в сериал всё что пришло от модуля GSM (нужно для отладки)
    if ('\r' == currSymb)
       {
         if (isStringMessage!=0) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
                {
          lcd.clear(); lcd.setCursor (0,0); lcd.print ("Message ");  //выдача на лсд от кого и что за команда 
          if (isStringMessage == 1) {lcd.print("Max");}              
          if (isStringMessage == 2) {lcd.print("Slava");}            
          lcd.setCursor (0,1); lcd.print (currStr);                  
              if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}    // Передача отчета об умном доме по смс
               else if (!currStr.compareTo("OHRANA-ON"))   { signalizON(); }  
               else if (!currStr.compareTo("OHRANA-OFF"))   { signalizOFF();} 
 else if (!currStr.compareTo("STANCIYA-ON")) { statusPump=1; if (isStringMessage == 1) {startMaxSMS();} if (isStringMessage == 2) {startSlavaSMS();} mySerial.println("Nasosnaya stanciya vkluchena"); EndSMS();} 
 else if (!currStr.compareTo("STANCIYA-OFF")){ statusPump=0; if (isStringMessage == 1) {startMaxSMS();} if (isStringMessage == 2) {startSlavaSMS();} mySerial.println("Nasosnaya stanciya otkluchena"); EndSMS();} 
               else if (!currStr.compareTo("Balance"))   { SMSbalance();}
            isStringMessage = 0;
                }
         else { if (currStr.startsWith("+CMT: \"+00000000001")) { isStringMessage = 1; KTOzapros = 1;} //если строка начинается с "+CMT...01",то след. строка является сообщ от аб.1
                if (currStr.startsWith("+CMT: \"+00000000002")) { isStringMessage = 2; KTOzapros = 2;} //если строка начинается с "+CMT...02",то след. строка является сообщ от аб.2
                if (currStr.startsWith("+CUSD: 0,"))  //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
                  { if (KTOzapros !=0) {               // если запрос не по блютуз, шлём смс тому, кто запросил. 
                  if (KTOzapros == 1) startMaxSMS();  
                  if (KTOzapros == 2) startSlavaSMS();
                  mySerial.print (currStr);  // пересылка содержимого смс-ки баланса абоненту 
                  EndSMS();           }
                  else Serial3.print (currStr);      // если запрос от блютуз , шлём баланс туда
                  }    
              } 
               
        currStr = "";
      } 
    else if ('\n' != currSymb) { currStr += String(currSymb);}
}

void SMSzapros()
{
  if (TimeSMSzapros==true) { startSlavaSMS();}
  if (isStringMessage == 1) { startMaxSMS();}
  if (isStringMessage == 2) { startSlavaSMS();}
    mySerial.println (time.gettime("H:i, D, d M"));
  if (signaliz == 1) mySerial.println ("OHRANA Vkluchena!");
  if (signaliz == 0) mySerial.println ("OHRANA Otkluchena!");  
  if(dvig) mySerial.println ("Dvizhenie v kotelnoy!");
    mySerial.print("Kuhnya: "); mySerial.print (TempKuhnyaC); mySerial.println("*C");
    mySerial.print("VannaNiz: "); mySerial.print (TempVannaNizC); mySerial.println("*C");
    mySerial.print("Ulica: "); mySerial.print (TempUlicaC); mySerial.println("*C");
    mySerial.print("AntiFreeze: "); mySerial.print (TempFreezeC); mySerial.println("*C");
   EndSMS();                                 
}

void SMSbalance() {
 
      mySerial.println("ATD#100#");
    
      delay(2000);                             
                  }


// BLUETOOTH  ////////////


void bluetooth() //_________ Контроль и управление умным домом по терминалу НС-05_http://rezoh.ru/?p=1754 взято тут
{ 
inSize=0; // Сбрасываем переменную
memset(str, '\0', 128); // Очищаем массив
 if(Serial3.available() > 0)
 {
   delay(200); // Ждем, для того, чтобы пришли все данные
   inSize = Serial3.available(); // Получаем длину строки и записываем ее в переменую
   for (int i = 0; i < inSize; i++)
   {
     str[i] = Serial3.read(); // Читаем каждый символ, и пишем его в массив
   }
   // Сравнять массив с строкой будем используя функцию strcmp
    
         if (strcmp(str, "OHRANA-ON") == 0)  { signalizON(); tone(Pyezo, TonPIKon, 200); Serial3.println ("OHRANA Vkluchena!");} 
      else if (strcmp(str, "OHRANA-OFF") == 0)  { signalizOFF(); tone(Pyezo, TonPIKoff, 200); Serial3.println ("OHRANA Otkluchena!");}
      else if (strcmp(str, "Balance") == 0)  { KTOzapros = 0; tone(Pyezo, TonPIKon, 200); Serial3.println ("Ozhidayte balans"); SMSbalance();}
            else if (strcmp(str, "ZAPROS") == 0) {  zapros(); tone(Pyezo, TonPIKon, 100); delay(200);} // Передача отчета об умном доме в терминал блютуз
      else{ Serial3.println("Nevernaya comanda!");} 
  }          
}

void zapros()  //Передача всех параметров в терминал по bluetooth
{

   Serial3.println (time.gettime("H:i, D, d M"));
  if (signaliz == 1) Serial3.println ("OHRANA Vkluchena!");
  if (signaliz == 0) Serial3.println ("OHRANA Otkluchena!");  
  if(dvig) Serial3.println ("Dvizhenie v kotelnoy!");
    Serial3.print("Kuhnya: "); Serial3.print (TempKuhnyaC); Serial3.println("*C");
    Serial3.print("VannaNiz: "); Serial3.print (TempVannaNizC); Serial3.println("*C");
    Serial3.print("Ulica: "); Serial3.print (TempUlicaC); Serial3.println("*C");
    Serial3.print("AntiFreeze: "); Serial3.print (TempFreezeC); Serial3.println("*C");
   if (AlarmTemp==1) { Serial3.println("Alarm! Kriticheskaya temperatura!"); }
}

 

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

Привет, вот разработал сиситему, https://vk.com/arduino78?w=wall-85051128_10%2Fall

Serg1
Offline
Зарегистрирован: 04.12.2015

Макс, спасибо.

А этот кусок кода куда вставлять? (полность заменить код во вкладке GSM, или где?)

Вчера тестировал М590. Подключил питание 4,2 В от лабораторного БП с током до 3А.  Замкнул Boоt на землю.

Горит 1 светодиод и моргает с частотой 1 Гц второй светодиод. Это рабочий режим, однако "абонент недоступен".

Показания амперметра прыгают от 0,02 до 0,12 А. На телефон приходят смс о том, что модуль в сети, но до него не дозвониться. Подключил в качестве питания Ли-По акумулятор от РУ вертолета. Модуль в сети, гудки пошли.

В общем у кого модуль глючит- первым делом обеспечьте питание мин 4В и током до 2А.

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

ну если тупо заменить код во вкладке GSM ничего работать не будет. У каждого ведь свой проект. Например у меня сериал соединение с gsm модулем  - mySerial, у кого то Serial1.  у меня управляемых устройств не больше пяти, у автора темы  - целый список и т.д. нужно понимать код, копипастом врядли можно добиться правильной работы проекта. 

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

RuslanRec
Offline
Зарегистрирован: 02.11.2016

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

Кстати вот наткнулся на визуальный отладчик http://fritzing.org/ может для отладки комуто пригодиться

И еще один проект с примерами http://ngin.pro/

 

Serg1
Offline
Зарегистрирован: 04.12.2015

Коллеги!

Продолжаю делиться опытом по реализации  данной системы:

Модуль М590 - 4 дня молчал по Rx Tx. Продавец с Али указывал в описании что модуль настроен на скорость 115200. Я ему поверил. По подключению он же указывал, что питание 4,2В Подключение по Rx Tx осуществляется напрямую (без согласования уровней).

Использование Ардуино НАНО в качестве USB\UART испробовал:

1.Замыканием RES c землей,

2. Заливка скетча из 2х строк и подключение к аппаратным  Rx Tx(выводы 0, 1).void setup()

 { 
   pinMode(0, INPUT); 
   pinMode(1, INPUT); 
 } 
 void loop()  

 {} 

3. Согласовывал уровни. Результат нулевой.

Для проверки замыкал  выводы Rx-Tx в целях получения эха. ЭХА не было.

Оставался вариант купить переходник, но за ним лениво ехать. Либо попытаться подключиться по софтсериал. "спецы" с различных форумов уверяли, что 115200 слишком высокая скорость для софт сериал. Но попытка не пытка...

Результат ЕСТЬ! Модем ответил ОК по софтсериалу на 115200. И по команде AT+IPR=19200 тоже ОК.

 

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

Так вот она, не скрываю её chernisheevka@mail.ru

RuslanRec пишет:

Slavyanin55 пишет:

RuslanRec пишет:

Супер. Автор ты в Башкирии на ПНР Транснефти случем не работал, лицо закомое - )

Неа, в Башкирии я никогда не был. Но у меня очень много коллег из Башкирии.

Дружище напиши свою почту, есть кое какая информация. Хочу тебе скинуть.

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

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

А ещё минусы такие,  что флпрог создает много глобальных переменных, а они поедают оперативку атмеги. А еще в коде флпрога нет комментариев.

Но я очень уважаю автора FLProga и слежу за развитием его детища.

bars пишет:

Привет! Я тоже КИПовец! Ты интересное и нужное дело затеял. Посмотрел всю тему и так понял, что прогу для Ардуинки ты пишеш на С#. Дело конечно хорошее, но я хочу подсказать сайт FlProg.ru на нём представлена среда для разработки программ для ардуино ДЛЯ НЕ ПРОГРАМИСТОВ. вся программа пищется в удобном для нас КИПовцев виде, как логические блок схемы, а компилятор потом всё превращает в текст в С#. Много уже готовых блоков для подключений разных датчиков. Очень не плохая поддержка информацией на форуме. Я тоже делаю умный дом и прогу для ардуинки пишу в FlProg. В качестве мониторинга и управления системой я использую скаду. Кстате FlProg бесплатная.

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

Ну а что, зачем кидаться тапками. После того как обворовали мой железный контейнер, я тоже озадачился этим вопросом. В итоге я приобрел сигнализацию TAVR-GSM производства Альтоника. Рекомендую! Она несколько лет проработала у меня в железном неотапливаемом гараже без электричества на краю микрорайона. Так вот сейчас появились следующие версии этой сигнализации, а у меня первая с одним датчиком движения. Сигнализация абсолютно автономная, работает на батарейках. Производитель утверждает, что срок работы до 1 года на одних батарейках, но это при температуре +20С. Она отработает это время, не сомневаюсь. НО она уменя работала в диапазоне от -37 до +55! Надо понимать, что батарейки на морозе за -20 не работают. Но сигнализация работала и при -30, но со свежими батарейками. Состоит она из основного блока размером 7х10х4 см и отдельного датчика движения. Между блоком и датчиком связь без проводов. В блок вставляется симкарта , и он прячется в скрытом месте, а датчик устанавливается в месте вероятного появления противника :) Как только будет обнаружено движение, блок обзвонит номера хозяевов и разошлет смс! Что ещё для счастья надо. Такую сигнализацию, можно брать куда хочешь, в палатку, ложить в машину, на дачу, куда угодно, где есть мобильная связь.

fightingcloud пишет:

Прошу не кидаться тапками, если кто-то уже обращался с подобным вопросом (: Лучше ткните где посмотреть (:

Собственно, вопрос. В прошлом году какие-то негодяи разбили окно, влезли на дачу и вынесли всё, что плохо лежало. Решила вот установить систему безопасности и наткнулась на Эктоконтрол. Кто-нибудь ставил? Как скоро приходят оповещения? Ещё интересует срок автономной работы, в посёлке частенько электричество отключают… На сайте информации не нашла.

Заранее спасибо за ответы (:

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

MaksVV и Stambylov Вам просто низкий поклон! за ваши программы! Блин, все гениальное - просто. Как я сам не допер до этого.

Буду использовать ваши решения!

 

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

Вот! значит какие у меня новости, и чем я занимаюсь вообще!

Короче, пока шла вторая мега, мне коллега и сочувствующий рассказал об ESP8266! Показал пару уроков и сайт https://WIFI-IOT.com

вообще красота. ESP8266 классная штучка размером с 5-ти рублёвую монету. Столько всего можно сделать. Короче, я сделал и установил уже мониторинг температур в помещениях бани! Вообще тема.

1 .Работает по WIFI.

2. Передает температура на "народный мониторинг"

3. Сайт ведет тренды и отсылает СМС и почту, если температура выходит за установленные мною пределы.

Затопил печку, и смотришь, как там банька прогревается! Перед входом в парилку, смотришь, какая там температура. Обвязал все датчиками Dallas DS18B20. Пока до 70-ти градусов только парилку разгонял. Надо звть друзей в баню, бить рекорды. Благо снег выпал в достаточном количестве.

Вот! далее. На основе этой же платы ESP8266 буду делать вебинтерфейс своего дома! Да да, в топку этот Блютус, с его ограниченностью и нестабильностью. ВЕБ интерфейс хранится на самой плате 8266. Она сама может являться либо точкой доступа, либо к роутеру цепляться, как у меня. Любое устройство с браузером, может по IP адресу цеплятся ну и дальше сами понимаете. А вот когда роутер в VPN подлкючу, так управление по интернету можно организовать. Вот! Короче первая версия ВЕБинтерфейса есть, но как она получилось, я мало понял :) Сделал её мой коллега!

А вот ещё что! Появилась проблема с нехваткой оперативы у МЕги! открыл для себя много интересного на тему " куда девается оперативка или как грамотно программировать". Короче борюсь за свободное место. Последние победы это 30% свободного места. Пока эту программу не проверил ещё в деле, поэтому не выкладываю в свободное пользование. По причине поедания оперативы глобальными переменными и функцией Serial.print буду очень серьезно переделывать вкладку bluetooth. От неё вообще почти ничего не останется. Будет обмен командами между Мегой и ESP через например 1121, 3201 т.е. по 4-х значным командам, это вообще нисколько не поедает оперативу и не ограничивает.

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

У меня всё :)

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

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

А может тебе мегу на 3,3 В переделать? Вмсысле на Мегу Due, Она и быстрее и оператывы больше. 

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

MaksVV пишет:

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

MaksVV пишет:

кому интересно выглядит всё это примерно так https://yadi.sk/d/gRk-caBPy8qu7

вот код для платы света 

#include <class_BUTTON.h>      //библиотека для создания различных видов нажитий на выключатели плюс защита от дребезга, спасибо КЛАПАУЦИЮ!. 
#include <Wire.h>
#include <MCP23x17.h>
#include <MCP23017.h>


// пины входов от выключателей в комнатах (цифровые пины ардуины)
BUTTON switchTanya(2);
BUTTON switchDet(3);
BUTTON switchKatya(4);
BUTTON switchVanna_2(5);
BUTTON switchZal_2(6);

// пины выходов на реле включения света (MCP 23017)
#define RelayTanya    10
#define RelayDet      11
#define RelayKatya    12
#define RelayVanna_2  13
#define RelayZal_2A    14
#define RelayZal_2B    15        
#define RelayZal_2C 12        // пин 12 ардуино 
  
// пины (MCP 23017) выходов на трехцветные светодиоды для индикации (на выключателях) 
// принудительно включен свет от выключателя - красная индикация (самый высокий приоритет)
// состояния функуции "автосвет" - зеленая индикация (приоритет ниже чем красная, но выше оранжевой)
// подсветки выключателей ночью  - оранжевая индикация (самый низкий приоритет)

#define LEDautoTanya_Red      0    
#define LEDautoTanya_Green    1    
#define LEDautoDet_Red        2
#define LEDautoDet_Green      3
#define LEDautoKatya_Red      4
#define LEDautoKatya_Green    5
#define LEDautoVanna_2_Red    6
#define LEDautoVanna_2_Green  7
#define LEDautoZal_2_Red      8
#define LEDautoZal_2_Green    9


// пины входов от датчиков движения и сенсора света (пины ардуины)

#define PIRTanya     7
#define PIRDet       8
#define PIRKatya     9
#define PIRVanna_2   10
#define PIRZal_2     11
#define sensorSVET   A0           // пин входа аналогового сенсора  освещения 
int UlicaS = 15;

// флаги состояния реле света в комнатах и состояния принудительного включения света от выключателя 

bool Tanya =   0;
bool Det =     0;
bool Katya =   0;
bool Vanna_2 = 0;
bool Zal_2 =   0;

bool manualTanya =   0;
bool manualDet =     0;
bool manualKatya =   0;
bool manualVanna_2 = 0;
bool manualZal_2 =   0;

int Zal_2Level = 1;           // 1 - включены все три люстры, 2 - левая, 3 - правая, 4 - центральная, 5 - левая и центральная, 6 - правая и центральная, 7 - крайние люстры. 

// флаги состояния функции "автосвет" в комнатах

bool autoTanya =   0;
bool autoDet =     0;
bool autoKatya =   0;
bool autoVanna_2 = 0;
bool autoZal_2 =   0;

// флаги наличия движения в комнатах

bool dvigTanya =    0;
bool dvigDet =      0;
bool dvigKatya =    0;
bool dvigVanna_2 =  0;
bool dvigZal_2 =    0;

// переменные для функции "автосвет"

long unsigned int lowIn_Tanya; // Время, в которое был принят сигнал отсутствия движения (LOW)
long unsigned int lowIn_Det; 
long unsigned int lowIn_Katya; 
long unsigned int lowIn_Vanna_2; 
long unsigned int lowIn_Zal_2; 

int pause_Tanya = 240; //задержка выключения света при включенной функции "автосвет", сек
int pause_Det = 240;
int pause_Katya = 240;
int pause_Vanna_2 = 120;
int pause_Zal_2 = 240;

bool lockLow_Tanya = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
bool lockLow_Det = true;
bool lockLow_Katya = true;
bool lockLow_Vanna_2 = true;
bool lockLow_Zal_2 = true;

bool takeLowTime_Tanya; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
bool takeLowTime_Det;
bool takeLowTime_Katya;
bool takeLowTime_Vanna_2;
bool takeLowTime_Zal_2;


// создаём объект расширителя портов - микросхема MCP23017

CMCP23017 mcp23_1;    

void setup() {
  
  Wire.begin();
   mcp23_1.init(0);          // инициализация микросхемы MCP23017 на адресе 0. 
    
    
 // порты реле управления светом (порты MCP23017), сигнал инвертированный 0 - включено, 1 - выключено, сначала выключаем все реле
  pinMode(13, OUTPUT); digitalWrite (13, HIGH);             // свободный канал реле, можно что-нибудь сюда подключить (этот канал на пине 13 ардуино)
  mcp23_1.pinMode (RelayTanya,  OUTPUT);   mcp23_1.digitalWrite (RelayTanya,  HIGH);         
  mcp23_1.pinMode (RelayDet,    OUTPUT);   mcp23_1.digitalWrite (RelayDet,    HIGH);         
  mcp23_1.pinMode (RelayKatya,  OUTPUT);   mcp23_1.digitalWrite (RelayKatya,  HIGH);
  mcp23_1.pinMode (RelayVanna_2,OUTPUT);   mcp23_1.digitalWrite (RelayVanna_2,HIGH);
  mcp23_1.pinMode (RelayZal_2A, OUTPUT);   mcp23_1.digitalWrite (RelayZal_2A, HIGH);
  mcp23_1.pinMode (RelayZal_2B, OUTPUT);   mcp23_1.digitalWrite (RelayZal_2B, HIGH);
          pinMode (RelayZal_2C, OUTPUT);           digitalWrite (RelayZal_2C, HIGH);   // эта реле заведена на пин 12 ардуино

// порты входов PIR датчиков (порты ардуино)

  pinMode (PIRTanya,  INPUT);   digitalWrite (PIRTanya,   HIGH);
  pinMode (PIRDet,    INPUT);   digitalWrite (PIRDet,     HIGH);
  pinMode (PIRKatya,  INPUT);   digitalWrite (PIRKatya,   HIGH);
  pinMode (PIRVanna_2,INPUT);   digitalWrite (PIRVanna_2, HIGH);
  pinMode (PIRZal_2,  INPUT);   digitalWrite (PIRZal_2,   HIGH);

//порты (порты MCP23017) выходы на светодиоды индикации состояния функуции "автосвет" (светодиоды, которые находятся на выключателях света), сначала выключаем все лампы-индикаторы  

  mcp23_1.pinMode (LEDautoTanya_Red, OUTPUT);   mcp23_1.digitalWrite (LEDautoTanya_Red,LOW);         
  mcp23_1.pinMode (LEDautoTanya_Green, OUTPUT);   mcp23_1.digitalWrite (LEDautoTanya_Green,LOW);         
  
  mcp23_1.pinMode (LEDautoDet_Red,     OUTPUT);   mcp23_1.digitalWrite (LEDautoDet_Red,    LOW);          
  mcp23_1.pinMode (LEDautoDet_Green,     OUTPUT);   mcp23_1.digitalWrite (LEDautoDet_Green,    LOW);          
  
  mcp23_1.pinMode (LEDautoKatya_Red,   OUTPUT);   mcp23_1.digitalWrite (LEDautoKatya_Red,  LOW);
  mcp23_1.pinMode (LEDautoKatya_Green,   OUTPUT);   mcp23_1.digitalWrite (LEDautoKatya_Green,  LOW);
  
  mcp23_1.pinMode (LEDautoVanna_2_Red, OUTPUT);   mcp23_1.digitalWrite (LEDautoVanna_2_Red,LOW);
  mcp23_1.pinMode (LEDautoVanna_2_Green, OUTPUT);   mcp23_1.digitalWrite (LEDautoVanna_2_Green,LOW);
  
  mcp23_1.pinMode (LEDautoZal_2_Red,   OUTPUT);   mcp23_1.digitalWrite (LEDautoZal_2_Red,  LOW);
  mcp23_1.pinMode (LEDautoZal_2_Green,   OUTPUT);   mcp23_1.digitalWrite (LEDautoZal_2_Green,  LOW);
  

  }


void loop() {

//ЧТЕНИЕ ВХОДОВ 

// Обновляем состояние выключателей света

switchTanya.read();
switchDet.read();
switchKatya.read();
switchVanna_2.read();
switchZal_2.read();


// Обновляем состояние входов и забиваем их в переменные 

  UlicaS = map (analogRead (sensorSVET),0,1023,1023,0) / 10; 
  dvigTanya =   !digitalRead(PIRTanya);
  dvigDet =     !digitalRead(PIRDet);
  dvigKatya =   !digitalRead(PIRKatya);
  dvigVanna_2 = !digitalRead(PIRVanna_2);
  dvigZal_2 =   !digitalRead(PIRZal_2);

        
// ДЕЙСТВИЯ ПРИ РАЗЛИЧНЫХ ВИДАХ НАЖАТИЙ НА ВЫКЛЮЧАТЕЛИ СВЕТА 

  // если нажат какой-либо выключатель "короткое нажатие", изменяем состояние света на противоположное, флаги принудительного включения света в true, если свет включен  
  
if (switchTanya.click_down) {Tanya = !Tanya; manualTanya = Tanya ;}
if (switchDet.click_down) {Det = !Det; manualDet = Det ; }
if (switchKatya.click_down) { Katya = !Katya; manualKatya = Katya ; }
if (switchVanna_2.click_down) { Vanna_2 = !Vanna_2; manualVanna_2 = Vanna_2 ;}
if (switchZal_2.click_down) {Zal_2 = !Zal_2; manualZal_2 = Zal_2 ; }

// если состояние света выключено, делаем чтобы флаги принудительного включения тоже были false  
if (!Tanya)    manualTanya = 0;
if (!Det)      manualDet = 0;
if (!Katya)    manualKatya = 0;
if (!Vanna_2)  manualVanna_2 = 0;
if (!Zal_2)    manualZal_2 = 0;


// если нажат какой-либо выключатель "длительное нажатие" , изменяем состояние функции "автосвет" на противоположное, помигаем индикацией 5 раз
// 5 зеленых блинков - автосвет включился, 5 красных - выключился. 

if (switchTanya.retention) {autoTanya = !autoTanya; 
if (autoTanya) {for (int i = 0; i < 5; i++ ){
mcp23_1.digitalWrite (LEDautoTanya_Red, 0);  mcp23_1.digitalWrite (LEDautoTanya_Green, 1); delay (100);
mcp23_1.digitalWrite (LEDautoTanya_Red, 0);  mcp23_1.digitalWrite (LEDautoTanya_Green, 0); delay (100);
}}
if (!autoTanya) {for (int i = 0; i < 5; i++ ){
mcp23_1.digitalWrite (LEDautoTanya_Red, 1);  mcp23_1.digitalWrite (LEDautoTanya_Green, 0); delay (100);
mcp23_1.digitalWrite (LEDautoTanya_Red, 0);  mcp23_1.digitalWrite (LEDautoTanya_Green, 0); delay (100);
}}}


if (switchDet.retention) {autoDet = !autoDet;
if (autoDet) {for (int i = 0; i < 5; i++ ){
mcp23_1.digitalWrite (LEDautoDet_Red, 0);  mcp23_1.digitalWrite (LEDautoDet_Green, 1); delay (100);
mcp23_1.digitalWrite (LEDautoDet_Red, 0);  mcp23_1.digitalWrite (LEDautoDet_Green, 0); delay (100);
}}
if (!autoDet) {for (int i = 0; i < 5; i++ ){
mcp23_1.digitalWrite (LEDautoDet_Red, 1);  mcp23_1.digitalWrite (LEDautoDet_Green, 0); delay (100);
mcp23_1.digitalWrite (LEDautoDet_Red, 0);  mcp23_1.digitalWrite (LEDautoDet_Green, 0); delay (100);
}}}


if (switchKatya.retention) {autoKatya = !autoKatya;
if (autoKatya) {for (int i = 0; i < 5; i++ ){
mcp23_1.digitalWrite (LEDautoKatya_Red, 0);  mcp23_1.digitalWrite (LEDautoKatya_Green, 1); delay (100);
mcp23_1.digitalWrite (LEDautoKatya_Red, 0);  mcp23_1.digitalWrite (LEDautoKatya_Green, 0); delay (100);
}}
if (!autoKatya) {for (int i = 0; i < 5; i++ ){
mcp23_1.digitalWrite (LEDautoKatya_Red, 1);  mcp23_1.digitalWrite (LEDautoKatya_Green, 0); delay (100);
mcp23_1.digitalWrite (LEDautoKatya_Red, 0);  mcp23_1.digitalWrite (LEDautoKatya_Green, 0); delay (100);
}}}


if (switchVanna_2.retention) {autoVanna_2 = !autoVanna_2;
if (autoVanna_2) {for (int i = 0; i < 5; i++ ){
mcp23_1.digitalWrite (LEDautoVanna_2_Red, 0);  mcp23_1.digitalWrite (LEDautoVanna_2_Green, 1); delay (100);
mcp23_1.digitalWrite (LEDautoVanna_2_Red, 0);  mcp23_1.digitalWrite (LEDautoVanna_2_Green, 0); delay (100);
}}
if (!autoVanna_2) {for (int i = 0; i < 5; i++ ){
mcp23_1.digitalWrite (LEDautoVanna_2_Red, 1);  mcp23_1.digitalWrite (LEDautoVanna_2_Green, 0); delay (100);
mcp23_1.digitalWrite (LEDautoVanna_2_Red, 0);  mcp23_1.digitalWrite (LEDautoVanna_2_Green, 0); delay (100);
}}}


if (switchZal_2.retention) {autoZal_2 = !autoZal_2;
if (autoZal_2) {for (int i = 0; i < 5; i++ ){
mcp23_1.digitalWrite (LEDautoZal_2_Red, 0);  mcp23_1.digitalWrite (LEDautoZal_2_Green, 1); delay (100);
mcp23_1.digitalWrite (LEDautoZal_2_Red, 0);  mcp23_1.digitalWrite (LEDautoZal_2_Green, 0); delay (100);
}}
if (!autoZal_2) {for (int i = 0; i < 5; i++ ){
mcp23_1.digitalWrite (LEDautoZal_2_Red, 1);  mcp23_1.digitalWrite (LEDautoZal_2_Green, 0); delay (100);
mcp23_1.digitalWrite (LEDautoZal_2_Red, 0);  mcp23_1.digitalWrite (LEDautoZal_2_Green, 0); delay (100);
}}}


 // если нажат какой-либо выключатель "двойной клик", изменяем состояние количества ламп  (только для гостинной, в комнатах на дабл клик можно чтонибудь придумать)

if (switchZal_2.doubleclick) Zal_2Level++;   // если на выключателе света дабл клик , изменим состояние переменной "уровень света"
if (Zal_2Level > 7) Zal_2Level = 1;        // строка делает диапазон переменной "уровень света" от 1 до 7

  
  // УПРАВЛЕНИЕ РЕЛЕ СВЕТА 
  // управляем светом в зависимости от состояния переменных света (подача сигнала на реле инвертирована:  0 - реле включено, 1 - выключено)
   mcp23_1.digitalWrite (RelayTanya, !Tanya);
   mcp23_1.digitalWrite (RelayDet, !Det);
   mcp23_1.digitalWrite (RelayKatya, !Katya);
   mcp23_1.digitalWrite (RelayVanna_2, !Vanna_2);
  
  // управляем реле света трёх люстр в зале в зависимости от переменных состояние света в зале "Zal_2" и уровень света "Zal_2Level"
  if (Zal_2) {                                         // если флаг состояния света в зале включен, то управляем реле в зависимости от переменной уровня
  if (Zal_2Level == 1) {mcp23_1.digitalWrite (RelayZal_2A, LOW); mcp23_1.digitalWrite (RelayZal_2B, LOW); digitalWrite (RelayZal_2C, LOW);}
  if (Zal_2Level == 2) {mcp23_1.digitalWrite (RelayZal_2A, LOW); mcp23_1.digitalWrite (RelayZal_2B, HIGH); digitalWrite (RelayZal_2C, HIGH);}
  if (Zal_2Level == 3) {digitalWrite (RelayZal_2C, LOW); mcp23_1.digitalWrite (RelayZal_2B, HIGH); mcp23_1.digitalWrite (RelayZal_2A, HIGH);}
  if (Zal_2Level == 4) {mcp23_1.digitalWrite (RelayZal_2B, LOW); mcp23_1.digitalWrite (RelayZal_2A, HIGH); digitalWrite (RelayZal_2C, HIGH);}
  if (Zal_2Level == 5) {mcp23_1.digitalWrite (RelayZal_2A, LOW); digitalWrite (RelayZal_2C, LOW); mcp23_1.digitalWrite (RelayZal_2B, HIGH);}
  if (Zal_2Level == 6) {mcp23_1.digitalWrite (RelayZal_2B, LOW); digitalWrite (RelayZal_2C, LOW); mcp23_1.digitalWrite (RelayZal_2A, HIGH);}
  if (Zal_2Level == 7) {mcp23_1.digitalWrite (RelayZal_2A, LOW); mcp23_1.digitalWrite (RelayZal_2B, LOW); digitalWrite (RelayZal_2C, HIGH) ;}
                 }
  if (!Zal_2) {mcp23_1.digitalWrite (RelayZal_2A, HIGH); mcp23_1.digitalWrite (RelayZal_2B, HIGH); digitalWrite (RelayZal_2C, HIGH);}   // если флаг состояния света в зале выключен, то выключаем все реле света в зале

 // ИНДИКАЦИЯ НА ВЫКЛЮЧАТЕЛЯХ 
 // индикация включенного света принудительно от выключателя (красная индикация)

if (manualTanya) {mcp23_1.digitalWrite (LEDautoTanya_Red, 1); mcp23_1.digitalWrite (LEDautoTanya_Green, 0);}
if (manualDet)   {mcp23_1.digitalWrite (LEDautoDet_Red, 1);   mcp23_1.digitalWrite (LEDautoDet_Green, 0); }  
if (manualKatya) {mcp23_1.digitalWrite (LEDautoKatya_Red, 1); mcp23_1.digitalWrite (LEDautoKatya_Green, 0); } 
if (manualVanna_2) {mcp23_1.digitalWrite (LEDautoVanna_2_Red, 1); mcp23_1.digitalWrite (LEDautoVanna_2_Green,0);}
if (manualZal_2) {mcp23_1.digitalWrite (LEDautoZal_2_Red, 1); mcp23_1.digitalWrite (LEDautoZal_2_Green, 0); }  
  
 // индикация включения функции "автосвет" на выключателях (зеленая индикация)

if (!manualTanya && autoTanya)     {mcp23_1.digitalWrite (LEDautoTanya_Red, 0);  mcp23_1.digitalWrite (LEDautoTanya_Green, 1);}
if (!manualDet && autoDet)         {mcp23_1.digitalWrite (LEDautoDet_Red, 0);    mcp23_1.digitalWrite (LEDautoDet_Green, 1); }  
if (!manualKatya && autoKatya)     {mcp23_1.digitalWrite (LEDautoKatya_Red, 0);  mcp23_1.digitalWrite (LEDautoKatya_Green, 1); } 
if (!manualVanna_2 && autoVanna_2) {mcp23_1.digitalWrite (LEDautoVanna_2_Red, 0); mcp23_1.digitalWrite (LEDautoVanna_2_Green,1);}
if (!manualZal_2 && autoZal_2)     {mcp23_1.digitalWrite (LEDautoZal_2_Red, 0);  mcp23_1.digitalWrite (LEDautoZal_2_Green, 1); }  

   //подсветка выключателей ночью  (оранжевый свет индикатора)

if (!autoTanya && !manualTanya && UlicaS <= 6) {mcp23_1.digitalWrite (LEDautoTanya_Red, 1); mcp23_1.digitalWrite (LEDautoTanya_Green, 1);}
if (!autoDet && !manualDet && UlicaS <= 6)   {mcp23_1.digitalWrite (LEDautoDet_Red, 1);  mcp23_1.digitalWrite (LEDautoDet_Green, 1);  }
if (!autoKatya && !manualKatya && UlicaS <= 6) {mcp23_1.digitalWrite (LEDautoKatya_Red, 1); mcp23_1.digitalWrite (LEDautoKatya_Green, 1);}
if (!autoVanna_2  && !manualVanna_2 && UlicaS <= 6) {mcp23_1.digitalWrite (LEDautoVanna_2_Red, 1); mcp23_1.digitalWrite (LEDautoVanna_2_Green, 1);}
if (!autoZal_2 && !manualZal_2 && UlicaS <= 6)  {mcp23_1.digitalWrite (LEDautoZal_2_Red, 1); mcp23_1.digitalWrite (LEDautoZal_2_Green, 1);}

// выключаем индикацию выключателей, если сейчас день и выключена функция "автосвет" и свет НЕ включен принудительно от выключателя

if (!autoTanya && !manualTanya && UlicaS > 6) {mcp23_1.digitalWrite (LEDautoTanya_Red, 0); mcp23_1.digitalWrite (LEDautoTanya_Green, 0);}
if (!autoDet && !manualDet && UlicaS > 6)   {mcp23_1.digitalWrite (LEDautoDet_Red, 0);  mcp23_1.digitalWrite (LEDautoDet_Green, 0);  }
if (!autoKatya && !manualKatya && UlicaS > 6) {mcp23_1.digitalWrite (LEDautoKatya_Red, 0); mcp23_1.digitalWrite (LEDautoKatya_Green, 0);}
if (!autoVanna_2  && !manualVanna_2 && UlicaS > 6) {mcp23_1.digitalWrite (LEDautoVanna_2_Red, 0); mcp23_1.digitalWrite (LEDautoVanna_2_Green, 0);}
if (!autoZal_2 && !manualZal_2 && UlicaS > 6)  { mcp23_1.digitalWrite (LEDautoZal_2_Red, 0); mcp23_1.digitalWrite (LEDautoZal_2_Green, 0);}


  
// РАБОТА ФУНКЦИИ "АВТОСВЕТ"

//Ниже для комнаты Таня

 if (autoTanya && !manualTanya)            {                // если включен автосвет и свет НЕ включен принудительно отвыключателя 
  if(dvigTanya && UlicaS < 30) //Если обнаружено движение и освещенность улицы меньше 30%
  {    
    if(lockLow_Tanya) //Если до этого момента еще не включили реле
    { lockLow_Tanya = false; Tanya = 1; delay(50);}     //Включаем свет.     
    takeLowTime_Tanya = true;
  }  
  if(!dvigTanya) //Ели движения нет
  { //Если время окончания движения еще не записано     
    if(takeLowTime_Tanya){lowIn_Tanya = millis();takeLowTime_Tanya = false;} //Сохраним время окончания движения изменим значения флага, чтобы больше не брать время, пока не будет нового движения
    if(!lockLow_Tanya && millis() - lowIn_Tanya > pause_Tanya*1000)               //Если время без движение превышает паузу => движение окончено
    { lockLow_Tanya = true; Tanya = 0; delay(50);}      //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения                
  } 
  if (UlicaS > 35) Tanya = 0;     // Отключение реле управления освещением больше 35%
                            }

//Ниже для детской комнаты 

 if (autoDet && !manualDet)            {               
  if(dvigDet && UlicaS < 30) 
  {    
    if(lockLow_Det) 
    { lockLow_Det = false; Det = 1; delay(50);}     
    takeLowTime_Det = true;
  }  
  if(!dvigDet) //Ели движения нет
  { //Если время окончания движения еще не записано     
    if(takeLowTime_Det){lowIn_Det = millis();takeLowTime_Det = false;} 
    if(!lockLow_Det && millis() - lowIn_Det > pause_Det*1000)               
    { lockLow_Det = true; Det = 0; delay(50);}                 
  } 
  if (UlicaS > 35) Det = 0;     
                              }

//Ниже для комнаты Катя 

 if (autoKatya && !manualKatya)            {             
  if(dvigKatya && UlicaS < 30) 
  {    
    if(lockLow_Katya) 
    { lockLow_Katya = false; Katya = 1; delay(50);}   
    takeLowTime_Katya = true;
  }  
  if(!dvigKatya) 
  {
    if(takeLowTime_Katya){lowIn_Katya = millis();takeLowTime_Katya = false;} 
    if(!lockLow_Katya && millis() - lowIn_Katya > pause_Katya*1000)          
    { lockLow_Katya = true; Katya = 0; delay(50);}   
  } 
  if (UlicaS > 35) Katya = 0;     
                              }

//Ниже для ванной комнаты 

 if (autoVanna_2 && !manualVanna_2)            {                
  if(dvigVanna_2 && UlicaS < 30)
  {    
    if(lockLow_Vanna_2) 
    { lockLow_Vanna_2 = false; Vanna_2 = 1; delay(50);}     
    takeLowTime_Vanna_2 = true;
  }  
  if(!dvigVanna_2) 
  { 
    if(takeLowTime_Vanna_2){lowIn_Vanna_2 = millis();takeLowTime_Vanna_2 = false;} 
    if(!lockLow_Vanna_2 && millis() - lowIn_Vanna_2 > pause_Vanna_2*1000)               
    { lockLow_Vanna_2 = true; Vanna_2 = 0; delay(50);}                      
  } 
  if (UlicaS > 35) Vanna_2 = 0;     
                              }

//Ниже для зала 2

 if (autoZal_2 && !manualZal_2)            {                
  if(dvigZal_2 && UlicaS < 30) 
  {    
    if(lockLow_Zal_2) 
    { lockLow_Zal_2 = false; Zal_2 = 1; delay(50);}    
    takeLowTime_Zal_2 = true;
  }  
  if(dvigZal_2) 
  { 
    if(takeLowTime_Zal_2){lowIn_Zal_2 = millis();takeLowTime_Zal_2 = false;} 
    if(!lockLow_Zal_2 && millis() - lowIn_Zal_2 > pause_Zal_2*1000)               
    { lockLow_Zal_2 = true; Zal_2 = 0; delay(50);}       
  } 
  if (UlicaS > 35) Zal_2 = 0;     
                              }
     }
  
  

 

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

Slavyanin55 пишет:

мне коллега и сочувствующий рассказал об ESP8266! 

Вот! Короче первая версия ВЕБинтерфейса есть, но как она получилось, я мало понял :) Сделал её мой коллега!

этот девайс можно также ардуиновскими скетчами программировать, вот тут почитай может интересно будет

https://geektimes.ru/post/271754/

naz
Offline
Зарегистрирован: 15.11.2016

Здравствуйте, форумчане.

Тоже занимаюсь темой умного дома, правда не столь продвинут. Автору спасибо за труд, и что поделился. Делаю на Меге 2560.

Вопрос у меня касается SIM900 (подключен на Serial1): после посылки смс шилд встаёт в ступор и перестаёт реагировать на АТ команды. В мониторе появляются ">". Привести шилд в чувство можно, передёрнув питание: выключить и включить (программно, конечно) после каждой посланной смс. Предполагаю, что есть более красивое решение, кто имел такую же проблему?

elik745i
Offline
Зарегистрирован: 08.04.2012

naz пишет:

Здравствуйте, форумчане.

Тоже занимаюсь темой умного дома, правда не столь продвинут. Автору спасибо за труд, и что поделился. Делаю на Меге 2560.

Вопрос у меня касается SIM900 (подключен на Serial1): после посылки смс шилд встаёт в ступор и перестаёт реагировать на АТ команды. В мониторе появляются ">". Привести шилд в чувство можно, передёрнув питание: выключить и включить (программно, конечно) после каждой посланной смс. Предполагаю, что есть более красивое решение, кто имел такую же проблему?

Эти шилдики очень капризны к питанию и битрейту UART! Вы каким портом пользуетесь хард или софт?

Еще замечен такой глюк на 800х, если не ограничивать напряжения последовательного порта, то гдето через пару недель модуль начинает капризничать и порт перестает адекватно реагировать на команды посланные в последовательный порт, максимальное напряжение, которое должно быть как на РХ так и на ТХ не должно быть больше 2.8вольт! Вероятно вы просто спалили порт...