OEMHOME проект умного дома (Arduino + Android)

OEMBSOD
OEMBSOD аватар
Offline
Зарегистрирован: 31.05.2014

После долгих и успешных эксперементов на arduino, решил перейти к своей давней мечте создание "умного" дома. 

Компоненты 

Arduino NANO 328 5v (сервер)

Arduino PRO mimi 328 5v (принимает команды от NANO для управления кондиционером с помощью IR диода)

enc28j60

LCD 16*2 iic

DHT11

Relay 2ch

IR приемник

IR диод

Схема работы устройства 

На данный момент устройство на Arduino может:

- отслеживать IR команды с пульта

- управлять кондиционером 

- управлять телевизором

- управлять ресивером

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

- выводить информацию о температуре и влажности в комнате на LCD 16*2

- выводить информацию о состоянии устройств на LCD 16*2

- отображать web страницу с температурой, влажностью, состоянием устройств и их управление

Приложение на Android может:

- отображать температуру и влажность

- включать и выключать кондиционер

- включать и выключать подсветку на LCD 16*2

- включать и выключать реле на 2 канала, каждый канал отдельно

- отслеживать температур и автоматически включать или выключать устройства (реле)

- обновлять информацию каждые 5 секунд или ручной режим обновления

- менять адрес arduino сервера

Видео работы устройства

 

Код сервера 

// код сервера OEMHOME
// oemhome.blogspot.ru

#include "etherShield.h"
#include "ETHER_28J60.h"
#include "DHT.h"
#include <Wire.h> 
#include  <LiquidCrystal_I2C.h>

#define pinACON 7
#define pinACOFF 8
#define DHTPIN 6     
#define DHTTYPE DHT11   // DHT 11 
// #define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)7
DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal_I2C lcd(0x27,16,2);
#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif
byte tempChar[8] = {
  B00100,
  B01010,
  B01010,
  B01110,
  B01110,
  B11111,
  B11111,
  B01110
};
byte humChar[8] = {
  B00100,
  B00100,
  B01010,
  B01010,
  B10001,
  B10001,
  B10001,
  B01110
};
byte r1Char[8] = {
  B01110,
  B10001,
  B10001,
  B10001,
  B01010,
  B01110,
  B01110,
  B00100
};
byte r2Char[8] = {
  B00000,
  B01010,
  B01010,
  B11111,
  B11011,
  B01110,
  B00100,
  B00100
};

int relayPin1 = 3;
int relayPin2 = 4;

int ac_status = 0;
int status_b = 0;

ETHER_28J60 e;
static uint8_t mac[6] = {
  0x74,0x69,0x69,0x2D,0x30,0x31 }; 
static uint8_t ip[4] = {
  192, 168, 1, 25}; 
static uint8_t gwip[] = {
  192,168,1,1};
static uint16_t port = 80;


int t=0;
int h=0;
int Timer= 0;
int Animation = 0;

boolean AcStatus;
boolean LcdStatus;
boolean R1Status;
boolean R2Status;


void setup () {
  digitalWrite(pinACON,LOW);
  digitalWrite(pinACOFF,LOW);
  pinMode(pinACON,OUTPUT);
  pinMode(pinACOFF,OUTPUT);
  pinMode(relayPin1, OUTPUT);
  pinMode(relayPin2, OUTPUT);
  lcd.init();
  //lcd.backlight();
  lcd.createChar(0, tempChar);
  lcd.createChar(1, humChar);
  lcd.createChar(2, r1Char);
  lcd.createChar(3, r2Char);
  dht.begin();
  e.setup(mac, ip, port);

  Serial.begin(57600);
  Serial.println("OEMHOME AC control");
  Serial.print (dht.readTemperature());
  Serial.println("C");
  Serial.print (dht.readHumidity());
  Serial.println("%");

  Serial.println();
  AcStatus = false;
  LcdStatus = false;
  R1Status = false;
  R2Status = false;

}

