Здарова коллеги. Подскажите скетч на ардуино, мне надо чтобы три датчика движения зажигали одну реле. Только реле будет 2, а датчиков 6. За ранее спасибо.
Коллеги, подскажите пожалуйста, меня мучает идея как все таки прикрутить сюда ESP 8266 чтоб можно было "мишью открывать окна " )
Я правильно понимаю если ESP 8266 использовать как сервер то можно управлять уным домом только врамках своей WI- FI сети дома ?
Или все же можно будет подключиться к серверу через мобильный интерент например ?
Я в програмировании не силен прошу помочь советом, основная идея управлять домом не через АТ команды а удаленно через телефон с интернетом
Зайди на страницу //esp8266.ru/ Там ответы на твои вопросы.
Если вкратце: берем однокристальный пк (апельсинку, малинку, банан и т.д.) ставим на нее все что нужно. Цель: сервер для умного дома. Пускаем этот мини-сервер в интернет. Цепляем к серверу стопицот есп и лежа на диване управляем домом.
Зайди на страницу //esp8266.ru/ Там ответы на твои вопросы.
Если вкратце: берем однокристальный пк (апельсинку, малинку, банан и т.д.) ставим на нее все что нужно. Цель: сервер для умного дома. Пускаем этот мини-сервер в интернет. Цепляем к серверу стопицот есп и лежа на диване управляем домом.
Спасибо за подсказку , но я хочу на ардуине слепить. просто управление GSM не настолько удобно как вэб для меня, как оповещение GSM рулит
дело в том, что есп мощнее многих дуин будет. минус - ограниченное количество входов/выходов. Т.е. грубо говоря так: берем кухню, на кухне есть счетверенная розетка для чайника/тостера и т.д. запихав есп в подразетник - управляешь всеми четырьмя розетками без проводов со своего телефона/планшета/ телевизора и т.д. можно засунуть есп внутрь печки, микроволновки, посудомойки и т.д. Прописав ай пи для каждого устройства, имеем домашную сеть "умных устройств" а малинка нужна для организации веб интерфейса общего. Иначе, чтобы включить/выключить устройство, надо будет открыть страницу именно этого устройства, что не очень удобно. Да и держать в памяти все адреса... Ардуине в этой структуре можно доверить сбор данных и отправку на телефон смс сообщений о состоянии устройств, температуры и т.д.
Сейчас попалась инструкция от котла настенного аристон, с функцией NET. Ничего толком не описано, только общие фразы. Так вот там вай фай. Рано или поздно, один фиг придется городить вай фай сеть "умных устройств".
Вообще ЕСП и ардуино - конструкторы для выполнения разных задач. Подключение есп к ардуинке не более, чем легкая ностальгия по арду. Это мое видение ситуации, ибо сам думал как присобачить к ардуино есп, а теперь забил на это.
Прописав ай пи для каждого устройства, имеем домашную сеть
Кстати, тут вопрос возник. Может кто то задавался целью подсчитать как работает большое колличество ЕСПешек в сети со средненьким домашним роутером. Например штук 50 ЕСП. Не будет зависаний или отвалов. Оли может ещё какие нибудь подводные камни?
Доброго всем времени суток, делюсь своей доработкой умного дома, не могу тут добавить регулировку SG90 и кнопку перехода на другую страничку, например с наменованием indexs. Вот ссылка на скетч https://cloud.mail.ru/public/KzQ7/mEk1ig1RR пароль 14051974
шилд5100 и ардуино дуе. в ссылке кроме скетча надо все сохранить на флешке сразу в корень, не создавая лишних папок и не желательно иметь там посторонние файлы.Спасибо за ответ(заранее)
Сначала в скетче идетзапрос на открытие password.htm, после поддверждения пароля(надо обязательно кликнуть по ентер) в скетче идет запрос(если верен пароль) на index
Здравствуйте, нужна помощь. Пишу дипломный проект по автоматизации газового водогрейного котла через ардуино мега, в целях снижения затрат на природный газ(короче говоря нужно изобрести мозги котлу). Если кто-то может помоч кодом или схемой пайки буду весьма благодарен.
Зарание спасибо.
если кому интересно, я сделал запись номеров пользователей не со скетча, а как должно быть пользователем по смс, не меняя основной конструкции скетча (конкретно места парсинга сообщений от 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);
}
Просто я работаю в сфере автомобилей. Приходилось изучать Can шину, а раз есть какие то знания в этой области, было бы неправильно их не применить. К тому же не пойму, почему многим это решение кажется кривым, я пока минусов не увидел.
Привет всем сочувствующим!!! Проект не заброшен! Автоматика работает, и развивается потихоньку.В свободное от всего время. Наконецто проброшен кабель от контроллерного шкафа до котла :) Не подцеплял ещё. Приеду с вахты доделаю климат контроль в доме без препарирования пульта газового котла!!! Всё должно быть просто. Если в двух словах, то если разорвать проводную связь между пультом и котлом, то котел стоит и ничег не делает, при восстановлении связи с пультом, работа котла продолжается, без паники, истерики, блокировок и т.д. А значит, можно просто разрывать один проводков от котла до пульта через реле от УД!
УД научен говорить голосом, время, температуры. Кстати для этого пользую программу "Балаболка" с голосовым движком "Алена" (Russkiy_golos_Alyona_5587). Очень рекомендую!
Так же немного причесал контроллерный шкаф. Закупил платы с предохранителями, Всё цепи питания защищены плавкими предохранителями. Так спокойнее, надежнее, система живучее.
Добавлен блок питания на 12В 10А для питания всяких доп устройств, в том числе и подсветки кухонного гарнитура светодиодными лентами. Но это в будущем. Так же добавлено 6 каналов управления на транзисторах IRF740. Попробовал сделать плавное погасание/зажигание ночной подсветки... но не прокатило, что то. Буду разбираться.
Всем хорошего настроения. Кто-нибудь, объясните пожалуйста, как обеспечивается быстрое считывание сигнала с ИК-пульта? (в коде увидел что помимо даласовской задержки в библиотеке, в самой программе еще несколько присутствую, что в сумме более чем на 1,5 секунды тормозят программу. Кода внешнего прерывания не заметил.)
Приветствую, коллега!!! Интересует через какую программу на смартфоне управляешь УД (через ESPшку я так понял) по Wi-Fi ?
По СМС управляю по приложению GSM Trinket. Мне оно нравится, тем, что настройки конфигурации сохраняются файликом, после хардресета файлик подгружаешь и всё работает. Так же супруге на телефон сбрасываешь этот файлик и так же все запускается. Хорошее приложение.
Через Еспишку я так и не наладил управление. HTML изучать надо. Или где бы готовый пример подсмотреть, и уму разуму научиться.
А так вообще... Пульт ИК... основное средство управления.
Всем хорошего настроения. Кто-нибудь, объясните пожалуйста, как обеспечивается быстрое считывание сигнала с ИК-пульта? (в коде увидел что помимо даласовской задержки в библиотеке, в самой программе еще несколько присутствую, что в сумме более чем на 1,5 секунды тормозят программу. Кода внешнего прерывания не заметил.)
Ну в плане считывания с ИК пульта работает быстро. Даже с пульта самсунга. Он ведь двойной код присылает. Одно нажатие кнопки и прилетает два одинаковых кода команды и умный дом успевает отрабатывать по два раза! С этим приходится бороться. А так, не всё так плохо! 1,5 секунды они ведь не на каждом "круге" программы. Вот измерения даллосовских датчиков происходит 1 раз в 2 минуты! Ну подвисла программка на 1,5 секунды раз в две минуты, ну не атомный же реактор она окучиват, ничего страшного не случится. А так работает, всё на библиотеках. По простому, по тупому :) Но я согласен! надо стремится к полному порядку и быстродействию. Благо оперативы Меги ещё пока хватает.
Приветствую, коллега!!! Интересует через какую программу на смартфоне управляешь УД (через ESPшку я так понял) по Wi-Fi ?
Так же нравится в GSM Trinket , что смс перехватываются и можно отдельный звук ставить. Иконок не много, но хватает.
А вообще буду рад узнать более гибкое и красочное приложение! Которое например может расшифровывать ответные смс и менять свои картинки. Статусы там переключателей. С анимацией и всё такое. Есть такие приложения? Чтобы не обязательно было в андроиде программировать, а просто пальчиком на экране на создавать, картинок и привязать к ним команды всякие.
По СМС управляю по приложению GSM Trinket. Мне оно нравится, тем, что настройки конфигурации сохраняются файликом, после хардресета файлик подгружаешь и всё работает. Так же супруге на телефон сбрасываешь этот файлик и так же все запускается. Хорошее приложение.
Через Еспишку я так и не наладил управление. HTML изучать надо. Или где бы готовый пример подсмотреть, и уму разуму научиться.
А так вообще... Пульт ИК... основное средство управления.
Да, GSM Trinket тема, тоже его везде использую, ты ещё давно посоветовал.
Насчет того что ты заменил блютуз на ESP. Собственно и управлять можно также как по блютуз. Программа для андроид типа Serial Wi-Fi Terminal. Я чето часок посидел и настроил этот терминал как был в блютузе только уже по вайфаю. (там также кнопки настраиваются с командами). Ви фи то по всему дому берёт однако, удобнее. Правда я на столе только всё подключал, щас опять вспоминать надо. Время будет , может выложу то что получилось с этим терминалом
Предложу свой вариант ускорения, может кому понравится).
#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. В данном варианте практически бесполезное поедание ресурсов. ИМХО.
С обработкой ошибок вы пошли порочным путем. Если хочется, то запрос и сверка адреса + 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 для считывания температуры не хочу (у меня на него другие планы).
- ограничение на время между запросами.
Если у меня из кода убрать лишнее, тоже достаточно компактно получается).
По поводу CRC согласен. А вот проверять адрес не вижу смысла, он ведь жестко задан и вероятность чтения не того датчика практически нулевая. Добавил проверку CRC.
При отвалившемся датчике вроде CRC совпадет. Хотя не проверял.
При отвалившемся датчике вроде CRC совпадет. Хотя не проверял.
Не совпадает, проверял. Пример с CRC из библиотеки OneWire у меня работает (при отключении датчика не выдает сообщее "CRC is not valid"), пришлось допиливать самому. Отключал датчик, программа реагирует адекватно. Добавил в условие правильности температуру 85гр, потому что при восстановлении питания, датчик то что у него записано в EEPROM. Единственное что каждый может доработать, это то какая будет реакция при ошибке (для меня удобно если будет посылаться последнее измеренное значение).
Через Еспишку я так и не наладил управление. 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 - соотвественно включает светик.
Команды легко присвоить на кнопки (для настройки долго удерживаем кнопку и там пишем название кнопки и текст команды).
Здравствуйте. Я слежу за вашим проектом и решил его повторить переделав под свои нужды. Хотел задать вопрос по поводу последней версии, а точнее куда подключен lcd 1602, в программе этого не нашел. Большое спасибо за ваши труды.
Здравствуйте. Я слежу за вашим проектом и решил его повторить переделав под свои нужды. Хотел задать вопрос по поводу последней версии, а точнее куда подключен lcd 1602, в программе этого не нашел. Большое спасибо за ваши труды.
автор вроде как собирается подключать дисплей по шине i2c. Т.е. в меге это пины 20 и 21
Нашел один небольшой косяк при работе с ESP. При подключении к существующей сети Wi-Fi роутер назначает ESP шке IP адрес динамически - т.е. каждый раз разный может быть. Т.е. при перезагрузке роутера (электричество например отключали или ещё что), ESPшка получит другой IP и мы уже не сможем управлять умным домом с Wi-Fi Serial Terminal, пока не узнаем новый IP адрес ESP. Для исправления данного косяка нужно в настройках роутера сделать чтобы IP адрес нашёй ESP выделялся всегда один и тотже, т.е. статический. Исправил сообщение #539, там указал как это сделать, всё просто.
кстати вот скетч 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; }
Здравствуйте. Я слежу за вашим проектом и решил его повторить переделав под свои нужды. Хотел задать вопрос по поводу последней версии, а точнее куда подключен lcd 1602, в программе этого не нашел. Большое спасибо за ваши труды.
Здравствуйте, Semushka! MaksVV сказал правильно, экран я подключаю чере I2C плату. Только в программе сейчас LCD1602. Но я в скором времени буду подключать LCD2004. Так, что если вы собираетесь заказывать экран, то берите сразу 2004ый, т.е. 4 строки по 20 символов. с поддержкой кирилицы.
Нашел один небольшой косяк при работе с ESP. При подключении к существующей сети Wi-Fi роутер назначает ESP шке IP адрес динамически - т.е. каждый раз разный может быть. Т.е. при перезагрузке роутера (электричество например отключали или ещё что), ESPшка получит другой IP и мы уже не сможем управлять умным домом с Wi-Fi Serial Terminal, пока не узнаем новый IP адрес ESP. Для исправления данного косяка нужно в настройках роутера сделать чтобы IP адрес нашёй ESP выделялся всегда один и тотже, т.е. статический. Исправил сообщение #539, там указал как это сделать, всё просто.
MaksVV низкий тебе поклон! Скоро буду дома, займусь Espихой!
Огромный респект автору. Практически - титанический труд. Хочу обратить внимание на несколько аспектов.
Sms - дороги и не сердито, к тому же часто запаздывает. Голосов вызов, голосовое меню + DTMF управление, имхо, на много удобнее и надёжнее. К тому же SIM800 и SIM900 обладают SMTP клиентом и вполне могут отправлять емайлы, даже через сервак Гугла (у Гугла есть спецшлюз, без шифрования, просто учётку нужно дополнительно создать, чисто для Дуни, с отключением зашиты). DTMF эти модемы дешифруют аппаратно, SIM900 имеет даже встроенный синтезатор речи (правда английский).
Второй момент, люди тут изголяться в написании кода фильтрования звонков, "свой не свой", при этом создавая переменные структуры, мучая Еепром Дуни. Вопрос: зачем? Для этого а) есть память СИМ; б) модем сам знает кто свой. Запишите на СИМ "свои" номера (хоть с телефона на андроид, или нокии - пофиг), и модем при звонке выдаёт (если включена функция АОН), номер звонящего, ВНИМАНИЕ! СТРОКУ С ИМЕНЕМ ЗВОНЯЩЕГО из памяти СИМ, и даже цифровой код, который может рассказать многое, например: в роуминге ли звонящий, записан ли его номер в СИМ и многое ещё.
Удачи в развитии проекта. Сам я дом автоматизировать пока не пытаюсь, но есть свои задумки. Для начала нужные функции пишу, для голосового меню и оповещения.
Вот тут http://arduino.ru/forum/programmirovanie/progovarivanie-float моя функция для проговаривания float (влажность, температура, баланс карты и т.п.). Может сгодится. )
Огромный респект автору. Практически - титанический труд. Хочу обратить внимание на несколько аспектов.
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... которая это делает софтово.
Здарова коллеги. Подскажите скетч на ардуино, мне надо чтобы три датчика движения зажигали одну реле. Только реле будет 2, а датчиков 6. За ранее спасибо.
Автору респект!
а мне надо чтобы солнышко вокруг земли крутилось,))) никак не наоборот....
даю подсказку,
1 смотрим видео уроки джерими блюм. там все хорошо рассказвает мужик.. и пишим скетч, если возникают вопросы задаем на форуме в отдельной теме.
2 пишим заявку в теме ищю исполнителя......
А лучше сразу исполнителя. Тогда два человека будут удовлетворены :-)
Шучу.
:-)
Коллеги, подскажите пожалуйста, меня мучает идея как все таки прикрутить сюда ESP 8266 чтоб можно было "мишью открывать окна " )
Я правильно понимаю если ESP 8266 использовать как сервер то можно управлять уным домом только врамках своей WI- FI сети дома ?
Или все же можно будет подключиться к серверу через мобильный интерент например ?
Я в програмировании не силен прошу помочь советом, основная идея управлять домом не через АТ команды а удаленно через телефон с интернетом
я так понимаю это можно сделать через MQTT облако ?
Напоминает о фильме МИСТЕР БИН!) Всё за тебя машина делает!)
Коллеги, подскажите пожалуйста, меня мучает идея как все таки прикрутить сюда ESP 8266 чтоб можно было "мишью открывать окна " )
Я правильно понимаю если ESP 8266 использовать как сервер то можно управлять уным домом только врамках своей WI- FI сети дома ?
Или все же можно будет подключиться к серверу через мобильный интерент например ?
Я в програмировании не силен прошу помочь советом, основная идея управлять домом не через АТ команды а удаленно через телефон с интернетом
Зайди на страницу //esp8266.ru/ Там ответы на твои вопросы.
Если вкратце: берем однокристальный пк (апельсинку, малинку, банан и т.д.) ставим на нее все что нужно. Цель: сервер для умного дома. Пускаем этот мини-сервер в интернет. Цепляем к серверу стопицот есп и лежа на диване управляем домом.
Зайди на страницу //esp8266.ru/ Там ответы на твои вопросы.
Если вкратце: берем однокристальный пк (апельсинку, малинку, банан и т.д.) ставим на нее все что нужно. Цель: сервер для умного дома. Пускаем этот мини-сервер в интернет. Цепляем к серверу стопицот есп и лежа на диване управляем домом.
Спасибо за подсказку , но я хочу на ардуине слепить. просто управление GSM не настолько удобно как вэб для меня, как оповещение GSM рулит
дело в том, что есп мощнее многих дуин будет. минус - ограниченное количество входов/выходов. Т.е. грубо говоря так: берем кухню, на кухне есть счетверенная розетка для чайника/тостера и т.д. запихав есп в подразетник - управляешь всеми четырьмя розетками без проводов со своего телефона/планшета/ телевизора и т.д. можно засунуть есп внутрь печки, микроволновки, посудомойки и т.д. Прописав ай пи для каждого устройства, имеем домашную сеть "умных устройств" а малинка нужна для организации веб интерфейса общего. Иначе, чтобы включить/выключить устройство, надо будет открыть страницу именно этого устройства, что не очень удобно. Да и держать в памяти все адреса... Ардуине в этой структуре можно доверить сбор данных и отправку на телефон смс сообщений о состоянии устройств, температуры и т.д.
Сейчас попалась инструкция от котла настенного аристон, с функцией NET. Ничего толком не описано, только общие фразы. Так вот там вай фай. Рано или поздно, один фиг придется городить вай фай сеть "умных устройств".
Вообще ЕСП и ардуино - конструкторы для выполнения разных задач. Подключение есп к ардуинке не более, чем легкая ностальгия по арду. Это мое видение ситуации, ибо сам думал как присобачить к ардуино есп, а теперь забил на это.
Прописав ай пи для каждого устройства, имеем домашную сеть
Кстати, тут вопрос возник. Может кто то задавался целью подсчитать как работает большое колличество ЕСПешек в сети со средненьким домашним роутером. Например штук 50 ЕСП. Не будет зависаний или отвалов. Оли может ещё какие нибудь подводные камни?
Доброго всем времени суток, делюсь своей доработкой умного дома, не могу тут добавить регулировку SG90 и кнопку перехода на другую страничку, например с наменованием indexs. Вот ссылка на скетч https://cloud.mail.ru/public/KzQ7/mEk1ig1RR пароль 14051974
шилд5100 и ардуино дуе. в ссылке кроме скетча надо все сохранить на флешке сразу в корень, не создавая лишних папок и не желательно иметь там посторонние файлы.Спасибо за ответ(заранее)
пароль 14051974
Здравствуйте.
что то не соображу, как у Вас password.htm из Index задействуется ?
Сначала в скетче идетзапрос на открытие password.htm, после поддверждения пароля(надо обязательно кликнуть по ентер) в скетче идет запрос(если верен пароль) на index
Здравствуйте, нужна помощь. Пишу дипломный проект по автоматизации газового водогрейного котла через ардуино мега, в целях снижения затрат на природный газ(короче говоря нужно изобрести мозги котлу). Если кто-то может помоч кодом или схемой пайки буду весьма благодарен.
Зарание спасибо.
если кому интересно, я сделал запись номеров пользователей не со скетча, а как должно быть пользователем по смс, не меняя основной конструкции скетча (конкретно места парсинга сообщений от GSM) автора темы. Номера при этом хранятся в еепром и после перевключения питания естественно сохраняются. Номер 1 лежит в ячейках с 10 по 21, Номер 2 лежит в 20 по 31. Если вы используете эти ячейки чем-то другим, нужно переделать. Также там есть рабочая функция запроса баланса для SIM800L.
Если номера не запрограммированы, модуль принимает только две команды "ZAPROS" и "ZAPROSTEL" . И сообщает в ответной смс какую смс (команда "WriteNumber1") отправить для сохранения номера #1. Если мы отправили такую команду номер сохраняется, приходит соответствующее подтверждение о записи номера #1. Теперь можно управлять модулем. Запись номера #2 возможна только в случае записанного номера #1 и только с номера #1 (команда "WriteNumber2").
Есть также команда для удаления обоих номеров из еепром и памяти ("NumbersReset"). После чего модуль опять начинает реагировать только на две команды. "ZAPROS" и "ZAPROSTEL"
Приведена только часть скетча, только где что-то изменилось.
...Номер 1 лежит в ячейках с 10 по 21, Номер 2 лежит в 20 по 31. Если вы используете эти ячейки чем-то другим, нужно переделать.
у вас случайно номер 2 не накладывается на 1 номер?! а то написано 1 номер с 10 по 21, 2 номер с 20 по 31.
в EEPROM номер в формате 79991115500
...Номер 1 лежит в ячейках с 10 по 21, Номер 2 лежит в 20 по 31. Если вы используете эти ячейки чем-то другим, нужно переделать.
у вас случайно номер 2 не накладывается на 1 номер?! а то написано 1 номер с 10 по 21, 2 номер с 20 по 31.
в EEPROM номер в формате 79991115500
спасибо за замеченную ошибку! Не проверял, но конечно, будет накладываться. Исправлю
И в самом деле, объем работ не малый. Я как новичок в этой сфере, выражаю искреннее уважение автору и желаю успеха.
И в самом деле, объем работ не малый. Я как новичок в этой сфере, выражаю искреннее уважение автору и желаю успеха.
Подскажите а какая шина будет хороша если делать модульную систему:
Световой - реле - подводим питание(220в) из шины читает включение и запоминает состояние
Датчик - температура
В общем хочу сделать на маленьких схемах каждой дать "адрес" чтобы были в общей системе в идеале питалить и подключались к шине по FTP кабелю.
Rs485 до 32 уcтройств что мало.
А на конце сделать распберри.
Чтобы не было головной Ардеино Мега.
DS2413? DS2408? esp8266?
Как идея? Кажется хорошо - в каждую комнату котроллер света / вентиляции / тепла / датчика и легко расширяемо.
Остается вопрос питания 220в и как компактро трансформировать в 12в или сразу 12в. А также протокола. ethernet в каждом устройстве монстрабельно.
ПС - тут уже думал про децентрализованную систему: http://arduino.ru/forum/proekty/umnyi-chastnyi-dom#comment-316162
Тут MaksVV этим пытается заняться http://arduino.ru/forum/proekty/ocherednoi-umnyi-dom-na-etot-raz-modulna.... Только его на CAN понесло. И чего Вы по чужие темы засоряете, свою создайте может кто и подтянется, если интересно будет.
Просто я работаю в сфере автомобилей. Приходилось изучать Can шину, а раз есть какие то знания в этой области, было бы неправильно их не применить. К тому же не пойму, почему многим это решение кажется кривым, я пока минусов не увидел.
Хороший проэкт!!!
А чего блог забросил?
Хороший проэкт!!!
А чего блог забросил?
Привет всем сочувствующим!!! Проект не заброшен! Автоматика работает, и развивается потихоньку.В свободное от всего время. Наконецто проброшен кабель от контроллерного шкафа до котла :) Не подцеплял ещё. Приеду с вахты доделаю климат контроль в доме без препарирования пульта газового котла!!! Всё должно быть просто. Если в двух словах, то если разорвать проводную связь между пультом и котлом, то котел стоит и ничег не делает, при восстановлении связи с пультом, работа котла продолжается, без паники, истерики, блокировок и т.д. А значит, можно просто разрывать один проводков от котла до пульта через реле от УД!
УД научен говорить голосом, время, температуры. Кстати для этого пользую программу "Балаболка" с голосовым движком "Алена" (Russkiy_golos_Alyona_5587). Очень рекомендую!
Так же немного причесал контроллерный шкаф. Закупил платы с предохранителями, Всё цепи питания защищены плавкими предохранителями. Так спокойнее, надежнее, система живучее.
Добавлен блок питания на 12В 10А для питания всяких доп устройств, в том числе и подсветки кухонного гарнитура светодиодными лентами. Но это в будущем. Так же добавлено 6 каналов управления на транзисторах IRF740. Попробовал сделать плавное погасание/зажигание ночной подсветки... но не прокатило, что то. Буду разбираться.
Ссылка на последнюю программу, библиотеки и фото от Ноябрь_2017 : https://yadi.sk/d/iqyRFz1Zdt8W2
Приветствую, коллега!!! Интересует через какую программу на смартфоне управляешь УД (через ESPшку я так понял) по Wi-Fi ?
Всем хорошего настроения. Кто-нибудь, объясните пожалуйста, как обеспечивается быстрое считывание сигнала с ИК-пульта? (в коде увидел что помимо даласовской задержки в библиотеке, в самой программе еще несколько присутствую, что в сумме более чем на 1,5 секунды тормозят программу. Кода внешнего прерывания не заметил.)
Приветствую, коллега!!! Интересует через какую программу на смартфоне управляешь УД (через ESPшку я так понял) по Wi-Fi ?
По СМС управляю по приложению GSM Trinket. Мне оно нравится, тем, что настройки конфигурации сохраняются файликом, после хардресета файлик подгружаешь и всё работает. Так же супруге на телефон сбрасываешь этот файлик и так же все запускается. Хорошее приложение.
Через Еспишку я так и не наладил управление. HTML изучать надо. Или где бы готовый пример подсмотреть, и уму разуму научиться.
А так вообще... Пульт ИК... основное средство управления.
Всем хорошего настроения. Кто-нибудь, объясните пожалуйста, как обеспечивается быстрое считывание сигнала с ИК-пульта? (в коде увидел что помимо даласовской задержки в библиотеке, в самой программе еще несколько присутствую, что в сумме более чем на 1,5 секунды тормозят программу. Кода внешнего прерывания не заметил.)
Ну в плане считывания с ИК пульта работает быстро. Даже с пульта самсунга. Он ведь двойной код присылает. Одно нажатие кнопки и прилетает два одинаковых кода команды и умный дом успевает отрабатывать по два раза! С этим приходится бороться. А так, не всё так плохо! 1,5 секунды они ведь не на каждом "круге" программы. Вот измерения даллосовских датчиков происходит 1 раз в 2 минуты! Ну подвисла программка на 1,5 секунды раз в две минуты, ну не атомный же реактор она окучиват, ничего страшного не случится. А так работает, всё на библиотеках. По простому, по тупому :) Но я согласен! надо стремится к полному порядку и быстродействию. Благо оперативы Меги ещё пока хватает.
Приветствую, коллега!!! Интересует через какую программу на смартфоне управляешь УД (через ESPшку я так понял) по Wi-Fi ?
Так же нравится в GSM Trinket , что смс перехватываются и можно отдельный звук ставить. Иконок не много, но хватает.
А вообще буду рад узнать более гибкое и красочное приложение! Которое например может расшифровывать ответные смс и менять свои картинки. Статусы там переключателей. С анимацией и всё такое. Есть такие приложения? Чтобы не обязательно было в андроиде программировать, а просто пальчиком на экране на создавать, картинок и привязать к ним команды всякие.
Через Еспишку я так и не наладил управление. HTML изучать надо. Или где бы готовый пример подсмотреть, и уму разуму научиться.
А так вообще... Пульт ИК... основное средство управления.
Да, GSM Trinket тема, тоже его везде использую, ты ещё давно посоветовал.
Насчет того что ты заменил блютуз на ESP. Собственно и управлять можно также как по блютуз. Программа для андроид типа Serial Wi-Fi Terminal. Я чето часок посидел и настроил этот терминал как был в блютузе только уже по вайфаю. (там также кнопки настраиваются с командами). Ви фи то по всему дому берёт однако, удобнее. Правда я на столе только всё подключал, щас опять вспоминать надо. Время будет , может выложу то что получилось с этим терминалом
мне вот эта статья помогала разбираться с ESP. Довольно доходчиво описано
Но я согласен! надо стремится к полному порядку и быстродействию.
Предложу свой вариант ускорения, может кому понравится).
Предложу свой вариант ускорения, может кому понравится).
С обработкой ошибок вы пошли порочным путем. Если хочется, то запрос и сверка адреса + CRC. В данном варианте практически бесполезное поедание ресурсов. ИМХО.
Dimax давно предложил как считывать датчики даллас через прерывание вотчдог и без задержек - #348
С обработкой ошибок вы пошли порочным путем. Если хочется, то запрос и сверка адреса + CRC...
По поводу CRC согласен. А вот проверять адрес не вижу смысла, он ведь жестко задан и вероятность чтения не того датчика практически нулевая. Добавил проверку CRC.
Dimax давно предложил как считывать датчики даллас через прерывание вотчдог и без задержек - #348
Способ хороши, но:
- использоват watchdog для считывания температуры не хочу (у меня на него другие планы).
- ограничение на время между запросами.
Если у меня из кода убрать лишнее, тоже достаточно компактно получается).
По поводу CRC согласен. А вот проверять адрес не вижу смысла, он ведь жестко задан и вероятность чтения не того датчика практически нулевая. Добавил проверку CRC.
При отвалившемся датчике вроде CRC совпадет. Хотя не проверял.
При отвалившемся датчике вроде CRC совпадет. Хотя не проверял.
Не совпадает, проверял. Пример с CRC из библиотеки OneWire у меня работает (при отключении датчика не выдает сообщее "CRC is not valid"), пришлось допиливать самому. Отключал датчик, программа реагирует адекватно. Добавил в условие правильности температуру 85гр, потому что при восстановлении питания, датчик то что у него записано в EEPROM. Единственное что каждый может доработать, это то какая будет реакция при ошибке (для меня удобно если будет посылаться последнее измеренное значение).
Вот пример. Но управление не через браузер, а просто через программу на андроиде "Serial WI-FI Terminal"
Подключаем ESP к ардуино ( схему подключения можно посмотреть в статье, я чуть выше приводил #532) Хотя я просто подключил 4 провода. питание 3,3В взял с ардуино (что не есть хорошо) GND и TX, RX. Причем уровни не согласовывал, но у меня всё и так нормально заработало - для проверки на столе пойдет, для постоянного пользования - нет. Для надёжности нужно стабильное питание и согл. уровней. ). У меня ESP подключено через софт сериал на 7,8 пины. Поправьте в скетче , если у вас по другому.
Заливаем скетч и ставим в мониторе порта нужную скорость и NL&CR справа внизу
И отправляем команду "AT". ESP должна ответить "ОК". У меня модуль откликался на скорости 115200.
Потом я поменял эту скорость командой AT+CIOBAUD=38400 так как иногда символы пропадали при общении с модулем. Подумал что многовато 115200. После замены скорости опять заливаем скетч который выше и ставим там Serial.begin уже поменянную скорость.
Далее можно посмотреть список доступных сетей Wi-Fi командой AT+CWLAP
AT+RST - на всякий случай перезагружаем модуль
Потом устанавливаем режим WIFI:
AT+CWMODE=1 — клиент, подключается к другим точкам доступа. Т.е. режим, в котором наша ESP будет сама подключаться к существующей Wi-Fi сети.
или этот если команды будут из 4 цифр, как у автора темы
Далее качаем в плеймаркете Serial Wi-Fi Terminal. Не забываем включить вай фай на телефоне и подключиться к той же сети что и ESP. Открываем прогу. Слева вверху кнопка настройки. Далее Devices и нажимаем "+" справа внизу. Забиваем имя (любое), IP адрес ESP (там это называется Host) - мы его чуть выше уже узнали (и сделали постояннным) и порт, в скетче установлен 88. Такой и ставим, или меняем в скетче (Он в сетап, команда "AT+CIPSERVER=1,88" 88 - это и есть порт ) и в программе Wi-Fi Terminal тоже. Все , выходим в общее окно программы, Сверху посередине нажимаем кнопку подключить, и в окне терминала должно появиться Connected .
И вот сейчас отправляем команды "LED OFF" - Встроенный светик ардуино должен погаснуть и прийти отчет в окно терминала, в скетче ест ещё команда LED ON - соотвественно включает светик.
Команды легко присвоить на кнопки (для настройки долго удерживаем кнопку и там пишем название кнопки и текст команды).
MaksVV Помогите пожалуйста настроить ESP8266 под последнюю версию "ForumHouse_10_11_2017_YD"
MaksVV Помогите пожалуйста настроить ESP8266 под последнюю версию "ForumHouse_10_11_2017_YD"
а что не получается? пример выше я дал как делать. Всё переписывать за вас не собираюсь
Здравствуйте. Я слежу за вашим проектом и решил его повторить переделав под свои нужды. Хотел задать вопрос по поводу последней версии, а точнее куда подключен lcd 1602, в программе этого не нашел. Большое спасибо за ваши труды.
Здравствуйте. Я слежу за вашим проектом и решил его повторить переделав под свои нужды. Хотел задать вопрос по поводу последней версии, а точнее куда подключен lcd 1602, в программе этого не нашел. Большое спасибо за ваши труды.
автор вроде как собирается подключать дисплей по шине i2c. Т.е. в меге это пины 20 и 21
Нашел один небольшой косяк при работе с ESP. При подключении к существующей сети Wi-Fi роутер назначает ESP шке IP адрес динамически - т.е. каждый раз разный может быть. Т.е. при перезагрузке роутера (электричество например отключали или ещё что), ESPшка получит другой IP и мы уже не сможем управлять умным домом с Wi-Fi Serial Terminal, пока не узнаем новый IP адрес ESP. Для исправления данного косяка нужно в настройках роутера сделать чтобы IP адрес нашёй ESP выделялся всегда один и тотже, т.е. статический. Исправил сообщение #539, там указал как это сделать, всё просто.
кстати вот скетч ESP с функцией запроса параметров по wi-fi (переделал всю фукнцию автора темы, т.к. Serial.print () тут не канает). Не так просто было настроить этот запрос параметров. Но сейчас вроде работает стабильно.
Скетч можно легко склеить со скетчем автора темы. В скетче описано в комментах как пользоваться написанием текста и переменных вместо Serial.print (). Добавил распечатку переменных типа float. БЕЗ ЧАСОВ DS3231 СКЕТЧ НЕ БУДЕТ РАБОТАТЬ!
Здравствуйте. Я слежу за вашим проектом и решил его повторить переделав под свои нужды. Хотел задать вопрос по поводу последней версии, а точнее куда подключен lcd 1602, в программе этого не нашел. Большое спасибо за ваши труды.
Здравствуйте, Semushka! MaksVV сказал правильно, экран я подключаю чере I2C плату. Только в программе сейчас LCD1602. Но я в скором времени буду подключать LCD2004. Так, что если вы собираетесь заказывать экран, то берите сразу 2004ый, т.е. 4 строки по 20 символов. с поддержкой кирилицы.
Нашел один небольшой косяк при работе с ESP. При подключении к существующей сети Wi-Fi роутер назначает ESP шке IP адрес динамически - т.е. каждый раз разный может быть. Т.е. при перезагрузке роутера (электричество например отключали или ещё что), ESPшка получит другой IP и мы уже не сможем управлять умным домом с Wi-Fi Serial Terminal, пока не узнаем новый IP адрес ESP. Для исправления данного косяка нужно в настройках роутера сделать чтобы IP адрес нашёй ESP выделялся всегда один и тотже, т.е. статический. Исправил сообщение #539, там указал как это сделать, всё просто.
MaksVV низкий тебе поклон! Скоро буду дома, займусь Espихой!
Спасибо большое за разъяснения.
Огромный респект автору. Практически - титанический труд. Хочу обратить внимание на несколько аспектов.
Sms - дороги и не сердито, к тому же часто запаздывает. Голосов вызов, голосовое меню + DTMF управление, имхо, на много удобнее и надёжнее. К тому же SIM800 и SIM900 обладают SMTP клиентом и вполне могут отправлять емайлы, даже через сервак Гугла (у Гугла есть спецшлюз, без шифрования, просто учётку нужно дополнительно создать, чисто для Дуни, с отключением зашиты). DTMF эти модемы дешифруют аппаратно, SIM900 имеет даже встроенный синтезатор речи (правда английский).
Второй момент, люди тут изголяться в написании кода фильтрования звонков, "свой не свой", при этом создавая переменные структуры, мучая Еепром Дуни. Вопрос: зачем? Для этого а) есть память СИМ; б) модем сам знает кто свой. Запишите на СИМ "свои" номера (хоть с телефона на андроид, или нокии - пофиг), и модем при звонке выдаёт (если включена функция АОН), номер звонящего, ВНИМАНИЕ! СТРОКУ С ИМЕНЕМ ЗВОНЯЩЕГО из памяти СИМ, и даже цифровой код, который может рассказать многое, например: в роуминге ли звонящий, записан ли его номер в СИМ и многое ещё.
Удачи в развитии проекта. Сам я дом автоматизировать пока не пытаюсь, но есть свои задумки. Для начала нужные функции пишу, для голосового меню и оповещения.
Вот тут http://arduino.ru/forum/programmirovanie/progovarivanie-float моя функция для проговаривания float (влажность, температура, баланс карты и т.п.). Может сгодится. )
Огромный респект автору. Практически - титанический труд. Хочу обратить внимание на несколько аспектов.
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... которая это делает софтово.