Remote switch - простое управление покупными радиорозетками.

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Надеюсь, тема будет полезна начинающим. 

Итак, имеется набор радиорозеток с пультом, вот такой :

 

 

 

 

 

 

 

 

(живущим в Украине - куплено в "Эпицентре" за 99,95 грн.)

Работает этот набор на частоте 433 МГц, что дает возможность "рулить" розетками с Ардуины. Гугление темы подтвердило - имеются разные библиотеки для работы с разными управляемыми по 433/315 МГц исполнительными устройствами. Я начал с двух : 

1. rc-switch - Arduino library to operate low cost 315 MHz / 433 MHz remote control devices , http://code.google.com/p/rc-switch/

2. RemoteSwitch - for generic remote switches, https://bitbucket.org/

fuzzillogic/433mhzforarduino/wiki/Home

Первая библиотека мне не подошла, упоминаю ее только "для ассортимента", а вот, зайдя по второй ссылке, на картинке

я с радостью обнаружил мой тип розеток, бинго !

Теперь конкретика. Берем Ардуино, приемник и передатчик на 433МГц (приемник потом не нужен будет), ага, вот такие

Приемник - на второй пин, передатчик - на десятый.

Приступаем к самому интересному.

1. Распаковываем библиотеку RemoteSwitch в \libraries\RemoteSwitch

2. Управлять розеткой будет функция RemoteSwitch::sendTelegram(code,RF_TX_PIN), но где взять значение code ? Да не проблема, запускаем \libraries\RemoteSwitch\examples\Show_received_code\Show_received_code.pde , открываем окно терминала.

3. Берем пульт, нажимаем по очереди все кнопки и в окне терминала видим искомые  Code и period duration. Копипастим и сохраняем. Все, приемник можно отключать.

4. Из копипащеного делаем заготовку, что-то типа

unsigned int period = 146;

unsigned long CodesON[] = { 265353, 266325, 266649 };
unsigned long CodesOFF[] = { 265349, 266321, 266645 };

5. Ну а теперь можно писать скетч для управления розетками. В моем случае была дописка рабочего скетча, поэтому процитирую только необходимые строки, кто не разберется - подробности спрашивайте.

#include <RemoteSwitch.h>
#define RF_TX_PIN 10 // pin connected to 433MHz TX 

String readString = ""; 

...

// В void setup() для этой библиотеки в данном случае ничего не пишем

...

// В void loop() принимаем команду :
while (Serial.available())
 {
  delay(3); //delay to allow buffer to fill
  if ( Serial.available() > 0 )
   {
    char c = Serial.read(); //gets one byte from serial buffer
    readString += c; //makes the string readString
   }
 }
if ( readString.length() > 0 )  {  SendToRCSwitch(readString); }
readString = "";

...

Далее существует некая функция, которая анализирует принятую извне команду и передает указания розеткам. Вот часть ее :

unsigned long transmitCode;
unsigned int period = 146;
unsigned long code;
unsigned long CodesON[] = { 265353, 266325, 266649 };
unsigned long CodesOFF[] = { 265349, 266321, 266645 };

if (DoON == 0 ) { transmitCode = CodesON[cmdnom - 1]; }
if (DoOFF == 0 ) { transmitCode = CodesOFF[cmdnom - 1]; }
//Copy the received code.
code = transmitCode & 0xFFFFF; //truncate to 20 bits for show; receivedCode is never more than 20 bits..
//Add the period duration to the code. Range: [0..511] (9 bit)
code |= (unsigned long)period << 23;
//Add the number of repeats to the code. Range: [0..7] (3 bit). The actual number of repeats will be 2^(repeats),
//in this case 8
code |= 3L << 20;
//Transmit the signal
RemoteSwitch::sendTelegram(code,RF_TX_PIN);
delay(100);

Тут все взято из первоисточника.

Ну вот и все, если в общих чертах. Готов ответить на вопросы.

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

