Здравствуйте Уважаемые. Предыстория такова: Есть загородный дом, отапливается сплит системой. В осенне-зимний период, когда температура около нуля, нужно где-то 12 часов что бы сплит нагрел до комфортной температуры остывший дом. Часто, перед планируемой в пятницу поездкой на выходные , приходилось за день ехать и включать отопление, а если поездка откладывалась по форс-мажору , все равно приходилось ехать выключать. В общем все это порядком поднадоело , и было принято решение, как то облегчить себе жизнь. Вот уж не помню как меня занесло на Ваш сайт , но это произошло и я открыл для себя Ардуино ))) Так, что это первый опыт и в программировании в том числе, сильно не пинайте. Итак, устройство состоит из: 1. Ардуино Уно 2. GPRS шилд 3. Цифровой датчик температуры DS18B20 4. 4-x канальный релейный модуль 5. Родной пульт от сплита. Алгоритм следующий: 1.При включении девайс отправляет мне на телефон подтверждающую включение СМС, и сообщает температуру в помещении. 2. Далее устройство поддерживает следующие смс команды. а. *on#17...30* (здесь ON включить сплит, после # температура от 17 до 30. б. *temp#17...30* (установить на сплите температуру) в. *status# (возвращает статус сплита вкл или выкл, а так-же температуру в помещении) г. *turbo# (турбо режим сплита) г. *off# (ну тут все ясно) На каждую команду устройство отправляет подтверждающее СМС. Ардуино управляет релейным модулем, которое в свою очередь пультом ДУ. Подпаялся к кнопкам. Функционал ручного режима пульта сохранился. Решение конечно грубоватое , с реле я имею в виду, но оно было в наличии , вот и решил не мудрить. Алгоритм установки температуры прост. Ставим минимально возможное значение (17С) считая условно , что стоит максимальное (30С) , ну а дальше отсчелкиваем нужное значение. Большой недостаток, это конечно отсутствие обратной связи от сплита. Хотя возможность в любой момент отслеживать температуру немного компенсирует этот недостаток. Если температура через какой то промежуток не поднимается , что то не так и можно повторить команду. Еще заказал датчик движения , пусть выполняет и охранную функцию. Подключу сирену с оповещением СМС. Формат СМС по мотивам USDD запросов , можно было выбрать любой. Так же в программе контроль номера , откуда приходят СМС, поиграться сплитами чужим не получится. На данный момент еще нет коробка для устройства , временно живет в картонной коробке из под GPRS шилда.
Вот. Реальное решение. Молодец. Если есть желание улучшать, то можно попробовать записать с пульта команды, которые он выдает, а потом их повторять. Что бы отвязать пульт от устройства. Можно попробовать Что то из этого: http://dx.com/s/arduino IR receiver
Изначально так и планировалось, но так как устройство имеет сугубо практическую цель , было решено по быстрому собрать с пультом , а дальше разбираться с протоколом IR. Там не все так просто , для меня по крайней мере, за одну посылку передается сразу вся информация , и о температуре и режимах , в общем с наскока не получилось, буду разбираться.
Ну и код неплохо бы выложить если не жалко будет для последователей, чтоб с нуля велосипед не писать.
Код (Text): #include <OneWire.h> #include <DS18B20.h> #include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); #define numberOfSensors 1 DS18B20 myDS(6); static byte sensorArray[numberOfSensors][8]; float T=0; // переменная для температуры int on_off = 2; int up = 3; int down = 4; int turbo = 5; int tempInt; String currStr=""; boolean isStringMessage = false; // если текущая строка является сообщением boolean workStatus=false; void setup() { pinMode(up, OUTPUT); pinMode(down, OUTPUT); pinMode(on_off, OUTPUT); pinMode(turbo, OUTPUT); pinMode(13, OUTPUT); standUpGprs(); getTemp(); // инициализируем датчик температуры gprsSerial.print("AT+CMGF=1\r"); // текстовый режим смс сообщения delay(300); gprsSerial.print("AT+IFC=1, 1\r"); //програмный контроль передачи данных delay(300); gprsSerial.print("AT+CPBS=\"SM\"\r"); // доступ к телефонной книге сим карты delay(300); gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); //оповещение о новых смс сообщениях delay(300); sendTextMessage("GPRS device switched On, split system dont work. Temp in the room="); // приветственное сообщение при включении } void loop() { if (!gprsSerial.available()) return; digitalWrite(13, HIGH); delay(10); digitalWrite(13, LOW); delay(10); char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { smsCommand(currStr); // обрабатываем смс и реагируем на нее isStringMessage = false; } else { if (currStr.startsWith("+CMT: \x22+7928ххххххх\x22")) // c других номеров нам заебы не нужны { isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } } void smsCommand (String smsText) // Обработка СМС сообщения { String ts="", command="", temp=""; if (smsText[0]=='*') // декодируем смс на команду и параметры { for (int n=1; n<=smsText.length()-1; n++) { if (smsText[n]=='#') { command=ts; ts=""; n++; } if (smsText[n]=='*') { temp=ts; strToInt(temp); } ts=ts+smsText[n]; } if (command=="on" && tempInt>=17 && tempInt<=30 && workStatus==false) // передаем команды пульту, включение и установка температуры. { digitalWrite(on_off, HIGH); delay(150); digitalWrite(on_off, LOW); delay(2000); for (int n=0; n<=12; n++) // ставим температуру на 17 градусов, т.е минимум { digitalWrite(down, HIGH); delay(150); digitalWrite(down, LOW); delay(150); } for (int n=1; n<=tempInt-17; n++) { digitalWrite(up, HIGH); delay(150); digitalWrite(up, LOW); delay(150); } workStatus=true; sendTextMessage("Split system switched ON. Temp in the room="); } if (command=="temp" && tempInt>=17 && tempInt<=30 && workStatus==true) // передаем команды пульту, установка температуры. { for (int n=0; n<=12; n++) // ставим температуру на 17 градусов, т.е минимум { digitalWrite(down, HIGH); delay(150); digitalWrite(down, LOW); delay(150); } for (int n=1; n<=tempInt-17; n++) { digitalWrite(up, HIGH); delay(150); digitalWrite(up, LOW); delay(150); } sendTextMessage("Temperature split is set, room temp="); } if (command=="status") //Status { if (workStatus==true) { sendTextMessage("Split system switched ON, temp="); } if (workStatus==false) { sendTextMessage("Split system switched OFF, temp="); } } if (command=="off" && workStatus==true) { digitalWrite(on_off, HIGH); delay(150); digitalWrite(on_off, LOW); workStatus=false; sendTextMessage("Split system switched OFF, temp="); } if (command=="turbo" && workStatus==true) // Турбо режим { digitalWrite(turbo, HIGH); delay(150); digitalWrite(turbo, LOW); sendTextMessage("Turbo mode is enabled, temp="); } } sendTextMessage("command is not correctly..., temp="); } int strToInt(String str) // Процедура переобразования строки в число { char rez[str.length()+1]; str.toCharArray(rez, sizeof(rez)); tempInt = atoi(rez); return tempInt; } float *getTemp () //Процедура возвращающая показания термометра { myDS.init(numberOfSensors); myDS.getAddresses(sensorArray); T=myDS.getTemp(sensorArray[0]); return &T; } void sendTextMessage(char *textSMS) //Функция отправки сообщения { gprsSerial.print("AT+CMGF=1\r"); // текстовый режим для SMS-сообщений delay(200); gprsSerial.println("AT + CMGS = \"+79282963586\""); // получатель delay(200); while (*textSMS!='\0') { gprsSerial.print(*textSMS); //пишем текст *textSMS++; } delay(200); gprsSerial.print(*getTemp()); delay(200); gprsSerial.println((char)26); // Отправляем Ctrl+Z, обозначая, что сообщение готово delay(1000); } void standUpGprs() //Включаем GPRS шилд { gprsSerial.begin(19200); gprsSerial.print("AT\r"); // Если шилд включен, ничего не делаем, а то выключим delay(1000); if (!gprsSerial.available()) { pinMode(9, OUTPUT); digitalWrite(9,LOW); delay(1000); digitalWrite(9,HIGH); delay(2000); digitalWrite(9,LOW); delay(15000); } }
Немного модернизировал устройство. Интернет на даче раздает билайновский свисток, скорость хорошая, правда он иногда виснет. Для меня это критично , так как поливом я управляю дистанционно , через инет , и видеонаблюдение для контроля процессом тоже через него. После того, как завис после включения полива , выключать пришлось ехать вручную , а это не близко, решил приделать свисток в ардуине, что бы была возможность включать/выключать инет , перегружать. Питание с Vin через стабилизатор 5 вольт и дальше управление через реле. Результатом доволен.
Подскажите пожалуйста, ругается на DS18B20 myDS(6); видимо библиотека датчика другая, подставлял что нашел - не цепляет. И можно прислать модернизированный код на ecozhol@gmail.com ? Спасибо.