static void ReadDHT11()
{
  h = dht.readHumidity();
  t = dht.readTemperature();

}
void loop() {



  Timer  = Timer+1;
  if(Timer==1)
  {
    ReadDHT11();
    lcd.setCursor(0, 0);
    lcd.printByte(0);
    lcd.print(t);
    lcd.print("C");
    if(Animation==0)
    {
      lcd.print(" +");
    }
    if(Animation==1)
    {
      lcd.print(" *");
    }
    lcd.setCursor(0,1);
    lcd.printByte(1);
    //lcd.print(" ");
    //lcd.print("Rh: ");
    lcd.print(h);
    lcd.print("%");

    Animation = Animation + 1;
    if(Animation==2)
    {
      Animation=0;
    }
  }
  if(Timer==1100)
  {
    Timer=0;
  }
  char* params;
  if (params = e.serviceRequest())
  {
    // e.print("<head><title>AC control</title></head>");
    e.print("Temperature <b>");
    e.print(t);
    e.print(" C</b><br/>");
    e.print("Humidity <b>");
    e.print(h);
    e.print(" %</b><br/>");
    //    e.print("<b><h>AC Control</h></b><br/>");
    //    e.print("<a href='?cmd=off'><input name='But' type='button' value='AC off'></a> ");
    //    e.print("<a href='?cmd=on'><input name='But' type='button' value='AC on'></a><br>");
    e.print("<A HREF='?cmd=acoff'>AC off</A><br>");
    e.print("<A HREF='?cmd=acon'>AC on</A><br>");
    if (strcmp(params, "?cmd=acon") == 0)
    {
      AcStatus = true;
      status_b = 1;

    }
    else if (strcmp(params, "?cmd=acoff") == 0) 
    {
      AcStatus = false;
      status_b = 2;

    }
    if (AcStatus == true)
    {
      e.print("AC_ON<br><br> ");
    }
    else {
      e.print("AC_OFF<br><br>");
    }

    //    e.print("<a href='?cmd=nolight'><input name='But' type='button' value='lcd off'></a> ");
    //    e.print("<a href='?cmd=light'><input name='But' type='button' value='lcd on'></a><br>");
    e.print("<A HREF='?cmd=loff'>LCD off</A><br>");
    e.print("<A HREF='?cmd=lon'>LCD on</A><br>");
    if(strcmp(params, "?cmd=lon") == 0)
    {
      LcdStatus = true;
      lcd.backlight();

    }
    else if (strcmp(params, "?cmd=loff") == 0) 
    {
      LcdStatus = false; 
      lcd.noBacklight();

    }
    if (LcdStatus == true)
    {
      e.print("L_ON<br><br>");
    }
    else {
      e.print("L_OFF<br><br>");
    }
    e.print("<A HREF='?cmd=roff'>R1 off</A><br>");
    e.print("<A HREF='?cmd=ron'>R1 on</A><br>");
    if(strcmp(params, "?cmd=ron") == 0)
    {
      digitalWrite(relayPin1, HIGH);
      R1Status = true;


    }
    else if (strcmp(params, "?cmd=roff") == 0) 
    {
      digitalWrite(relayPin1, LOW);
      R1Status = false;

    }
    if (R1Status == true)
    {
      e.print("R1_ON<br><br>");
      lcd.setCursor(5,1);
      lcd.printByte(2);
      lcd.print(":");
      lcd.print("ON ");
    }
    else {
      e.print("R1_OFF<br><br>");
      lcd.setCursor(5,1);
      lcd.printByte(2);
      lcd.print(":");
      lcd.print("OFF");
    }
    e.print("<A HREF='?cmd=r2off'>R2 off</A><br>");
    e.print("<A HREF='?cmd=r2on'>R2 on</A><br>");
    if(strcmp(params, "?cmd=r2on") == 0)
    {
      digitalWrite(relayPin2, HIGH);
      R2Status = true;


    }
    else if (strcmp(params, "?cmd=r2off") == 0) 
    {
      digitalWrite(relayPin2, LOW);
      R2Status = false;

    }
    if (R2Status == true)
    {
      e.print("R2_ON<br><br>");
      lcd.setCursor(11,1);
      lcd.printByte(3);
      lcd.print(":");
      lcd.print("ON ");
    }
    else {
      e.print("R2_OFF<br><br>");
      lcd.setCursor(11,1);
      lcd.printByte(3);
      lcd.print(":");
      lcd.print("OFF");
    }

    e.respond();
    //delay(100);
  }


  AcControl (status_b);
}

