@XardasNetpoint

Как сымитировать «нажатие» кнопки выключателя?

Пытаюсь сделать "умный дом", взялся за выключатель (выключатель будет подключен к радио-модулю), для этого купил у китайцев бесконтактный выключатель (двухкнопочный), насколько я смог понять со своими скудными знаниями электроники, в выключателе используется емкостный датчик (хотя я в этом до сих пор не уверен). Я нашел как можно считать текущее состояние выключателя, но способа "нажать" кнопку, найти так и не удалось. Пробовал подавать +, на каждую ногу микроконтроллера, но это ничего не дает. Подскажите пожалуйста, какие есть варианты имитации нажатия?

Задняя часть выключателя
Лицевая сторона выключателя
  • Вопрос задан
  • 6538 просмотров
Решения вопроса 1
@XardasNetpoint Автор вопроса
Вроде бы нашел решение (не уверен, потому как к текущему моменту микроконтроллер pic16f690 еле живой и глючит, после того, как я случайно подал на него 12 вольт). Исследовал схему с помощью осциллографа, и в этом месте, получил вот такую картину:

Момент включения + шум (обычное состояние):
63315d1f055142d0917f4d1ef0a25bdb.png
Шум:
c0be555a4cbb4615b8ca351528be715d.png

после чего пришел к выводу, что "кнопка" срабатывает, если на ножку МК подается подобный сигнал. Набросал на ардуино простенькую "включалку", которая через раз работает (видимо из-за умершего МК).
void setup() {
  pinMode(10, OUTPUT);
  pinMode(2, INPUT);
}

int buttonState = 0;
void loop() {
  buttonState = digitalRead(2);
  if (buttonState == HIGH) {
    digitalWrite(10, HIGH);
    delayMicroseconds(2);
    digitalWrite(10, LOW);
    delayMicroseconds(2);
  }
}


необходимо объединить землю между ардуино и выключателем, схема включения кнопки для ардуины - arduino.cc/en/Tutorial/Button.

Заказал новый выключатель на АЛИ, когда он придет, опробую это на нем, по всей логике вещей, должно будет работать идеально, возможно кому-то поможет, всем спасибо за попытки помочь.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Тоже задавался данным вопросом. Данные выключатели есть с радио управлением. И на плате есть разъем для радиоприемника. Один из контактов это RX.
Если используете ардуину:
int txPin = 9; // pin connected to RF transmitter
int i; // counter to send command pulses
int pulse; // count pulse repetitions
int incomingByte = 0;   // for incoming serial data

// hard coded commands (see txButton): 1 - pulse start, 2 - zero, 3 - one, 4 - pause, 5 - low
int button1[45]={44, 1, 2, 4, 2, 4, 2, 4, 3, 5, 2, 4, 2, 4, 3, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2};
int button2[43]={43, 1, 2, 4, 2, 4, 2, 4, 3, 5, 2, 4, 2, 4, 3, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 5, 3, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2};
int button3[41]={40, 1, 2, 4, 2, 4, 2, 4, 3, 5, 2, 4, 2, 4, 3, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 5, 3, 5, 3, 4, 2, 4, 2, 4, 2};
int button4[43]={42, 1, 2, 4, 2, 4, 2, 4, 3, 5, 2, 4, 2, 4, 3, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 5, 3, 4, 2, 4, 2, 4, 2};
int button5[43]={42, 1, 2, 4, 2, 4, 2, 4, 3, 5, 2, 4, 2, 4, 3, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 5, 2, 4, 3, 4, 2, 4, 2, 4, 2, 4, 2};
int button6[43]={42, 1, 2, 4, 2, 4, 2, 4, 3, 5, 2, 4, 2, 4, 3, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 5, 3, 4, 2, 4, 2, 4, 2, 4, 2};
int button7[41]={40, 1, 2, 4, 2, 4, 2, 4, 3, 5, 2, 4, 2, 4, 3, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 5, 3, 4, 2, 5, 3, 4, 2, 4, 2};
int button8[43]={42, 1, 2, 4, 2, 4, 2, 4, 3, 5, 2, 4, 2, 4, 3, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 5, 3, 4, 2, 4, 2};
int button9[43]={42, 1, 2, 4, 2, 4, 2, 4, 3, 5, 2, 4, 2, 4, 3, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 5, 2, 4, 2, 4, 3, 4, 2, 4, 2, 4, 2};
int button10[43]={42, 1, 2, 4, 2, 4, 2, 4, 3, 5, 2, 4, 2, 4, 3, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 5, 2, 4, 3, 4, 2, 4, 2, 4, 2};
int button11[41]={40, 1, 2, 4, 2, 4, 2, 4, 3, 5, 2, 4, 2, 4, 3, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 5, 3, 4, 2, 5, 2, 4, 3, 4, 2};