UPD: разобрал одну из розеток - внутри обыкновенное реле 24V 10A (не то чтоб я удивился, интересовал вольтаж), так что для силовых розеток без проблем можно будет поменять его на более мощное (SSR, естественно).

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

это все ужастно интересно. но как бы вроде уже весь инет исписан вдоль и поперек подобными проектами, с примерами и прочими хороводами на ардуино..

самая основная проблема всех этих устройств, в том что они не имеют обратного отклика. они не сообщают о своем состоянии.. догадыватся включено оно или выключено можно только методом раскладывания пасьянса...

плюс ограниченое количество кодов.. даже при условии что один и тот же код включает и выключает...

есть еще выключатели такие же китайские... заметсо обычного вкручиваеш и играйся со светом удалено...

как то так :)

вы бы код вставляли кодом.. читалось бы легче и выглядело бы красивше..

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

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Согласен с Вами по всем пунктам, особенно насчет отсутствия обратной связи. Спасибо, Кэп :)

axill
Offline
Зарегистрирован: 05.09.2011

несколько лет назад тоже на них смотрел, но выбрал zwave и не жалею. Выходит раза в 3-4 дороже, но оно того стоит. Обратная связь присутствует. Наращивать можно шаг за шагом

поиграться конечно можно и с такими, хотя лучше тогда уже сделать свои )) раз мы все в  теме програмирования МК

то, что там обычное реле - это обычная практика. Полноформатная розетка должна быть расчитана на 3,5квт, если делать ее в компактном корпусе то при использовании твердотельного реле не удасться решить задачу с теплоотводом.

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Ну а там, где мощности десятиамперного реле не хватает, можно поставить что-то покруче, например, твердотельное реле.

Это розетка, обслуживающая утюг. Идея состоит в том, чтобы обесточивать её при включении "охранного" режима, во избежание, так сказать.

Внутри TSR-25DA от Fotek и "потроха" одной из радиоуправляемых розеток (см. топикстарт).

Коробочка с розеткой соединена тремя проводами.

axill
Offline
Зарегистрирован: 05.09.2011

там где не хватает реле 10А можно поставить реле 30А )))

Твердотельное реле тож не плохо только с учетом теплоотвода и размеров китайских реле - громоздко, не везде удобно

п.с. кто утюг еще не купил - покупайте утюг с встроенной защитой. У меня такой тефаль - если ему не менять положение более нескольких минут он сам отключается (причем в лежачем положении отключается быстрее). Так что без дополнительных заморочек практически исключается риск пожара

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

axill пишет:

там где не хватает реле 10А можно поставить реле 30А )))

Твердотельное реле тож не плохо только с учетом теплоотвода и размеров китайских реле - громоздко, не везде удобно

п.с. кто утюг еще не купил - покупайте утюг с встроенной защитой. У меня такой тефаль - если ему не менять положение более нескольких минут он сам отключается (причем в лежачем положении отключается быстрее). Так что без дополнительных заморочек практически исключается риск пожара

Реле на радиаторе.

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

axill
Offline
Зарегистрирован: 05.09.2011

конечно понимаю)) у меня так же примерно сделано отключения всей плиты - тоже твердотельное реле на радиаторе только реле на 80А и стоит в щитке.

специально сделал оговорку - для тех кто утюг еще не купил)

Transformer
Offline
Зарегистрирован: 20.09.2013

Добрый день.

Подскажите пожалуйста как запрограммировать Ардуино Дуемиланова для управления радиорозетками через веб интерфейс?

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Уж не знаю на какой ответ Вы рассчитаваете, пойду путем Капитана Очевидности : задача разделяется на две подзадачи.

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

2. Научите Ардуино управляться через веб-интерфейс (см. поиск, таких проектов много, в т.ч. и на этом форуме).

1 + 2 = Дальше все еще очевидней.

Не сочтите за насмешку, это единственный способ САМОМУ запрограммировать Ардуино для управления радиорозетками через веб интерфейс..

