управление кондиционером через интернет (IR Led + ENC28J60)

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

Добрый вечер.

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

Есть у меня мысль, соорудить устройство для управления кондиционером через интернет.

Для этого у меня есть arduino mini, ENC28J60, IR Led ну и остальные плюшки, которые сейчас не так важны.

Нашел интересные примеры для работы с ENC28J60 и больше всего, для тестирования, мне подходит пример номер 7

Сам код:

#include <EtherCard.h>

static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
static byte myip[] = {192,168,1,2};
byte Ethernet::buffer[700];

const int ledPin = 2;
boolean ledStatus;

char* on = "ON";
char* off = "OFF";
char* statusLabel;
char* buttonLabel;

void setup () {
 
  Serial.begin(57600);
  Serial.println("WebLed Demo");
 
  if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
    Serial.println( "Failed to access Ethernet controller");
 else
   Serial.println("Ethernet controller initialized");
 
  if (!ether.staticSetup(myip))
    Serial.println("Failed to set IP address");

  Serial.println();
  
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  ledStatus = false;
}
  
void loop() {
 
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  
  if(pos) {
    
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
      Serial.println("Received ON command");
      ledStatus = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
      Serial.println("Received OFF command");
      ledStatus = false;
    }
    
    if(ledStatus) {
      digitalWrite(ledPin, HIGH);
      statusLabel = on;
      buttonLabel = off;
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel = off;
      buttonLabel = on;
    }
      
    BufferFiller bfill = ether.tcpOffset();
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
      "<html><head><title>WebLed</title></head>"
      "<body>LED Status: $S "
      "<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
      "</body></html>"      
      ), statusLabel, buttonLabel, buttonLabel);
    ether.httpServerReply(bfill.position());
  }
}

И что же я хочу получить ( но у самого не выходит аленький цветок, сколько бы книжек и форумов я не прочитал)

При включении диода через интернет, отправляется команда кондиционеру на включение, при выключении светодиода выключение.

Из примера на ХАБРЕ я разобрался с кодами для управления моего кондиционера, привел их в нужный вид (они работаю, кондер на них реагирует)

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};

Это команды включения в автоматическом режиме и выключения кондея.

Так как мне заставить, что бы мой IR диод отправлял команды при включении и выключении диода. 

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

 

toc
Offline
Зарегистрирован: 09.02.2013

1. добавьте после 33 строки две функции
void ConditionerON()
{
...
}
void ConditionerOFF()
{
...
}

2. Добавьте после 55 строки
ConditionerON();

3. Добавьте после 59 строки
ConditionerOFF();

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

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

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

toc пишет:
1. добавьте после 33 строки две функции void ConditionerON() { ... } void ConditionerOFF() { ... } 2. Добавьте после 55 строки ConditionerON(); 3. Добавьте после 59 строки ConditionerOFF();

 

Спасибо за ответ. Постараюсь на днях проверить, отпишусь.

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

toc пишет:
...;

Насколько смог использовал ваши рекомендации. В програмировании слаб, думаю я накосячил.

Мой вариант:

#include <EtherCard.h>
#include <IRremote.h>

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};
IRsend irsend;

static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
static byte myip[] = {192,168,2,2};
byte Ethernet::buffer[700];

const int ledPin = 4;
boolean ledStatus;

char* on = "ON";
char* off = "OFF";
char* statusLabel;
char* buttonLabel;

void setup () {
 
  Serial.begin(57600);
  Serial.println("WebLed Demo");
 
  if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
    Serial.println( "Failed to access Ethernet controller");
 else
   Serial.println("Ethernet controller initialized");
 
  if (!ether.staticSetup(myip))
    Serial.println("Failed to set IP address");

  Serial.println();
  
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  ledStatus = false;
}
void ConditionerON()
{
if (ledPin, HIGH)
irsend.sendRaw(AcAutoOn,228,38);
}
void ConditionerOFF()
{
if (ledPin, LOW)
irsend.sendRaw(AcOff,228,38);
}
void loop() {
 
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  
  if(pos) {
    
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
      Serial.println("Received ON command");
      ledStatus = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
      Serial.println("Received OFF command");
      ledStatus = false;
    }
    
    if(ledStatus) {
      digitalWrite(ledPin, HIGH);
      statusLabel = on;
      buttonLabel = off;
      ConditionerON();
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel = off;
      buttonLabel = on;
      ConditionerOFF();
    }
      
    BufferFiller bfill = ether.tcpOffset();
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
      "<html><head><title>WebLed</title></head>"
      "<body>LED Status: $S "
      "<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
      "</body></html>"      
      ), statusLabel, buttonLabel, buttonLabel);
    ether.httpServerReply(bfill.position());
  }
}

Web страница зависает и не меняет статус диода

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

Парни, после очередного, длительного мозгового штурма, пришел к такому варианту

