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

Korangar23
Offline
Зарегистрирован: 19.04.2017

Здарова коллеги. Подскажите скетч на ардуино, мне надо чтобы три датчика движения зажигали одну реле. Только реле будет 2, а датчиков 6. За ранее спасибо.

Автору респект!

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

а мне надо чтобы солнышко вокруг земли крутилось,))) никак не наоборот....

даю подсказку,

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

2 пишим заявку в теме ищю исполнителя......

Alexey-kipia
Alexey-kipia аватар
Offline
Зарегистрирован: 14.03.2016

А лучше сразу исполнителя. Тогда два человека будут удовлетворены :-)

Шучу.

Alexey-kipia
Alexey-kipia аватар
Offline
Зарегистрирован: 14.03.2016

:-)

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

Коллеги, подскажите пожалуйста, меня мучает идея как все таки прикрутить сюда ESP 8266 чтоб можно было "мишью открывать окна "  ) 

Я правильно понимаю если ESP 8266 использовать как сервер то можно управлять уным домом только врамках своей WI- FI сети дома ? 

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

Я в програмировании не силен прошу помочь советом, основная идея управлять домом не через АТ команды а удаленно через телефон с интернетом 

 

 

 

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

я так понимаю это можно сделать через MQTT  облако ?

fake
fake аватар
Offline
Зарегистрирован: 18.08.2017

Напоминает о фильме МИСТЕР БИН!) Всё за тебя машина делает!)

TigerFS
Offline
Зарегистрирован: 04.08.2014

Oleg_I пишет:

Коллеги, подскажите пожалуйста, меня мучает идея как все таки прикрутить сюда ESP 8266 чтоб можно было "мишью открывать окна "  ) 

Я правильно понимаю если ESP 8266 использовать как сервер то можно управлять уным домом только врамках своей WI- FI сети дома ? 

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

Я в програмировании не силен прошу помочь советом, основная идея управлять домом не через АТ команды а удаленно через телефон с интернетом 

Зайди на страницу //esp8266.ru/ Там ответы на твои вопросы. 

Если вкратце: берем однокристальный пк (апельсинку, малинку, банан и т.д.) ставим на нее все что нужно. Цель: сервер для умного дома. Пускаем этот мини-сервер в интернет. Цепляем к серверу стопицот есп и лежа на диване управляем домом.

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

TigerFS] </p> <p>[quote=Oleg_I пишет:

Зайди на страницу //esp8266.ru/ Там ответы на твои вопросы. 

Если вкратце: берем однокристальный пк (апельсинку, малинку, банан и т.д.) ставим на нее все что нужно. Цель: сервер для умного дома. Пускаем этот мини-сервер в интернет. Цепляем к серверу стопицот есп и лежа на диване управляем домом.


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

TigerFS
Offline
Зарегистрирован: 04.08.2014

дело в том, что есп мощнее многих дуин будет. минус - ограниченное количество входов/выходов. Т.е. грубо говоря так: берем кухню, на кухне есть счетверенная розетка для чайника/тостера и т.д. запихав есп в подразетник - управляешь всеми четырьмя розетками без проводов со своего телефона/планшета/ телевизора и т.д. можно засунуть есп внутрь печки, микроволновки, посудомойки и т.д. Прописав ай пи для каждого устройства, имеем домашную сеть "умных устройств" а малинка нужна для организации веб интерфейса общего. Иначе, чтобы включить/выключить устройство,  надо будет открыть страницу именно этого устройства, что не очень удобно. Да и держать в памяти все адреса... Ардуине в этой структуре можно доверить сбор данных и отправку на телефон смс сообщений о состоянии устройств, температуры и т.д.

Сейчас попалась инструкция от котла настенного аристон, с функцией NET. Ничего толком не описано, только общие фразы. Так вот там вай фай. Рано или поздно, один фиг придется городить вай фай сеть "умных устройств".

Вообще ЕСП и ардуино - конструкторы для выполнения разных задач. Подключение есп к ардуинке не более, чем легкая ностальгия по арду. Это мое видение ситуации, ибо сам думал как присобачить к ардуино есп, а теперь забил на это.

Evg-Chugunov
Evg-Chugunov аватар
Offline
Зарегистрирован: 22.08.2015

TigerFS пишет:

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

Кстати, тут вопрос возник. Может кто то задавался целью подсчитать как работает большое колличество ЕСПешек в сети со средненьким домашним роутером. Например штук 50 ЕСП. Не будет зависаний или отвалов. Оли может ещё какие нибудь подводные камни?

gidrobort
Offline
Зарегистрирован: 20.03.2017

Доброго всем времени суток, делюсь своей доработкой умного дома, не могу тут добавить регулировку SG90 и кнопку перехода на другую страничку, например с наменованием indexs. Вот ссылка на скетч https://cloud.mail.ru/public/KzQ7/mEk1ig1RR  пароль 14051974

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

inspiritus
Offline
Зарегистрирован: 17.12.2012

gidrobort пишет:

  пароль 14051974

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

что то не соображу, как у Вас password.htm из Index задействуется ?

gidrobort
Offline
Зарегистрирован: 20.03.2017

Сначала в скетче идетзапрос на открытие password.htm, после поддверждения пароля(надо обязательно кликнуть по ентер) в скетче идет запрос(если верен пароль) на index

sab678
Offline
Зарегистрирован: 03.10.2017

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

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

если кому интересно,  я сделал запись номеров пользователей не со скетча, а как должно быть пользователем по смс, не меняя основной конструкции скетча (конкретно места парсинга сообщений от GSM) автора темы.  Номера при этом хранятся в еепром и после перевключения питания естественно сохраняются. Номер 1 лежит в ячейках с 10 по 21, Номер 2 лежит в 20 по 31. Если вы используете эти ячейки чем-то другим, нужно переделать. Также там есть рабочая функция запроса баланса для SIM800L. 

Если номера не запрограммированы, модуль принимает только две команды "ZAPROS" и "ZAPROSTEL" . И сообщает в ответной смс какую смс (команда "WriteNumber1") отправить для сохранения номера #1. Если мы отправили такую команду номер сохраняется, приходит соответствующее подтверждение о записи номера #1. Теперь можно управлять модулем. Запись номера #2 возможна только в случае записанного номера #1 и только с номера #1 (команда "WriteNumber2").

Есть также команда для удаления обоих номеров из еепром и памяти ("NumbersReset"). После чего модуль опять начинает реагировать только на две команды. "ZAPROS" и "ZAPROSTEL"

Приведена только часть скетча, только где что-то изменилось. 

String currStr = "";

String TelNumber1 = "000000000000";

String TelNumber2 = "000000000000";

String BufferNumber = "000000000000";

bool SaveNumber2 = 0;  // флаг когда необходима запись номера#2, он true

int isStringMessage = 0; 
int KTOzapros = 0;
int KTOreport = 1;


void setup() {
for (int i=0; i<12; i++) TelNumber1[i] = EEPROM.read (i+10);
for (int i=0; i<12; i++) TelNumber2[i] = EEPROM.read (i+20);}




void readSMS() //_____Цикл чтения входящих СМС-сообщений______________     
{
    if (!mySerial.available()) return;
    char currSymb = mySerial.read();
//  Serial.print (currSymb);
    if ('\r' == currSymb)
       {
         if (isStringMessage!=0&&isStringMessage!=10) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
                                           {
if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}               // Передача параметров по СМС

else if (!currStr.compareTo("ZAPROSTEL"))   { SMSzaprosTEL();}               // Передача номеров телефонов пользователей по СМС

else if (!currStr.compareTo("ResetNumbers"))   {if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Phone numbers are erased"); EndSMS();} 
                                          else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Phone numbers are erased"); EndSMS();}            
             TelNumber1 = "000000000000"; TelNumber2 = "000000000000"; for (int i=0; i<12; i++) {EEPROM.write (i+10,  TelNumber1[i]); EEPROM.write (i+20,  TelNumber2[i]); }}

              else if (!currStr.compareTo("WriteNumber2")&& isStringMessage == 1)   { SaveNumber2 = 1; startNumber1SMS(); mySerial.println("Otpravte lyuboye SMS s nomera2 dlya sochraneniya nomera"); EndSMS();} 
                                                                    
              else if (!currStr.compareTo("Balance"))    SMSbalance();
            
            isStringMessage = 0;
                                           }
             
              else if (isStringMessage==10){ if (!currStr.compareTo("WriteNumber1"))   { TelNumber1 = BufferNumber; for (int i=0; i<12; i++) {EEPROM.write (i+10, BufferNumber[i]);}
              startNumber1SMS(); mySerial.println("Tel Number#1 is saving in memory");  mySerial.print("Tel#1: ");  mySerial.println (TelNumber1); EndSMS();
              } 
                                             else if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}   
                                             else if (!currStr.compareTo("ZAPROSTEL"))   { SMSzaprosTEL();}               // Передача номеров телефонов пользователей по СМС            
               isStringMessage = 0;
              
                                           }           


               else if (isStringMessage==0) {  if (TelNumber1!="000000000000" && !SaveNumber2 && TelNumber1!="яяяяяяяяяяяя") // Если еепром НЕ пустой или номера НЕ стерты и нет флага записи номера2
                                                {                                                                            // парсим строку как обычно         
                     if (currStr.startsWith("+CMT: \""+TelNumber1)) { isStringMessage = 1; KTOzapros = 1; }   
                else if (currStr.startsWith("+CMT: \""+TelNumber2)) { isStringMessage = 2; KTOzapros = 2; }   
                else if (currStr.startsWith("+CUSD: 0,"))  //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
                  {
                       if (KTOzapros == 1) startNumber1SMS();
                  else if (KTOzapros == 2) startNumber2SMS();
                  mySerial.print (currStr);
                  EndSMS();
                  }    
                                                }
// если ееппром пустой или номера стёрты или флаг зиписи номера 2 труе ждем команды сохранения номеров, записывая номер телефона временно в буфер
                else if    (currStr.startsWith("+CMT:") && !SaveNumber2) { isStringMessage = 10; for (int i =0; i<12; i++) {BufferNumber[i]=currStr[i+7];}}
                else if    (currStr.startsWith("+CMT:") && SaveNumber2) { for (int i =0; i<12; i++) {BufferNumber[i]=currStr[i+7];} TelNumber2 = BufferNumber; for (int i=0; i<12; i++) {EEPROM.write (i+20, BufferNumber[i]);}
              startNumber2SMS(); mySerial.println("Vash nomer sochranyen kak Number#2 v pamyati!"); 
              mySerial.print("Tel#1: "); mySerial.println(TelNumber1); mySerial.print("Tel#2: ");  mySerial.println (TelNumber2); EndSMS(); SaveNumber2 = 0; } 
              
              } 
               
        currStr = "";
      } 
 
    else if ('\n' != currSymb) { currStr += String(currSymb);}
}


