Дистанционное управление сплит системой в загородном доме.

Тема в разделе "Глядите, что я сделал", создана пользователем Perun61, 22 янв 2013.

  1. Perun61

    Perun61 Нерд

    [​IMG]Здравствуйте Уважаемые.
    Предыстория такова: Есть загородный дом, отапливается сплит системой. В осенне-зимний период, когда температура около нуля, нужно где-то 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 шилда.
     

    Вложения:

    • Split.jpg
      Split.jpg
      Размер файла:
      242,1 КБ
      Просмотров:
      890
    Злая Птичка, nailxx и Вячеслав нравится это.
  2. Вот. Реальное решение. Молодец.;)
    Если есть желание улучшать, то можно попробовать записать с пульта команды, которые он выдает, а потом их повторять. Что бы отвязать пульт от устройства.
    Можно попробовать Что то из этого: http://dx.com/s/arduino IR receiver
     
  3. Perun61

    Perun61 Нерд

    Изначально так и планировалось, но так как устройство имеет сугубо практическую цель , было решено по быстрому собрать с пультом , а дальше разбираться с протоколом IR. Там не все так просто , для меня по крайней мере, за одну посылку передается сразу вся информация , и о температуре и режимах , в общем с наскока не получилось, буду разбираться.
     
  4. Chanov

    Chanov Нерд

    Ну и код неплохо бы выложить если не жалко будет для последователей, чтоб с нуля велосипед не писать.
     
  5. Perun61

    Perun61 Нерд

    Код (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);
      }
       
    }
     
  6. Perun61

    Perun61 Нерд

    Вчера соорудил домик для устройства, и пора в "поле"
    20130214_193724.jpg 20130214_193733.jpg 20130214_193749.jpg 20130214_193802.jpg 20130214_193902.jpg
     
    alp69 и nailxx нравится это.
  7. hibiki

    hibiki Гик

    красивый домик :)
     
  8. Perun61

    Perun61 Нерд

    Спасибо ))) В темноте красиво светится , как ночник работает ))
     
  9. Perun61

    Perun61 Нерд

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

    Вложения:

    • Gprs.jpg
      Gprs.jpg
      Размер файла:
      222 КБ
      Просмотров:
      921
    alp69 нравится это.
  10. brunh

    brunh Нуб

    Подскажите пожалуйста, ругается на DS18B20 myDS(6); видимо библиотека датчика другая, подставлял что нашел - не цепляет.
    И можно прислать модернизированный код на ecozhol@gmail.com ? Спасибо.
     
  11. dobromir

    dobromir Нуб

    Присоеденяюсь к brunh. Не получается компиляция. Ругается на библиотеки.
     
  12. ilnurgi

    ilnurgi Нуб

    а как это? не могли бы показать
     
  13. kuzen

    kuzen Нуб

    Кто нибудь нашёл библиотеку ds18b20.h или как вышли из положения?
     
  14. Perun61

    Perun61 Нерд

    ого, как давно я тут не был. Библиотеку прикладываю
     

    Вложения:

    • DS18B20.zip
      Размер файла:
      4,6 КБ
      Просмотров:
      246