void AcControl(int b_s){
  int status = 0;
  if (b_s == 1){
    status = 1;
  }
  if (b_s == 2){
    status = 2;
  }
  if(status != ac_status) {
    ac_status = status;
    {	
      if(status == 1) {

        status_b = 0;
        digitalWrite(pinACON,HIGH);
        delay(100);
        digitalWrite(pinACON,LOW);
        Serial.println("AC Magnit - Auto mode - ON");
        Serial.print (t);
        Serial.println("C");
        Serial.print (h);
        Serial.println("%");
        lcd.setCursor(11,0);
        lcd.print("*:");
        lcd.print("ON ");
      }
      if (status == 2){
        status_b = 0;
        digitalWrite(pinACOFF,HIGH);
        delay(100);
        digitalWrite(pinACOFF,LOW);
        Serial.println("AC Magnit OFF");
        Serial.print (t);
        Serial.println("C");
        Serial.print (h);
        Serial.println("%");
        lcd.setCursor(11,0);
        lcd.print("*:");
        lcd.print("OFF");
      }
    }
  }

}

Код для управления кондиционером ver.1

// код клиент ver.1 OEMHOME
// oemhome.blogspot.ru

#include "IRremote.h"
#define pinACON A2
#define pinACOFF A3
 
IRsend irsend;
 
void setup()
{
  //Serial.begin(9600);
}
int khz=38; 
unsigned int AcOff[228] = {3750,1400,600,1150,600,1150,550,500,550,450,550,500,550,1150,600,450,550,450,550,1200,550,1200,550,450,550,1200,550,500,550,450,550,1200,550,1150,600,450,550,1200,550,1150,600,450,550,450,600,1150,550,500,550,500,500,1200,550,450,600,450,550,450,550,500,550,450,550,500,550,500,500,500,550,450,550,500,550,450,550,500,550,450,550,500,550,450,550,500,550,450,550,450,600,450,550,450,600,1150,550,500,550,450,550,500,550,450,550,500,550,1150,550,500,550,500,500,500,550,450,550,1200,550,1200,550,1150,600,450,550,500,550,450,550,450,600,450,550,1200,550,450,550,1200,550,1200,550,450,550,1200,550,450,600,450,550,450,600,450,550,450,550,500,550,500,500,500,550,450,550,500,550,450,550,500,550,450,550,450,600,450,550,450,600,450,550,450,600,1150,550,500,550,450,550,500,550,450,550,450,600,450,550,450,600,450,550,450,600,1150,550,500,550,450,550,450,600,450,550,500,550,450,550,1200,550,1150,600,450,550,1200,550,1150,600,1150,550,500,500};
unsigned int AcAutoOn[228] = {3800,1400,550,1200,550,1200,550,450,550,500,550,450,550,1200,550,450,600,450,550,1200,550,1150,600,450,550,1200,550,500,500,500,550,1150,600,1150,550,500,550,1150,600,1150,550,500,550,500,500,1200,550,450,600,450,550,1200,550,450,550,500,550,450,550,450,600,450,550,450,600,450,550,450,600,450,550,450,600,450,550,500,500,500,550,450,550,500,550,450,550,500,550,1150,600,450,550,450,600,1150,550,500,550,450,550,500,550,450,550,450,600,1150,550,500,550,450,550,500,550,450,550,1200,550,1200,550,1150,600,450,550,500,550,450,550,450,600,450,550,1200,550,450,550,1200,550,1200,550,450,550,1200,550,450,600,450,550,500,500,500,550,450,550,500,550,450,550,500,550,450,550,450,600,450,550,500,550,450,550,450,600,450,550,500,550,450,550,450,600,1150,550,500,550,450,550,450,600,450,550,450,600,450,550,500,550,450,550,450,600,1150,550,500,550,450,550,500,550,450,550,450,600,450,550,1200,550,450,550,1200,550,1200,550,1150,600,1150,550,500,500};