void SMSzapros()
{   if (isStringMessage == 10){
 startBufferNumberSMS();

 mySerial.println ("Tel.number#1 is not saving in memory!");
 mySerial.println ("For save Tel1 send SMS command \"WriteNumber1\"");
  mySerial.print("Tel1: "); mySerial.println(TelNumber1);
  mySerial.print("Tel2: "); mySerial.println(TelNumber2); 
  }
  
  
  
  else {
  
  if (isStringMessage == 1) { startNumber1SMS();}
  else if (isStringMessage == 2) { startNumber2SMS();}
  else if (isStringMessage == 0) {if  (KTOreport == 1) startNumber1SMS();
                             else if  (KTOreport == 2) startNumber2SMS();}
        if (webasto)  mySerial.println ("Webasto ON");
        else mySerial.println ("Webasto OFF");  

     if (engine)  mySerial.println ("Engine ON");
     else mySerial.println ("Engine OFF");  

     if (ignition)  mySerial.println ("IGN ON");
     else mySerial.println ("IGN OFF");  

     if (ohrana)  mySerial.println ("OHRANA ON");
     else mySerial.println ("OHRANA OFF");  

     if (trevoga)  mySerial.println ("Vnimanie!!! Trevoga!!! Sirena Vkl!");
     
  mySerial.print("Battery: "); mySerial.print (Vpit); mySerial.println("V");
  mySerial.print("Engine: "); mySerial.print (TempEngineC); mySerial.println("*C");
  mySerial.print("Vyhlop: "); mySerial.print (TempVyhlopC); mySerial.println("*C");
  mySerial.print("Ulica: "); mySerial.print (TempUlicaC); mySerial.println("*C");
  mySerial.print("Salon: "); mySerial.print (TempSalonC); mySerial.println("*C");  
   
  }  
   EndSMS();                                 
}



void SMSzaprosTEL(){
  if (isStringMessage == 1) { startNumber1SMS();}
  else if (isStringMessage == 2) { startNumber2SMS();}
  else if (isStringMessage == 10) { startBufferNumberSMS();}
  
  
  mySerial.print("Tel1: "); mySerial.println(TelNumber1);
  mySerial.print("Tel2: "); mySerial.println(TelNumber2); 
  
  EndSMS();                                 
  }


void SMSbalance() {
  
  mySerial.print("AT+CMGF=1\r");
     
      delay(200);

mySerial.println ("AT+CUSD=1,\"#100#\"");
    
      delay(2000);                         
     
}

 

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

MaksVV пишет:

...Номер 1 лежит в ячейках с 10 по 21, Номер 2 лежит в 20 по 31. Если вы используете эти ячейки чем-то другим, нужно переделать. 

у вас случайно номер 2 не накладывается на 1 номер?! а то написано 1 номер с 10 по 21, 2 номер с 20 по 31.

в EEPROM номер в формате 79991115500

// 10-20 - Храним номер №1
// 21-31 - Храним номер №2
MaksVV
Offline
Зарегистрирован: 06.08.2015

stambylov пишет:

MaksVV пишет:

...Номер 1 лежит в ячейках с 10 по 21, Номер 2 лежит в 20 по 31. Если вы используете эти ячейки чем-то другим, нужно переделать. 

у вас случайно номер 2 не накладывается на 1 номер?! а то написано 1 номер с 10 по 21, 2 номер с 20 по 31.

в EEPROM номер в формате 79991115500