1 вариант (рабочий) тестировал отправку команды при нажатии и отжатии кнопки с включением и отключением подсветки дисплея

#include <IRremote.h>
#include <Wire.h>
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};
IRsend irsend;
int ac_status = 0; 

int LedPin = 13;             // Подключаем светодиод к порту 13
int ButPin = 6;             // Подключаем кнопку к выходу 10
#include  <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

void setup()
{
  pinMode(LedPin, OUTPUT);   // Инициализируем порт "ledPin" как выходной
  lcd.init();                     

}  

void loop()
{ 
  if(digitalRead(ButPin) == HIGH)        // если кнопка нажата
  { 
    lcd.backlight();

  }
  if(digitalRead(ButPin) == LOW)
  {
    lcd.noBacklight();

  }
  AcControl (digitalRead(ButPin));
}
void AcControl(int b_s){
  int status = 0;
  if (b_s == HIGH){
    status = 1;
  }
  if (b_s == LOW){
    status = 2;
  }
  if(status != ac_status) {
    ac_status = status;
    {	
      if(status == 1) {
        irsend.sendRaw(AcAutoOn,228,38); 
        delay (40);
      }
      if (status == 2){
        irsend.sendRaw(AcOff,228,38);
        delay (40);
      }
    }
  }
}







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

Пытаюсь зацепиться к такому варианту, но при этом страница зависает и нет реакции, в чем может быть проблема?

#include <EtherCard.h>
#include <IRremote.h>

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};
IRsend irsend;
int ac_status = 0;

static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
static byte myip[] = {192,168,2,2};
byte Ethernet::buffer[700];

const int ledPin = 4;
boolean ledStatus;

char* on = "ON";
char* off = "OFF";
char* statusLabel;
char* buttonLabel;

void setup () {
 
  Serial.begin(57600);
  Serial.println("WebLed Demo");
 
  if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
    Serial.println( "Failed to access Ethernet controller");
 else
   Serial.println("Ethernet controller initialized");
 
  if (!ether.staticSetup(myip))
    Serial.println("Failed to set IP address");

  Serial.println();
  
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  ledStatus = false;
}
void loop() {
 
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  
  if(pos) {
    
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
      Serial.println("Received ON command");
      ledStatus = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
      Serial.println("Received OFF command");
      ledStatus = false;
    }
    
    if(ledStatus) {
      digitalWrite(ledPin, HIGH);
      statusLabel = on;
      buttonLabel = off;
  
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel = off;
      buttonLabel = on;
   
    }
      
    BufferFiller bfill = ether.tcpOffset();
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
      "<html><head><title>WebLed</title></head>"
      "<body>LED Status: $S "
      "<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
      "</body></html>"      
      ), statusLabel, buttonLabel, buttonLabel);
    ether.httpServerReply(bfill.position());
  }
  AcControl(ledPin);
}
void AcControl(int b_s){
  int status = 0;
  if (b_s == HIGH){
    status = 1;
  }
  if (b_s == LOW){
    status = 2;
  }
  if(status != ac_status) {
    ac_status = status;
    {	
      if(status == 1) {
        irsend.sendRaw(AcAutoOn,228,38); 
        delay (40);
      }
      if (status == 2){
        irsend.sendRaw(AcOff,228,38);
        delay (40);
      }
    }
  }
}

 

MaksMS
Offline
Зарегистрирован: 11.03.2013

Для доступа через интернет необходимо пробрасывать порт веб сервера наружу , желательно не на стандартный 80 порт. А так же в скетче в параметрах должен быть указан шлюз - ип адрес роутера..

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

Проблема совсем в другом.

при добавке моего кода

078   }
079   AcControl(ledPin);
080 }
081 void AcControl(int b_s){
082   int status = 0;
083   if (b_s == HIGH){
084     status = 1;
085   }
086   if (b_s == LOW){
087     status = 2;
088   }
089   if(status != ac_status) {
090     ac_status = status;
091     {  
092       if(status == 1) {
093         irsend.sendRaw(AcAutoOn,228,38);
094         delay (40);
095       }
096       if (status == 2){
097         irsend.sendRaw(AcOff,228,38);
098         delay (40);
099       }
100     }
101   }
102 }

web страница зависает. Без моего кода скетч работает верно и зависаний нет

 

Anatoljevich_pro
Offline
Зарегистрирован: 07.01.2015

Добрый день. Для информации, если интересно.

Я использую для управления кондиционером устройство UniPing v3 http://www.netping.ru/products/uniping-v3. К UniPing v3 подключил модуль IRC-TR v2 http://www.netping.ru/products/netping-IRC-TR-v2  для дистанционного управления устройством с инфракрасным интерфейсом по сети TCP/IP (web, SNMP).

Устройство работает стабильно, нареканий нет.

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

Цены на сайте актуальные? Как-то неожиданно недорого...