void loop() {

// Invio il segnale di accenedre il condizionatore sul CALDO 
if(checkArduinoMaster(pinACON)){
  irsend.sendRaw(AcAutoOn, sizeof(AcAutoOn)/sizeof(int),khz); 
  delay(1000);
}
// Invio il segnale di accedere il condizionatore sul FREDDO
if(checkArduinoMaster(pinACOFF)){
  irsend.sendRaw(AcOff, sizeof(AcOff)/sizeof(int),khz); 
  delay(100);
}
}

// Questa funziona stabilisce se a quella porta, è stata inviato un segnale dall'altro Arduino
boolean checkArduinoMaster (int porta){
  if(analogRead(porta)>1000){
    return true;
  }else{
    return false;
  }
} 

Код для управления кондиционером ver.2, плюс считывания команд с пульта телевизора, для управления в паре с аудиоресивером (тут можно посмотреть подробнее на эту тему)

 

// код клиент ver.2 OEMHOME
// oemhome.blogspot.ru

#include "IRremote.h"
#define pinACON A2
#define pinACOFF A3
 
int RECEIVE_PIN = 5;
IRrecv irrecv(RECEIVE_PIN);
decode_results results; 

IRsend irsend;
 
void setup()
{
irrecv.enableIRIn();
//irrecv.blink13(true);
pinMode(13, OUTPUT);
}
int khz=38; 
unsigned int AcOff[228] = {3750,1400,600,1150,600,1150,550,500,550,450,550,500,550,1150,600,450,550,450,550,1200,550,1200,550,450,550,1200,550,500,550,450,550,1200,550,1150,600,450,550,1200,550,1150,600,450,550,450,600,1150,550,500,550,500,500,1200,550,450,600,450,550,450,550,500,550,450,550,500,550,500,500,500,550,450,550,500,550,450,550,500,550,450,550,500,550,450,550,500,550,450,550,450,600,450,550,450,600,1150,550,500,550,450,550,500,550,450,550,500,550,1150,550,500,550,500,500,500,550,450,550,1200,550,1200,550,1150,600,450,550,500,550,450,550,450,600,450,550,1200,550,450,550,1200,550,1200,550,450,550,1200,550,450,600,450,550,450,600,450,550,450,550,500,550,500,500,500,550,450,550,500,550,450,550,500,550,450,550,450,600,450,550,450,600,450,550,450,600,1150,550,500,550,450,550,500,550,450,550,450,600,450,550,450,600,450,550,450,600,1150,550,500,550,450,550,450,600,450,550,500,550,450,550,1200,550,1150,600,450,550,1200,550,1150,600,1150,550,500,500};
unsigned int AcAutoOn[228] = {3800,1400,550,1200,550,1200,550,450,550,500,550,450,550,1200,550,450,600,450,550,1200,550,1150,600,450,550,1200,550,500,500,500,550,1150,600,1150,550,500,550,1150,600,1150,550,500,550,500,500,1200,550,450,600,450,550,1200,550,450,550,500,550,450,550,450,600,450,550,450,600,450,550,450,600,450,550,450,600,450,550,500,500,500,550,450,550,500,550,450,550,500,550,1150,600,450,550,450,600,1150,550,500,550,450,550,500,550,450,550,450,600,1150,550,500,550,450,550,500,550,450,550,1200,550,1200,550,1150,600,450,550,500,550,450,550,450,600,450,550,1200,550,450,550,1200,550,1200,550,450,550,1200,550,450,600,450,550,500,500,500,550,450,550,500,550,450,550,500,550,450,550,450,600,450,550,500,550,450,550,450,600,450,550,500,550,450,550,450,600,1150,550,500,550,450,550,450,600,450,550,450,600,450,550,500,550,450,550,450,600,1150,550,500,550,450,550,500,550,450,550,450,600,450,550,1200,550,450,550,1200,550,1200,550,1150,600,1150,550,500,500};

void loop() {
  
if (irrecv.decode(&results)) {

    if(results.value==0xE0E040BF)
    {
      //delay (500);
      irsend.sendNEC(0xA55A38C7,32);
      //Serial.println("POWER");
    }

    if(results.value==0xE0E0E01F)
    {
      //delay (500);
      irsend.sendNEC(0xA55A50AF,32);
      //Serial.println("Volume +");
    }

    if(results.value==0xE0E0D02F)
    {
      //delay (500);
      irsend.sendNEC(0xA55AD02F,32); 
      //Serial.println("Volume -");
    }

    if(results.value==0xE0E0F00F)
    {
      //delay (500);
      irsend.sendNEC(0xA55A48B7,32); 
      //Serial.println("MUTE");
    }
    irrecv.enableIRIn();
    irrecv.resume();
  }

if(checkArduinoMaster(pinACON)){
  irsend.sendRaw(AcAutoOn, sizeof(AcAutoOn)/sizeof(int),khz); 
  digitalWrite(13, HIGH);
  delay(100);
  irrecv.enableIRIn();
    irrecv.resume();
}
if(checkArduinoMaster(pinACOFF)){
  irsend.sendRaw(AcOff, sizeof(AcOff)/sizeof(int),khz); 
  digitalWrite(13, LOW);
  delay(100);
  irrecv.enableIRIn();
   irrecv.resume();
}
}

boolean checkArduinoMaster (int porta){
  if(analogRead(porta)>1000){
    return true;
  }else{
    return false;
  }
} 

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

P.S. За отсутствие комментариев, сильно не пинайте, если появится время, то обновлю код и добавлю пояснения

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

Статьи, которые мне помогли и вдохновили

http://habrahabr.ru/post/184966/

http://www.lucadentella.it/en/category/enc28j60-arduino/ (отличные примеры для работы с enc28j60)

http://www.instructables.com/id/Arduino-TempHumidity-with-LCD-and-Web-In...

http://www.instructables.com/id/How-to-control-the-air-conditioner-AC-at...

Мой блог

 

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Ммм... прям хочеться бегать кругами и громко кричать УРААА Я СОБРАЛ ДИСТАНЦИОНЫЙ ВЫКЛЮЧАТЕЛЬ ( еще один, 100501 проект со словом умный)

Молодец! Хочешь пирожок?

vladk
Offline
Зарегистрирован: 24.04.2014

А что это у вас подключено к реле по 3-м проводам?

OEMBSOD
OEMBSOD аватар
Offline
Зарегистрирован: 31.05.2014

Это проходной выключатель света. Для того что бы управлять лампой с ардуино и через штатный выключатель света.

http://electrik.info/main/praktika/186-proxodnoj-vyklyuchatel-sxema-podk...

art100
Offline
Зарегистрирован: 09.03.2014

OEMBSOD пишет:

Это проходной выключатель света. Для того что бы управлять лампой с ардуино и через штатный выключатель света.

http://electrik.info/main/praktika/186-proxodnoj-vyklyuchatel-sxema-podklyucheniya.html

Можно вопрос? Я действительно не в теме "проходных" что-то цены по 20$ удивляют. Я раньше если не хватало контактной группы брал два выключателя сдвоенный или строенный и надевал крышку как на одиночный под крышкой свободная контактная группу, только зачем они для паралельного семистора не понятно. А можно схему увидеть "проходного". Это они простая паралель?