// 10-20 - Храним номер №1
// 21-31 - Храним номер №2

спасибо за замеченную ошибку! Не проверял, но конечно, будет накладываться. Исправлю

stepan.v4
Offline
Зарегистрирован: 09.10.2017

И в самом деле, объем работ не малый. Я как новичок в этой сфере, выражаю искреннее уважение автору и желаю успеха.

stepan.v4
Offline
Зарегистрирован: 09.10.2017

И в самом деле, объем работ не малый. Я как новичок в этой сфере, выражаю искреннее уважение автору и желаю успеха.

bernex
Offline
Зарегистрирован: 08.12.2014

Подскажите а какая шина будет хороша если делать модульную систему:

Световой - реле  - подводим питание(220в) из шины читает включение и запоминает состояние

Датчик - температура

В общем хочу сделать на маленьких схемах каждой дать "адрес" чтобы были в общей системе в идеале питалить и подключались к шине по FTP кабелю.

Rs485 до 32 уcтройств что мало.

А на конце сделать распберри.

Чтобы не было головной Ардеино Мега.

DS2413? DS2408? esp8266?

Как идея? Кажется хорошо - в каждую комнату котроллер света / вентиляции / тепла / датчика и легко расширяемо.

Остается вопрос питания 220в и как компактро трансформировать в 12в или сразу 12в. А также протокола. ethernet в каждом устройстве монстрабельно.

ПС - тут уже думал про децентрализованную систему: http://arduino.ru/forum/proekty/umnyi-chastnyi-dom#comment-316162

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

Тут MaksVV этим пытается заняться http://arduino.ru/forum/proekty/ocherednoi-umnyi-dom-na-etot-raz-modulna.... Только его на CAN понесло. И чего Вы по чужие темы засоряете, свою создайте может кто и подтянется, если интересно будет.

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

alex_r61 пишет:
Только его на CAN понесло.

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

TREEZH.PRO
Offline
Зарегистрирован: 05.11.2017

Хороший проэкт!!!

А чего блог забросил?

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

TREEZH.PRO пишет:

Хороший проэкт!!!

А чего блог забросил?

Привет всем сочувствующим!!! Проект не заброшен! Автоматика работает, и развивается потихоньку.В свободное от всего время. Наконецто проброшен кабель от контроллерного шкафа до котла :) Не подцеплял ещё. Приеду с вахты доделаю климат контроль в доме без препарирования пульта газового котла!!! Всё должно быть просто. Если в двух словах, то если разорвать проводную связь между пультом и котлом, то котел стоит и ничег не делает, при восстановлении связи с пультом, работа котла продолжается, без паники, истерики, блокировок и т.д. А значит, можно просто разрывать один проводков от котла до пульта через реле от УД!

УД научен говорить голосом, время, температуры. Кстати для этого пользую программу "Балаболка" с голосовым движком "Алена" (Russkiy_golos_Alyona_5587). Очень рекомендую!

Так же немного причесал контроллерный шкаф. Закупил платы с предохранителями, Всё цепи питания защищены плавкими предохранителями. Так спокойнее, надежнее, система живучее.

Добавлен блок питания на 12В 10А для питания всяких доп устройств, в том числе и подсветки кухонного гарнитура светодиодными лентами. Но это в будущем. Так же добавлено 6 каналов управления на транзисторах IRF740. Попробовал сделать плавное погасание/зажигание ночной подсветки... но не прокатило, что то. Буду разбираться.

Ссылка на последнюю программу, библиотеки и фото от Ноябрь_2017 : https://yadi.sk/d/iqyRFz1Zdt8W2

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

Приветствую, коллега!!! Интересует через какую программу на смартфоне управляешь УД (через ESPшку я так понял) по Wi-Fi ? 

abarmotovi4
Offline
Зарегистрирован: 07.02.2016

Всем хорошего настроения. Кто-нибудь, объясните пожалуйста, как обеспечивается быстрое считывание сигнала с ИК-пульта? (в коде увидел что помимо даласовской задержки в библиотеке, в самой программе еще несколько присутствую, что в сумме более чем на 1,5 секунды тормозят программу. Кода внешнего прерывания не заметил.)

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

MaksVV пишет:

Приветствую, коллега!!! Интересует через какую программу на смартфоне управляешь УД (через ESPшку я так понял) по Wi-Fi ? 

По СМС управляю по приложению GSM Trinket. Мне оно нравится, тем, что настройки конфигурации сохраняются файликом, после хардресета файлик подгружаешь и всё работает. Так же супруге на телефон сбрасываешь этот файлик и так же все запускается. Хорошее приложение.

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

А так вообще... Пульт ИК... основное средство управления.

 

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

abarmotovi4 пишет:

Всем хорошего настроения. Кто-нибудь, объясните пожалуйста, как обеспечивается быстрое считывание сигнала с ИК-пульта? (в коде увидел что помимо даласовской задержки в библиотеке, в самой программе еще несколько присутствую, что в сумме более чем на 1,5 секунды тормозят программу. Кода внешнего прерывания не заметил.)

Ну в плане считывания с ИК пульта работает быстро. Даже с пульта самсунга. Он ведь двойной код присылает. Одно нажатие кнопки и прилетает два одинаковых кода команды и умный дом успевает отрабатывать по два раза! С этим приходится бороться. А так, не всё так плохо! 1,5 секунды они ведь не на каждом "круге" программы. Вот измерения даллосовских датчиков происходит 1 раз в 2 минуты! Ну подвисла программка на 1,5 секунды раз в две минуты, ну не атомный же реактор она окучиват, ничего страшного не случится. А так работает, всё на библиотеках. По простому, по тупому :) Но я согласен! надо стремится к полному порядку и быстродействию. Благо оперативы Меги ещё пока хватает.

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

MaksVV пишет:

Приветствую, коллега!!! Интересует через какую программу на смартфоне управляешь УД (через ESPшку я так понял) по Wi-Fi ? 

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

А вообще буду рад узнать более гибкое и красочное приложение! Которое например может расшифровывать ответные смс и менять свои картинки. Статусы там переключателей. С анимацией и всё такое. Есть такие приложения? Чтобы не обязательно было в андроиде программировать, а просто пальчиком на экране на создавать, картинок и привязать к ним команды всякие.

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

Slavyanin55 пишет:
По СМС управляю по приложению GSM Trinket. Мне оно нравится, тем, что настройки конфигурации сохраняются файликом, после хардресета файлик подгружаешь и всё работает. Так же супруге на телефон сбрасываешь этот файлик и так же все запускается. Хорошее приложение.

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

А так вообще... Пульт ИК... основное средство управления.

Да, GSM Trinket тема, тоже его везде использую, ты ещё давно посоветовал. 

Насчет того что ты заменил блютуз на ESP. Собственно и управлять можно также как по блютуз. Программа для андроид типа Serial Wi-Fi Terminal. Я чето часок посидел и настроил этот терминал как был в блютузе только уже по вайфаю. (там также кнопки настраиваются с командами). Ви фи то по всему дому берёт однако, удобнее. Правда я на столе только всё подключал, щас опять вспоминать надо. Время будет , может выложу то что получилось с этим терминалом

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

мне вот эта статья помогала разбираться с ESP. Довольно доходчиво описано

abarmotovi4
Offline
Зарегистрирован: 07.02.2016

Slavyanin55 пишет:

 Но я согласен! надо стремится к полному порядку и быстродействию. 

Предложу свой вариант ускорения, может кому понравится).

#include <OneWire.h>
#include <Wire.h>                

OneWire ds (10);           // Пин с датчиками DS18B20
boolean f_readTemp = true; // Флаг чтения температуры 
byte data[12];             // Переменная для хранения значений температуры, полученной от DS18B20 из функции опроса
byte UlitsaC[8]    = { 0x28, 0xFF, 0x37, 0x7C, 0xC2, 0x15, 0x2, 0x94 }; // Сетевой адрес датчика DS18B20 на улице  
byte ZalC[8]       = { 0x28, 0xFF, 0x30, 0x53, 0xC0, 0x15, 0x1, 0x82 }; // Сетевой адрес датчика DS18B20 в зале
byte KuhnyaC[8]    = { 0x28, 0xFF, 0xD3, 0x7C, 0xC2, 0x15, 0x2, 0x51 }; // Сетевой адрес датчика DS18B20 в кухне

const uint16_t updateTime= 3000; // Частота опроса датчиков DS18B20
uint32_t currentTime     = 0;    // Текущее время
uint32_t lastUpdateTime  = 0;    // Время последнего опроса датчиков 
uint8_t dsErrUlitsaC     = 0;    // Счетчик ошибок чтения тепмпературы 
uint8_t dsErrZalC        = 0;    // Счетчик ошибок чтения тепмпературы 
uint8_t dsErrKuhnyaC     = 0;    // Счетчик ошибок чтения тепмпературы 
uint8_t dsErrCount       = 0;    // Общий счетчик ошибок чтения 

float  Temp_I_UlitsaC ; // Только что измеренная температура с датчика на улице  
float  Temp_I_ZalC    ; // Только что измеренная температура с датчика в зале         
float  Temp_I_KuhnyaC ; // Только что измеренная температура с датчика в кухне                  

float  Temp_UlitsaC ; // Температура предыдущего измерения на улице  
float  Temp_ZalC    ; // Температура предыдущего измерения в зале         
float  Temp_KuhnyaC ; // Температура предыдущего измерения в кухне                  

void setup()
{
  Serial.begin(9600);
  Wire.begin();
}

void loop()
{
   izmereniya();    
}

void izmereniya() 
{
  if (f_readTemp == true)  
  {
    ds.reset();
    ds.write(0xCC);     // Пропуск ROM для подачи сигнала старта конвертации всем датчика на линии
    ds.write(0x44);     // Начало конвертации температуры датчиком
    f_readTemp = false; // Сброс флага чтения температуры
  }                                           
  currentTime = millis();
  if (currentTime - lastUpdateTime > updateTime) // Частота опроса
  {
    Temp_I_UlitsaC = DS18B20(UlitsaC); // Промежуточная переменная 
    Temp_I_ZalC    = DS18B20(ZalC);    // Промежуточная переменная         
    Temp_I_KuhnyaC = DS18B20(KuhnyaC); // Промежуточная переменная
    if (Temp_I_UlitsaC > -50 && Temp_I_UlitsaC < 120) 
    { Temp_UlitsaC = Temp_I_UlitsaC; dsCount++; } // Запись температуры
    else  { dsErrUlitsaC++; dsErrCount++; }       // Счетчик ошибок
    if (Temp_I_ZalC > -50 && Temp_I_ZalC < 120)       
    { Temp_ZalC = Temp_I_ZalC; dsCount++; }	  // Запись температуры
    else  { dsErrZalC++; dsErrCount++; }	  // Счетчик ошибок
    if (Temp_I_KuhnyaC > -50 && Temp_I_KuhnyaC < 120) 
    { Temp_KuhnyaC = Temp_I_KuhnyaC; dsCount++; }// Запись температуры
    else  { dsErrKuhnyaC++; dsErrCount++; }    	 // Счетчик ошибок
    lastUpdateTime = currentTime;                // Сброс таймера 
    f_readTemp     = true;                       // Установка флага чтения
    Serial.print (Temp_UlitsaC);
    Serial.print ("C ,");
    Serial.print (Temp_ZalC);
    Serial.print ("C ,");
    Serial.print (Temp_KuhnyaC);
    Serial.println ("C ");
    Serial.println (" OK");
    Serial.println (millis()/1000);
   }
}

//==================================================================================
//                            Считывание температуры
//==================================================================================

float DS18B20(byte *adres)
{
  ds.reset();
  ds.select(adres);
  ds.write(0xBE);                  // Чтение памяти датчика (scratchpad)
  data[0] = ds.read ();
  data[1] = ds.read ();
  float raw;
  raw =  (data[1] << 8) | data[0]; // Пересчитываем в температуру
  float celsius =  raw / 16.0;
  return celsius;
}

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

abarmotovi4 пишет:

Предложу свой вариант ускорения, может кому понравится).

#include <OneWire.h>
#include <Wire.h>                

OneWire ds (10);           // Пин с датчиками DS18B20
boolean f_readTemp = true; // Флаг чтения температуры 
byte data[12];             // Переменная для хранения значений температуры, полученной от DS18B20 из функции опроса
byte UlitsaC[8]    = { 0x28, 0xFF, 0x37, 0x7C, 0xC2, 0x15, 0x2, 0x94 }; // Сетевой адрес датчика DS18B20 на улице  
byte ZalC[8]       = { 0x28, 0xFF, 0x30, 0x53, 0xC0, 0x15, 0x1, 0x82 }; // Сетевой адрес датчика DS18B20 в зале
byte KuhnyaC[8]    = { 0x28, 0xFF, 0xD3, 0x7C, 0xC2, 0x15, 0x2, 0x51 }; // Сетевой адрес датчика DS18B20 в кухне

const uint16_t updateTime= 3000; // Частота опроса датчиков DS18B20
uint32_t currentTime     = 0;    // Текущее время
uint32_t lastUpdateTime  = 0;    // Время последнего опроса датчиков 
uint8_t dsErrUlitsaC     = 0;    // Счетчик ошибок чтения тепмпературы 
uint8_t dsErrZalC        = 0;    // Счетчик ошибок чтения тепмпературы 
uint8_t dsErrKuhnyaC     = 0;    // Счетчик ошибок чтения тепмпературы 
uint8_t dsErrCount       = 0;    // Общий счетчик ошибок чтения 

float  Temp_I_UlitsaC ; // Только что измеренная температура с датчика на улице  
float  Temp_I_ZalC    ; // Только что измеренная температура с датчика в зале         
float  Temp_I_KuhnyaC ; // Только что измеренная температура с датчика в кухне                  

float  Temp_UlitsaC ; // Температура предыдущего измерения на улице  
float  Temp_ZalC    ; // Температура предыдущего измерения в зале         
float  Temp_KuhnyaC ; // Температура предыдущего измерения в кухне                  

void setup()
{
  Serial.begin(9600);
  Wire.begin();
}

void loop()
{
   izmereniya();    
}