Transformer
Offline
Зарегистрирован: 20.09.2013

За насмешку несочту конечно)

Я научил Ардуину управлять радиорозетками по средствам обработки сигналов с ИК пульта, благо примеров придостаточно, а вот с вебом застрял( Перекапал форум ничего подходящего ненашол, а можт нашол да не понял, что это, ОНО))) ОК буду дальше биться.

axill
Offline
Зарегистрирован: 05.09.2011

Transformer пишет:

За насмешку несочту конечно)

Я научил Ардуину управлять радиорозетками по средствам обработки сигналов с ИК пульта, благо примеров придостаточно, а вот с вебом застрял( Перекапал форум ничего подходящего ненашол, а можт нашол да не понял, что это, ОНО))) ОК буду дальше биться.

web понятие растяжимое. Полноценная web консоль это одно и тут без компьютера не обойтись - получится связка розетка <-> радио <-> ардуино <-> ethernet <-> компьютер <-> web server <-> пользователь

либо web это GET/POST запросы в компьютерной сети например http://192.168.1.1/rozetka/001/off - выключаем свет у выклюателя номер 1. ну или простые кнопки в браузере - ON/OFF. Это можно сделать без компьютера

подключаете к ардуино с одной стороны радио для управления розетками с другой ethernet шилд для связи с компьютерной сетью. Поднимаете web server и в зависимости от того что хотите на web иметь делаете обработку

вот вам пример моего куска кода для обработки GET запросов из сети. Писал его как раз как  gateway из компьютерной сети в радио сеть

#include <Ethernet.h>

// ------------------------------------------------------
// определения для работы с ethernet
//
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//IPAddress ip(192,168,1, 177);


// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);
EthernetClient client;

// =============================================================================
// обработка запросов на web сервер
// =============================================================================
void ethernet_init() {
  while(Ethernet.begin(mac) == 0) {
    sdlogln("Cannot get IP from DHCP, will wait", 1);
    delay(10000);
  }
  
  uint32_t ip = Ethernet.localIP();
  uint8_t *bytes = (uint8_t*)&ip;
  sprintf(sdlogBuf(), "Assigned IP = %d.%d.%d.%d", bytes[0], bytes[1], bytes[2], bytes[3]);
  sdlogln(sdlogBuf(), 0);
  utft_statusIP(ip);
}