Так мы делали в молодости и до сих пор в среднем ~21$ себестоимость + торговая надбавка

700руб39 руб

что-то я понять это не могу

 700 руб ?

жуть

столько проводов всунуть это какие плоскогубцы и пальцы и токи надо

руб ???

а радио управление 700 руб ???

Ладно тут вроде все понятно "раз пипл хавает вот мы и впариваем"

Вопрос по существу:

ОптоCемистор на стандартные 15 ампер 220 вольт мелкий не встречали? Ко мне едут монстры от Fotek 50...25ампер по 4$ http://ru.aliexpress.com/item/FOTEK-SSR-25DA-25A-Taiwan-yangming-single-phase-solid-state-relay-dc-control-ac-25-input/1841363791.html я их конечно в экзотику повсовываю

Подсказочка теперь их модно называть "твердотельные реле"

Может мелочь ОптоСемисторную встречали чтоб не паять?

 

axill
Offline
Зарегистрирован: 05.09.2011

хорошая работа, бережно описанная как и положено настоящему интузиасту )

умным домом пока ваш проект назвать нельзя, то, что вы сделали это дистанционное управление и дистанционное информирование

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

дальше вам нужен контролер логики который и может взять на себя фенкцию "думания" и сделает из вашего дистпнционного управления умный дом

carduino.ru
Offline
Зарегистрирован: 06.12.2011

axill пишет:
главный атрибут умного дома это умение делать вещи за хозяина - самому включать/выключать свет

Интересно по каким критериям он будет принимать решение?

PIR сенсор?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

carduino.ru пишет:

axill пишет:
главный атрибут умного дома это умение делать вещи за хозяина - самому включать/выключать свет

Интересно по каким критериям он будет принимать решение?

PIR сенсор?


Телескоп на крыше будет делать фото звездного неба и от расположения звезд будет смываться вода в унитазе. Ну или не смываться пока звезды не займут правильную позицию.

OEMBSOD
OEMBSOD аватар
Offline
Зарегистрирован: 31.05.2014

art100 пишет:

Вопрос по существу:

ОптоCемистор на стандартные 15 ампер 220 вольт мелкий не встречали? Ко мне едут монстры от Fotek 50...25ампер по 4$ http://ru.aliexpress.com/item/FOTEK-SSR-25DA-25A-Taiwan-yangming-single-phase-solid-state-relay-dc-control-ac-25-input/1841363791.html я их конечно в экзотику повсовываю

Спасибо за ссылку, а то у нас они стоят от 1000 р. Буду заказывать. цена отличная.

Минимальных вариантов не видел.

Цена за проходной выключатель на две клавиши в районе 100-150 рублей (покупал в ОБИ)

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

 

 

OEMBSOD
OEMBSOD аватар
Offline
Зарегистрирован: 31.05.2014

axill пишет:

хорошая работа, бережно описанная как и положено настоящему интузиасту )

умным домом пока ваш проект назвать нельзя, то, что вы сделали это дистанционное управление и дистанционное информирование

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

дальше вам нужен контролер логики который и может взять на себя фенкцию "думания" и сделает из вашего дистпнционного управления умный дом

Спасибо за ответ.

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

Мы можем указать минимальную и максимальную температуру, для управления кондиционером/обогревателем

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

В ближайшее время добавлю датчик света, беспроводной датчик температуры на лоджии и улице (arduino pro mini, ttc 103, nrf24l01 и акк. с солнечными батареями)

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

axill
Offline
Зарегистрирован: 05.09.2011

carduino.ru пишет:

Интересно по каким критериям он будет принимать решение?

PIR сенсор?

зависит от фантазии, желания и возможности

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

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

axill
Offline
Зарегистрирован: 05.09.2011

OEMBSOD пишет:

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