void izmereniya() 
{
  if (f_readTemp == true)  
  {
    ds.reset();
    ds.write(0xCC);     // Пропуск ROM для подачи сигнала старта конвертации всем датчика на линии
    ds.write(0x44);     // Начало конвертации температуры датчиком
    f_readTemp = false; // Сброс флага чтения температуры
  }                                           
  currentTime = millis();
  if (currentTime - lastUpdateTime > updateTime) // Частота опроса
  {
    Temp_I_UlitsaC = DS18B20(UlitsaC); // Промежуточная переменная 
    Temp_I_ZalC    = DS18B20(ZalC);    // Промежуточная переменная         
    Temp_I_KuhnyaC = DS18B20(KuhnyaC); // Промежуточная переменная
    if (Temp_I_UlitsaC > -50 && Temp_I_UlitsaC < 120) 
    { Temp_UlitsaC = Temp_I_UlitsaC; dsCount++; } // Запись температуры
    else  { dsErrUlitsaC++; dsErrCount++; }       // Счетчик ошибок
    if (Temp_I_ZalC > -50 && Temp_I_ZalC < 120)       
    { Temp_ZalC = Temp_I_ZalC; dsCount++; }	  // Запись температуры
    else  { dsErrZalC++; dsErrCount++; }	  // Счетчик ошибок
    if (Temp_I_KuhnyaC > -50 && Temp_I_KuhnyaC < 120) 
    { Temp_KuhnyaC = Temp_I_KuhnyaC; dsCount++; }// Запись температуры
    else  { dsErrKuhnyaC++; dsErrCount++; }    	 // Счетчик ошибок
    lastUpdateTime = currentTime;                // Сброс таймера 
    f_readTemp     = true;                       // Установка флага чтения
    Serial.print (Temp_UlitsaC);
    Serial.print ("C ,");
    Serial.print (Temp_ZalC);
    Serial.print ("C ,");
    Serial.print (Temp_KuhnyaC);
    Serial.println ("C ");
    Serial.println (" OK");
    Serial.println (millis()/1000);
   }
}

//==================================================================================
//                            Считывание температуры
//==================================================================================

float DS18B20(byte *adres)
{
  ds.reset();
  ds.select(adres);
  ds.write(0xBE);                  // Чтение памяти датчика (scratchpad)
  data[0] = ds.read ();
  data[1] = ds.read ();
  float raw;
  raw =  (data[1] << 8) | data[0]; // Пересчитываем в температуру
  float celsius =  raw / 16.0;
  return celsius;
}

С обработкой ошибок вы пошли порочным путем. Если хочется, то запрос и сверка адреса + CRC. В данном варианте практически бесполезное поедание ресурсов. ИМХО.

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

Dimax давно предложил как считывать датчики даллас через прерывание вотчдог и без задержек -  #348

abarmotovi4
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

С обработкой ошибок вы пошли порочным путем. Если хочется, то запрос и сверка адреса + CRC...

По поводу CRC согласен. А вот проверять адрес не вижу смысла, он ведь жестко задан и вероятность чтения не того датчика практически нулевая. Добавил проверку CRC.

#include <OneWire.h>
#include <Wire.h>                

OneWire ds (10);             // Пин с датчиками DS18B20
boolean f_readTemp  = true;  // Флаг чтения температуры 
byte data[12];                                
byte UlitsaC[8] = { 0x28, 0xFF, 0x37, 0x7C, 0xC2, 0x15, 0x2, 0x94 };    // Сетевой адрес датчика на улице  
byte ZalC[8]    = { 0x28, 0xFF, 0x30, 0x53, 0xC0, 0x15, 0x1, 0x82 };    // Сетевой адрес датчика в зале
byte KuhnyaC[8] = { 0x28, 0xFF, 0xD3, 0x7C, 0xC2, 0x15, 0x2, 0x51 };    // Сетевой адрес датчика в кухне
int i;

const uint16_t updateTime = 3000;  // Частота опроса датчиков
uint32_t currentTime     = 0;      // Текущее время
uint32_t lastUpdateTime  = 0;      // Время прошедшее с последнего опроса 
uint8_t crc;

float  Temp_I_UlitsaC ; // Только что измеренная температура   
float  Temp_I_ZalC    ;       
float  Temp_I_KuhnyaC ;                 

float  Temp_UlitsaC ; // Температура предыдущего измерения   
float  Temp_ZalC    ;          
float  Temp_KuhnyaC ;  


void setup()
{
  Serial.begin(9600);
  Wire.begin();
}

void loop()
{
   izmereniya();
}

void izmereniya() 
{ 
  if (f_readTemp == true)  
  {
    ds.reset();
    ds.write(0xCC);      // Пропуск ROM 
    ds.write(0x44);      // Начало конвертации (питание от внешнее) 
    f_readTemp = false;  // Сброс флага чтения температуры
  }                                           
  currentTime = millis();
  if (currentTime - lastUpdateTime > updateTime) // Частота опроса датчика
  {
    Temp_I_UlitsaC = DS18B20(UlitsaC); // Промежуточная переменная
    Temp_I_ZalC    = DS18B20(ZalC);            
    Temp_I_KuhnyaC = DS18B20(KuhnyaC); 
    if (Temp_I_UlitsaC > -50 && Temp_I_UlitsaC < 120 && Temp_I_UlitsaC != 85) 
       { Temp_UlitsaC = Temp_I_UlitsaC;} // Запись текущей температуры
    if (Temp_I_ZalC > -50 && Temp_I_ZalC < 120 && Temp_I_ZalC != 85)       
       { Temp_ZalC = Temp_I_ZalC; }	 
    if (Temp_I_KuhnyaC > -50 && Temp_I_KuhnyaC < 120 && Temp_I_KuhnyaC != 85)
       { Temp_KuhnyaC = Temp_I_KuhnyaC; }  
    lastUpdateTime = currentTime; // Сброс таймера 
    f_readTemp     = true;       // Установка флага чтения температуры
    Serial.print (Temp_UlitsaC);
    Serial.print ("C ,");
    Serial.print (Temp_ZalC);
    Serial.print ("C ,");
    Serial.print (Temp_KuhnyaC);
    Serial.println ("C ");
    Serial.println (" OK");
  }
}

//==================================================================================
//                            Считывание температуры
//==================================================================================

float DS18B20(byte *adres)
{
  ds.reset();
  ds.select(adres);
  ds.write(0xBE);                // Чтение памяти датчика (scratchpad)
  for ( i = 0; i < 9; i++)            
  {
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }  
  crc = OneWire::crc8(data, 8);
  if (crc == data[8])
  {
    Serial.print(" CRC=");
    Serial.print(crc, HEX);
    Serial.println();
  }
  else {
    Serial.println("CRC invalid!");
    return -100;
  }
  float raw;
  raw =  (data[1] << 8) | data[0]; // Пересчитываем в температуру
  float celsius =  raw / 16.0;
  return celsius;
}

MaksVV пишет:

Dimax давно предложил как считывать датчики даллас через прерывание вотчдог и без задержек -  #348

Способ хороши, но:

- использоват watchdog для считывания температуры не хочу (у меня на него другие планы).

