Управление реле через arduino, enc28j60 и кнопки
- Войдите на сайт для отправки комментариев
Вс, 10/01/2016 - 19:00
Здравствуйте, уважаемые посетители и администраторы форума.
Совсем недавно начал играться с Ардуино и появился вопрос, который не знаю как решить. Опишу всё максимально подробно.
Есть в наличии: 1) Arduino Uno, 2) модуль сети mini enc28j60(в перспективе хочу заменить), 3) плата с двумя реле srd-05vdc-sl-c (использую только одно реле. В перспективе хочу заменить), кнопка тактовая без фиксации.
С горем пополам спустя несколько дней накидал такой скетч:
#include <EtherCard.h> // разъем CS из модуля сети подключаем к 10-му пину на ардуино #define CS 10 #define RELAY_PIN 4 #define REQUEST_RATE 5000 // настройки сетевого интерфейса static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; static byte myip[] = { 10,36,1,52 }; static byte gwip[] = { 10,36,1,7 }; static byte dnsip[] = { 10,36,1,7 }; static byte hisport[] = { 80 }; char* on = "ON"; char* off = "OFF"; boolean relayStatus; char* relayLabel; char* linkLabel; byte Ethernet::buffer[700]; // --- begin для кнопки // задаём константы const int buttonPin = 2; // номер входа, подключенный к кнопке // переменные boolean lastButton = LOW; // Переменная для сохранения предыдущего состояния кнопки boolean currentButton = LOW; // Переменная для сохранения текущего состояния кнопки // --- end конец для кнопки // --- begin для светодиода const int ledPin = 6; // номер выхода светодиода на Arduino boolean ledOn = false; // Текущее состояние светодиода (включен/выключен) // --- end для светодиода void setup () { // begin инициируем подключение к локальной сети delay(300); if (ether.begin(sizeof Ethernet::buffer, mymac, CS) == 0) Serial.println(F("Failed to access Ethernet controller")); ether.staticSetup(myip); // end инициируем подключение к сети // --- begin для реле pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, HIGH); // если надо чтобы при обновлении // страницы в браузере реле сразу включалось // надо вместо true поставить false relayStatus = true; relayLabel = off; linkLabel = on; // --- end для реле // --- begin для кнопки // инициализируем пин, подключенный к кнопке, как вход pinMode(buttonPin, INPUT); // --- end для кнопки // --- begin для светодиода на 6-ом пине // инициализируем пин, подключенный к светодиоду, как выход pinMode(ledPin, OUTPUT); // --- end для светодиода } // --- begin сглаживание кнопки /* * функция сглаживания дребезга * принимает в качестве аргумента предыдущее состояние кнопки * и выдаёт фактическое. */ boolean debounce(boolean last) { boolean current = digitalRead(buttonPin); // Считать состояние кнопки if (last != current) // Если изменилось ... { delay(5); // ждём 5 мс current = digitalRead(buttonPin); // Считываем состояние кнопки return current; // Возвращаем состояние кнопки } } // --- end сглаживание кнопки void loop () { // --- begin управление по локальной сети word len = ether.packetReceive(); word pos = ether.packetLoop(len); if(pos) { if(strstr((char *)Ethernet::buffer + pos, "GET /?ON") != 0) { relayStatus = false; relayLabel = on; linkLabel = off; } else if(strstr((char *)Ethernet::buffer + pos, "GET /?OFF") != 0) { relayStatus = true; relayLabel = off; linkLabel = on; } digitalWrite(RELAY_PIN, relayStatus); BufferFiller bfill = ether.tcpOffset(); bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n" "<html><head></head><body>" "<div style='font:bold 14px verdana;text-align:center'>Relay is $S</div>" "<a href='http://10.36.1.52/?OFF'>Выключить</a>" "<br></br>" "<a href='http://10.36.1.52/?ON'>Включить</a>" "</div></div></body></html>" ), relayLabel, linkLabel, linkLabel); ether.httpServerReply(bfill.position()); } // --- end управление по локальной сети // --- begin реакция на нажатие кнопки для реле currentButton = debounce(lastButton); if (lastButton == LOW && currentButton == HIGH) // Если нажатие { relayStatus = !relayStatus; ledOn = !ledOn; } lastButton = currentButton; digitalWrite(RELAY_PIN, relayStatus); // Изменить статус состояния реле digitalWrite(ledPin, ledOn); // Изменить статус состояния светодиода // --- end реакция на нажатие кнопки для реле }
Что делает скетч:
С кнопки можно включить реле и выключить (кнопку постоянно держать нажатой для этого не нужно-это важный момент). Релюшку так же можно переключать через веб интерфейс. Если я щёлкаю релюшкой через веб-интерфейс, то отрисовывается состояние реле (OFF или ON). Могу переключить реле физической кнопкой, а выключить через web и наоборот. Всё вобщем так, как и надо было. На светодиод на пину №6 можно внимание не обращать - это "муки творчества" :-)
Что должно получиться и не получается сделать:
Надо, чтобы переключая реле, я знал о текущем его состоянии, не зависимо от того переключил я реле с физической кнопки или через веб-интерфейс. Надо чтобы информация о состоянии реле я знал через веб интерфейс модуля enc28j60 на arduino.
Может кто знает как решить задачу?
Заранее благодарен.
создай переменную boolean и присваивай ей значение как при програмноой так и при хард смене режима
А носом ткнёте?
Добрый всем вечер может ктото подсказать мне по скетчу
artemon25 в вашем скетче беспорядок
1. Выводы управления реле объявлены как попало
Вижу Artemon25 создал новую тему на форуме ОБЩИЙ http://arduino.ru/forum/obshchii/rabota-rele-po-peremenno-ne-meshaya-drug-drugu. Ему сразу написали весь скетч, не дали человеку времени поработать головой.