void ethernet_loop() {
  
  EthernetClient client = server.available();
  
  String cur_line = "";
  
  // параметры для вызовы функций сети NRF024
  //nrf24_actions nrf24_action =  nrf24_actions_unknown;
  //nrf24_statuses nrf24_status = nrf24_status_unknown;
//  unsigned short nrf24_address;
//  unsigned short nrf24_ref;
//  String nrf24_name;
//  String nrf24_value;
  
  if (client) {
    String param[6];

    sdlogln("ETHERNET IN", 0);
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        // парсинг строг заголовка запроса
        char c = client.read();
        cur_line += c;
        //Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/plain");
          client.println("Connection: close");
          client.println();
          client.print("command ");
          for(uint8_t i=0; i<6; i++) {
            client.print("[");
            client.print(param[i]);
            client.print("]");
          }
          client.println();
          //client.println("<!DOCTYPE HTML>");
          //client.println("<html>");
                    // add a meta refresh tag, so the browser pulls again every 5 seconds:
          //client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          /*if(nrf24_status == nrf24_status_ok) {
            switch(nrf24_action) {
              case nrf24_action_get:
              case nrf24_action_set:
                /*nrf24net_message_tobesent.type          = nrf24net_message_type001;
                nrf24net_message_tobesent.control       = my_message.type + 10;  // control code to check if message of undestandable format
                nrf24net_message_tobesent.reference     = nrf24_ref;
                nrf24net_message_tobesent.to_addr       = nrf24_address;
                nrf24net_message_tobesent.throuth_addr  = nrf24_address;
                nrf24net_message_tobesent.from_addr     = 0;
                nrf24_name.toCharArray(nrf24net_message_tobesent.name, 8);
                break;
            }            
            switch(nrf24_action) {
              case nrf24_action_set:
                //nrf24_value.toCharArray(nrf24net_message_tobesent.value, 8);
              case nrf24_action_get:
                //nrf24_tobesent = true;
              case nrf24_action_status:
              break;
            }
            //client.println("status=" + String(nrf24_status));
          } else {          
            //client.println("status=" + String(nrf24_status));
          }
          client.println("===== debug =====");
          //client.println("action=" + String(nrf24_action));
          client.println("ref=" + String(nrf24_ref));
          client.println("address=" + String(nrf24_address));
          client.println("name=" + nrf24_name);
          client.println("value=" + nrf24_value);
          //client.println("status=" + String(nrf24_status));
          //client.println("</html>");*/
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
          //Serial.println("=======================");
          //Serial.println(cur_line);
          //Serial.println("-----------------------");
          if(cur_line.startsWith("GET /")) {
            // сканируем на параметры действия
            // формат http://<coordinator_ip>/<command>/[2]/[3]/[4]/[5]/[6]
            // за командой от нуля до 5 параметров
           
           /*char buf[40];
           cur_line.toCharArray(buf, 30);
           buf[31] = 0;
           sdlogln(buf, 0);*/
           
           int param_size = -1;
            
            int start_inx = 5;
            int end_inx = cur_line.indexOf(' ', start_inx);
            int p_i = 0;
            
            while(end_inx > 0 && p_i < 6) {
              int search_inx = cur_line.indexOf('/', start_inx);
              if(search_inx > 0 && start_inx < search_inx && search_inx < end_inx) {
                param_size = p_i + 1;
                param[p_i] = cur_line.substring(start_inx, search_inx);
                start_inx = search_inx + 1;
                p_i++;
              } else {
                if(start_inx < end_inx) {
                  param_size = p_i + 1;
                  param[p_i] = cur_line.substring(start_inx, end_inx);
                }
                break; 
              }
            }
            for(;p_i < 6; p_i++) { param[p_i] = String(""); }
            ethernet_command(param);
//            sprintf(buf, "params=%d", p_i);
//            sdlogln(buf, 0);
            
          }
          cur_line = "";
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    //sdlogln("client disonnected", 0);
  }
}

static uint8_t scan_64bitaddress(String str, uint64_t* address) {
  uint16_t a[3];
  char buf[9];  
  
  str.toCharArray(buf, 8);
  
  if(sscanf(buf, "%2x%2x%2x", &a[2], &a[1], &a[0]) == 3) {
    uint8_t* aa = (uint8_t*)address;
    
    *address = 0;
    aa[2] = a[2];
    aa[1] = a[1];
    aa[0] = a[0];
    //sprintf(sdlog_buf, "address = [%02X][%02X][%02X]", a[2], a[1], a[0]);
    //sdlogln_buf(0);
    return 1;
  }
  sdlogln("unconverted", 1);
  return 0;
}

static void ethernet_command(String param[]) {
  char buf[32];
  
  if(param[0].equalsIgnoreCase("rtcupdate")) {
    sdlogln("> command rtcupdate", 0);
    syncTime();
  } else if(param[0].equalsIgnoreCase("rtcupdatedev")) {
    sdlogln("> command rtcupdatedev", 0);
    command_rtcupdatedev(0x010101);
  } else if(param[0].equalsIgnoreCase("homest")) {
    uint8_t homest = param[1].toInt();
    sprintf(buf, "> command homest[%d]", homest);
    sdlogln(buf, 0);    
    command_homest(homest);
  } else if(param[0].equalsIgnoreCase("nrf24scan")) {
    command_nrf24scan();
  } else if(param[0].equalsIgnoreCase("nrf24ping")) {
    command_nrf24ping_test();
  } else if(param[0].equalsIgnoreCase("dev")) {
    //  /dev/[dev address]/eeparam/setbyname/[param name]/[param value]
    uint64_t address64;
    
    if(scan_64bitaddress(param[1], &address64)) {
      char domain[17];
      char cmd[17];
      char param_name[9];
      char param_value[9];
  
      param[2].toCharArray(domain, 17);
      param[3].toCharArray(cmd, 17);
      param[4].toCharArray(param_name, 9);
      param[5].toCharArray(param_value, 9);
      
      sprintf(sdlog_buf, "> dev/%02X%04X/%s/%s/", (int)((address64 >> 16) & 0xff), (int)(address64 & 0xffff), domain, cmd);
      sdlogln_buf(0);
      sprintf(sdlog_buf, "> param [%s]=[%s]", param_name, param_value);
      sdlogln_buf(0);

      if(! strcmp(domain, "eeparam")) {
        if(! strcmp(cmd, "setbyname")) {
          command_dev_eeparam_setbyname(address64, param_name, param_value);
        }
      } else if(! strcmp(domain, "rtcupdate")) {
         command_rtcupdatedev(address64);
      } else if(! strcmp(domain, "ping")) {
        command_nrf24ping(address64);
      } else if(! strcmp(domain, "test")) {
        vera3_set_switch(18, 0);
      }
    } else {
        sdlogln("> cannot convert device address", 1);
    }
  } else {
    sdlogln("> unhandled command", 1);
  }
  
}

 

Transformer
Offline
Зарегистрирован: 20.09.2013

Огромное Спасибо. Пытаюсь разобраться).

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012
dimitri08
Offline
Зарегистрирован: 21.04.2012