- ограничение на время между запросами.

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

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

abarmotovi4 пишет:

По поводу CRC согласен. А вот проверять адрес не вижу смысла, он ведь жестко задан и вероятность чтения не того датчика практически нулевая. Добавил проверку CRC.

При отвалившемся датчике вроде CRC совпадет. Хотя не проверял.

abarmotovi4
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

При отвалившемся датчике вроде CRC совпадет. Хотя не проверял.

Не совпадает, проверял. Пример с CRC из библиотеки OneWire у меня работает (при отключении датчика не выдает сообщее "CRC is not valid"), пришлось допиливать самому. Отключал датчик, программа реагирует адекватно. Добавил в условие правильности температуру 85гр, потому что при восстановлении питания, датчик то что у него записано в EEPROM. Единственное что каждый может доработать, это то какая будет реакция при ошибке (для меня удобно если будет посылаться последнее измеренное значение).

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

Slavyanin55 пишет:
Через Еспишку я так и не наладил управление. HTML изучать надо. Или где бы готовый пример подсмотреть, и уму разуму научиться.

Вот пример. Но управление не через браузер, а просто через программу на андроиде "Serial WI-FI Terminal"

Подключаем ESP к ардуино ( схему подключения можно посмотреть в статье, я чуть выше приводил #532) Хотя я просто подключил 4 провода. питание 3,3В взял с ардуино (что не есть хорошо) GND и TX, RX. Причем уровни не согласовывал, но у меня всё и так нормально заработало - для проверки на столе пойдет, для постоянного пользования - нет. Для надёжности нужно стабильное питание и согл. уровней. ). У меня ESP подключено через софт сериал на 7,8 пины. Поправьте в скетче , если у вас по другому. 

Заливаем скетч и ставим в мониторе порта нужную скорость и NL&CR справа  внизу

#include <SoftwareSerial.h>

SoftwareSerial mySerial(7, 8); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.println("Nasrtoyka ESP");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(115200);
 // mySerial.println("Hello, world?");
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

И отправляем команду "AT". ESP должна ответить "ОК".  У меня модуль откликался на скорости 115200. 

Потом я поменял эту скорость командой AT+CIOBAUD=38400 так как иногда символы пропадали при общении с модулем. Подумал что многовато 115200. После замены скорости опять заливаем скетч который выше и ставим там Serial.begin  уже поменянную скорость. 

Далее можно посмотреть список доступных сетей Wi-Fi командой AT+CWLAP

AT+RST - на всякий случай перезагружаем модуль

Потом устанавливаем режим WIFI:

AT+CWMODE=1 — клиент, подключается к другим точкам доступа. Т.е. режим, в котором наша ESP будет сама подключаться к существующей Wi-Fi сети. 

 
Далее подключаемся к сети Wi-Fi:  AT+CWJAP="nameap","parolparol"
например сеть с именем DIR300 а пароль у нее privet
Тогда нужная нам АТ команда будет 
AT+CWJAP="DIR300","privet"
 
Модуль должен ответить :
WIFI CONNECTED
WIFI GOT IP
 
Можно теперь посмотреть подключились ли мы или нет   AT+CWJAP?
 
И нужно узнать какой ESP имеет MAC-адрес и какой нам присвоил роутер IP адрес. Это делаем командой AT+CIFSR   - запишем эти данные где нибудь, они далее понадобятся.
 
Теперь заходим в настройки роутера (набираем в строке адреса сайта в браузере обычно 192.168.0.1 или 192.168.1.1 ) Логин и пароль, по умолчанию admin и admin (эти данные указаны снизу маршрутизатора).
и настраиваем чтобы устройству с данным MAC-адресом (наша ESP, мак адрес мы чуть выше уже узнали) всегда присваивался один и тот же IP адрес. Вот статья как это сделать. Это вообще не сложно. 
 
На этом настройка подключения к сети Wi-Fi закончена и по идее она должна сохраняться после перевключения питания. 
 
Далее заливаем этот скетч если хотим рулить ардуиной текстовыми командами 
#include <avr/pgmspace.h>
const char string_0[] PROGMEM = "LED is OFF";  //отчет 0
const char string_1[] PROGMEM = "LED is ON";   //отчет 1 и т.д.
const char* const string_table[] PROGMEM = {string_0, string_1}; // здесь массив отчетов
char buf[30]; // буффер для работы прогмем, если нужны строки более 30 символов, тут ставим бОльшее значение

// далее всем строкам дефайним название, чтоб не 0 1 2... так проще ориентироваться
#define BALANCE 100 //когда на GSM модуль пришел баланс, отправляемся оттуда в функцию отчетов с парметром строки №100, т.е. пишем otvet_klienty(BALANCE);
#define REPORT_LED_OFF 0
#define REPORT_LED_ON 1



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

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


String currStr = "";

#define ledPin 13     

#define BUFFER_SIZE 128

char buffer[BUFFER_SIZE];
int ch_id;

void setup() 
{ 

  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;
      while(*pb!=':') pb++;
      pb++;
      Serial.println(buffer);
 //далее идёт парсинг команд
  
      if(strncmp(pb, "LED OFF", 6) == 0) // если принята команда "LED OFF", то 
       {
        if (digitalRead(ledPin)) digitalWrite(ledPin, 0); // выключаем светодиод
        otvet_klienty(REPORT_LED_OFF);  // отправляемся в функцию формирования отчета в WI-FI терминал клиенту (и передаём ей номер строки отчета)
       } 
 


 if(strncmp(pb, "LED ON", 6) == 0) // если принята команда "LED ON", то 
       {
        if (!digitalRead(ledPin)) digitalWrite(ledPin, 1); // включаем светодиод
        otvet_klienty(REPORT_LED_ON);  // отправляемся в функцию формирования отчета в WI-FI терминал клиенту (и передаём ей номер строки отчета)
       }

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

  
}


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


void otvet_klienty(int str_number) 
{  

//если это не отчет по балансу, берем строку из прогмем
if (str_number!=100) strcpy_P(buf, (char*)pgm_read_word(&(string_table[str_number]))); 
  else //иначе, если это баланс, парсим строку String currStr
  {
   // пишем в буфер из строки стринг всё что после 8 символа и до символа 'r' (ну рублей тобишь)
    int leng =0;
    while (currStr[leng]!='r') leng++; 
  for (int i=0; i<leng-9; i++) buf[i] = currStr[i+10];
  } 
    int len=0;

    while (buf[len]!='\0') len++;
 

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

  delay(20);

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

}


или этот если команды будут из 4 цифр, как у автора темы

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

#include <avr/pgmspace.h>
const char string_0[] PROGMEM = "LED is OFF";  //отчет 0
const char string_1[] PROGMEM = "LED is ON";   //отчет 1 и т.д.
const char string_2[] PROGMEM = "Command Error!";   

const char* const string_table[] PROGMEM = {string_0, string_1, string_2}; // здесь массив строк отчетов

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


// далее всем строкам дефайним название, чтобы не 0 1 2... так проще ориентироваться

#define BALANCE 100 //когда на GSM модуль пришел баланс, отправляемся оттуда в функцию отчетов с парметром строки №100, т.е. пишем otvet_klienty(BALANCE);
#define REPORT_LED_OFF 0
#define REPORT_LED_ON 1
#define ERR 2



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

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


String currStr = "";

#define ledPin 13     

#define BUFFER_SIZE 30

char buffer[BUFFER_SIZE];
int ch_id;

void setup() 
{ 

  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;
      while(*pb!=':') pb++;
      pb++;
      
 //далее идёт парсинг команд
   char a,b,c,d;
   a= buffer [9];  b= buffer [10];
   c= buffer [11]; d= buffer [12];
 
 if(a=='0'){
      if(b=='1'){
        if(c=='1')
        {
          if(d=='1'){ if (!digitalRead(ledPin)) digitalWrite(ledPin, 1); otvet_klienty(REPORT_LED_ON);} // включить светодиод (0111)
     else if(d=='0'){ if (digitalRead(ledPin)) digitalWrite(ledPin, 0); otvet_klienty(REPORT_LED_OFF);} // выключить светодиод (0110)
     else if(d=='2'){ } // Включение  климат-контроля в режим экономии (0112)
     else if(d=='3'){ } // Выключение  климат-контроля из режим экономии (0113)
     else if(d=='4'){ } // Прибавление желаемой температуры в доме на 1гр.С (0114)
     else if(d=='5'){ } // Уменьшение желаемой температуры в доме на 1гр.С (0115)
     else {otvet_klienty(ERR);}
        }
      }
}
   

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

  
}


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


void otvet_klienty(int str_number) 
{  

//если это не отчет по балансу, берем строку из прогмем
if (str_number!=100) strcpy_P(buf, (char*)pgm_read_word(&(string_table[str_number]))); 
  else //иначе, если это баланс, парсим строку String currStr
  {
   // пишем в буфер из строки стринг всё что после 8 символа и до символа 'r' (ну рублей тобишь)
    int leng =0;
    while (currStr[leng]!='r') leng++; 
  for (int i=0; i<leng-9; i++) buf[i] = currStr[i+10];
  } 
    int len=0;

    while (buf[len]!='\0') len++;
 

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

  delay(20);

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

}


Далее качаем в плеймаркете Serial Wi-Fi Terminal. Не забываем включить вай фай на телефоне и подключиться к той же сети что и ESP.  Открываем прогу. Слева вверху кнопка настройки. Далее Devices и нажимаем "+" справа внизу. Забиваем имя (любое), IP адрес ESP (там это называется Host) - мы его чуть выше уже узнали (и сделали постояннным) и порт, в скетче установлен 88. Такой и ставим, или меняем в скетче (Он в сетап, команда "AT+CIPSERVER=1,88"   88 - это и есть порт ) и  в программе Wi-Fi Terminal тоже. Все , выходим в общее окно программы, Сверху посередине нажимаем кнопку подключить, и в окне терминала должно появиться Connected . 

И вот сейчас отправляем команды "LED OFF" - Встроенный светик ардуино должен погаснуть и прийти отчет в окно терминала, в скетче ест ещё команда LED ON - соотвественно включает светик. 

Команды легко присвоить на кнопки (для настройки долго удерживаем кнопку и там пишем название кнопки и текст команды). 

 

 

 

nferaru
Offline
Зарегистрирован: 26.09.2016

MaksVV Помогите пожалуйста настроить ESP8266 под последнюю версию "ForumHouse_10_11_2017_YD"

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

nferaru пишет:

MaksVV Помогите пожалуйста настроить ESP8266 под последнюю версию "ForumHouse_10_11_2017_YD"

а что не получается? пример выше я дал как делать. Всё переписывать за вас не собираюсь

semushka
Offline
Зарегистрирован: 04.02.2016

Здравствуйте. Я слежу за вашим проектом и решил его повторить переделав под свои нужды. Хотел задать вопрос по поводу последней версии, а точнее куда подключен lcd 1602, в программе этого не нашел. Большое спасибо за ваши труды. 

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

semushka пишет:

Здравствуйте. Я слежу за вашим проектом и решил его повторить переделав под свои нужды. Хотел задать вопрос по поводу последней версии, а точнее куда подключен lcd 1602, в программе этого не нашел. Большое спасибо за ваши труды. 

автор вроде как собирается подключать дисплей по шине i2c. Т.е. в меге это пины 20 и 21

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

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

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

кстати вот скетч ESP с функцией запроса параметров по wi-fi (переделал всю фукнцию автора темы, т.к.  Serial.print () тут не канает). Не так просто было настроить этот запрос параметров. Но сейчас вроде работает стабильно. 

Скетч можно легко склеить со скетчем автора темы. В скетче описано в комментах как пользоваться написанием текста и переменных вместо Serial.print (). Добавил распечатку переменных типа float. БЕЗ ЧАСОВ DS3231 СКЕТЧ НЕ БУДЕТ РАБОТАТЬ!


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

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

//ниже строки для фукнции запроса параметров в терминал по Wi-Fi

const char string_0[] PROGMEM = "SmartHOME = "; 
const char string_1[] PROGMEM = "ON";   
const char string_2[] PROGMEM = "OFF";   
const char string_3[] PROGMEM = "VNIMANIE";   
const char string_4[] PROGMEM = "TREVOGA";   
const char string_5[] PROGMEM = "PROVERKA";   
const char string_6[] PROGMEM = "FireAlarm = ";
const char string_7[] PROGMEM = "ON: ";
const char string_8[] PROGMEM = "ON: Ustavka: ";
const char string_9[] PROGMEM = " *C";
const char string_10[] PROGMEM = "ECONOMIA";
const char string_11[] PROGMEM = "ON: temperatura v kuhne";
const char string_12[] PROGMEM = "ECONOMIA: temperatura v kuhne";
const char string_13[] PROGMEM = "Parametry:";
const char string_14[] PROGMEM = "Podpol: ";
const char string_15[] PROGMEM = "V zale: ";
const char string_16[] PROGMEM = "Ha ylice: ";
const char string_17[] PROGMEM = "Kuhnya: ";
const char string_18[] PROGMEM = "Solnce na ylice: ";
const char string_19[] PROGMEM = "IBP: +";
const char string_20[] PROGMEM = "SMS: ";
const char string_21[] PROGMEM = "Fireschet: ";
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 = "Narabotka: ";
const char string_28[] PROGMEM = " dney";
const char string_29[] PROGMEM = "net svyazi";
const char string_30[] PROGMEM = "Otkrita kalitka";
const char string_31[] PROGMEM = "Otkrita vhodnaya dver'";
const char string_32[] PROGMEM = "Otkrita dver'banya";
const char string_33[] PROGMEM = "Trevoga! Voda v pogrebe!";
const char string_34[] PROGMEM = "Ochen' visokaya temperatura v bane! Pozhar?";
const char string_35[] PROGMEM = "Srabotal dimovoy datchik";
const char string_36[] PROGMEM = "Banya gotova!";
const char string_37[] PROGMEM = "Dvizhenie v vannoy";
const char string_38[] PROGMEM = "Dvizhenie na kuhne";
const char string_39[] PROGMEM = "Dvizhenie v zale";
const char string_40[] PROGMEM = "Net pitaniya 220V";
const char string_41[] PROGMEM = "OHRANA PERIMETRA VKLYUCHENA";
const char string_42[] PROGMEM = "Alarm! Kriticheskaya temperatura!";
const char string_43[] PROGMEM = "Klimat kontrol = ";
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 = "";

//Ниже строки отчетов о выполнении команд по Wi-Fi

const char string_50[] PROGMEM = "Command Error!";   
const char string_51[] PROGMEM = "LED is OFF";  //отчет 0
const char string_52[] PROGMEM = "LED is ON";   //отчет 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=4;

#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=='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();}  
     // тут ниже (команда 0114) пример распечатки отчета с переменной float 
     else if(d=='4'){PrintTEXT(IBP); Print_floatVar(Vpit); strcat(buff, "V"); otvet_klienty();} 
     else if(d=='5'){ } 
    
     else if(d=='6'){zapros_ESP();} // запрос параметров умного дома в терминал по Wi-Fi (команда 0116)
     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(digitalRead(23)==HIGH)  { PrintTEXT(OTKR_KALITKA); strcat(buff, "\r\n");}
  if(digitalRead(25)==HIGH)  { PrintTEXT(OTKR_VH_DVER); strcat(buff, "\r\n");}
  if(digitalRead(27)==HIGH)  { PrintTEXT(OTKR_BANYA_DVER); strcat(buff, "\r\n");}
  if(digitalRead(30)==HIGH) { PrintTEXT(VODA_POGREB); strcat(buff, "\r\n");}  
 }
  if (i==7){

  if (digitalRead(31)==HIGH)    { PrintTEXT(ALARMTEMP_BANYA); strcat(buff, "\r\n");}
  if (digitalRead(33)==LOW || digitalRead(35)==LOW)  { PrintTEXT(DYM_DATCHIK); strcat(buff, "\r\n");}
  
   }

    if (i==8){
  if (digitalRead(29)==HIGH)  { PrintTEXT(BANYA_GOTOVA); strcat(buff, "\r\n");}  
  if (digitalRead(24)==HIGH) { PrintTEXT(DVIG_VANNA); strcat(buff, "\r\n");} 
  if (digitalRead(26)==HIGH) { PrintTEXT(DVIG_KUHNYA); strcat(buff, "\r\n");} 
  if (digitalRead(22)==HIGH) { PrintTEXT(DVIG_ZAL); strcat(buff, "\r\n");}
}

