UNO+IR+RELEY+ETHERNET SHIELD

rogelisby
Offline
Зарегистрирован: 31.10.2015

Добрый день!

Есть скетч. Он счелкает реле от ИК датчика.

Получая код пульта 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()
{
}

 

Radjah
Offline
Зарегистрирован: 06.08.2014

57-64 заменить на

digitalWrite(RELAY_POWR,ON_State);

96-104

digitalWrite(RELAY_MIX2,RELAY_MIX2_State);

Примеры дерганья URL ищи в примере WebClient к либе.

rogelisby
Offline
Зарегистрирован: 31.10.2015

Решил задачу разбить на подзадачи

С отправкой 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();
}}

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Все строки заключи в F(), а то памяти в упор небось.

rogelisby
Offline
Зарегистрирован: 31.10.2015

Спасибо. Не знал про такую опцию ))

 

rogelisby
Offline
Зарегистрирован: 31.10.2015

как то так.

#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()
{
}