#2 Програмування Arduino » Переключение реле при помощи кнопки вместе с aREST » 2016-06-04 19:25:40

CyanoFresh
відповідей: 1

Всем привет. Я только начал изучать ардуино. Задача такая: нужно сделать параллельное переключение реле при помощи кнопки (push button) и через aREST (через инет). Все получилось сделать, работает, но такое чувство что это не "right way". К тому же обнаружилась проблема: если включить через aREST, а потом зажать кнопку (не отпускать) - реле отключится, а потом отпустить - включится - то есть вернется в исходное состояние (моргнет, но не отключит, как должно быть).
Текущий код:

#include <enc28j60.h>
#include <EtherCard.h>
#include <net.h>
#include <aREST.h>

aREST rest = aREST();

static byte myip[] = { 192, 168, 1, 108 };
static byte gwip[] = { 192, 168, 1, 1 };
static byte mymac[] = { 0x74, 0x69, 0x69, 0x2D, 0x30, 0x31 };

byte Ethernet::buffer[350]; // tcp/ip send and receive buffer
BufferFiller bfill;

const int relayPin = 4;
const int btnPin = 2;

boolean lastButton;
boolean relayOn;
boolean currentButton;

void setup() {
  // Set up ethernet
  ether.begin(sizeof Ethernet::buffer, mymac, 8);
  ether.staticSetup(myip, gwip);
  
  // Set up pins
  pinMode(relayPin, OUTPUT);
  pinMode(btnPin, INPUT);
}

void loop() {
  // Ethernet and AREST port
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  if (pos) {
    bfill = ether.tcpOffset();
    char *data = (char *) Ethernet::buffer + pos;
    
    if (strncmp("GET /", data, 5) != 0) {
      // Unsupported request method (POST or other).
      bfill.emit_p(PSTR("Unsupported HTTP request."));
    } else {
      // vvv--- Handle REST manually ---vvv
      rest.handle_proto(data);
      char *res = rest.getBuffer();
      // Send HTTP header:
      bfill.emit_p(
        PSTR("HTTP/1.0 200 OK\r\nContent-Type: application/json\r\nPragma: no-cache\r\n\r\n")
      );
      // Send result:
      bfill.emit_raw(res, strlen(res));
      rest.resetBuffer();
      rest.reset_status();
      // ^^^--- Handle REST manually ---^^^
    }

    ether.httpServerReply(bfill.position());    // send http response
  }

  // Button handler
  currentButton = digitalRead(btnPin);
  
  if (lastButton != currentButton) {
    if (currentButton == HIGH) {
      relayOn = !relayOn;
    }

    delay(50);
    
    lastButton = currentButton;
    digitalWrite(relayPin, relayOn);
  }
}

Как решить данную проблему или как правильно сделать сделать параллельное управление? Чувствую, вопросы связаны.
Слышал насчет hardware решения debounce - но можно ли обойтись без этого?
P.S кнопка с дребезгом (нужен debounce), Arduino UNO

Підвал форуму