отлично! ) но будет еще круче если кондиционер будет автоматически включаться и выключаться. Ограничения мин/макс и от температуры на улице это уже близко к умному дому, но не совсем. Т.е. мешает делать ошибки, но не избавляет от забот

axill
Offline
Зарегистрирован: 05.09.2011

Насчет проходного выключателя. Цель включать/выключать или же цель в слепую инвертировать статус?

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

OEMBSOD
OEMBSOD аватар
Offline
Зарегистрирован: 31.05.2014

axill пишет:

отлично! ) но будет еще круче если кондиционер будет автоматически включаться и выключаться. Ограничения мин/макс и от температуры на улице это уже близко к умному дому, но не совсем. Т.е. мешает делать ошибки, но не избавляет от забот

Может не правильно вас понял, но уже сейчас у меня работает вариант

На примере обогревателя:

В приложении мы записываем минимальную и максимальную температуру

При показаниях температуры ниже минимальной

Обогреватель включается

При показаниях температуры выше максимальной

Обогреватель выключается. 

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

axill
Offline
Зарегистрирован: 05.09.2011

ну... поддерживать температуру умеею абсолютно любой бытовой обогреватель. Тут ардуина не нужна. Я предлагаю на таких простых функциях не останавливаться, а двигаться дальше

например заменить режим включения-выключения на PID регулятор, что повысит адекватность регулирования

потом идти дальше

у меня например отслеживается уличная температура (своего датчика пока нет, отслеживается температура через интернет и это вполне устраивает) и автоматом меняется статус холодный сезон - ДА/НЕТ. Переключается только когда среднесуточная температура падает ниже заданной или повышается выше заданной

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

carduino.ru
Offline
Зарегистрирован: 06.12.2011

axill пишет:

carduino.ru пишет:

Интересно по каким критериям он будет принимать решение?

PIR сенсор?

зависит от фантазии, желания и возможности

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

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

Судя по Вашему ответу PIR, будильник и сценарий это умный дом?

И это на все на что способна Ваша фантазия?

axill
Offline
Зарегистрирован: 05.09.2011

carduino.ru пишет:

Судя по Вашему ответу PIR, будильник и сценарий это умный дом?

И это на все на что способна Ваша фантазия?

по-моему умный дом это тот который меня избавляет от части действий который при отсутствия умного дома нужно делать самому

здесь форум по обмену опытом, а не место для эмоциональной разрядки. Я уже имел опыт негативного общения с вами. Хотите поумничать - без меня

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Умный дом 

axill
Offline
Зарегистрирован: 05.09.2011

carduino.ru пишет:

Умный дом 

 

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

это конечно супер, если ваш розеточный таймер умеет так же

OEMBSOD
OEMBSOD аватар
Offline
Зарегистрирован: 31.05.2014

axill

Спасибо за варианты, буду думать, как построить логику.

axill
Offline
Зарегистрирован: 05.09.2011

OEMBSOD пишет:

axill

Спасибо за варианты, буду думать, как построить логику.

На здоровье )) Придумаете сами что-то интересное - пишите. Я тоже с интересом применю хорошую идею

у меня статус дома/не дома определяется по отсутствию активности внутри дома по датчикам движения. Но это означает, что нужно сначала поставить датчики по всему дому.

Более простой вариант - на выходе из дома поставить кнопку "Выход" и датчик закрытия двери. После нажатия дается время до закрытия двери когда считается, что все ушли. После этого отключаем свет, кондиционеры и тд

По приходу срабатывает датчик двери и мы меняем статус на "дома"

OEMBSOD
OEMBSOD аватар
Offline
Зарегистрирован: 31.05.2014

axill пишет:

По приходу срабатывает датчик двери и мы меняем статус на "дома"

 

У меня есть идея по поводу определения дома/не дома. Хочу в машине установить arduino с беспроводным датчиком, так вот когда сервер принимает сигнал от машины, то "все дома" (плюс мы знаем, что машина на месте) если сигнал от машины отсутвует, то включается режим "вне дома"

