Ви не увійшли.
Получилось решить использованием библиотеки Bouncer. Закрыто
Всем привет. Я только начал изучать ардуино. Задача такая: нужно сделать параллельное переключение реле при помощи кнопки (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