if (i==9){
 
  if (digitalRead(37)==HIGH) { 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; }

 

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

semushka пишет:

Здравствуйте. Я слежу за вашим проектом и решил его повторить переделав под свои нужды. Хотел задать вопрос по поводу последней версии, а точнее куда подключен lcd 1602, в программе этого не нашел. Большое спасибо за ваши труды. 

Здравствуйте, Semushka! MaksVV сказал правильно, экран я подключаю чере I2C плату. Только в программе сейчас LCD1602. Но я в скором времени буду подключать LCD2004. Так, что если вы собираетесь заказывать экран, то берите сразу 2004ый, т.е. 4 строки по 20 символов. с поддержкой кирилицы.

 

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

MaksVV пишет:

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

MaksVV низкий тебе поклон! Скоро буду дома, займусь Espихой!

semushka
Offline
Зарегистрирован: 04.02.2016

Спасибо большое за разъяснения.

kostyamat
Offline
Зарегистрирован: 16.11.2017

Огромный респект автору. Практически - титанический труд. Хочу обратить внимание на несколько аспектов.
Sms - дороги и не сердито, к тому же часто запаздывает. Голосов вызов, голосовое меню + DTMF управление, имхо, на много удобнее и надёжнее. К тому же SIM800 и SIM900 обладают SMTP клиентом и вполне могут отправлять емайлы, даже через сервак Гугла (у Гугла есть спецшлюз, без шифрования, просто учётку нужно дополнительно создать, чисто для Дуни, с отключением зашиты). DTMF эти модемы дешифруют аппаратно, SIM900 имеет даже встроенный синтезатор речи (правда английский).
Второй момент, люди тут изголяться в написании кода фильтрования звонков, "свой не свой", при этом создавая переменные структуры, мучая Еепром Дуни. Вопрос: зачем? Для этого а) есть память СИМ; б) модем сам знает кто свой. Запишите на СИМ "свои" номера (хоть с телефона на андроид, или нокии - пофиг), и модем при звонке выдаёт (если включена функция АОН), номер звонящего, ВНИМАНИЕ! СТРОКУ С ИМЕНЕМ ЗВОНЯЩЕГО из памяти СИМ, и даже цифровой код, который может рассказать многое, например: в роуминге ли звонящий, записан ли его номер в СИМ и многое ещё.

