UNO+IR+RELEY+ETHERNET SHIELD
- Войдите на сайт для отправки комментариев
Сб, 31/10/2015 - 21:05
Добрый день!
Есть скетч. Он счелкает реле от ИК датчика.
Получая код пульта 13 он работает с реле на 2-м пине, и так далее.
Теперь есть задача. При получении с пульта код 59 отправлять через ethernet запрос типа "http://192.168.0.5:8080/jsonrpc?request={%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Input.Select%22,%20%22id%22:%201}"
Подскажите олгаритм работы.
#include <IRremote.h>
#include <SPI.h>
#include <Ethernet.h>
#define FREEZE_TIME 250 //Тут определяем жесткую паузу между ближайшими нажатиями клавиш, миллисекунды
#define RELAY_WORK_TIME 20 //Тут определяем сколько должны работать реле при нажатии кнопок (там где кнопки не фиксируются);
#define RECV_PIN 8 //пин подключения IR приёмника
//кнопка пульта может иметь значение как 44 так 2092 для примера
//кнопки должны не залипать, а то питание хер словишь ))
//реле 1, 4-7 нажал включилось, нажал выключилось
//реле 2,3 для регулировки громкости, нажал сработало и отпустилось
//Лучше использовать define вместо переменной: компилятор заменяет имена цифрами и не занимается место в оперативе для переменных. В данном случае сэкономили целых 8переменныхint*2байта=16 байт :)
#define RELAY_POWR 2 //реле1 питания 13/2061
#define RELAY_VOLD 3 //реле2 громкость - 44/2092
#define RELAY_VOLU 4 //реле3 громкость + 43/2091
#define RELAY_MIX1 5 //реле4 микшера1 55/2103
#define RELAY_MIX2 6 //реле5 микшера2 54/2102
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 200 };
byte server[] = { 192, 168, 0, 5 };
EthernetClient client;
IRrecv irrecv(RECV_PIN);
decode_results results;
bool ON_State = false;
bool LampState = false;
bool RELAY_MIX1_State=false;
bool RELAY_MIX2_State=false;
void setup()
{
pinMode(RELAY_POWR, OUTPUT);
pinMode(RELAY_VOLD, OUTPUT);
pinMode(RELAY_VOLU, OUTPUT);
pinMode(RELAY_MIX1, OUTPUT);
pinMode(RELAY_MIX2, OUTPUT);
digitalWrite(RELAY_POWR, LOW);
digitalWrite(RELAY_VOLD, LOW);
digitalWrite(RELAY_VOLU, LOW);
digitalWrite(RELAY_MIX1, LOW);
digitalWrite(RELAY_MIX2, LOW);
irrecv.enableIRIn(); // Включаем ресивер
Ethernet.begin(mac, ip);
client.connect(server, 8080);
}
void loop()
{
if (irrecv.decode(&results))
{
if (results.value == 13)
{
Blink_lamp();
ON_State=!ON_State;
if (ON_State)
{
digitalWrite(RELAY_POWR,ON_State);
}
else
{
digitalWrite(RELAY_POWR,ON_State);
}
}
if (results.value == 44)
{
Blink_lamp();
digitalWrite(RELAY_VOLD,HIGH);
delay(RELAY_WORK_TIME);
digitalWrite(RELAY_VOLD,LOW);
}
if (results.value == 43)
{
Blink_lamp();
digitalWrite(RELAY_VOLU,HIGH);
delay(RELAY_WORK_TIME);
digitalWrite(RELAY_VOLU,LOW);
}
if (results.value == 55)
{
Blink_lamp();
RELAY_MIX1_State = !RELAY_MIX1_State;
if (RELAY_MIX1_State)
{
digitalWrite(RELAY_MIX1,HIGH);
}
else
{
digitalWrite(RELAY_MIX1,LOW);
}
}
if (results.value == 54)
{
Blink_lamp();
RELAY_MIX2_State = !RELAY_MIX2_State;
if (RELAY_MIX2_State)
{
digitalWrite(RELAY_MIX2,HIGH);
}
else
{
digitalWrite(RELAY_MIX2,LOW);
}
}
delay(FREEZE_TIME);
irrecv.resume();
}
}
void Blink_lamp()
{
}
57-64 заменить на
digitalWrite(RELAY_POWR,ON_State);
96-104
digitalWrite(RELAY_MIX2,RELAY_MIX2_State);
Примеры дерганья URL ищи в примере WebClient к либе.
Решил задачу разбить на подзадачи
С отправкой GET запросов уже чуток навоял.
Пока что код огромный, да и после отработки одной кнопки процесс замерает.
#include <SPI.h> #include <Ethernet.h> #include <IRremote.h> #define RECV_PIN 8 int relayPin = 2; byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; char server[] = "192.168.0.5"; IPAddress ip(192, 168, 0, 177); EthernetClient client; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { pinMode(relayPin, OUTPUT); Ethernet.begin(mac, ip); irrecv.enableIRIn(); } void loop() { digitalWrite(relayPin, HIGH); if (irrecv.decode(&results)) { if (results.value == 22 && client.connect(server, 8080)) { client.println("GET /jsonrpc?request={%20%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Application.SetVolume%22,%20%22params%22:%20{%20%22volume%22:%20%22increment%22%20},%20%22id%22:%201%20}"); client.println("Host: 192.168.0.5:8080"); client.println("Connection: close"); client.println(); } if (results.value == 21 && client.connect(server, 8080)) { client.println("GET /jsonrpc?request={%20%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Application.SetVolume%22,%20%22params%22:%20{%20%22volume%22:%20%22decrement%22%20},%20%22id%22:%201%20}"); client.println("Host: 192.168.0.5:8080"); client.println("Connection: close"); client.println(); } if (results.value == 59 && client.connect(server, 8080)) { client.println("GET /jsonrpc?request={%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Input.Select%22,%20%22id%22:%201}"); client.println("Host: 192.168.0.5:8080"); client.println("Connection: close"); client.println(); } if (results.value == 48 && client.connect(server, 8080)) { client.println("GET /jsonrpc?request={%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Input.Home%22,%20%22id%22:%201}"); client.println("Host: 192.168.0.5:8080"); client.println("Connection: close"); client.println(); } if (results.value == 32 && client.connect(server, 8080)) { client.println("GET /jsonrpc?request={%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Input.Up%22,%20%22id%22:%201}"); client.println("Host: 192.168.0.5:8080"); client.println("Connection: close"); client.println(); } if (results.value == 33 && client.connect(server, 8080)) { client.println("GET /jsonrpc?request={%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Input.Down%22,%20%22id%22:%201}"); client.println("Host: 192.168.0.5:8080"); client.println("Connection: close"); client.println(); } if (results.value == 17 && client.connect(server, 8080)) { client.println("GET /jsonrpc?request={%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Input.Left%22,%20%22id%22:%201}"); client.println("Host: 192.168.0.5:8080"); client.println("Connection: close"); client.println(); } if (results.value == 16 && client.connect(server, 8080)) { client.println("GET /jsonrpc?request={%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Input.Right%22,%20%22id%22:%201}"); client.println("Host: 192.168.0.5:8080"); client.println("Connection: close"); client.println(); } irrecv.resume(); }}Все строки заключи в F(), а то памяти в упор небось.
Спасибо. Не знал про такую опцию ))
как то так.
#include <IRremote.h> #include <SPI.h> #include <Ethernet.h> #define FREEZE_TIME 250 #define P 2 #define M 5 EthernetClient xbmcClient; byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,0,177); IPAddress servers[1]; IPAddress server0(192,168,0,5); int serverIndex = 0; EthernetClient webClient; char httpRequest[30]; int httpRequestIdx = 0; int RECV_PIN = 8; IRrecv irrecv(RECV_PIN); decode_results results; bool ON_State = false; bool LampState = false; bool M_State = false; void setup() { pinMode(P, OUTPUT); pinMode(M, OUTPUT); digitalWrite(P, LOW); digitalWrite(M, LOW); Serial.begin(9600); Ethernet.begin(mac, ip); irrecv.enableIRIn(); servers[0] = server0; } void loop() { if (irrecv.decode(&results)) {////////////////////////////// if (results.value == 13) { Blink_lamp(); ON_State = !ON_State; if (ON_State) { digitalWrite(P, ON_State); } else { digitalWrite(P, ON_State); } } if (results.value == 55) { Blink_lamp(); M_State = !M_State; if (M_State) { digitalWrite(M, HIGH); } else { digitalWrite(M, LOW); } } if (xbmcClient.connected()) xbmcClient.flush(); if (!xbmcClient.connected()) { if (xbmcClient.connect(servers[serverIndex], 9090)) { Serial.print("Connected "); Serial.println(serverIndex); } else { Serial.print("Connection Failure "); Serial.println(serverIndex); } } Serial.println(results.value); SendXbmcCommand(results.value); delay(FREEZE_TIME); irrecv.resume(); } } void SendXbmcCommand(long irCode) { switch (irCode) { case 22: case 2070: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"Application.SetVolume\",\"params\":{\"volume\":\"increment\"}}")); break; case 21: case 2069: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"Application.SetVolume\",\"params\":{\"volume\":\"decrement\"}}")); break; case 34: case 2082: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"Input.Back\"}")); break; case 17: case 2065: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"Input.Left\"}")); break; case 16: case 2064: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"Input.Right\"}")); break; case 32: case 2080: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"Input.Up\"}")); break; case 33: case 2081: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"Input.Down\"}")); break; case 59: case 2107: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"Input.Select\"}")); break; case 48: case 2096: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"Input.ContextMenu\"}")); break; case 12: case 2060: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"System.Shutdown\",\"id\":1}")); break; case 7: case 2055: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"Player.Stop\",\"params\":{\"playerid\":1}}")); break; case 6: case 2054: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"Player.PlayPause\",\"params\":{\"playerid\": 1}}")); break; case 5: case 2053: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"Player.SetSpeed\",\"params\":{\"playerid\":1,\"speed\":4 }}")); break; case 8: case 2056: xbmcClient.print(F("{\"jsonrpc\":\"2.0\",\"method\":\"Player.SetSpeed\",\"params\":{\"playerid\":1,\"speed\":-4 }}")); break; case 63: case 2111: serverIndex = 0; xbmcClient.flush(); xbmcClient.stop(); break; } } void Blink_lamp() { }