добрый день

 

есть вопрос это библиотека поддерживает чип PT2240.???????

заранее спасибо за ответ.

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Упомянутые выше библиотеки не поддерживают.

4ishops
Offline
Зарегистрирован: 06.10.2012

«Заводим» радиоуправляемые розетки без пульта

http://habrahabr.ru/post/212215/

dimitri08
Offline
Зарегистрирован: 21.04.2012

Можете подсказать где можно достать или добавить в библиотеку  RC switch поддежку чипов PT2240. У меня два пульта на этих чипах. Подскажите пожалуиста.

 

Заранее спасибо 

4ishops
Offline
Зарегистрирован: 06.10.2012

dimitri08 пишет:

Можете подсказать где можно достать или добавить в библиотеку  RC switch поддежку чипов PT2240.

 

Можно же посмотреть что шлют пульты, инструкция по реверсу есть в самом первом сообщении.

Плюс на хабре достаточно подробно разжевано про чипы, там правда 2272 был, но суть таже думаю.

 

dimitri08
Offline
Зарегистрирован: 21.04.2012

спасибо за ответ и внимание

оказываеться у библиотека RC switch поддерживает чипы PT2240.   24bit

может кому то будет полезно. 

4ishops
Offline
Зарегистрирован: 06.10.2012

dimitri08 пишет:

может кому то будет полезно. 

 

Будет более полезно если расскажите здесь про ваш опыт и что в итоге получилось:)

dimitri08
Offline
Зарегистрирован: 21.04.2012

пульт на чипе PT2240(315мгц) имеет четыре кнопки. на ардуино про мини с применением бибилиотеки   RC switch появились надписи по сериал порту       6116656 24bit. 

 

cudla1973
Offline
Зарегистрирован: 21.02.2013

Можно спросить ,а как передать эти коды через блютуз ,коды я узнал пульта теперь не могу понять как их отправить на 10 пин передатчика, из примеров не понял в какой системе счисления передавать эти коды .

сам задал сам отвечу 

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
#define AA 349632//код моего пульта кнопка а

#define BB 349488 //код моего пульта кнопка в

#define CC 349452//код моего пульта кнопка с

#define DD 349443//код моего пульта кнопка д