Удачи в развитии проекта. Сам я дом автоматизировать пока не пытаюсь, но есть свои задумки. Для начала нужные функции пишу, для голосового меню и оповещения.
Вот тут http://arduino.ru/forum/programmirovanie/progovarivanie-float моя функция для проговаривания float (влажность, температура, баланс карты и т.п.). Может сгодится. )

kostyamat
Offline
Зарегистрирован: 16.11.2017

Огромный респект автору. Практически - титанический труд. Хочу обратить внимание на несколько аспектов.
Sms - дороги и не сердито, к тому же часто запаздывает. Голосов вызов, голосовое меню + DTMF управление, имхо, на много удобнее и надёжнее. К тому же SIM800 и SIM900 обладают SMTP клиентом и вполне могут отправлять емайлы, даже через сервак Гугла (у Гугла есть спецшлюз, без шифрования, просто учётку нужно дополнительно создать, чисто для Дуни, с отключением зашиты). DTMF эти модемы дешифруют аппаратно, SIM900 имеет даже встроенный синтезатор речи (правда английский).
Второй момент, люди тут изголяться в написании кода фильтрования звонков, "свой не свой", при этом создавая переменные структуры, мучая Еепром Дуни. Вопрос: зачем? Для этого а) есть память СИМ; б) модем сам знает кто свой. Запишите на СИМ "свои" номера (хоть с телефона на андроид, или нокии - пофиг), и модем при звонке выдаёт (если включена функция АОН), номер звонящего, ВНИМАНИЕ! СТРОКУ С ИМЕНЕМ ЗВОНЯЩЕГО из памяти СИМ, и даже цифровой код, который может рассказать многое, например: в роуминге ли звонящий, записан ли его номер в СИМ и многое ещё.

Удачи в развитии проекта. Сам я дом автоматизировать пока не пытаюсь, но есть свои задумки. Для начала нужные функции пишу, для голосового меню и оповещения.
Вот тут http://arduino.ru/forum/programmirovanie/progovarivanie-float моя функция для проговаривания float (влажность, температура, баланс карты и т.п.). Может сгодится. )
Для отладки, функция не воспроизводит wav, а формирует название файлов и печатает их в сериал, чем вы замените Serial.println() решать вам. Кто-то будет юзать DFPlayer, я же, например, предпочитаю библиотеку http://out.arduino.ru/?redirect=https%3A%2F%2Fgithub.com%2FTMRh20%2FTMRp... которая это делает софтово.