управление кондиционером через интернет (IR Led + ENC28J60)
- Войдите на сайт для отправки комментариев
Добрый вечер.
Уже больше месяца бьюсь над одной проблемой (конечно время самой проблеме(увлечению) уделяю не так много, как хотелось бы, но пополнение в семействе важнее
Есть у меня мысль, соорудить устройство для управления кондиционером через интернет.
Для этого у меня есть 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 диод отправлял команды при включении и выключении диода.
Натолкните на мысль, буду весьма признателен.
1. добавьте после 33 строки две функции
void ConditionerON()
{
...
}
void ConditionerOFF()
{
...
}
2. Добавьте после 55 строки
ConditionerON();
3. Добавьте после 59 строки
ConditionerOFF();
Я понял так,
Где-то, возможно в очень далекой галактике, мигает диод... Ардуино каким то мистическим образом узнает что диод включился и дает по инету команду кондиционеру включиться..
Мистика и колдовство.. может кровь дракона была просрочена?
Спасибо за ответ. Постараюсь на днях проверить, отпишусь.
Насколько смог использовал ваши рекомендации. В програмировании слаб, думаю я накосячил.
Мой вариант:
#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 страница зависает и не меняет статус диода
Парни, после очередного, длительного мозгового штурма, пришел к такому варианту
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); } } } }Для доступа через интернет необходимо пробрасывать порт веб сервера наружу , желательно не на стандартный 80 порт. А так же в скетче в параметрах должен быть указан шлюз - ип адрес роутера..
Проблема совсем в другом.
при добавке моего кода
078}079AcControl(ledPin);080}081voidAcControl(intb_s){082intstatus = 0;083if(b_s == HIGH){084status = 1;085}086if(b_s == LOW){087status = 2;088}089if(status != ac_status) {090ac_status = status;091{092if(status == 1) {093irsend.sendRaw(AcAutoOn,228,38);094delay (40);095}096if(status == 2){097irsend.sendRaw(AcOff,228,38);098delay (40);099}100}101}102}web страница зависает. Без моего кода скетч работает верно и зависаний нет
Добрый день. Для информации, если интересно.
Я использую для управления кондиционером устройство 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).
Устройство работает стабильно, нареканий нет.
Цены на сайте актуальные? Как-то неожиданно недорого...