void setup() {

Serial.begin(9600);
mySwitch.enableTransmit(10);


}

void loop() {

if (Serial.available() > 0) {

int i = Serial.read()-48;

if (i == 1) mySwitch.send(349632,24);

if (i == 2) mySwitch.send(349488,24);

if (i == 3) mySwitch.send(349452,24);

if (i == 4) mySwitch.send(349443,24);



}

}

 

General
Offline
Зарегистрирован: 09.12.2012

axill пишет:

вот вам пример моего куска кода для обработки GET запросов из сети. Писал его как раз как  gateway из компьютерной сети в радио сеть

Правда что-то ваш код не компилируется. Видимо совсем "кусок" - только часть кода ? 

Дляаналогичных целей пробывал "RCSwitch Webserver" - но почему-то не срабатывает. Кто-то его еще пробывал ? Для управления радиореле через web ?

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

50$ розетка от Belkin. Там и Wifi и подсчет мощности и еще куча всякого.

General
Offline
Зарегистрирован: 09.12.2012

это все лишнее

cudla1973
Offline
Зарегистрирован: 21.02.2013

Кто поможет ,хочу другим пультом управлять розетками,код пульта получил ,не могу понять как написать код что поступил сигнал с кодом например 1234567 ,чтоб отправить команду с кодом определенной розетки ?

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  mySwitch.enableTransmit(10);
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
}

void loop() {
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    
    
     
     switch (value) {
       case 13421909:
       
   mySwitch.send(349443,24);
 
   
    
     }}}

Вроде работает но включает с задержкой,что можно исправить?

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Мне вот этот кусочек кода не совсем понятен.

 

code |= (unsigned long)period << 23;
//Add the number of repeats to the code. Range: [0..7] (3 bit). The actual number of repeats will be 2^(repeats),
//in this case 8
code |= 3L << 20;

Разжуйте пожалуйста.

 

Alxxx.1
Offline
Зарегистрирован: 16.02.2015

Всем привет, использую библиотеку RemoteSwith для ролевых игровых целей, вообщем необходимо что бы когда на приемник не приходит сигнал с передатчика переменная Y была равна 0, а когда поднести приемник равна 85, проблема в том что когда подносишь приемник к передатчику, переменная меняется, а вот когда отходишь от передатчика и сигнал не поступает на приемник Y все равно равна 85. Я новичек в этом деле, вот часть кода.

  Serial.print(receivedCode);
  
  if (receivedCode == 528526)   //если есть доступные данные с передатчика 1
  {
        Serial.println("Priem 01");
        y = 85;
  }
        else if (receivedCode != 528526) //если нет, меняем переменную
        {
        y = 0;
        } 
 
Подскажите пожалуйста как сбросить.
Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Проще написать

if (receivedCode == 528526) //если есть доступные данные с передатчика 1
{
Serial.println("Priem 01");
y = 85;
}
else //если нет, меняем переменную
{
y = 0;
}

, хотя приведенный Вами кусок кода тоже вполне работоспособен. Наверное, проблема не в этом месте кода. Возможно, когда сигнал не поступает на приемник, не изменяется сама receivedCode.

Alxxx.1
Offline
Зарегистрирован: 16.02.2015

if (receivedCode == 528526) //если есть доступные данные с передатчика 1
{
Serial.println("Priem 01");
y = 85;
}
else //если нет, меняем переменную
{
y = 0;
}