Ну и конечно паралельно этому нужно поставить кнопку (вход/выход), т.к. не всегда на машине катаемся.

axill
Offline
Зарегистрирован: 05.09.2011

такой вариант хорош когда один живешь или когда домочадцы тоже готовы с датчиками ходить))

вместо датчиков кстати успешно применяют смартфоны. Я не использую, хотя есть все для того, чтобы настроить реакцию на удаление смартфона(нов) от дома. Можно и на приближение реагировать. Сейчас примеров таких решений полно. К моему контроллеру (на форуме есть отдельная тема про micasaverde) есть готовый плагин который генерирует события удаления/приближения. Один знакомый это использует по смартфонам своему и супруги, говорит нормально работает

OEMBSOD
OEMBSOD аватар
Offline
Зарегистрирован: 31.05.2014

Доделал схему, выкладываю.

Тут еще должен быть ethernet шилд

enc28j60, но его нет в нужном виде в программе Fritzing

Подключение enc28j60 к Arduino NANO

VCC to Arduino Pin 3.3V

GND to Arduino Pin GND

CS to Arduino Digital Pin 10

SI to Arduino Digital Pin 11

SO to Arduino Digital Pin 12

SCK to Arduino Digital Pin 13

carduino.ru
Offline
Зарегистрирован: 06.12.2011

axill пишет:
день/ночь у меня переключается с учетом времени восхода/заката солнца в моем местоположении в конкретный день года

это конечно супер, если ваш розеточный таймер умеет так же

Вау!!!  Офигеть как круто. А у меня для такого чуда фантазии не хватило

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

carduino.ru пишет:

axill пишет:
день/ночь у меня переключается с учетом времени восхода/заката солнца в моем местоположении в конкретный день года

это конечно супер, если ваш розеточный таймер умеет так же

Вау!!!  Офигеть как круто. А у меня для такого чуда фантазии не хватило


А еще микрофон в унитазе настроен на всплеск. И по этому сигналу сразу включает тепленькую воду на 30 секунд и потом 2 минуты обдув.гыыы

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

OEMBSOD, вы главное отчет не бросайте а троллей и дальше игнорируйте...

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Gippopotam пишет:

OEMBSOD, вы главное отчет не бросайте а троллей и дальше игнорируйте...


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

OEMBSOD
OEMBSOD аватар
Offline
Зарегистрирован: 31.05.2014

Gippopotam пишет:

OEMBSOD, вы главное отчет не бросайте...

Конечно, буду писать по мере дополнения функциолнала.

 

vladk
Offline
Зарегистрирован: 24.04.2014

оффтоп!!!

как тесен интернет))) http://mysku.ru/blog/ebay/28030.html

OEMBSOD, ваше?)

4ishops
Offline
Зарегистрирован: 06.10.2012

FYI Апп на телефон/планшет и сама платформа есть такая - http://www.openremote.org/display/HOME/OpenRemote

OEMBSOD
OEMBSOD аватар
Offline
Зарегистрирован: 31.05.2014

vladk пишет:

оффтоп!!!

OEMBSOD, ваше?)

Да, моё! Все верно, инет большая деревня )))

mokswolf
Offline
Зарегистрирован: 23.10.2014

А софтинку для андройда можно попользовать?

 

OEMBSOD
OEMBSOD аватар
Offline
Зарегистрирован: 31.05.2014

На данный момент не планирую ее выкладывать. Возможно в ближайшее время буду ее переделывать, так скажем ver. 2.0 выпускать. Но она может появиться на маркете

Gagarin74
Offline
Зарегистрирован: 24.08.2013

не подскажите плиз а где взять приложения под андройд ?

mokswolf
Offline
Зарегистрирован: 23.10.2014

а например OpenHAB не пробовали с уже готовым веб и андройд интерфейсом?