void setup () {

pinMode(txPin, OUTPUT);
     Serial.begin(9600);
     Serial.println("Number = button;  a to press 0;  b to shut off all");

}

    void loop(){
      if (Serial.available() > 0) {
        // read the incoming byte:
        incomingByte = Serial.read();
        switch(incomingByte) {
        case 49:
        txButton(button1);
        Serial.println("Switching on 1");
        break;
        case 50:
        txButton(button2);
        Serial.println("Switching on 2");
        break;
        case 51:
        txButton(button3);
        Serial.println("Switching on 3");
        break;
        case 52:
        txButton(button4);
        Serial.println("Switching on 4");
        break;
        case 53:
        txButton(button5);
        Serial.println("Switching on 5");
        break;
        case 54:
        txButton(button6);
        Serial.println("Switching on 6");
        break;
        case 55:
        txButton(button7);
        Serial.println("Switching on 7");
        break;
        case 56:
        txButton(button8);
        Serial.println("Switching on 8");
        break;
        case 57:
        txButton(button9);
        Serial.println("Switching on 9");
        break;
        case 97:
        txButton(button10);
        Serial.println("Switching on 0");
        break;
        case 98:
        txButton(button11);
        Serial.println("Switching All off");
        break;
        }
      } // end if serial available
    }// end void loop
    
// transmit command. Due to transmitter (or something, I don't know) transmission code should be INVERTED. Ex: one is coded as LOW-delay->HIGH instead of HIGH-delay-LOW
void txButton(int cmd[]) {
Serial.print("Processing. Array size is ");
Serial.println(cmd[0]);
digitalWrite(txPin, HIGH); // not sure if its required, just an attempt to start transmission to enable AGC of the receiver
delay(1000);

for (pulse= 0; pulse <= 100; pulse=pulse+1) { // repeat command 100 times
for (i = 1; i < cmd[0]+1; i = i + 1) { // transmit command

  switch(cmd[i]) {
   case 1: // start
   digitalWrite(txPin, HIGH);
   delayMicroseconds(550);
   digitalWrite(txPin, LOW);
//   Serial.print("s");
   break;
   case 2: // "zero", that is short high spike
   digitalWrite(txPin, LOW);
   delayMicroseconds(110);
   digitalWrite(txPin, HIGH);
//   Serial.print("0");
   break;   
   case 3: // "one", that is long high spike
   digitalWrite(txPin, LOW);
   delayMicroseconds(303);
   digitalWrite(txPin, HIGH);
//   Serial.print("1");
   break;      
   case 4: // pause, that is short low spike
   digitalWrite(txPin, HIGH);
   delayMicroseconds(110);
   digitalWrite(txPin, LOW);
//   Serial.print("p");
   break;      
   case 5: // low, that is long low spike
   digitalWrite(txPin, HIGH);
   delayMicroseconds(290);
   digitalWrite(txPin, LOW);
//   Serial.print("l");   
   break;      
  }
    
  }

} 


}


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

Все отлично работает. Так же работает команда на выключение.

Пока эксперименты приостановил. Но следующим хотел найти как его можно напрямую включить или по UART
Ответ написан
Neuroware
@Neuroware
Программист в свободное от работы время
из фотографий видно что у него есть разъем для управления, нужно найти к этому выключателю документацию и посмотреть какой pin за что отвечает. Подавать + на каждую ногу это очень и очень плохая идея, в зависимости от того как именно это происходило есть вероятность, что контроллер теперь мертв.
Ответ написан
@renoize
Android Developer
По ссылке, которую Вы дали, большими буквами написано, что выключатель емкостной )
Судя по сниму лицевой части на плате две площадки для прикосновения. Если совсем не очень с электроникой, то смотрите куда приходят проводники на контроллер и с помощью мультиметра смотрите изменение напряжения в момент касания тач-панели (не забываем про ТБ).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы