управление кондиционером через интернет (IR Led + ENC28J60)
- Войдите на сайт для отправки комментариев
Добрый вечер.
Уже больше месяца бьюсь над одной проблемой (конечно время самой проблеме(увлечению) уделяю не так много, как хотелось бы, но пополнение в семействе важнее
Есть у меня мысль, соорудить устройство для управления кондиционером через интернет.
Для этого у меня есть arduino mini, ENC28J60, IR Led ну и остальные плюшки, которые сейчас не так важны.
Нашел интересные примеры для работы с ENC28J60 и больше всего, для тестирования, мне подходит пример номер 7
Сам код:
01 | #include <EtherCard.h> |
02 |
03 | static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x00,0x01}; |
04 | static byte myip[] = {192,168,1,2}; |
05 | byte Ethernet::buffer[700]; |
06 |
07 | const int ledPin = 2; |
08 | boolean ledStatus; |
09 |
10 | char * on = "ON" ; |
11 | char * off = "OFF" ; |
12 | char * statusLabel; |
13 | char * buttonLabel; |
14 |
15 | void setup () { |
16 | |
17 | Serial .begin(57600); |
18 | Serial .println( "WebLed Demo" ); |
19 | |
20 | if (!ether.begin( sizeof Ethernet::buffer, mymac, 10)) |
21 | Serial .println( "Failed to access Ethernet controller" ); |
22 | else |
23 | Serial .println( "Ethernet controller initialized" ); |
24 | |
25 | if (!ether.staticSetup(myip)) |
26 | Serial .println( "Failed to set IP address" ); |
27 |
28 | Serial .println(); |
29 | |
30 | pinMode(ledPin, OUTPUT); |
31 | digitalWrite(ledPin, LOW); |
32 | ledStatus = false ; |
33 | } |
34 | |
35 | void loop () { |
36 | |
37 | word len = ether.packetReceive(); |
38 | word pos = ether.packetLoop(len); |
39 | |
40 | if (pos) { |
41 | |
42 | if (strstr(( char *)Ethernet::buffer + pos, "GET /?status=ON" ) != 0) { |
43 | Serial .println( "Received ON command" ); |
44 | ledStatus = true ; |
45 | } |
46 |
47 | if (strstr(( char *)Ethernet::buffer + pos, "GET /?status=OFF" ) != 0) { |
48 | Serial .println( "Received OFF command" ); |
49 | ledStatus = false ; |
50 | } |
51 | |
52 | if (ledStatus) { |
53 | digitalWrite(ledPin, HIGH); |
54 | statusLabel = on; |
55 | buttonLabel = off; |
56 | } else { |
57 | digitalWrite(ledPin, LOW); |
58 | statusLabel = off; |
59 | buttonLabel = on; |
60 | } |
61 | |
62 | BufferFiller bfill = ether.tcpOffset(); |
63 | bfill.emit_p(PSTR( "HTTP/1.0 200 OK\r\n" |
64 | "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n" |
65 | "<html><head><title>WebLed</title></head>" |
66 | "<body>LED Status: $S " |
67 | "<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>" |
68 | "</body></html>" |
69 | ), statusLabel, buttonLabel, buttonLabel); |
70 | ether.httpServerReply(bfill.position()); |
71 | } |
72 | } |
И что же я хочу получить ( но у самого не выходит аленький цветок, сколько бы книжек и форумов я не прочитал)
При включении диода через интернет, отправляется команда кондиционеру на включение, при выключении светодиода выключение.
Из примера на ХАБРЕ я разобрался с кодами для управления моего кондиционера, привел их в нужный вид (они работаю, кондер на них реагирует)
1 | 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}; |
2 | 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();
Я понял так,
Где-то, возможно в очень далекой галактике, мигает диод... Ардуино каким то мистическим образом узнает что диод включился и дает по инету команду кондиционеру включиться..
Мистика и колдовство.. может кровь дракона была просрочена?
Спасибо за ответ. Постараюсь на днях проверить, отпишусь.
Насколько смог использовал ваши рекомендации. В програмировании слаб, думаю я накосячил.
Мой вариант:
01
#include <EtherCard.h>
02
#include <IRremote.h>
03
04
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};
05
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};
06
IRsend irsend;
07
08
static
byte
mymac[] = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
09
static
byte
myip[] = {192,168,2,2};
10
byte
Ethernet::buffer[700];
11
12
const
int
ledPin = 4;
13
boolean ledStatus;
14
15
char
* on =
"ON"
;
16
char
* off =
"OFF"
;
17
char
* statusLabel;
18
char
* buttonLabel;
19
20
void
setup
() {
21
22
Serial
.begin(57600);
23
Serial
.println(
"WebLed Demo"
);
24
25
if
(!ether.begin(
sizeof
Ethernet::buffer, mymac, 10))
26
Serial
.println(
"Failed to access Ethernet controller"
);
27
else
28
Serial
.println(
"Ethernet controller initialized"
);
29
30
if
(!ether.staticSetup(myip))
31
Serial
.println(
"Failed to set IP address"
);
32
33
Serial
.println();
34
35
pinMode(ledPin, OUTPUT);
36
digitalWrite(ledPin, LOW);
37
ledStatus =
false
;
38
}
39
void
ConditionerON()
40
{
41
if
(ledPin, HIGH)
42
irsend.sendRaw(AcAutoOn,228,38);
43
}
44
void
ConditionerOFF()
45
{
46
if
(ledPin, LOW)
47
irsend.sendRaw(AcOff,228,38);
48
}
49
void
loop
() {
50
51
word len = ether.packetReceive();
52
word pos = ether.packetLoop(len);
53
54
if
(pos) {
55
56
if
(strstr((
char
*)Ethernet::buffer + pos,
"GET /?status=ON"
) != 0) {
57
Serial
.println(
"Received ON command"
);
58
ledStatus =
true
;
59
}
60
61
if
(strstr((
char
*)Ethernet::buffer + pos,
"GET /?status=OFF"
) != 0) {
62
Serial
.println(
"Received OFF command"
);
63
ledStatus =
false
;
64
}
65
66
if
(ledStatus) {
67
digitalWrite(ledPin, HIGH);
68
statusLabel = on;
69
buttonLabel = off;
70
ConditionerON();
71
}
else
{
72
digitalWrite(ledPin, LOW);
73
statusLabel = off;
74
buttonLabel = on;
75
ConditionerOFF();
76
}
77
78
BufferFiller bfill = ether.tcpOffset();
79
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
80
"Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
81
"<html><head><title>WebLed</title></head>"
82
"<body>LED Status: $S "
83
"<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
84
"</body></html>"
85
), statusLabel, buttonLabel, buttonLabel);
86
ether.httpServerReply(bfill.position());
87
}
88
}
Web страница зависает и не меняет статус диода
Парни, после очередного, длительного мозгового штурма, пришел к такому варианту
1 вариант (рабочий) тестировал отправку команды при нажатии и отжатии кнопки с включением и отключением подсветки дисплея
01
#include <IRremote.h>
02
#include <Wire.h>
03
unsigned
int
AcOff[228] = {
04
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};
05
unsigned
int
AcAutoOn[228] = {
06
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};
07
IRsend irsend;
08
int
ac_status = 0;
09
10
int
LedPin = 13;
// Подключаем светодиод к порту 13
11
int
ButPin = 6;
// Подключаем кнопку к выходу 10
12
#include <LiquidCrystal_I2C.h>
13
LiquidCrystal_I2C lcd(0x27,16,2);
14
15
void
setup
()
16
{
17
pinMode(LedPin, OUTPUT);
// Инициализируем порт "ledPin" как выходной
18
lcd.init();
19
20
}
21
22
void
loop
()
23
{
24
if
(digitalRead(ButPin) == HIGH)
// если кнопка нажата
25
{
26
lcd.backlight();
27
28
}
29
if
(digitalRead(ButPin) == LOW)
30
{
31
lcd.noBacklight();
32
33
}
34
AcControl (digitalRead(ButPin));
35
}
36
void
AcControl(
int
b_s){
37
int
status = 0;
38
if
(b_s == HIGH){
39
status = 1;
40
}
41
if
(b_s == LOW){
42
status = 2;
43
}
44
if
(status != ac_status) {
45
ac_status = status;
46
{
47
if
(status == 1) {
48
irsend.sendRaw(AcAutoOn,228,38);
49
delay (40);
50
}
51
if
(status == 2){
52
irsend.sendRaw(AcOff,228,38);
53
delay (40);
54
}
55
}
56
}
57
}
Но меня больше интересует вопрос отправки команды через интернет.
Пытаюсь зацепиться к такому варианту, но при этом страница зависает и нет реакции, в чем может быть проблема?
001
#include <EtherCard.h>
002
#include <IRremote.h>
003
004
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};
005
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};
006
IRsend irsend;
007
int
ac_status = 0;
008
009
static
byte
mymac[] = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
010
static
byte
myip[] = {192,168,2,2};
011
byte
Ethernet::buffer[700];
012
013
const
int
ledPin = 4;
014
boolean ledStatus;
015
016
char
* on =
"ON"
;
017
char
* off =
"OFF"
;
018
char
* statusLabel;
019
char
* buttonLabel;
020
021
void
setup
() {
022
023
Serial
.begin(57600);
024
Serial
.println(
"WebLed Demo"
);
025
026
if
(!ether.begin(
sizeof
Ethernet::buffer, mymac, 10))
027
Serial
.println(
"Failed to access Ethernet controller"
);
028
else
029
Serial
.println(
"Ethernet controller initialized"
);
030
031
if
(!ether.staticSetup(myip))
032
Serial
.println(
"Failed to set IP address"
);
033
034
Serial
.println();
035
036
pinMode(ledPin, OUTPUT);
037
digitalWrite(ledPin, LOW);
038
ledStatus =
false
;
039
}
040
void
loop
() {
041
042
word len = ether.packetReceive();
043
word pos = ether.packetLoop(len);
044
045
if
(pos) {
046
047
if
(strstr((
char
*)Ethernet::buffer + pos,
"GET /?status=ON"
) != 0) {
048
Serial
.println(
"Received ON command"
);
049
ledStatus =
true
;
050
}
051
052
if
(strstr((
char
*)Ethernet::buffer + pos,
"GET /?status=OFF"
) != 0) {
053
Serial
.println(
"Received OFF command"
);
054
ledStatus =
false
;
055
}
056
057
if
(ledStatus) {
058
digitalWrite(ledPin, HIGH);
059
statusLabel = on;
060
buttonLabel = off;
061
062
}
else
{
063
digitalWrite(ledPin, LOW);
064
statusLabel = off;
065
buttonLabel = on;
066
067
}
068
069
BufferFiller bfill = ether.tcpOffset();
070
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
071
"Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
072
"<html><head><title>WebLed</title></head>"
073
"<body>LED Status: $S "
074
"<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
075
"</body></html>"
076
), statusLabel, buttonLabel, buttonLabel);
077
ether.httpServerReply(bfill.position());
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
}
Для доступа через интернет необходимо пробрасывать порт веб сервера наружу , желательно не на стандартный 80 порт. А так же в скетче в параметрах должен быть указан шлюз - ип адрес роутера..
Проблема совсем в другом.
при добавке моего кода
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 страница зависает. Без моего кода скетч работает верно и зависаний нет
Добрый день. Для информации, если интересно.
Я использую для управления кондиционером устройство 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).
Устройство работает стабильно, нареканий нет.
Цены на сайте актуальные? Как-то неожиданно недорого...