Этот вариант я тоже пробовал, но переменная сбрасывается только тогда когла послать другой сигнал с другой кнопки передатчика. В этом случае оператор else ждет другого значения что бы выполнить действие, а проблема в том что в receivedCode хранится код который был послан(

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Очищайте receivedCode после проверки.

if (receivedCode == 528526) //если есть доступные данные с передатчика 1
{
Serial.println("Priem 01");
y = 85;
}
else //если нет, меняем переменную
{
y = 0;
}

receivedCode = 0;

Alxxx.1
Offline
Зарегистрирован: 16.02.2015

Не помогает :(

Alxxx.1
Offline
Зарегистрирован: 16.02.2015

Есть еще какие ни будь идеи( Уже на стенку лезу...

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Из шести показанных строчек кода больше идей не будет.

Alxxx.1
Offline
Зарегистрирован: 16.02.2015

Решил проблемму принудительным обнулением переменной в конце скетча) А вот еще вопрос, почему при нажатии на кнопку передатчика, приемник не всегда получает код.

Может тут что то подправить RemoteReceiver::init(0, 3, showCode); ?

или в общем

// Callback function is called only when a valid code is received.
void showCode(unsigned long receivedCode, unsigned int period)

{
//Serial.println(receivedCode);
delay(3);
if (receivedCode == 528526) //если есть доступные данные с передатчика 1
{
//Serial.println("Priem 01");
x = 85;
}
delay(3);
if (receivedCode == 528528) //если есть доступные данные с передатчика 2
{
//Serial.println("Priem 02");
y = 85;
}
delay(3);
if (receivedCode == 528534) //если есть доступные данные с передатчика 3
{
//Serial.println("Priem 03");
z = 85;
}
delay(3);
if (receivedCode == 528552) //если есть доступные данные с передатчика 4
{
//Serial.println("Priem 04");
f = 85;
}
delay(3);
if (receivedCode == 528768) //если есть доступные данные с передатчика 5
{
//Serial.println("Priem 05");
p = 85;
}
delay(3);

}

TovBender
Offline
Зарегистрирован: 12.04.2015

cudla1973

просветите что за цыфры в вашем скетче    #23 /    в скобках ( 349632,24 ) строка 27.

при отправке вашего скетча по радио, в приёмнике приходит совсем другая цифра code 58995

как получается такая цифра ??

и как передать настоящий код пульта ??

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

а что за микросхемы используют в розетках?  даташит где посмотреть?

cudla1973
Offline
Зарегистрирован: 21.02.2013

TovBender пишет:

cudla1973

просветите что за цыфры в вашем скетче    #23 /    в скобках ( 349632,24 ) строка 27.

при отправке вашего скетча по радио, в приёмнике приходит совсем другая цифра code 58995

как получается такая цифра ??

и как передать настоящий код пульта ??

В скобках код моего пульта ,передаю через блютус программой написаной на ап инвертор

dinamitch1
Offline
Зарегистрирован: 15.12.2013
Всем привет! Зделал управление нагрузкой с ИК пульта (Dmitry OSIPOV) , есть один минус... нужно направлять пульт ДУ к ИК приёмнику (( 
 
Есть в наличие пульт от ворот 433,92 MHz (2 кнопки) , узнал коды.
 
Code: 144532, period duration: 459us.
Code: 144534, period duration: 459us.
помогите пожалуйста разобраться с кодом.
 
 
Вот код управление нагрузкой ИК пульта.
 
#include <IRremote.h>

#define RECV_PIN 11

#define POWER_KEY 0xF4BA2988
#define KEY1 0xE13DDA28
#define KEY2 0xAD586662
#define KEY3 0x273009C4
#define KEY4 0xF5999288
#define KEY5 0x731A3E02

#define OUT1 5
#define OUT2 6
#define OUT3 7
#define OUT4 8
#define OUT5 13

IRrecv irrecv(RECV_PIN);

decode_results results;


void setup()
{
  irrecv.enableIRIn(); // Start the receiver
  pinMode(OUT1, OUTPUT);
  pinMode(OUT2, OUTPUT);
  pinMode(OUT3, OUTPUT);
  pinMode(OUT4, OUTPUT);
  pinMode(OUT5, OUTPUT);
}

void loop() {
    if (irrecv.decode(&results)) {
    if(results.value == KEY1) digitalWrite(OUT1, !digitalRead(OUT1));
    else if(results.value == KEY2) digitalWrite(OUT2, !digitalRead(OUT2));
    else if(results.value == KEY3) digitalWrite(OUT3, !digitalRead(OUT3));
    else if(results.value == KEY4) digitalWrite(OUT4, !digitalRead(OUT4));
    else if(results.value == KEY5) digitalWrite(OUT5, !digitalRead(OUT5));
    
    else if(results.value == POWER_KEY) {
      if(digitalRead(OUT1) || digitalRead(OUT2) || digitalRead(OUT3) || digitalRead(OUT4) || digitalRead(OUT5)){
        digitalWrite(OUT1, LOW);
        digitalWrite(OUT2, LOW);
        digitalWrite(OUT3, LOW);
        digitalWrite(OUT4, LOW);
        digitalWrite(OUT5, LOW);
      }
      else{
        digitalWrite(OUT1, HIGH);
        digitalWrite(OUT2, HIGH);
        digitalWrite(OUT3, HIGH);
        digitalWrite(OUT4, HIGH);
        digitalWrite(OUT5, HIGH);
      }
    }
    delay(500); 
    irrecv.resume(); // Receive the next value
  }  
}

 

 

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

dinamitch1 пишет:

Code: 144532, period duration: 459us.
Code: 144534, period duration: 459us.

это ик ии радио?

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Short Circuit пишет:

это ик ии радио?

Фраза

"Есть в наличие пульт от ворот 433,92 MHz (2 кнопки) , узнал коды."

как бы намекает...

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

код от радио или от ик??

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Ага, фраза не намекает. Хорошо, тогда так: dinamitch1 приводит скетч от Д.Осипова, обрабатывающий сигналы с ИК-пульта, и желает, чтобы добрые люди сделали из него скетч, обрабатывающий сигналы с пульта от ворот 433,92 MHz (2 кнопки) с кодами 144532 и 144534, period duration: 459us.

dinamitch1
Offline
Зарегистрирован: 15.12.2013

Short Circuit пишет:

dinamitch1 пишет:

это ик ии радио?

 радио

Araris я прошу помоши зделать это , просто гугл не помог и я решыл обратится здесь

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015
#include <RemoteReceiver.h>
void setup() {
  RemoteReceiver::init(0, 3, showCode);
  pinMode(13, OUTPUT);  
  digitalWrite(13, LOW);
  pinMode(12, OUTPUT);  
  digitalWrite(12, LOW);
  pinMode(11, OUTPUT);  
  digitalWrite(11, LOW);
  pinMode(10, OUTPUT);  
  digitalWrite(10, LOW);
}
void loop() {}
void showCode(unsigned long receivedCode, unsigned int period) 
{
  if (receivedCode == 529980) digitalWrite(13, HIGH); 
  else if (receivedCode == 529976) digitalWrite(13, LOW);
  else if (receivedCode == 530952) digitalWrite(12, HIGH); 
  else if (receivedCode == 530948) digitalWrite(12, LOW);
  else if (receivedCode == 531276) digitalWrite(11, HIGH); 
  else if (receivedCode == 531272) digitalWrite(11, LOW);
  else if (receivedCode == 531384) digitalWrite(10, HIGH); 
  else if (receivedCode == 531380) digitalWrite(10, LOW);
 
} 

простенький пример управления реле с любого  радиопульта 2262

можно дополнить и писать в память состояние реле, при вкл будет восстанавливаться.

вход приемника - 2

dinamitch1
Offline
Зарегистрирован: 15.12.2013

Спосибо что помог с кодом ;)

dinamitch1
Offline
Зарегистрирован: 15.12.2013

"можно дополнить и писать в память состояние реле, при вкл будет восстанавливаться." - это обезательно или можно обойтись?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

в оригинальних китайских этого нет.

dinamitch1
Offline
Зарегистрирован: 15.12.2013

можно посмотреть на дополнительный код с состоянием реле? а то я не могу понять о чём ты.